Coverage Report

Created: 2023-06-07 06:06

/src/igraph/vendor/f2c/fmt.c
Line
Count
Source (jump to first uncovered line)
1
#include "f2c.h"
2
#include "fio.h"
3
#include "fmt.h"
4
#ifdef __cplusplus
5
extern "C" {
6
#endif
7
0
#define skip(s) while(*s==' ') s++
8
#ifdef interdata
9
#define SYLMX 300
10
#endif
11
#ifdef pdp11
12
#define SYLMX 300
13
#endif
14
#ifdef vax
15
#define SYLMX 300
16
#endif
17
#ifndef SYLMX
18
0
#define SYLMX 300
19
#endif
20
0
#define GLITCH '\2'
21
  /* special quote character for stu */
22
extern flag f__cblank,f__cplus; /*blanks in I and compulsory plus*/
23
static struct syl f__syl[SYLMX];
24
int f__parenlvl,f__pc,f__revloc;
25
#ifdef KR_headers
26
#define Const /*nothing*/
27
#else
28
0
#define Const const
29
#endif
30
31
 static
32
#ifdef KR_headers
33
char *ap_end(s) char *s;
34
#else
35
const char *ap_end(const char *s)
36
#endif
37
0
{ char quote;
38
0
  quote= *s++;
39
0
  for(;*s;s++)
40
0
  { if(*s!=quote) continue;
41
0
    if(*++s!=quote) return(s);
42
0
  }
43
0
  if(f__elist->cierr) {
44
0
    errno = 100;
45
0
    return(NULL);
46
0
  }
47
0
  f__fatal(100, "bad string");
48
0
  /*NOTREACHED*/ return 0;
49
0
}
50
 static int
51
#ifdef KR_headers
52
op_gen(a,b,c,d)
53
#else
54
op_gen(int a, int b, int c, int d)
55
#endif
56
0
{ struct syl *p= &f__syl[f__pc];
57
0
  if(f__pc>=SYLMX)
58
0
  { fprintf(stderr,"format too complicated:\n");
59
0
    sig_die(f__fmtbuf, 1);
60
0
  }
61
0
  p->op=a;
62
0
  p->p1=b;
63
0
  p->p2.i[0]=c;
64
0
  p->p2.i[1]=d;
65
0
  return(f__pc++);
66
0
}
67
#ifdef KR_headers
68
static char *f_list();
69
static char *gt_num(s,n,n1) char *s; int *n, n1;
70
#else
71
static const char *f_list(const char*);
72
static const char *gt_num(const char *s, int *n, int n1)
73
#endif
74
0
{ int m=0,f__cnt=0;
75
0
  char c;
76
0
  for(c= *s;;c = *s)
77
0
  { if(c==' ')
78
0
    { s++;
79
0
      continue;
80
0
    }
81
0
    if(c>'9' || c<'0') break;
82
0
    m=10*m+c-'0';
83
0
    f__cnt++;
84
0
    s++;
85
0
  }
86
0
  if(f__cnt==0) {
87
0
    if (!n1)
88
0
      s = 0;
89
0
    *n=n1;
90
0
    }
91
0
  else *n=m;
92
0
  return(s);
93
0
}
94
95
 static
96
#ifdef KR_headers
97
char *f_s(s,curloc) char *s;
98
#else
99
const char *f_s(const char *s, int curloc)
100
#endif
101
0
{
102
0
  skip(s);
103
0
  if(*s++!='(')
104
0
  {
105
0
    return(NULL);
106
0
  }
107
0
  if(f__parenlvl++ ==1) f__revloc=curloc;
108
0
  if(op_gen(RET1,curloc,0,0)<0 ||
109
0
    (s=f_list(s))==NULL)
110
0
  {
111
0
    return(NULL);
112
0
  }
113
0
  skip(s);
114
0
  return(s);
115
0
}
116
117
 static int
118
#ifdef KR_headers
119
ne_d(s,p) char *s,**p;
120
#else
121
ne_d(const char *s, const char **p)
122
#endif
123
0
{ int n,x,sign=0;
124
0
  struct syl *sp;
125
0
  switch(*s)
126
0
  {
127
0
  default:
128
0
    return(0);
129
0
  case ':': (void) op_gen(COLON,0,0,0); break;
130
0
  case '$':
131
0
    (void) op_gen(NONL, 0, 0, 0); break;
132
0
  case 'B':
133
0
  case 'b':
134
0
    if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
135
0
    else (void) op_gen(BN,0,0,0);
136
0
    break;
137
0
  case 'S':
138
0
  case 's':
139
0
    if(*(s+1)=='s' || *(s+1) == 'S')
140
0
    { x=SS;
141
0
      s++;
142
0
    }
143
0
    else if(*(s+1)=='p' || *(s+1) == 'P')
144
0
    { x=SP;
145
0
      s++;
146
0
    }
147
0
    else x=S;
148
0
    (void) op_gen(x,0,0,0);
149
0
    break;
150
0
  case '/': (void) op_gen(SLASH,0,0,0); break;
151
0
  case '-': sign=1;
152
0
  case '+': s++;  /*OUTRAGEOUS CODING TRICK*/
153
0
  case '0': case '1': case '2': case '3': case '4':
154
0
  case '5': case '6': case '7': case '8': case '9':
155
0
    if (!(s=gt_num(s,&n,0))) {
156
0
 bad:      *p = 0;
157
0
      return 1;
158
0
      }
159
0
    switch(*s)
160
0
    {
161
0
    default:
162
0
      return(0);
163
0
    case 'P':
164
0
    case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
165
0
    case 'X':
166
0
    case 'x': (void) op_gen(X,n,0,0); break;
167
0
    case 'H':
168
0
    case 'h':
169
0
      sp = &f__syl[op_gen(H,n,0,0)];
170
0
      sp->p2.s = (char*)s + 1;
171
0
      s+=n;
172
0
      break;
173
0
    }
174
0
    break;
175
0
  case GLITCH:
176
0
  case '"':
177
0
  case '\'':
178
0
    sp = &f__syl[op_gen(APOS,0,0,0)];
179
0
    sp->p2.s = (char*)s;
180
0
    if((*p = ap_end(s)) == NULL)
181
0
      return(0);
182
0
    return(1);
183
0
  case 'T':
184
0
  case 't':
185
0
    if(*(s+1)=='l' || *(s+1) == 'L')
186
0
    { x=TL;
187
0
      s++;
188
0
    }
189
0
    else if(*(s+1)=='r'|| *(s+1) == 'R')
190
0
    { x=TR;
191
0
      s++;
192
0
    }
193
0
    else x=T;
194
0
    if (!(s=gt_num(s+1,&n,0)))
195
0
      goto bad;
196
0
    s--;
197
0
    (void) op_gen(x,n,0,0);
198
0
    break;
199
0
  case 'X':
200
0
  case 'x': (void) op_gen(X,1,0,0); break;
201
0
  case 'P':
202
0
  case 'p': (void) op_gen(P,1,0,0); break;
203
0
  }
204
0
  s++;
205
0
  *p=s;
206
0
  return(1);
207
0
}
208
209
 static int
210
#ifdef KR_headers
211
e_d(s,p) char *s,**p;
212
#else
213
e_d(const char *s, const char **p)
214
#endif
215
0
{ int i,im,n,w,d,e,found=0,x=0;
216
0
  Const char *sv=s;
217
0
  s=gt_num(s,&n,1);
218
0
  (void) op_gen(STACK,n,0,0);
219
0
  switch(*s++)
220
0
  {
221
0
  default: break;
222
0
  case 'E':
223
0
  case 'e': x=1;
224
0
  case 'G':
225
0
  case 'g':
226
0
    found=1;
227
0
    if (!(s=gt_num(s,&w,0))) {
228
0
 bad:
229
0
      *p = 0;
230
0
      return 1;
231
0
      }
232
0
    if(w==0) break;
233
0
    if(*s=='.') {
234
0
      if (!(s=gt_num(s+1,&d,0)))
235
0
        goto bad;
236
0
      }
237
0
    else d=0;
238
0
    if(*s!='E' && *s != 'e')
239
0
      (void) op_gen(x==1?E:G,w,d,0);  /* default is Ew.dE2 */
240
0
    else {
241
0
      if (!(s=gt_num(s+1,&e,0)))
242
0
        goto bad;
243
0
      (void) op_gen(x==1?EE:GE,w,d,e);
244
0
      }
245
0
    break;
246
0
  case 'O':
247
0
  case 'o':
248
0
    i = O;
249
0
    im = OM;
250
0
    goto finish_I;
251
0
  case 'Z':
252
0
  case 'z':
253
0
    i = Z;
254
0
    im = ZM;
255
0
    goto finish_I;
256
0
  case 'L':
257
0
  case 'l':
258
0
    found=1;
259
0
    if (!(s=gt_num(s,&w,0)))
260
0
      goto bad;
261
0
    if(w==0) break;
262
0
    (void) op_gen(L,w,0,0);
263
0
    break;
264
0
  case 'A':
265
0
  case 'a':
266
0
    found=1;
267
0
    skip(s);
268
0
    if(*s>='0' && *s<='9')
269
0
    { s=gt_num(s,&w,1);
270
0
      if(w==0) break;
271
0
      (void) op_gen(AW,w,0,0);
272
0
      break;
273
0
    }
274
0
    (void) op_gen(A,0,0,0);
275
0
    break;
276
0
  case 'F':
277
0
  case 'f':
278
0
    if (!(s=gt_num(s,&w,0)))
279
0
      goto bad;
280
0
    found=1;
281
0
    if(w==0) break;
282
0
    if(*s=='.') {
283
0
      if (!(s=gt_num(s+1,&d,0)))
284
0
        goto bad;
285
0
      }
286
0
    else d=0;
287
0
    (void) op_gen(F,w,d,0);
288
0
    break;
289
0
  case 'D':
290
0
  case 'd':
291
0
    found=1;
292
0
    if (!(s=gt_num(s,&w,0)))
293
0
      goto bad;
294
0
    if(w==0) break;
295
0
    if(*s=='.') {
296
0
      if (!(s=gt_num(s+1,&d,0)))
297
0
        goto bad;
298
0
      }
299
0
    else d=0;
300
0
    (void) op_gen(D,w,d,0);
301
0
    break;
302
0
  case 'I':
303
0
  case 'i':
304
0
    i = I;
305
0
    im = IM;
306
0
 finish_I:
307
0
    if (!(s=gt_num(s,&w,0)))
308
0
      goto bad;
309
0
    found=1;
310
0
    if(w==0) break;
311
0
    if(*s!='.')
312
0
    { (void) op_gen(i,w,0,0);
313
0
      break;
314
0
    }
315
0
    if (!(s=gt_num(s+1,&d,0)))
316
0
      goto bad;
317
0
    (void) op_gen(im,w,d,0);
318
0
    break;
319
0
  }
320
0
  if(found==0)
321
0
  { f__pc--; /*unSTACK*/
322
0
    *p=sv;
323
0
    return(0);
324
0
  }
325
0
  *p=s;
326
0
  return(1);
327
0
}
328
 static
329
#ifdef KR_headers
330
char *i_tem(s) char *s;
331
#else
332
const char *i_tem(const char *s)
333
#endif
334
0
{ const char *t;
335
0
  int n,curloc;
336
0
  if(*s==')') return(s);
337
0
  if(ne_d(s,&t)) return(t);
338
0
  if(e_d(s,&t)) return(t);
339
0
  s=gt_num(s,&n,1);
340
0
  if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
341
0
  return(f_s(s,curloc));
342
0
}
343
344
 static
345
#ifdef KR_headers
346
char *f_list(s) char *s;
347
#else
348
const char *f_list(const char *s)
349
#endif
350
0
{
351
0
  for(;*s!=0;)
352
0
  { skip(s);
353
0
    if((s=i_tem(s))==NULL) return(NULL);
354
0
    skip(s);
355
0
    if(*s==',') s++;
356
0
    else if(*s==')')
357
0
    { if(--f__parenlvl==0)
358
0
      {
359
0
        (void) op_gen(REVERT,f__revloc,0,0);
360
0
        return(++s);
361
0
      }
362
0
      (void) op_gen(GOTO,0,0,0);
363
0
      return(++s);
364
0
    }
365
0
  }
366
0
  return(NULL);
367
0
}
368
369
 int
370
#ifdef KR_headers
371
pars_f(s) char *s;
372
#else
373
pars_f(const char *s)
374
#endif
375
0
{
376
0
  f__parenlvl=f__revloc=f__pc=0;
377
0
  if(f_s(s,0) == NULL)
378
0
  {
379
0
    return(-1);
380
0
  }
381
0
  return(0);
382
0
}
383
#define STKSZ 10
384
int f__cnt[STKSZ],f__ret[STKSZ],f__cp,f__rp;
385
flag f__workdone, f__nonl;
386
387
 static int
388
#ifdef KR_headers
389
type_f(n)
390
#else
391
type_f(int n)
392
#endif
393
0
{
394
0
  switch(n)
395
0
  {
396
0
  default:
397
0
    return(n);
398
0
  case RET1:
399
0
    return(RET1);
400
0
  case REVERT: return(REVERT);
401
0
  case GOTO: return(GOTO);
402
0
  case STACK: return(STACK);
403
0
  case X:
404
0
  case SLASH:
405
0
  case APOS: case H:
406
0
  case T: case TL: case TR:
407
0
    return(NED);
408
0
  case F:
409
0
  case I:
410
0
  case IM:
411
0
  case A: case AW:
412
0
  case O: case OM:
413
0
  case L:
414
0
  case E: case EE: case D:
415
0
  case G: case GE:
416
0
  case Z: case ZM:
417
0
    return(ED);
418
0
  }
419
0
}
420
#ifdef KR_headers
421
integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
422
#else
423
integer do_fio(ftnint *number, char *ptr, ftnlen len)
424
#endif
425
0
{ struct syl *p;
426
0
  int n,i;
427
0
  for(i=0;i<*number;i++,ptr+=len)
428
0
  {
429
0
loop: switch(type_f((p= &f__syl[f__pc])->op))
430
0
  {
431
0
  default:
432
0
    fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
433
0
      p->op,f__fmtbuf);
434
0
    err(f__elist->cierr,100,"do_fio");
435
0
  case NED:
436
0
    if((*f__doned)(p))
437
0
    { f__pc++;
438
0
      goto loop;
439
0
    }
440
0
    f__pc++;
441
0
    continue;
442
0
  case ED:
443
0
    if(f__cnt[f__cp]<=0)
444
0
    { f__cp--;
445
0
      f__pc++;
446
0
      goto loop;
447
0
    }
448
0
    if(ptr==NULL)
449
0
      return((*f__doend)());
450
0
    f__cnt[f__cp]--;
451
0
    f__workdone=1;
452
0
    if((n=(*f__doed)(p,ptr,len))>0)
453
0
      errfl(f__elist->cierr,errno,"fmt");
454
0
    if(n<0)
455
0
      err(f__elist->ciend,(EOF),"fmt");
456
0
    continue;
457
0
  case STACK:
458
0
    f__cnt[++f__cp]=p->p1;
459
0
    f__pc++;
460
0
    goto loop;
461
0
  case RET1:
462
0
    f__ret[++f__rp]=p->p1;
463
0
    f__pc++;
464
0
    goto loop;
465
0
  case GOTO:
466
0
    if(--f__cnt[f__cp]<=0)
467
0
    { f__cp--;
468
0
      f__rp--;
469
0
      f__pc++;
470
0
      goto loop;
471
0
    }
472
0
    f__pc=1+f__ret[f__rp--];
473
0
    goto loop;
474
0
  case REVERT:
475
0
    f__rp=f__cp=0;
476
0
    f__pc = p->p1;
477
0
    if(ptr==NULL)
478
0
      return((*f__doend)());
479
0
    if(!f__workdone) return(0);
480
0
    if((n=(*f__dorevert)()) != 0) return(n);
481
0
    goto loop;
482
0
  case COLON:
483
0
    if(ptr==NULL)
484
0
      return((*f__doend)());
485
0
    f__pc++;
486
0
    goto loop;
487
0
  case NONL:
488
0
    f__nonl = 1;
489
0
    f__pc++;
490
0
    goto loop;
491
0
  case S:
492
0
  case SS:
493
0
    f__cplus=0;
494
0
    f__pc++;
495
0
    goto loop;
496
0
  case SP:
497
0
    f__cplus = 1;
498
0
    f__pc++;
499
0
    goto loop;
500
0
  case P: f__scale=p->p1;
501
0
    f__pc++;
502
0
    goto loop;
503
0
  case BN:
504
0
    f__cblank=0;
505
0
    f__pc++;
506
0
    goto loop;
507
0
  case BZ:
508
0
    f__cblank=1;
509
0
    f__pc++;
510
0
    goto loop;
511
0
  }
512
0
  }
513
0
  return(0);
514
0
}
515
516
 int
517
en_fio(Void)
518
0
{ ftnint one=1;
519
0
  return(do_fio(&one,(char *)NULL,(ftnint)0));
520
0
}
521
522
 VOID
523
fmt_bg(Void)
524
0
{
525
0
  f__workdone=f__cp=f__rp=f__pc=f__cursor=0;
526
0
  f__cnt[0]=f__ret[0]=0;
527
0
}
528
#ifdef __cplusplus
529
}
530
#endif