Annotation of researchv10no/cmd/basic/bite/src/savars.c, revision 1.1.1.1

1.1       root        1: /* Copyright Bell Telephone Laboratories Whippany, N.J.
                      2: 
                      3:  *     /////////////////////////////////////
                      4:  *     /////////////////////////////////////
                      5:  *     ///////////// savars.c //////////////
                      6:  *     /// J. P. Hawkins WH X4610 8C-001 ///
                      7:  *     ///// Fri Feb 27 06:32:38 1981 //////
                      8:  *     /////////////////////////////////////
                      9:  *     /////////////////////////////////////
                     10:  *     @(#) savars.c: V1.2 3/4/81
                     11: 
                     12:  * String array variable Allocation and Fetch routines
                     13:  * For BITE
                     14:  *
                     15:  */
                     16: /*   "@(#) savars.c:  V 1.1  2/4/81" */
                     17: 
                     18: #include       "bas.h"
                     19: /*
                     20:  * this is the symbol table (table of pointers) for string array
                     21:  * variables. The first subscript 'j' is calculated by the
                     22:  * alpha name, the second subscript 'k' is calculated by the
                     23:  * numeric part + 1. If no numeric is specified, k = 0
                     24:  *
                     25:  * The pointer points to an area in memory allocated by dim.
                     26:  * The area is of similar form to that of numeric variables
                     27:  * except, the pointers to the strings rather than values are
                     28:  * actually stored. The header form is the same as that for numeric
                     29:  * variables except that the constants a1,a2,a3,..,etc.
                     30:  * are unnecessary due to allowing only one or two dimensions.
                     31:  * (see remarks at beginning of dim.c module and diagram)
                     32:  *
                     33:  * The specification for a string array variable is of the form:
                     34:  *     Alpha[Numeric]$(a,b)
                     35:  * The dimension "dim" statement is specified in the form:
                     36:  *     dim Alpha[numeric]$(XMAX[,YMAX])
                     37:  * The starting location is obtained by the equation:
                     38:  *     Loc = (a-1)*YMAX+b-1
                     39:  *
                     40:  *     where a <= XMAX
                     41:  *           b <= YMAX
                     42:  *
                     43:  * If dimension YMAX is not given it is set to 1, however the
                     44:  * first byte of the header will specify only one dimension exists.
                     45:  *
                     46:  */
                     47: char * sasymtab[26][11];
                     48: extern char    *hicore;        /* pointer lowest used corespace from
                     49:                                    top of user area */
                     50: 
                     51: 
                     52: struct FREELIST         freelist[MAXFREE];
                     53: /*
                     54:  * //////// FETCH VALUE OF VARIABLE ////////
                     55:  *
                     56:  * calling format:
                     57:  *
                     58:  *     sagetvar(sname, &sptr);
                     59:  *
                     60:  *     where: sname = string containing VALID variable name
                     61:  *                     i.e. [a-z] or a[0-9] - z[0-9]
                     62:  *            sptr = pointer to string
                     63:  */
                     64: sagetvar(sname,sptr)
                     65: char   sname[];
                     66: char   **sptr; /* pointer to string pointer */
                     67: {
                     68:        char    *addr;
                     69: 
                     70:        if(sgetaddr(sname, &addr) < 0)
                     71:                return(-1);     /* error occurred in getting addr */
                     72: 
                     73:        if(addr == 0)           /*if no pointer for this variable */
                     74:                                /*  (not allocated, yet) */
                     75:        {
                     76:                error2(inst.thing.linno,7,' '); /* UNASSIGNED VARIABLE */
                     77:                printf("- '%s'\n",sname); /* print variable name */
                     78:                *sptr = 0;              /* return zero anyway */
                     79:                return(-1);
                     80:        }
                     81:        else
                     82:        {
                     83:                *sptr = addr;           /* set ptr to data location */
                     84:                *sptr += 1;             /* bump past size byte */
                     85:        }
                     86:        return(0);
                     87: }
                     88: /*
                     89:  *
                     90:  * //// ASSIGN A VALUE TO A VARIABLE ////
                     91:  * /////////// ALLOCATE SPACE  //////////
                     92:  *
                     93:  * Copy the string into the allocated location.
                     94:  *
                     95:  * calling format:
                     96:  *
                     97:  *     saputvar(sname, sptr);
                     98:  *
                     99:  *     where: sname = string pointer to VALID variable name
                    100:  *            sptr = pointer to string to be copied
                    101:  */
                    102: saputvar(sname,sptr)
                    103: char   sname[];        /* valid variable string (name) */
                    104: char   *sptr;          /* pointer to string */
                    105: {
                    106:        register char *ptr,*cptr; /* pointer used for string copy to mem */
                    107:        char    *lookfree();
                    108:        int     ssize;          /* string size */
                    109:        int     useagain;       /* flag to use space again */
                    110:        char    *addr;          /* pointer array el. which is ptr to string */
                    111: 
                    112:        useagain = 0;
                    113:        cptr = sptr;    /* get source string pointer */
                    114:        ssize = strlen(sptr);   /* get size of string */
                    115:        if(sgetaddr(sname, &addr) < 0)
                    116:                return(-1);     /* error occurred in getting addr */
                    117:        if(addr != 0)           /* if this variable was used before */
                    118:        {
                    119:                ptr = addr;             /* point to old space */
                    120:                savefree(ptr);          /* save area old in free list */
                    121:                if((addr = ptr = lookfree(ssize)) != 0)
                    122:                        useagain = 1;   /* if other hole is found */
                    123:        }
                    124:        if(!useagain)   /* if this is the first time this var was used */
                    125:        {
                    126:                /*
                    127:                 * Return error if not enough space left
                    128:                 */
                    129:                if((hicore - (ssize+2)) <= linptr)
                    130:                {
                    131:                        error(inst.thing.linno, 24); /* NOT ENOUGH ADD. CORE */
                    132:                        return(-1);
                    133:                }
                    134:                hicore -= (ssize+2);    /* set new hicore mark - */
                    135:                                        /* include space for null and size */
                    136:                ptr = hicore;           /* set pointer for copy */
                    137:                *ptr = ssize;           /* put size of 1st string in 1st loc */
                    138:                addr = ptr;             /* put new pointer in array table */
                    139: 
                    140:                if((unsigned)hicore & 1)        /* hicore to even boundry */
                    141:                        hicore--;
                    142:        }
                    143:        ptr++;          /* bump past size */
                    144: 
                    145:        while(*ptr++ = *cptr++); /* copy string into storage */
                    146: 
                    147:        return(0);
                    148: }
                    149: #ifdef notdef
                    150: /*
                    151:  * Return size of string up to first null character
                    152:  */
                    153: static strlen(s)
                    154: char   *s;
                    155: {
                    156:        register count;
                    157:        for(count = 0; s[count]; count++);
                    158:        return(count);
                    159: }
                    160: #endif
                    161: /*
                    162:  *
                    163:  * Look in freelist to for smallest free area
                    164:  * which will fit new allocation. If none, return false.
                    165:  * The free list points to previously scrapped areas.
                    166:  */
                    167: char *
                    168: lookfree(size)
                    169: {
                    170:        register i;
                    171:        int     bestsize,besti;
                    172: 
                    173:        for(i=0, bestsize=0; i<MAXFREE; i++)
                    174:        {
                    175:                if(freelist[i].size == 0) /* skip null or deleted entries */
                    176:                        continue;
                    177:                if(freelist[i].size >= size)
                    178:                {
                    179:                        if(bestsize == 0) /* force first fit */
                    180:                        {
                    181:                                bestsize = freelist[i].size;
                    182:                                besti = i;
                    183:                        }
                    184:                        else if(freelist[i].size < bestsize) /* better fit? */
                    185:                        {
                    186:                                bestsize = freelist[i].size;
                    187:                                besti = i;
                    188:                        }
                    189:                }
                    190:        }
                    191:        if(bestsize == 0)
                    192:                return(0);      /* nothing found */
                    193:        else
                    194:        {
                    195:                freelist[besti].size = 0;       /* take off free list */
                    196:                return(freelist[besti].fraddr);
                    197:        }
                    198: }
                    199: 
                    200: savefree(addr)
                    201: char   *addr;
                    202: {
                    203:        register i;
                    204:        int     size;
                    205:        int     there;
                    206: 
                    207:        size = *addr;
                    208:        for(i=0,there=0; i<MAXFREE; i++)
                    209:        {
                    210:                if((freelist[i].size != 0) && (freelist[i].fraddr == addr))
                    211:                {
                    212:                        /* avoid dup entry */
                    213:                        there = 1;
                    214:                        break;
                    215:                }
                    216:        }
                    217:        if(!there)
                    218:        {
                    219:                for(i=0; i<MAXFREE; i++)
                    220:                {
                    221:                        if(freelist[i].size == 0)
                    222:                        {
                    223:                                freelist[i].size = size; /* save size */
                    224:                                freelist[i].fraddr = addr; /* save address */
                    225:                                break;
                    226:                        }
                    227:                }
                    228:        }
                    229: }
                    230: /*
                    231:  *
                    232:  * /// COMPUTE ARRAY VARIABLE ADDRESS ///
                    233:  */
                    234: sgetaddr(vstr, addr)
                    235: char   vstr[];         /* subscripted variable string */
                    236: char   **addr;         /* address of subscripted variable pointer */
                    237: {
                    238:        char    arname[3];      /* array name */
                    239:        int     offset;
                    240:        int     *ptr;           /* location pointer */
                    241:        int     asize;          /* actual array size */
                    242:        double  rsize;          /* requested size */
                    243:        register i;
                    244:        int     j,k;
                    245:        double  rdims[MAXDIM];  /* requested dims */
                    246:        int     adims[2];       /* actual dims */
                    247:        int     amax;           /* max number of dims */
                    248: 
                    249:        amax = 2;               /* no more than two dimensions */
                    250:        /*
                    251:         * GET ARRAY SYMBOL NAME, NUMBER OF DIMENSIONS &
                    252:         * PUT THE VALUE OF EACH DIMENSION IN DIMLIST
                    253:         */
                    254:        if(getdims(vstr,arname,&rsize,rdims) < 0)
                    255:                return(-1);
                    256:        if(rsize == 1.0)
                    257:        {
                    258:                rdims[1] = 1.0;
                    259:        }
                    260:        j = arname[0] - 'a';            /* compute j subscript */
                    261: 
                    262:        /*
                    263:         * compute k subscript
                    264:         */
                    265:        if(arname[1] == '\0')           /* if no numeric part */
                    266:                k = 0;                  /* then k = 0th column */
                    267:        else
                    268:                k = arname[1] - '0' + 1;
                    269: 
                    270:        if(sasymtab[j][k] == 0)         /* if not dimensioned complain */
                    271:        {
                    272:                error(inst.thing.linno, 25); /* NOT DIMENSIONED */
                    273:                return(-1);
                    274:        }
                    275:        ptr = (int *)sasymtab[j][k];            /* point to header */
                    276:        asize = *--ptr;                         /* get actual size */
                    277:        if(asize != (int)rsize)         /* error if mismatch in actual to
                    278:                                            requested size */
                    279:        {
                    280:                error(inst.thing.linno, 26); /* WRONG NUM OF DIMS */
                    281:                return(-1);
                    282:        }
                    283:        for(i=0; i<amax; i++)
                    284:        {
                    285:                adims[i] = *--ptr;
                    286:                if((int)rdims[i] > adims[i])
                    287:                {
                    288:                        error(inst.thing.linno, 27); /* DIM > ACTUAL */
                    289:                        return(-1);
                    290:                }
                    291:        }
                    292:        *--ptr;         /* BASE STARTS AFTER HEADER */
                    293:        /*
                    294:         * Note that this structure starts from hi to low memory
                    295:         *      LOC = BASE - ((a-1)*YMAX+b-1)
                    296:         */
                    297:        offset = ((int)rdims[0]-1)*adims[1]+((int)rdims[1]-1);
                    298:        *addr = (char *)(ptr-offset);
                    299:        return(0);
                    300: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.