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