void rad2mgf( /* convert a Radiance file to MGF */ char *inp ) { char buf[512]; char mod[128], typ[32], id[128], alias[128]; FUNARGS fa; register FILE *fp; register int c; if (inp == NULL) { inp = "standard input"; fp = stdin; } else if (inp[0] == '!') { if ((fp = popen(inp+1, "r")) == NULL) { fputs(inp, stderr); fputs(": cannot execute\n", stderr); exit(1); } } else if ((fp = fopen(inp, "r")) == NULL) { fputs(inp, stderr); fputs(": cannot open\n", stderr); exit(1); } printf("# Begin conversion from: %s\n", inp); while ((c = getc(fp)) != EOF) switch (c) { case ' ': /* white space */ case '\t': case '\n': case '\r': case '\f': break; case '#': /* comment */ if (fgets(buf, sizeof(buf), fp) != NULL) printf("# %s", buf); break; case '!': /* inline command */ ungetc(c, fp); fgetline(buf, sizeof(buf), fp); rad2mgf(buf); break; default: /* Radiance primitive */ ungetc(c, fp); if (fgetword(mod, sizeof(mod), fp) == NULL || fgetword(typ, sizeof(typ), fp) == NULL || fgetword(id, sizeof(id), fp) == NULL) { fputs(inp, stderr); fputs(": unexpected EOF\n", stderr); exit(1); } unspace(mod); unspace(id); if (!strcmp(typ, "alias")) { strcpy(alias, "EOF"); fgetword(alias, sizeof(alias), fp); unspace(alias); newmat(id, alias); } else { if (!readfargs(&fa, fp)) { fprintf(stderr, "%s: bad argument syntax for %s \"%s\"\n", inp, typ, id); exit(1); } cvtprim(inp, mod, typ, id, &fa); freefargs(&fa); } break; } printf("# End conversion from: %s\n", inp); if (inp[0] == '!') pclose(fp); else fclose(fp); }
void getobject( /* read the next object */ char *name, FILE *fp ) { #define OALIAS -2 OBJECT obj; char sbuf[MAXSTR]; int rval; OBJREC *objp; if ((obj = newobject()) == OVOID) error(SYSTEM, "out of object space"); objp = objptr(obj); /* get modifier */ strcpy(sbuf, "EOF"); fgetword(sbuf, MAXSTR, fp); if (strchr(sbuf, '\t')) { sprintf(errmsg, "(%s): illegal tab in modifier \"%s\"", name, sbuf); error(USER, errmsg); } if (!strcmp(sbuf, VOIDID)) objp->omod = OVOID; else if (!strcmp(sbuf, ALIASMOD)) objp->omod = OALIAS; else if ((objp->omod = modifier(sbuf)) == OVOID) { sprintf(errmsg, "(%s): undefined modifier \"%s\"", name, sbuf); error(USER, errmsg); } /* get type */ strcpy(sbuf, "EOF"); fgetword(sbuf, MAXSTR, fp); if ((objp->otype = otype(sbuf)) < 0) { sprintf(errmsg, "(%s): unknown type \"%s\"", name, sbuf); error(USER, errmsg); } /* get identifier */ sbuf[0] = '\0'; fgetword(sbuf, MAXSTR, fp); if (strchr(sbuf, '\t')) { sprintf(errmsg, "(%s): illegal tab in identifier \"%s\"", name, sbuf); error(USER, errmsg); } objp->oname = savqstr(sbuf); /* get arguments */ if (objp->otype == MOD_ALIAS) { OBJECT alias; strcpy(sbuf, "EOF"); fgetword(sbuf, MAXSTR, fp); if ((alias = modifier(sbuf)) == OVOID) { sprintf(errmsg, "(%s): bad reference \"%s\"", name, sbuf); objerror(objp, USER, errmsg); } if (objp->omod == OALIAS || objp->omod == objptr(alias)->omod) { objp->omod = alias; } else { objp->oargs.sarg = (char **)malloc(sizeof(char *)); if (objp->oargs.sarg == NULL) error(SYSTEM, "out of memory in getobject"); objp->oargs.nsargs = 1; objp->oargs.sarg[0] = savestr(sbuf); } } else if ((rval = readfargs(&objp->oargs, fp)) == 0) { sprintf(errmsg, "(%s): bad arguments", name); objerror(objp, USER, errmsg); } else if (rval < 0) { sprintf(errmsg, "(%s): error reading scene", name); error(SYSTEM, errmsg); } if (objp->omod == OALIAS) { sprintf(errmsg, "(%s): inappropriate use of '%s' modifier", name, ALIASMOD); objerror(objp, USER, errmsg); } /* initialize */ objp->os = NULL; insertobject(obj); /* add to global structure */ #undef OALIAS }