122195Sdist /* 222195Sdist * Copyright (c) 1980 Regents of the University of California. 322195Sdist * All rights reserved. The Berkeley software License Agreement 422195Sdist * specifies the terms and conditions for redistribution. 522195Sdist */ 6776Speter 714744Sthien #ifndef lint 8*32765Sbostic static char sccsid[] = "@(#)string.c 5.4 (Berkeley) 12/04/87"; 922195Sdist #endif not lint 10776Speter 11776Speter #include "whoami.h" 1230837Smckusick #include "align.h" 13776Speter #include "0.h" 14776Speter #ifndef PI01 15776Speter #ifndef PXP 16776Speter #include "send.h" 17776Speter #endif 18776Speter #endif 19776Speter 20776Speter /* 21776Speter * STRING SPACE DECLARATIONS 22776Speter * 23776Speter * Strng is the base of the current 24776Speter * string space and strngp the 25776Speter * base of the free area therein. 26776Speter * Strp is the array of descriptors. 27776Speter */ 28776Speter #ifndef PI0 29776Speter STATIC char strings[STRINC]; 30776Speter STATIC char *strng = strings; 31776Speter STATIC char *strngp = strings; 32776Speter #else 33776Speter char *strng, *strngp; 34776Speter #endif 35776Speter #ifndef PI01 36776Speter #ifndef PXP 37776Speter STATIC char *strp[20]; 38776Speter STATIC char **stract strp; 39776Speter int strmax; 40776Speter #endif 41776Speter #endif 42776Speter 43776Speter #ifndef PI01 44776Speter #ifndef PXP 45776Speter #ifndef PI0 46776Speter initstring() 47776Speter #else 48776Speter initstring(strings) 49776Speter char *strings; 50776Speter #endif 51776Speter { 52776Speter 53776Speter *stract++ = strings; 54776Speter #ifdef PI0 55776Speter strng = strngp = strings; 56776Speter #endif 57776Speter strmax = STRINC * 2; 58776Speter } 59776Speter #endif 60776Speter #endif 61776Speter 62776Speter /* 63776Speter * Copy a string into the string area. 64776Speter */ 65776Speter char * 66776Speter savestr(cp) 67776Speter register char *cp; 68776Speter { 69776Speter register int i; 70776Speter 71776Speter i = strlen(cp) + 1; 72776Speter if (strngp + i >= strng + STRINC) { 73776Speter strngp = malloc(STRINC); 741835Speter if (strngp == 0) { 75776Speter yerror("Ran out of memory (string)"); 76776Speter pexit(DIED); 77776Speter } 78776Speter #ifndef PI01 79776Speter #ifndef PXP 80776Speter *stract++ = strngp; 81*32765Sbostic strmax += STRINC; 82776Speter #endif 83776Speter #endif 84776Speter strng = strngp; 85776Speter } 8614744Sthien (void) pstrcpy(strngp, cp); 87776Speter cp = strngp; 88776Speter strngp = cp + i; 89776Speter #ifdef PI0 90776Speter send(RSTRING, cp); 91776Speter #endif 92776Speter return (cp); 93776Speter } 94776Speter 95776Speter #ifndef PI1 96776Speter #ifndef PXP 9714744Sthien char * 98776Speter esavestr(cp) 99776Speter char *cp; 100776Speter { 101776Speter 102776Speter #ifdef PI0 103776Speter send(REVENIT); 104776Speter #endif 10530837Smckusick strngp = ( (char *) roundup( strngp, A_LONG ) ); 106776Speter return (savestr(cp)); 107776Speter } 108776Speter #endif 109776Speter #endif 110776Speter 111776Speter #ifndef PI01 112776Speter #ifndef PXP 113776Speter soffset(cp) 114776Speter register char *cp; 115776Speter { 116776Speter register char **sp; 117776Speter register int i; 118776Speter 119776Speter if (cp == NIL || cp == OCT || cp == HEX) 120776Speter return (-cp); 121776Speter for (i = STRINC, sp = strp; sp < stract; sp++) { 122776Speter if (cp >= *sp && cp < (*sp + STRINC)) 123776Speter return (i + (cp - *sp)); 124*32765Sbostic i += STRINC; 125776Speter } 126776Speter i = nlfund(cp); 127776Speter if (i != 0) 128776Speter return (i); 129776Speter panic("soffset"); 130776Speter } 131776Speter #ifdef PI1 132776Speter sreloc(i) 133776Speter register int i; 134776Speter { 135776Speter 136776Speter if (i == 0 || i == -OCT || i == -HEX) 137776Speter return (-i); 138776Speter if (i < STRINC) { 139776Speter if (i >= INL) 140776Speter panic("sreloc INL"); 141776Speter i = nl[i].symbol; 142776Speter if (i == 0) 143776Speter panic("sreloc nl[i]"); 144776Speter return (i); 145776Speter } 146776Speter if (i > strmax || i < 0) 147776Speter panic("sreloc"); 148776Speter return (strp[(i / STRINC) - 1] + (i % STRINC)); 149776Speter } 150776Speter #endif 151776Speter #endif 152776Speter #endif 153