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