1*776Speter /* Copyright (c) 1979 Regents of the University of California */ 2*776Speter 3*776Speter static char sccsid[] = "@(#)string.c 1.1 08/27/80"; 4*776Speter 5*776Speter #include "whoami.h" 6*776Speter #include "0.h" 7*776Speter #ifndef PI01 8*776Speter #ifndef PXP 9*776Speter #include "send.h" 10*776Speter #endif 11*776Speter #endif 12*776Speter 13*776Speter /* 14*776Speter * STRING SPACE DECLARATIONS 15*776Speter * 16*776Speter * Strng is the base of the current 17*776Speter * string space and strngp the 18*776Speter * base of the free area therein. 19*776Speter * Strp is the array of descriptors. 20*776Speter */ 21*776Speter #ifndef PI0 22*776Speter STATIC char strings[STRINC]; 23*776Speter STATIC char *strng = strings; 24*776Speter STATIC char *strngp = strings; 25*776Speter #else 26*776Speter char *strng, *strngp; 27*776Speter #endif 28*776Speter #ifndef PI01 29*776Speter #ifndef PXP 30*776Speter STATIC char *strp[20]; 31*776Speter STATIC char **stract strp; 32*776Speter int strmax; 33*776Speter #endif 34*776Speter #endif 35*776Speter 36*776Speter #ifndef PI01 37*776Speter #ifndef PXP 38*776Speter #ifndef PI0 39*776Speter initstring() 40*776Speter #else 41*776Speter initstring(strings) 42*776Speter char *strings; 43*776Speter #endif 44*776Speter { 45*776Speter 46*776Speter *stract++ = strings; 47*776Speter #ifdef PI0 48*776Speter strng = strngp = strings; 49*776Speter #endif 50*776Speter strmax = STRINC * 2; 51*776Speter } 52*776Speter #endif 53*776Speter #endif 54*776Speter 55*776Speter /* 56*776Speter * Copy a string into the string area. 57*776Speter */ 58*776Speter char * 59*776Speter savestr(cp) 60*776Speter register char *cp; 61*776Speter { 62*776Speter register int i; 63*776Speter 64*776Speter i = strlen(cp) + 1; 65*776Speter if (strngp + i >= strng + STRINC) { 66*776Speter strngp = malloc(STRINC); 67*776Speter if (strngp == -1) { 68*776Speter yerror("Ran out of memory (string)"); 69*776Speter pexit(DIED); 70*776Speter } 71*776Speter #ifndef PI01 72*776Speter #ifndef PXP 73*776Speter *stract++ = strngp; 74*776Speter strmax =+ STRINC; 75*776Speter #endif 76*776Speter #endif 77*776Speter strng = strngp; 78*776Speter } 79*776Speter strcpy(strngp, cp); 80*776Speter cp = strngp; 81*776Speter strngp = cp + i; 82*776Speter #ifdef PI0 83*776Speter send(RSTRING, cp); 84*776Speter #endif 85*776Speter return (cp); 86*776Speter } 87*776Speter 88*776Speter #ifndef PI1 89*776Speter #ifndef PXP 90*776Speter esavestr(cp) 91*776Speter char *cp; 92*776Speter { 93*776Speter 94*776Speter #ifdef PI0 95*776Speter send(REVENIT); 96*776Speter #endif 97*776Speter strngp = ( (char *) ( ( (int) (strngp + 1) ) &~ 1 ) ); 98*776Speter return (savestr(cp)); 99*776Speter } 100*776Speter #endif 101*776Speter #endif 102*776Speter 103*776Speter #ifndef PI01 104*776Speter #ifndef PXP 105*776Speter soffset(cp) 106*776Speter register char *cp; 107*776Speter { 108*776Speter register char **sp; 109*776Speter register int i; 110*776Speter 111*776Speter if (cp == NIL || cp == OCT || cp == HEX) 112*776Speter return (-cp); 113*776Speter for (i = STRINC, sp = strp; sp < stract; sp++) { 114*776Speter if (cp >= *sp && cp < (*sp + STRINC)) 115*776Speter return (i + (cp - *sp)); 116*776Speter i =+ STRINC; 117*776Speter } 118*776Speter i = nlfund(cp); 119*776Speter if (i != 0) 120*776Speter return (i); 121*776Speter panic("soffset"); 122*776Speter } 123*776Speter #ifdef PI1 124*776Speter sreloc(i) 125*776Speter register int i; 126*776Speter { 127*776Speter 128*776Speter if (i == 0 || i == -OCT || i == -HEX) 129*776Speter return (-i); 130*776Speter if (i < STRINC) { 131*776Speter if (i >= INL) 132*776Speter panic("sreloc INL"); 133*776Speter i = nl[i].symbol; 134*776Speter if (i == 0) 135*776Speter panic("sreloc nl[i]"); 136*776Speter return (i); 137*776Speter } 138*776Speter if (i > strmax || i < 0) 139*776Speter panic("sreloc"); 140*776Speter return (strp[(i / STRINC) - 1] + (i % STRINC)); 141*776Speter } 142*776Speter 143*776Speter evenit() 144*776Speter { 145*776Speter 146*776Speter strngp = (strngp + 1) &~ 1; 147*776Speter } 148*776Speter #endif 149*776Speter #endif 150*776Speter #endif 151