FreeCalypso > hg > ueda-linux
view ueda/uschem-print/prolog.c @ 0:cd92449fdb51
initial import of ueda and ifctf-part-lib from ifctfvax CVS
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 20 Jul 2015 00:24:37 +0000 |
parents | |
children |
line wrap: on
line source
/* * The main work here is emitting the graphical symbol definitions * and any user-requested additional procsets. */ #include <sys/types.h> #include <stdio.h> #include <strings.h> #include "../libuschem/graphsym.h" #include "../libuschem/schemstruct.h" extern FILE *find_symlib_file(); extern int total_graphsyms; extern struct schem **schem_pages; extern int npages; extern char uschem_procset_pathname[]; extern char transfont_procset_pathname[]; print_graphsym_def(sym) struct graphsym *sym; { FILE *f; printf("/%s {\n", sym->gs_name); f = fopen(sym->gs_pathname, "r"); if (!f) { fprintf(stderr, "Unable to reopen %s for printing: ", sym->gs_pathname); perror(NULL); exit(1); } print_gschem_code_sym(f, sym); fclose(f); puts("} bind def"); } emit_prolog() { register int i; puts("%%BeginProlog"); emit_file(uschem_procset_pathname); emit_file(transfont_procset_pathname); for (i = 0; i < npages; i++) emit_extra_procsets(schem_pages[i]); printf("%d dict begin\n", total_graphsyms); graphsym_forall(print_graphsym_def); puts("currentdict end"); puts("$uschem exch /symbols exch put"); puts("%%EndProlog"); } #define MAX_EXTRA_PROCSETS 128 emit_extra_procsets(schem) struct schem *schem; { static char *procset_list[MAX_EXTRA_PROCSETS]; static int nprocsets; register struct schemobj *obj; register char *psname; register int i; register FILE *f; char buf[512]; for (obj = schem->obj_next; obj != (struct schemobj *)schem; obj = obj->obj_next) { if (obj->obj_type != OBJTYPE_COMMENT) continue; if (strncmp(obj->commentobj_text, "Need procset: ", 14)) continue; psname = obj->commentobj_text + 14; if (!psname[0]) continue; /* have we already seen it? */ for (i = 0; i < nprocsets; i++) if (!strcmp(procset_list[i], psname)) break; if (i < nprocsets) continue; if (nprocsets >= MAX_EXTRA_PROCSETS) { fprintf(stderr, "%s: line %d: too many procsets\n", schem->orig_filename, obj->obj_lineno); exit(1); } /* get it and put it out */ f = find_symlib_file(psname, NULL); if (!f) { fprintf(stderr, "procset %s not found (%s line %d)\n", psname, schem->orig_filename, obj->obj_lineno); exit(1); } while ((i = fread(buf, 1, sizeof buf, f)) > 0) fwrite(buf, 1, i, stdout); fclose(f); procset_list[nprocsets++] = psname; } }