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

1.1       root        1: /* Copyright Bell Telephone Laboratories Whippany, N.J.
                      2: 
                      3:  *     /////////////////////////////////////
                      4:  *     /////////////////////////////////////
                      5:  *     ////////////// svars.c //////////////
                      6:  *     /// J. P. Hawkins WH X4610 8C-001 ///
                      7:  *     ///// Sat Jan 31 14:59:54 1981 //////
                      8:  *     /////////////////////////////////////
                      9:  *     /////////////////////////////////////
                     10: 
                     11:  *
                     12:  * String variable Allocation and Fetch routines
                     13:  * For BITE
                     14:  *
                     15:  */
                     16: /*   "@(#) svars.c:  V 1.1  2/4/81" */
                     17: 
                     18: #include       "bas.h"
                     19: /*
                     20:  * this is the symbol table (table of pointers) for string
                     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: char * ssymtab[26][11];
                     26: extern char    *hicore;        /* pointer lowest used corespace from
                     27:                                    top of user area */
                     28: 
                     29: 
                     30: /*
                     31:  * //////// FETCH VALUE OF VARIABLE ////////
                     32:  *
                     33:  * calling format:
                     34:  *
                     35:  *     sgetvar(sname, &sptr);
                     36:  *
                     37:  *     where: sname = string containing VALID variable name
                     38:  *                     i.e. [a-z] or a[0-9] - z[0-9]
                     39:  *            sptr = pointer to string
                     40:  */
                     41: sgetvar(sname,sptr)
                     42: char   sname[];
                     43: char   **sptr; /* pointer to string pointer */
                     44: {
                     45:        int     j,k;    /* symbol table indicies */
                     46: 
                     47:        j = sname[0] - 'a';     /* compute j subscript */
                     48: 
                     49:        /*
                     50:         * compute k subscript
                     51:         */
                     52:        if(sname[1] == '\0')    /* if no numeric part */
                     53:                k = 0;          /* then k = 0th column */
                     54:        else
                     55:                k = sname[1] - '0' + 1; /* use numeric + 1th column */
                     56: 
                     57:        if(ssymtab[j][k] == 0)  /*if no pointer for this variable */
                     58:                                /*  (not allocated, yet) */
                     59:        {
                     60:                error2(inst.thing.linno,7,' '); /* UNASSIGNED VARIABLE */
                     61:                printf("- '%s$'\n",sname); /* print variable name */
                     62:                *sptr = 0;              /* return zero anyway */
                     63:                return(-1);
                     64:        }
                     65:        else
                     66:        {
                     67:                *sptr = ssymtab[j][k]; /* set ptr to data location */
                     68:                *sptr += 1;             /* bump past size byte */
                     69:        }
                     70:        return(0);
                     71: }
                     72: /*
                     73:  *
                     74:  * //// ASSIGN A VALUE TO A VARIABLE ////
                     75:  * /////////// ALLOCATE SPACE  //////////
                     76:  *
                     77:  * Copy the string into the allocated location.
                     78:  *
                     79:  * calling format:
                     80:  *
                     81:  *     sputvar(sname, sptr);
                     82:  *
                     83:  *     where: sname = string pointer to VALID variable name
                     84:  *            sptr = pointer to string to be copied
                     85:  */
                     86: sputvar(sname,sptr)
                     87: char   sname[];        /* valid variable string (name) */
                     88: char   *sptr;          /* pointer to string */
                     89: {
                     90:        register char *ptr,*cptr; /* pointer used for string copy to mem */
                     91:        int     ssize;          /* string size */
                     92:        int     useagain;       /* flag to use space again */
                     93:        int     j,k;    /* symbol table indicies */
                     94: 
                     95:        useagain = 0;
                     96:        cptr = sptr;    /* get source string pointer */
                     97:        j = sname[0] - 'a';     /* compute j subscript */
                     98: 
                     99:        /*
                    100:         * compute k subscript
                    101:         */
                    102:        if(sname[1] == '\0')    /* if no numeric part */
                    103:                k = 0;          /* then k = 0th column */
                    104:        else
                    105:                k = sname[1] - '0' + 1;
                    106: 
                    107:        ssize = strlen(sptr);   /* get size of string */
                    108:        if(ssymtab[j][k] != 0)  /* if this variable was used before */
                    109:        {
                    110:                ptr = ssymtab[j][k]; /* point to old space */
                    111:                if(ssize <= *ptr)       /* if there's enough room */
                    112:                {
                    113:                        useagain = 1;   /* use same space */
                    114:                        ptr++;          /* bump past size */
                    115:                }
                    116:        }
                    117:        if(!useagain)   /* if this is the first time this var was used */
                    118:        {
                    119:                /*
                    120:                 * Return error if not enough space left
                    121:                 */
                    122:                if((hicore - (ssize+2)) <= linptr)
                    123:                {
                    124:                        error(inst.thing.linno, 24); /* NOT ENOUGH ADD. CORE */
                    125:                        return(-1);
                    126:                }
                    127:                hicore -= (ssize+2);    /* set new hicore mark - */
                    128:                                        /* include space for null and size */
                    129:                ptr = hicore;           /* set pointer for copy */
                    130:                *ptr = ssize;           /* put size of 1st string in 1st loc */
                    131:                ssymtab[j][k] = ptr;    /* put pointer in sym. table */
                    132: 
                    133:                if((unsigned)hicore & 1)        /* hicore to even boundry */
                    134:                        hicore--;
                    135:                ptr++;          /* bump past size */
                    136:        }
                    137: 
                    138:        while(*ptr++ = *cptr++); /* copy string into storage */
                    139: 
                    140:        return(0);
                    141: }
                    142: #ifdef notdef
                    143: /*
                    144:  * Return size of string up to first null character
                    145:  */
                    146: static strlen(s)
                    147: char   *s;
                    148: {
                    149:        register count;
                    150:        for(count = 0; s[count]; count++);
                    151:        return(count);
                    152: }
                    153: #endif

unix.superglobalmegacorp.com

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