Back to index

radiance  4R0+20100331
psmeta.c
Go to the documentation of this file.
00001 #ifndef lint
00002 static const char    RCSid[] = "$Id: psmeta.c,v 1.4 2003/11/15 02:13:37 schorsch Exp $";
00003 #endif
00004 /*
00005 *  Program to convert meta-files to PostScript.
00006 *
00007 *     9/23/88
00008 */
00009 
00010 
00011 #include  "meta.h"
00012 #include  "plot.h"
00013 #include  "psplot.h"
00014 
00015 
00016 char  *progname;
00017 
00018 static short  newpage = TRUE;
00019 
00020 static void doprim(PRIMITIVE  *p);
00021 static int doglobal(PRIMITIVE  *g);
00022 
00023 int
00024 main(
00025        int  argc,
00026        char  **argv
00027 )
00028 {
00029        FILE  *fp;
00030 
00031        progname = *argv++;
00032        argc--;
00033 
00034        init(progname);
00035        if (argc)
00036               while (argc)  {
00037                      fp = efopen(*argv, "r");
00038                      plot(fp);
00039                      fclose(fp);
00040                      argv++;
00041                      argc--;
00042               }
00043        else
00044               plot(stdin);
00045 
00046        if (!newpage)
00047               endpage();
00048 
00049        done();
00050        return(0);
00051 }
00052 
00053 
00054 
00055 void
00056 plot(         /* plot meta-file */
00057        FILE  *infp
00058 )
00059 {
00060        PRIMITIVE  nextp;
00061 
00062        do {
00063               readp(&nextp, infp);
00064               while (isprim(nextp.com)) {
00065                      doprim(&nextp);
00066                      readp(&nextp, infp);
00067               }
00068        } while (doglobal(&nextp));
00069 
00070 }
00071 
00072 
00073 int
00074 doglobal(                   /* execute a global command */
00075        PRIMITIVE  *g
00076 )
00077 {
00078        FILE  *fp = NULL;
00079 
00080        switch (g->com) {
00081 
00082        case PEOF:
00083               return(0);
00084 
00085        case PPAUS:
00086               break;
00087 
00088        case PINCL:
00089               if (g->args == NULL)
00090                   error(USER, "missing include file name in include");
00091               if (g->arg0 == 2 || (fp = fopen(g->args, "r")) == NULL) {
00092                   if (g->arg0 != 0)
00093                      fp = mfopen(g->args, "r");
00094                   else {
00095                      sprintf(errmsg, "cannot open user include file \"%s\"",
00096                                    g->args);
00097                      error(USER, errmsg);
00098                   }
00099               }
00100               plot(fp);
00101               fclose(fp);
00102               break;
00103 
00104        case PDRAW:
00105               fflush(stdout);
00106               break;
00107 
00108        case PEOP:
00109               endpage();
00110               newpage = TRUE;
00111               break;
00112 
00113        case PSET:
00114               set(g->arg0, g->args);
00115               break;
00116 
00117        case PUNSET:
00118               unset(g->arg0);
00119               break;
00120 
00121        case PRESET:
00122               reset(g->arg0);
00123               break;
00124 
00125        case POPEN:
00126               segopen(g->args);
00127               break;
00128 
00129        case PCLOSE:
00130               segclose();
00131               break;
00132 
00133        default:
00134               sprintf(errmsg, "unknown command '%c' in doglobal", g->com);
00135               error(WARNING, errmsg);
00136               break;
00137        }
00138 
00139        return(1);
00140 }
00141 
00142 
00143 
00144 void
00145 doprim(              /* plot primitive */
00146        PRIMITIVE  *p
00147 )
00148 {
00149 
00150        switch (p->com) {
00151 
00152        case PMSTR:
00153               printstr(p);
00154               break;
00155 
00156        case PVSTR:
00157               plotvstr(p);
00158               break;
00159 
00160        case PLSEG:
00161               plotlseg(p);
00162               break;
00163 
00164        case PRFILL:
00165               fillrect(p);
00166               break;
00167 
00168        case PTFILL:
00169               filltri(p);
00170               break;
00171 
00172        case PPFILL:
00173               fillpoly(p);
00174               break;
00175 
00176        case PSEG:
00177               doseg(p);
00178               break;
00179 
00180        default:
00181               sprintf(errmsg, "unknown command '%c' in doprim", p->com);
00182               error(WARNING, errmsg);
00183               return;
00184        }
00185        newpage = FALSE;
00186 }
00187