ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/gen/xform.c
(Generate patch)

Comparing ray/src/gen/xform.c (file contents):
Revision 1.12 by greg, Sat Dec 15 14:58:03 1990 UTC vs.
Revision 1.15 by greg, Tue Jul 23 15:24:21 1991 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1990 Regents of the University of California */
1 > /* Copyright (c) 1991 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 16 | Line 16 | static char SCCSid[] = "$SunId$ LBL";
16  
17   #include  <ctype.h>
18  
19 + #include  "object.h"
20 +
21   #include  "otypes.h"
22  
23   int  xac;                               /* global xform argument count */
# Line 27 | Line 29 | int  reverse;                          /* boolean true if scene inverted */
29  
30   int  expand = 0;                        /* boolean true to expand commands */
31  
32 + char  *newmod = NULL;                   /* new modifier for surfaces */
33 +
34   char  *idprefix = NULL;                 /* prefix for object identifiers */
35  
36   #define  ALIAS          NUMOTYPE        /* put alias at end of array */
# Line 35 | Line 39 | char  *idprefix = NULL;                        /* prefix for object identif
39  
40   FUN  ofun[NUMTYPES] = INIT_OTYPE;       /* default types and actions */
41  
42 < typedef struct {
39 <        short  nsargs;                  /* # of string arguments */
40 <        char  **sarg;                   /* string arguments */
41 <        short  niargs;                  /* # of integer arguments */
42 <        int  *iarg;                     /* integer arguments */
43 <        short  nfargs;                  /* # of float arguments */
44 <        double  *farg;                  /* float arguments */
45 < }  FUNARGS;
42 > extern char  *malloc(), *fgetword();
43  
47 #define  MAXSTR         512             /* maximum string length */
48
49 FUNARGS  *getfargs();
50 char  *malloc();
51
44   #define  progname  (xav[0])
45  
46  
# Line 69 | Line 61 | char  *argv[];
61          for (a = 1; a < argc; a++) {
62                  if (argv[a][0] == '-')
63                          switch (argv[a][1]) {
64 +                        case 'm':
65 +                                if (argv[a][2] || a+1 >= argc)
66 +                                        break;
67 +                                newmod = argv[++a];
68 +                                continue;
69                          case 'n':
70                                  if (argv[a][2] || a+1 >= argc)
71                                          break;
# Line 228 | Line 225 | xfobject(fname, fin)                           /* transform an object */
225   char  *fname;
226   FILE  *fin;
227   {
228 <        char  stmp[MAXSTR];
228 >        char  typ[16], nam[MAXSTR];
229          int  fn;
230 <        
231 <        fscanf(fin, "%s", stmp);        /* modifier */
232 <        printf("\n%s ", stmp);
233 <        fscanf(fin, "%s", stmp);        /* object type */
234 <        if ((fn = otype(stmp)) < 0) {
230 >                                                /* modifier and type */
231 >        strcpy(typ, "EOF");
232 >        fgetword(nam, sizeof(nam), fin);
233 >        fgetword(typ, sizeof(typ), fin);
234 >        if ((fn = otype(typ)) < 0) {
235                  fprintf(stderr, "%s: (%s): unknown object type \"%s\"\n",
236 <                                progname, fname, stmp);
236 >                                progname, fname, typ);
237                  exit(1);
238          }
239 <        printf("%s ", stmp);
240 <        fscanf(fin, "%s", stmp);        /* object name */
239 >        printf("\n%s %s ", newmod!=NULL && issurface(fn) ? newmod : nam, typ);
240 >                                                /* object name */
241 >        fgetword(nam, sizeof(nam), fin);
242          if (idprefix != NULL && issurface(fn))
243 <                printf("%s.%s\n", idprefix, stmp);
243 >                printf("%s.%s\n", idprefix, nam);
244          else
245 <                printf("%s\n", stmp);
246 <                                        /* transform arguments */
245 >                printf("%s\n", nam);
246 >                                                /* transform arguments */
247          if ((*ofun[fn].funp)(fin) < 0) {
248                  fprintf(stderr, "%s: (%s): bad %s \"%s\"\n",
249 <                                progname, fname, ofun[fn].funame, stmp);
249 >                                progname, fname, ofun[fn].funame, nam);
250                  exit(1);
251          }
252   }
# Line 258 | Line 256 | o_default(fin)                 /* pass on arguments unchanged */
256   FILE  *fin;
257   {
258          register int  i;
259 <        register FUNARGS  *fa;
259 >        FUNARGS  fa;
260  
261 <        if ((fa = getfargs(fin)) == NULL)
261 >        if (readfargs(&fa, fin) != 1)
262                  return(-1);
263                                          /* string arguments */
264 <        printf("%d", fa->nsargs);
265 <        for (i = 0; i < fa->nsargs; i++)
266 <                printf(" %s", fa->sarg[i]);
264 >        printf("%d", fa.nsargs);
265 >        for (i = 0; i < fa.nsargs; i++)
266 >                printf(" %s", fa.sarg[i]);
267          printf("\n");
268 + #ifdef  IARGS
269                                          /* integer arguments */
270 <        printf("%d", fa->niargs);
271 <        for (i = 0; i < fa->niargs; i++)
272 <                printf(" %d", fa->iarg[i]);
270 >        printf("%d", fa.niargs);
271 >        for (i = 0; i < fa.niargs; i++)
272 >                printf(" %d", fa.iarg[i]);
273          printf("\n");
274 + #else
275 +        printf("0\n");
276 + #endif
277                                          /* float arguments */
278 <        printf("%d", fa->nfargs);
279 <        for (i = 0; i < fa->nfargs; i++)
280 <                printf(" %18.12g", fa->farg[i]);
278 >        printf("%d", fa.nfargs);
279 >        for (i = 0; i < fa.nfargs; i++)
280 >                printf(" %18.12g", fa.farg[i]);
281          printf("\n");
282 <        freefargs(fa);
282 >        freefargs(&fa);
283          return(0);
284   }
285  
# Line 286 | Line 288 | addxform(fin)                  /* add xf arguments to strings */
288   FILE  *fin;
289   {
290          register int  i;
291 <        register FUNARGS  *fa;
291 >        FUNARGS  fa;
292  
293 <        if ((fa = getfargs(fin)) == NULL)
293 >        if (readfargs(&fa, fin) != 1)
294                  return(-1);
295                                          /* string arguments */
296 <        printf("%d", fa->nsargs + xac-xfa);
297 <        for (i = 0; i < fa->nsargs; i++)
298 <                printf(" %s", fa->sarg[i]);
296 >        printf("%d", fa.nsargs + xac-xfa);
297 >        for (i = 0; i < fa.nsargs; i++)
298 >                printf(" %s", fa.sarg[i]);
299          for (i = xfa; i < xac; i++)     /* add xf arguments */
300                  printf(" %s", xav[i]);
301          printf("\n");
302 + #ifdef  IARGS
303                                          /* integer arguments */
304 <        printf("%d", fa->niargs);
305 <        for (i = 0; i < fa->niargs; i++)
306 <                printf(" %d", fa->iarg[i]);
304 >        printf("%d", fa.niargs);
305 >        for (i = 0; i < fa.niargs; i++)
306 >                printf(" %d", fa.iarg[i]);
307          printf("\n");
308 + #else
309 +        printf("0\n");
310 + #endif
311                                          /* float arguments */
312 <        printf("%d", fa->nfargs);
313 <        for (i = 0; i < fa->nfargs; i++)
314 <                printf(" %18.12g", fa->farg[i]);
312 >        printf("%d", fa.nfargs);
313 >        for (i = 0; i < fa.nfargs; i++)
314 >                printf(" %18.12g", fa.farg[i]);
315          printf("\n");
316 <        freefargs(fa);
316 >        freefargs(&fa);
317          return(0);
318   }
319  
# Line 331 | Line 337 | FILE  *fin;
337   {
338          char  aliasnm[MAXSTR];
339  
340 <        if (fscanf(fin, "%s", aliasnm) != 1)
340 >        if (fgetword(aliasnm, MAXSTR, fin) == NULL)
341                  return(-1);
342          printf("\t%s\n", aliasnm);
343          return(0);
# Line 341 | Line 347 | FILE  *fin;
347   m_glow(fin)                     /* transform arguments for proximity light */
348   FILE  *fin;
349   {
350 <        register FUNARGS  *fa;
350 >        FUNARGS  fa;
351  
352 <        if ((fa = getfargs(fin)) == NULL)
352 >        if (readfargs(&fa, fin) != 1)
353                  return(-1);
354 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
354 >        if (fa.nsargs != 0  || fa.nfargs != 4)
355                  return(-1);
356          printf("0\n0\n4");
357          printf(" %18.12g %18.12g %18.12g",
358 <                        fa->farg[0], fa->farg[1], fa->farg[2]);
359 <        printf(" %18.12g\n", fa->farg[3] * tot.sca);
360 <        freefargs(fa);
358 >                        fa.farg[0], fa.farg[1], fa.farg[2]);
359 >        printf(" %18.12g\n", fa.farg[3] * tot.sca);
360 >        freefargs(&fa);
361          return(0);
362   }
363  
# Line 360 | Line 366 | m_spot(fin)                    /* transform arguments for spotlight */
366   FILE  *fin;
367   {
368          double  v[3];
369 <        register FUNARGS  *fa;
369 >        FUNARGS  fa;
370  
371 <        if ((fa = getfargs(fin)) == NULL)
371 >        if (readfargs(&fa, fin) != 1)
372                  return(-1);
373 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
373 >        if (fa.nsargs != 0  || fa.nfargs != 7)
374                  return(-1);
375          printf("0\n0\n7");
376          printf(" %18.12g %18.12g %18.12g %18.12g\n",
377 <                        fa->farg[0], fa->farg[1], fa->farg[2], fa->farg[3]);
378 <        multv3(v, fa->farg+4, tot.xfm);
377 >                        fa.farg[0], fa.farg[1], fa.farg[2], fa.farg[3]);
378 >        multv3(v, fa.farg+4, tot.xfm);
379          printf("\t%18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
380 <        freefargs(fa);
380 >        freefargs(&fa);
381          return(0);
382   }
383  
# Line 380 | Line 386 | m_dielectric(fin)              /* transform arguments for dielectr
386   FILE  *fin;
387   {
388          double  pow();
389 <        register FUNARGS  *fa;
389 >        FUNARGS  fa;
390  
391 <        if ((fa = getfargs(fin)) == NULL)
391 >        if (readfargs(&fa, fin) != 1)
392                  return(-1);
393 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 5)
393 >        if (fa.nsargs != 0  || fa.nfargs != 5)
394                  return(-1);
395          printf("0\n0\n5");
396          printf(" %18.12g %18.12g %18.12g",
397 <                pow(fa->farg[0], 1.0/tot.sca),
398 <                pow(fa->farg[1], 1.0/tot.sca),
399 <                pow(fa->farg[2], 1.0/tot.sca));
400 <        printf(" %18.12g %18.12g\n", fa->farg[3], fa->farg[4]);
401 <        freefargs(fa);
397 >                pow(fa.farg[0], 1.0/tot.sca),
398 >                pow(fa.farg[1], 1.0/tot.sca),
399 >                pow(fa.farg[2], 1.0/tot.sca));
400 >        printf(" %18.12g %18.12g\n", fa.farg[3], fa.farg[4]);
401 >        freefargs(&fa);
402          return(0);
403   }
404  
# Line 401 | Line 407 | m_interface(fin)               /* transform arguments for interface
407   FILE  *fin;
408   {
409          double  pow();
410 <        register FUNARGS  *fa;
410 >        FUNARGS  fa;
411  
412 <        if ((fa = getfargs(fin)) == NULL)
412 >        if (readfargs(&fa, fin) != 1)
413                  return(-1);
414 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
414 >        if (fa.nsargs != 0  || fa.nfargs != 8)
415                  return(-1);
416          printf("0\n0\n8\n");
417          printf("%18.12g %18.12g %18.12g",
418 <                pow(fa->farg[0], 1.0/tot.sca),
419 <                pow(fa->farg[1], 1.0/tot.sca),
420 <                pow(fa->farg[2], 1.0/tot.sca));
421 <        printf(" %18.12g\n", fa->farg[3]);
418 >                pow(fa.farg[0], 1.0/tot.sca),
419 >                pow(fa.farg[1], 1.0/tot.sca),
420 >                pow(fa.farg[2], 1.0/tot.sca));
421 >        printf(" %18.12g\n", fa.farg[3]);
422          printf("%18.12g %18.12g %18.12g",
423 <                pow(fa->farg[4], 1.0/tot.sca),
424 <                pow(fa->farg[5], 1.0/tot.sca),
425 <                pow(fa->farg[6], 1.0/tot.sca));
426 <        printf(" %18.12g\n", fa->farg[7]);
427 <        freefargs(fa);
423 >                pow(fa.farg[4], 1.0/tot.sca),
424 >                pow(fa.farg[5], 1.0/tot.sca),
425 >                pow(fa.farg[6], 1.0/tot.sca));
426 >        printf(" %18.12g\n", fa.farg[7]);
427 >        freefargs(&fa);
428          return(0);
429   }
430  
# Line 428 | Line 434 | FILE  *fin;
434   {
435          int  i;
436          double  v[3];
437 <        register FUNARGS  *fa;
437 >        FUNARGS  fa;
438  
439 <        if ((fa = getfargs(fin)) == NULL)
439 >        if (readfargs(&fa, fin) != 1)
440                  return(-1);
441 <        if (fa->niargs != 0 || (fa->nfargs != 9 &&
436 <                        fa->nfargs != 11 && fa->nfargs != 15))
441 >        if (fa.nfargs != 9 && fa.nfargs != 11 && fa.nfargs != 15)
442                  return(-1);
443                                          /* string arguments */
444 <        printf("%d", fa->nsargs);
445 <        for (i = 0; i < fa->nsargs; i++)
446 <                printf(" %s", fa->sarg[i]);
447 <        printf("\n0\n%d\n", fa->nfargs);
444 >        printf("%d", fa.nsargs);
445 >        for (i = 0; i < fa.nsargs; i++)
446 >                printf(" %s", fa.sarg[i]);
447 >        printf("\n0\n%d\n", fa.nfargs);
448                                          /* anchor point */
449 <        multp3(v, fa->farg, tot.xfm);
449 >        multp3(v, fa.farg, tot.xfm);
450          printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
451                                          /* right vector */
452 <        multv3(v, fa->farg+3, tot.xfm);
452 >        multv3(v, fa.farg+3, tot.xfm);
453          printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
454                                          /* down vector */
455 <        multv3(v, fa->farg+6, tot.xfm);
455 >        multv3(v, fa.farg+6, tot.xfm);
456          printf(" %18.12g %18.12g %18.12g\n", v[0], v[1], v[2]);
457                                          /* forground and background */
458 <        if (fa->nfargs == 11)
459 <                printf(" %18.12g %18.12g\n", fa->farg[9], fa->farg[10]);
460 <        else if (fa->nfargs == 15) {
458 >        if (fa.nfargs == 11)
459 >                printf(" %18.12g %18.12g\n", fa.farg[9], fa.farg[10]);
460 >        else if (fa.nfargs == 15) {
461                  printf(" %18.12g %18.12g %18.12g\n",
462 <                                fa->farg[9], fa->farg[10], fa->farg[11]);
462 >                                fa.farg[9], fa.farg[10], fa.farg[11]);
463                  printf(" %18.12g %18.12g %18.12g\n",
464 <                                fa->farg[12], fa->farg[13], fa->farg[14]);
464 >                                fa.farg[12], fa.farg[13], fa.farg[14]);
465          }
466 <        freefargs(fa);
466 >        freefargs(&fa);
467          return(0);
468   }
469  
# Line 467 | Line 472 | o_source(fin)                  /* transform source arguments */
472   FILE  *fin;
473   {
474          double  dv[3];
475 <        register FUNARGS  *fa;
475 >        FUNARGS  fa;
476  
477 <        if ((fa = getfargs(fin)) == NULL)
477 >        if (readfargs(&fa, fin) != 1)
478                  return(-1);
479 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
479 >        if (fa.nsargs != 0  || fa.nfargs != 4)
480                  return(-1);
481                                          /* transform direction vector */
482 <        multv3(dv, fa->farg, tot.xfm);
482 >        multv3(dv, fa.farg, tot.xfm);
483                                          /* output */
484          printf("0\n0\n4");
485          printf(" %18.12g %18.12g %18.12g %18.12g\n",
486 <                        dv[0], dv[1], dv[2], fa->farg[3]);
487 <        freefargs(fa);
486 >                        dv[0], dv[1], dv[2], fa.farg[3]);
487 >        freefargs(&fa);
488          return(0);
489   }
490  
# Line 488 | Line 493 | o_sphere(fin)                  /* transform sphere arguments */
493   FILE  *fin;
494   {
495          double  cent[3], rad;
496 <        register FUNARGS  *fa;
496 >        FUNARGS  fa;
497  
498 <        if ((fa = getfargs(fin)) == NULL)
498 >        if (readfargs(&fa, fin) != 1)
499                  return(-1);
500 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 4)
500 >        if (fa.nsargs != 0  || fa.nfargs != 4)
501                  return(-1);
502          
503 <        multp3(cent, fa->farg, tot.xfm);        /* transform center */
503 >        multp3(cent, fa.farg, tot.xfm); /* transform center */
504          
505 <        rad = fa->farg[3] * tot.sca;            /* scale radius */
505 >        rad = fa.farg[3] * tot.sca;             /* scale radius */
506          
507          printf("0\n0\n4");
508          printf(" %18.12g %18.12g %18.12g %18.12g\n",
509                          cent[0], cent[1], cent[2], rad);
510 <        freefargs(fa);
510 >        freefargs(&fa);
511          return(0);
512   }
513  
# Line 512 | Line 517 | FILE  *fin;
517   {
518          double  p[3];
519          register int  i;
520 <        register FUNARGS  *fa;
520 >        FUNARGS  fa;
521  
522 <        if ((fa = getfargs(fin)) == NULL)
522 >        if (readfargs(&fa, fin) != 1)
523                  return(-1);
524 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs % 3)
524 >        if (fa.nsargs != 0  || fa.nfargs % 3)
525                  return(-1);
526          
527 <        printf("0\n0\n%d\n", fa->nfargs);
527 >        printf("0\n0\n%d\n", fa.nfargs);
528          
529 <        for (i = 0; i < fa->nfargs; i += 3) {
529 >        for (i = 0; i < fa.nfargs; i += 3) {
530                  if (reverse)
531 <                        multp3(p, fa->farg+(fa->nfargs-i-3), tot.xfm);
531 >                        multp3(p, fa.farg+(fa.nfargs-i-3), tot.xfm);
532                  else
533 <                        multp3(p, fa->farg+i, tot.xfm);
533 >                        multp3(p, fa.farg+i, tot.xfm);
534                  printf(" %18.12g %18.12g %18.12g\n", p[0], p[1], p[2]);
535          }
536 <        freefargs(fa);
536 >        freefargs(&fa);
537          return(0);
538   }
539  
# Line 537 | Line 542 | o_cone(fin)                    /* transform cone and cup arguments */
542   FILE  *fin;
543   {
544          double  p0[3], p1[3], r0, r1;
545 <        register FUNARGS  *fa;
545 >        FUNARGS  fa;
546  
547 <        if ((fa = getfargs(fin)) == NULL)
547 >        if (readfargs(&fa, fin) != 1)
548                  return(-1);
549 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
549 >        if (fa.nsargs != 0  || fa.nfargs != 8)
550                  return(-1);
551  
552          printf("0\n0\n8\n");
553  
554 <        multp3(p0, fa->farg, tot.xfm);
555 <        multp3(p1, fa->farg+3, tot.xfm);
556 <        r0 = fa->farg[6] * tot.sca;
557 <        r1 = fa->farg[7] * tot.sca;
554 >        multp3(p0, fa.farg, tot.xfm);
555 >        multp3(p1, fa.farg+3, tot.xfm);
556 >        r0 = fa.farg[6] * tot.sca;
557 >        r1 = fa.farg[7] * tot.sca;
558          printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
559          printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
560          printf(" %18.12g %18.12g\n", r0, r1);
561  
562 <        freefargs(fa);
562 >        freefargs(&fa);
563          return(0);
564   }
565  
# Line 563 | Line 568 | o_cylinder(fin)                        /* transform cylinder and tube argum
568   FILE  *fin;
569   {
570          double  p0[3], p1[3], rad;
571 <        register FUNARGS  *fa;
571 >        FUNARGS  fa;
572  
573 <        if ((fa = getfargs(fin)) == NULL)
573 >        if (readfargs(&fa, fin) != 1)
574                  return(-1);
575 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 7)
575 >        if (fa.nsargs != 0  || fa.nfargs != 7)
576                  return(-1);
577  
578          printf("0\n0\n7\n");
579  
580 <        multp3(p0, fa->farg, tot.xfm);
581 <        multp3(p1, fa->farg+3, tot.xfm);
582 <        rad = fa->farg[6] * tot.sca;
580 >        multp3(p0, fa.farg, tot.xfm);
581 >        multp3(p1, fa.farg+3, tot.xfm);
582 >        rad = fa.farg[6] * tot.sca;
583          printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
584          printf(" %18.12g %18.12g %18.12g\n", p1[0], p1[1], p1[2]);
585          printf(" %18.12g\n", rad);
586 <        freefargs(fa);
586 >        freefargs(&fa);
587          return(0);
588   }
589  
# Line 587 | Line 592 | o_ring(fin)                    /* transform ring arguments */
592   FILE  *fin;
593   {
594          double  p0[3], pd[3], r0, r1;
595 <        register FUNARGS  *fa;
595 >        FUNARGS  fa;
596  
597 <        if ((fa = getfargs(fin)) == NULL)
597 >        if (readfargs(&fa, fin) != 1)
598                  return(-1);
599 <        if (fa->nsargs != 0 || fa->niargs != 0 || fa->nfargs != 8)
599 >        if (fa.nsargs != 0  || fa.nfargs != 8)
600                  return(-1);
601  
602          printf("0\n0\n8\n");
603  
604 <        multp3(p0, fa->farg, tot.xfm);
605 <        multv3(pd, fa->farg+3, tot.xfm);
606 <        r0 = fa->farg[6] * tot.sca;
607 <        r1 = fa->farg[7] * tot.sca;
604 >        multp3(p0, fa.farg, tot.xfm);
605 >        multv3(pd, fa.farg+3, tot.xfm);
606 >        r0 = fa.farg[6] * tot.sca;
607 >        r1 = fa.farg[7] * tot.sca;
608          printf(" %18.12g %18.12g %18.12g\n", p0[0], p0[1], p0[2]);
609          printf(" %18.12g %18.12g %18.12g\n", pd[0], pd[1], pd[2]);
610          printf(" %18.12g %18.12g\n", r0, r1);
611 <        freefargs(fa);
611 >        freefargs(&fa);
612          return(0);
608 }
609
610
611 FUNARGS *
612 getfargs(fp)            /* get function arguments from stream */
613 FILE  *fp;
614 {
615        char  *strcpy();
616        char  sbuf[MAXSTR];
617        int  n;
618        register FUNARGS  *fa;
619        register int  i;
620
621        if ((fa = (FUNARGS *)malloc((unsigned)sizeof(FUNARGS))) == NULL)
622                goto memerr;
623        if (fscanf(fp, "%d", &n) != 1 || n < 0)
624                return(NULL);
625        if (fa->nsargs = n) {
626                fa->sarg = (char **)malloc((unsigned)fa->nsargs*sizeof(char *));
627                if (fa->sarg == NULL)
628                        goto memerr;
629                for (i = 0; i < fa->nsargs; i++) {
630                        if (fscanf(fp, "%s", sbuf) != 1)
631                                return(NULL);
632                        if ((fa->sarg[i] = malloc((unsigned)strlen(sbuf)+1)) == NULL)
633                                goto memerr;
634                        strcpy(fa->sarg[i], sbuf);
635                }
636        } else
637                fa->sarg = NULL;
638        if (fscanf(fp, "%d", &n) != 1 || n < 0)
639                return(NULL);
640        if (fa->niargs = n) {
641                fa->iarg = (int *)malloc((unsigned)fa->niargs*sizeof(int));
642                if (fa->iarg == NULL)
643                        goto memerr;
644                for (i = 0; i < fa->niargs; i++)
645                        if (fscanf(fp, "%d", &fa->iarg[i]) != 1)
646                                return(NULL);
647        } else
648                fa->iarg = NULL;
649        if (fscanf(fp, "%d", &n) != 1 || n < 0)
650                return(NULL);
651        if (fa->nfargs = n) {
652                fa->farg = (double *)malloc((unsigned)fa->nfargs*sizeof(double));
653                if (fa->farg == NULL)
654                        goto memerr;
655                for (i = 0; i < fa->nfargs; i++)
656                        if (fscanf(fp, "%lf", &fa->farg[i]) != 1)
657                                return(NULL);
658        } else
659                fa->farg = NULL;
660        return(fa);
661 memerr:
662        fprintf(stderr, "%s: out of memory in getfargs\n", progname);
663        exit(1);
664 }
665
666
667 freefargs(fa)                   /* free memory associated with fa */
668 register FUNARGS  *fa;
669 {
670        register int  i;
671
672        for (i = 0; i < fa->nsargs; i++)
673                free(fa->sarg[i]);
674        if (fa->nsargs)
675                free(fa->sarg);
676        if (fa->niargs)
677                free(fa->iarg);
678        if (fa->nfargs)
679                free(fa->farg);
680        free(fa);
613   }
614  
615  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines