1776Speter /* Copyright (c) 1979 Regents of the University of California */ 2776Speter 3*1835Speter static char sccsid[] = "@(#)string.c 1.2 11/24/80"; 4776Speter 5776Speter #include "whoami.h" 6776Speter #include "0.h" 7776Speter #ifndef PI01 8776Speter #ifndef PXP 9776Speter #include "send.h" 10776Speter #endif 11776Speter #endif 12776Speter 13776Speter /* 14776Speter * STRING SPACE DECLARATIONS 15776Speter * 16776Speter * Strng is the base of the current 17776Speter * string space and strngp the 18776Speter * base of the free area therein. 19776Speter * Strp is the array of descriptors. 20776Speter */ 21776Speter #ifndef PI0 22776Speter STATIC char strings[STRINC]; 23776Speter STATIC char *strng = strings; 24776Speter STATIC char *strngp = strings; 25776Speter #else 26776Speter char *strng, *strngp; 27776Speter #endif 28776Speter #ifndef PI01 29776Speter #ifndef PXP 30776Speter STATIC char *strp[20]; 31776Speter STATIC char **stract strp; 32776Speter int strmax; 33776Speter #endif 34776Speter #endif 35776Speter 36776Speter #ifndef PI01 37776Speter #ifndef PXP 38776Speter #ifndef PI0 39776Speter initstring() 40776Speter #else 41776Speter initstring(strings) 42776Speter char *strings; 43776Speter #endif 44776Speter { 45776Speter 46776Speter *stract++ = strings; 47776Speter #ifdef PI0 48776Speter strng = strngp = strings; 49776Speter #endif 50776Speter strmax = STRINC * 2; 51776Speter } 52776Speter #endif 53776Speter #endif 54776Speter 55776Speter /* 56776Speter * Copy a string into the string area. 57776Speter */ 58776Speter char * 59776Speter savestr(cp) 60776Speter register char *cp; 61776Speter { 62776Speter register int i; 63776Speter 64776Speter i = strlen(cp) + 1; 65776Speter if (strngp + i >= strng + STRINC) { 66776Speter strngp = malloc(STRINC); 67*1835Speter if (strngp == 0) { 68776Speter yerror("Ran out of memory (string)"); 69776Speter pexit(DIED); 70776Speter } 71776Speter #ifndef PI01 72776Speter #ifndef PXP 73776Speter *stract++ = strngp; 74776Speter strmax =+ STRINC; 75776Speter #endif 76776Speter #endif 77776Speter strng = strngp; 78776Speter } 79776Speter strcpy(strngp, cp); 80776Speter cp = strngp; 81776Speter strngp = cp + i; 82776Speter #ifdef PI0 83776Speter send(RSTRING, cp); 84776Speter #endif 85776Speter return (cp); 86776Speter } 87776Speter 88776Speter #ifndef PI1 89776Speter #ifndef PXP 90776Speter esavestr(cp) 91776Speter char *cp; 92776Speter { 93776Speter 94776Speter #ifdef PI0 95776Speter send(REVENIT); 96776Speter #endif 97776Speter strngp = ( (char *) ( ( (int) (strngp + 1) ) &~ 1 ) ); 98776Speter return (savestr(cp)); 99776Speter } 100776Speter #endif 101776Speter #endif 102776Speter 103776Speter #ifndef PI01 104776Speter #ifndef PXP 105776Speter soffset(cp) 106776Speter register char *cp; 107776Speter { 108776Speter register char **sp; 109776Speter register int i; 110776Speter 111776Speter if (cp == NIL || cp == OCT || cp == HEX) 112776Speter return (-cp); 113776Speter for (i = STRINC, sp = strp; sp < stract; sp++) { 114776Speter if (cp >= *sp && cp < (*sp + STRINC)) 115776Speter return (i + (cp - *sp)); 116776Speter i =+ STRINC; 117776Speter } 118776Speter i = nlfund(cp); 119776Speter if (i != 0) 120776Speter return (i); 121776Speter panic("soffset"); 122776Speter } 123776Speter #ifdef PI1 124776Speter sreloc(i) 125776Speter register int i; 126776Speter { 127776Speter 128776Speter if (i == 0 || i == -OCT || i == -HEX) 129776Speter return (-i); 130776Speter if (i < STRINC) { 131776Speter if (i >= INL) 132776Speter panic("sreloc INL"); 133776Speter i = nl[i].symbol; 134776Speter if (i == 0) 135776Speter panic("sreloc nl[i]"); 136776Speter return (i); 137776Speter } 138776Speter if (i > strmax || i < 0) 139776Speter panic("sreloc"); 140776Speter return (strp[(i / STRINC) - 1] + (i % STRINC)); 141776Speter } 142776Speter 143776Speter evenit() 144776Speter { 145776Speter 146776Speter strngp = (strngp + 1) &~ 1; 147776Speter } 148776Speter #endif 149776Speter #endif 150776Speter #endif 151