Annotation of capa/capa51/pProj/capaMapExpr.c, revision 1.1.1.1

1.1       albertel    1: /* ========================================================================== */
                      2: /*            capaMapExpr.c    created by Isaac Tsai                       */
                      3: /*                                1998, 1999 copyrighted by Isaac Tsai     */
                      4: /*                                                                         */
                      5: /*  this is the main code to handle /MAP() function call in capa */
                      6: #include <stdio.h>
                      7: #include <string.h>
                      8: #include <math.h>
                      9: 
                     10: #include "capaParser.h"
                     11: #include "capaToken.h"
                     12: #include "ranlib.h"
                     13: 
                     14: 
                     15:             
                     16: /* |>|===============================================================|<| */
                     17: int
                     18: do_map(seed, varp, argp, argc, dir) 
                     19: char *seed; ArgNode_t *varp; ArgNode_t *argp; int argc; int dir;
                     20: {
                     21:   long        orig_gen, current_gen, seed1, seed2;
                     22:   long       *idx_array, *ridx_array;
                     23:   int         idx, val;
                     24:   Symbol      val_array[ONE_K];
                     25:   ArgNode_t  *tmpArgp;
                     26:   
                     27: 
                     28:   for(idx=0,tmpArgp=argp;idx<argc;idx++) {
                     29:     switch( FIRST_ARGTYPE(tmpArgp) ) {
                     30:     case I_VAR:
                     31:     case I_CONSTANT:
                     32:          (val_array[idx]).s_type = I_VAR;
                     33:          (val_array[idx]).s_int = FIRST_ARGINT(tmpArgp); break;
                     34:     case R_VAR:
                     35:     case R_CONSTANT:
                     36:          (val_array[idx]).s_type = R_VAR;
                     37:          (val_array[idx]).s_real = FIRST_ARGREAL(tmpArgp); break;
                     38:     case S_VAR:
                     39:     case S_CONSTANT:
                     40:          (val_array[idx]).s_type = S_VAR;
                     41:          (val_array[idx]).s_str = strsave(FIRST_ARGSTR(tmpArgp)); break;
                     42:     default:
                     43:          return -1;
                     44: 	 break;
                     45:     }
                     46:     tmpArgp =  (tmpArgp->a_next);
                     47:   }
                     48:   idx_array = (long *)capa_malloc(sizeof(long), argc);
                     49:   for(idx=0;idx<argc;idx++) idx_array[idx] = idx;
                     50:   gscgn(GET_GENERATOR, &orig_gen);
                     51:   current_gen = PERMUTATION_G;
                     52:   gscgn(SET_GENERATOR, &current_gen);
                     53:   phrtsd(seed, &seed1, &seed2);
                     54:   setsd(seed1, seed2);
                     55:   genprm(idx_array, (long)argc);
                     56:   if(dir == REVERSE_MAP) {
                     57:     ridx_array = (long *)capa_malloc(sizeof(long), argc);
                     58:     for(idx=0;idx<argc;idx++) {
                     59:       ridx_array[ idx_array[idx] ] = idx;
                     60:     }
                     61:     for(idx=0;idx<argc;idx++) {
                     62:       idx_array[idx] = ridx_array[idx];
                     63:     }
                     64:     capa_mfree((char *)ridx_array);
                     65:   }
                     66:   for(idx=0,tmpArgp=varp;idx<argc;idx++) {
                     67:     val = idx_array[idx];
                     68:     switch( FIRST_ARGTYPE(tmpArgp) ) {
                     69:       case IDENTIFIER:
                     70:       case I_VAR: case I_CONSTANT:
                     71:       case R_VAR: case R_CONSTANT: break;
                     72:       case S_VAR: case S_CONSTANT: capa_mfree((char *)FIRST_ARGSTR(tmpArgp)); break;
                     73:     }
                     74:     FIRST_ARGTYPE(tmpArgp) = (val_array[val]).s_type;
                     75:     
                     76:     switch( val_array[val].s_type ) {
                     77:      case I_VAR: FIRST_ARGINT(tmpArgp) =  (val_array[val]).s_int;   break;
                     78:      case R_VAR: FIRST_ARGREAL(tmpArgp) = (val_array[val]).s_real;  break;
                     79:      case S_VAR: FIRST_ARGSTR(tmpArgp) =  (val_array[val]).s_str;   break;
                     80:     }
                     81:     tmpArgp = tmpArgp->a_next;
                     82:   }
                     83:   gscgn(SET_GENERATOR, &orig_gen);
                     84:   capa_mfree((char *)idx_array);
                     85:   return (0);
                     86: }
                     87: 
                     88: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>