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;
+	}
+}