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