1 /* $Header: str.c,v 2.0.1.1 88/06/28 16:38:11 root Exp $
4 * Revision 2.0.1.1 88/06/28 16:38:11 root
5 * patch1: autoincrement of '' didn't work right.
7 * Revision 2.0 88/06/05 00:11:07 root
8 * Baseline version 2.0.
24 if (!*s) { /* reset ?? searches */
25 for (spat = spat_root; spat != Nullspat; spat = spat->spat_next) {
26 spat->spat_flags &= ~SPAT_USED;
39 for ( ; i <= max; i++) {
40 for (stab = stab_index[i]; stab; stab = stab->stab_next) {
44 if (str->str_ptr != Nullch)
45 str->str_ptr[0] = '\0';
46 if (stab->stab_array) {
47 aclear(stab->stab_array);
49 if (stab->stab_hash) {
50 hclear(stab->stab_hash);
62 str->str_pok = 0; /* invalidate pointer */
63 str->str_nok = 1; /* validate number */
77 GROWSTR(&(str->str_ptr), &(str->str_len), 24);
80 olderrno = errno; /* some Xenix systems wipe out errno here */
81 #if defined(scs) && defined(ns32000)
82 gcvt(str->str_nval,20,s);
85 if (str->str_nval == 0.0)
89 sprintf(s,"%.20g",str->str_nval);
95 warn("Use of uninitialized variable");
97 str->str_cur = s - str->str_ptr;
101 fprintf(stderr,"0x%lx ptr(%s)\n",str,str->str_ptr);
112 if (str->str_len && str->str_pok)
113 str->str_nval = atof(str->str_ptr);
116 fprintf(stderr,"Use of uninitialized variable in %s line %ld.\n",
117 filename,(long)line);
123 fprintf(stderr,"0x%lx num(%g)\n",str,str->str_nval);
125 return str->str_nval;
134 else if (sstr->str_nok)
135 str_numset(dstr,sstr->str_nval);
136 else if (sstr->str_pok)
137 str_nset(dstr,sstr->str_ptr,sstr->str_cur);
142 str_nset(str,ptr,len)
147 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
148 bcopy(ptr,str->str_ptr,len);
150 *(str->str_ptr+str->str_cur) = '\0';
151 str->str_nok = 0; /* invalidate number */
152 str->str_pok = 1; /* validate pointer */
164 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
165 bcopy(ptr,str->str_ptr,len+1);
167 str->str_nok = 0; /* invalidate number */
168 str->str_pok = 1; /* validate pointer */
171 str_chop(str,ptr) /* like set but assuming ptr is in str */
177 str->str_cur -= (ptr - str->str_ptr);
178 bcopy(ptr,str->str_ptr, str->str_cur + 1);
179 str->str_nok = 0; /* invalidate number */
180 str->str_pok = 1; /* validate pointer */
183 str_ncat(str,ptr,len)
190 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + len + 1);
191 bcopy(ptr,str->str_ptr+str->str_cur,len);
193 *(str->str_ptr+str->str_cur) = '\0';
194 str->str_nok = 0; /* invalidate number */
195 str->str_pok = 1; /* validate pointer */
204 if (!(sstr->str_pok))
207 str_ncat(dstr,sstr->str_ptr,sstr->str_cur);
221 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + len + 1);
222 bcopy(ptr,str->str_ptr+str->str_cur,len+1);
224 str->str_nok = 0; /* invalidate number */
225 str->str_pok = 1; /* validate pointer */
229 str_append_till(str,from,delim,keeplist)
241 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + len + 1);
242 str->str_nok = 0; /* invalidate number */
243 str->str_pok = 1; /* validate pointer */
244 to = str->str_ptr+str->str_cur;
245 for (; *from; from++,to++) {
246 if (*from == '\\' && from[1] && delim != '\\') {
248 if (from[1] == delim || from[1] == '\\')
253 else if (index(keeplist,from[1]))
258 else if (*from == delim)
263 str->str_cur = to - str->str_ptr;
275 freestrroot = str->str_link.str_next;
276 str->str_link.str_magic = Nullstab;
279 str = (STR *) safemalloc(sizeof(STR));
280 bzero((char*)str,sizeof(STR));
283 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
293 GROWSTR(&(str->str_ptr), &(str->str_len), len + 1);
296 /* make str point to what nstr did */
299 str_replace(str,nstr)
303 safefree(str->str_ptr);
304 str->str_ptr = nstr->str_ptr;
305 str->str_len = nstr->str_len;
306 str->str_cur = nstr->str_cur;
307 str->str_pok = nstr->str_pok;
308 if (str->str_nok = nstr->str_nok)
309 str->str_nval = nstr->str_nval;
310 safefree((char*)nstr);
320 str->str_ptr[0] = '\0';
324 str->str_link.str_next = freestrroot;
346 #ifdef STDSTDIO /* Here is some breathtakingly efficient cheating */
348 register char *bp; /* we're going to steal some values */
349 register int cnt; /* from the stdio struct and put EVERYTHING */
350 register STDCHAR *ptr; /* in the innermost loop into registers */
351 register char newline = record_separator;/* (assuming >= 6 registers) */
355 register int get_paragraph;
356 register char *oldbp;
358 if (get_paragraph = !newline) { /* yes, that's an assignment */
360 oldbp = Nullch; /* remember last \n position (none) */
362 cnt = fp->_cnt; /* get count into register */
363 str->str_nok = 0; /* invalidate number */
364 str->str_pok = 1; /* validate pointer */
365 if (str->str_len <= cnt) /* make sure we have the room */
366 GROWSTR(&(str->str_ptr), &(str->str_len), cnt+1);
367 bp = str->str_ptr; /* move these two too to registers */
371 while (--cnt >= 0) { /* this */ /* eat */
372 if ((*bp++ = *ptr++) == newline) /* really */ /* dust */
373 goto thats_all_folks; /* screams */ /* sed :-) */
376 fp->_cnt = cnt; /* deregisterize cnt and ptr */
378 i = _filbuf(fp); /* get more characters */
380 ptr = fp->_ptr; /* reregisterize cnt and ptr */
382 bpx = bp - str->str_ptr; /* prepare for possible relocation */
383 if (get_paragraph && oldbp)
384 obpx = oldbp - str->str_ptr;
385 GROWSTR(&(str->str_ptr), &(str->str_len), bpx + cnt + 2);
386 bp = str->str_ptr + bpx; /* reconstitute our pointer */
387 if (get_paragraph && oldbp)
388 oldbp = str->str_ptr + obpx;
390 if (i == newline) { /* all done for now? */
392 goto thats_all_folks;
394 else if (i == EOF) /* all done for ever? */
395 goto thats_really_all_folks;
396 *bp++ = i; /* now go back to screaming loop */
400 if (get_paragraph && bp - 1 != oldbp) {
401 oldbp = bp; /* remember where this newline was */
402 goto screamer; /* and go back to the fray */
404 thats_really_all_folks:
405 fp->_cnt = cnt; /* put these back or we're in trouble */
408 str->str_cur = bp - str->str_ptr; /* set length */
410 #else /* !STDSTDIO */ /* The big, slow, and stupid way */
412 static char buf[4192];
414 if (fgets(buf, sizeof buf, fp) != Nullch)
419 #endif /* STDSTDIO */
421 return str->str_cur ? str->str_ptr : Nullch;
430 register char *t = s;
431 char *envsave = envname;
436 if (*s == '\\' && s[1] == '\\') {
437 str_ncat(str, t, s++ - t);
440 else if (*s == '\\' && s[1] == '$') {
441 str_ncat(str, t, s++ - t);
444 else if (*s == '$' && s[1] && s[1] != '|') {
446 s = scanreg(s,tokenbuf);
447 str_cat(str,reg_get(tokenbuf));
467 str->str_nval += 1.0;
471 if (!str->str_pok || !*str->str_ptr) {
478 while (isalpha(*d)) d++;
479 while (isdigit(*d)) d++;
481 str_numset(str,atof(str->str_ptr) + 1.0); /* punt */
485 while (d >= str->str_ptr) {
495 *(d--) -= 'z' - 'a' + 1;
498 /* oh,oh, the number grew */
499 GROWSTR(&(str->str_ptr), &(str->str_len), str->str_cur + 2);
501 for (d = str->str_ptr + str->str_cur; d > str->str_ptr; d--)
516 str->str_nval -= 1.0;
521 str->str_nval = -1.0;
525 str_numset(str,atof(str->str_ptr) - 1.0);
528 /* make a string that will exist for the duration of the expression eval */
534 register STR *str = str_new(0);
535 static long tmps_size = -1;
537 str_sset(str,oldstr);
538 if (++tmps_max > tmps_size) {
539 tmps_size = tmps_max;
540 if (!(tmps_size & 127)) {
542 tmps_list = (STR**)saferealloc((char*)tmps_list,
543 (MEM_SIZE)((tmps_size + 128) * sizeof(STR*)) );
545 tmps_list = (STR**)safemalloc(128 * sizeof(char*));
548 tmps_list[tmps_max] = str;
556 register STR *str = str_new(0);
566 register STR *str = str_new(0);