1 /* $Header: str.c,v 1.0.1.1 88/01/21 21:28:39 root Exp $
4 * Revision 1.0.1.1 88/01/21 21:28:39 root
5 * Suppressed warning messages on signed vs unsigned chars in str_gets().
7 * Revision 1.0 87/12/18 13:06:22 root
27 if (!*s) { /* reset ?? searches */
28 for (spat = spat_root; spat != Nullspat; spat = spat->spat_next) {
29 spat->spat_flags &= ~SPAT_USED;
42 for ( ; i <= max; i++) {
43 for (stab = stab_index[i]; stab; stab = stab->stab_next) {
46 if (str->str_ptr != Nullch)
47 str->str_ptr[0] = '\0';
58 str->str_pok = 0; /* invalidate pointer */
59 str->str_nok = 1; /* validate number */
70 GROWSTR(&(str->str_ptr), &(str->str_len), 24);
73 sprintf(s,"%.20g",str->str_nval);
77 str->str_cur = s - str->str_ptr;
81 fprintf(stderr,"0x%lx ptr(%s)\n",str,str->str_ptr);
92 if (str->str_len && str->str_pok)
93 str->str_nval = atof(str->str_ptr);
99 fprintf(stderr,"0x%lx num(%g)\n",str,str->str_nval);
101 return str->str_nval;
110 else if (sstr->str_nok)
111 str_numset(dstr,sstr->str_nval);
112 else if (sstr->str_pok)
113 str_nset(dstr,sstr->str_ptr,sstr->str_cur);
118 str_nset(str,ptr,len)
123 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
124 bcopy(ptr,str->str_ptr,len);
126 *(str->str_ptr+str->str_cur) = '\0';
127 str->str_nok = 0; /* invalidate number */
128 str->str_pok = 1; /* validate pointer */
140 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
141 bcopy(ptr,str->str_ptr,len+1);
143 str->str_nok = 0; /* invalidate number */
144 str->str_pok = 1; /* validate pointer */
147 str_chop(str,ptr) /* like set but assuming ptr is in str */
153 str->str_cur -= (ptr - str->str_ptr);
154 bcopy(ptr,str->str_ptr, str->str_cur + 1);
155 str->str_nok = 0; /* invalidate number */
156 str->str_pok = 1; /* validate pointer */
159 str_ncat(str,ptr,len)
166 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + len + 1);
167 bcopy(ptr,str->str_ptr+str->str_cur,len);
169 *(str->str_ptr+str->str_cur) = '\0';
170 str->str_nok = 0; /* invalidate number */
171 str->str_pok = 1; /* validate pointer */
178 if (!(sstr->str_pok))
181 str_ncat(dstr,sstr->str_ptr,sstr->str_cur);
195 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + len + 1);
196 bcopy(ptr,str->str_ptr+str->str_cur,len+1);
198 str->str_nok = 0; /* invalidate number */
199 str->str_pok = 1; /* validate pointer */
203 str_append_till(str,from,delim,keeplist)
215 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + len + 1);
216 str->str_nok = 0; /* invalidate number */
217 str->str_pok = 1; /* validate pointer */
218 to = str->str_ptr+str->str_cur;
219 for (; *from; from++,to++) {
220 if (*from == '\\' && from[1] && delim != '\\') {
222 if (from[1] == delim || from[1] == '\\')
227 else if (index(keeplist,from[1]))
232 else if (*from == delim)
237 str->str_cur = to - str->str_ptr;
249 freestrroot = str->str_link.str_next;
250 str->str_link.str_magic = Nullstab;
253 str = (STR *) safemalloc(sizeof(STR));
254 bzero((char*)str,sizeof(STR));
257 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
267 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
270 /* make str point to what nstr did */
273 str_replace(str,nstr)
277 safefree(str->str_ptr);
278 str->str_ptr = nstr->str_ptr;
279 str->str_len = nstr->str_len;
280 str->str_cur = nstr->str_cur;
281 str->str_pok = nstr->str_pok;
282 if (str->str_nok = nstr->str_nok)
283 str->str_nval = nstr->str_nval;
284 safefree((char*)nstr);
294 str->str_ptr[0] = '\0';
298 str->str_link.str_next = freestrroot;
320 #ifdef STDSTDIO /* Here is some breathtakingly efficient cheating */
322 register char *bp; /* we're going to steal some values */
323 register int cnt; /* from the stdio struct and put EVERYTHING */
324 register STDCHAR *ptr; /* in the innermost loop into registers */
325 register char newline = record_separator;/* (assuming >= 6 registers) */
329 register int get_paragraph;
330 register char *oldbp;
332 if (get_paragraph = !newline) { /* yes, that's an assignment */
334 oldbp = Nullch; /* remember last \n position (none) */
336 cnt = fp->_cnt; /* get count into register */
337 str->str_nok = 0; /* invalidate number */
338 str->str_pok = 1; /* validate pointer */
339 if (str->str_len <= cnt) /* make sure we have the room */
340 GROWSTR(&(str->str_ptr), &(str->str_len), cnt+1);
341 bp = str->str_ptr; /* move these two too to registers */
345 while (--cnt >= 0) { /* this */ /* eat */
346 if ((*bp++ = *ptr++) == newline) /* really */ /* dust */
347 goto thats_all_folks; /* screams */ /* sed :-) */
350 fp->_cnt = cnt; /* deregisterize cnt and ptr */
352 i = _filbuf(fp); /* get more characters */
354 ptr = fp->_ptr; /* reregisterize cnt and ptr */
356 bpx = bp - str->str_ptr; /* prepare for possible relocation */
357 if (get_paragraph && oldbp)
358 obpx = oldbp - str->str_ptr;
359 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + cnt + 1);
360 bp = str->str_ptr + bpx; /* reconstitute our pointer */
361 if (get_paragraph && oldbp)
362 oldbp = str->str_ptr + obpx;
364 if (i == newline) { /* all done for now? */
366 goto thats_all_folks;
368 else if (i == EOF) /* all done for ever? */
369 goto thats_really_all_folks;
370 *bp++ = i; /* now go back to screaming loop */
374 if (get_paragraph && bp - 1 != oldbp) {
375 oldbp = bp; /* remember where this newline was */
376 goto screamer; /* and go back to the fray */
378 thats_really_all_folks:
379 fp->_cnt = cnt; /* put these back or we're in trouble */
382 str->str_cur = bp - str->str_ptr; /* set length */
384 #else /* !STDSTDIO */ /* The big, slow, and stupid way */
386 static char buf[4192];
388 if (fgets(buf, sizeof buf, fp) != Nullch)
393 #endif /* STDSTDIO */
395 return str->str_cur ? str->str_ptr : Nullch;
404 register char *t = s;
405 char *envsave = envname;
410 if (*s == '\\' && s[1] == '$') {
411 str_ncat(str, t, s++ - t);
414 else if (*s == '$' && s[1] && s[1] != '|') {
416 s = scanreg(s,tokenbuf);
417 str_cat(str,reg_get(tokenbuf));
437 str->str_nval += 1.0;
446 for (d = str->str_ptr; *d && *d != '.'; d++) ;
448 if (!isdigit(*str->str_ptr) || !isdigit(*d) ) {
449 str_numset(str,atof(str->str_ptr) + 1.0); /* punt */
452 while (d >= str->str_ptr) {
457 /* oh,oh, the number grew */
458 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + 2);
460 for (d = str->str_ptr + str->str_cur; d > str->str_ptr; d--)
474 str->str_nval -= 1.0;
479 str->str_nval = -1.0;
483 for (d = str->str_ptr; *d && *d != '.'; d++) ;
485 if (!isdigit(*str->str_ptr) || !isdigit(*d) || (*d == '0' && d == str->str_ptr)) {
486 str_numset(str,atof(str->str_ptr) - 1.0); /* punt */
489 while (d >= str->str_ptr) {
496 /* make a string that will exist for the duration of the expression eval */
502 register STR *str = str_new(0);
503 static long tmps_size = -1;
505 str_sset(str,oldstr);
506 if (++tmps_max > tmps_size) {
507 tmps_size = tmps_max;
508 if (!(tmps_size & 127)) {
510 tmps_list = (STR**)saferealloc((char*)tmps_list,
511 (tmps_size + 128) * sizeof(STR*) );
513 tmps_list = (STR**)safemalloc(128 * sizeof(char*));
516 tmps_list[tmps_max] = str;
524 register STR *str = str_new(0);
534 register STR *str = str_new(0);