FreeCalypso > hg > ueda-linux
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ueda/uschem-print/prolog.c Mon Jul 20 00:24:37 2015 +0000 @@ -0,0 +1,101 @@ +/* + * 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; + } +}