diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index d3d1f87d6..c8369dea3 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -175,6 +175,7 @@ static struct modellist *inp_find_model( struct nscope *scope, const char *name); void tprint(struct card *deck); +static char* libprint(struct card* t, const char *dir); static void inp_repair_dc_ps(struct card* oldcard); static void inp_get_w_l_x(struct card* oldcard); @@ -3292,13 +3293,23 @@ static struct card *expand_section_ref(struct card *c, const char *dir_name) * every library section reference (when the given section_name_ === NULL) * or * just those references occuring in the given library section definition + * + * Command .libsave saves the loaded and parsed lib, to be read by .include */ static void expand_section_references(struct card *c, const char *dir_name) { - for (; c; c = c->nextcard) - if (ciprefix(".lib", c->line)) + for (; c; c = c->nextcard) { + struct card* p = c; + if (ciprefix(".libsave", c->line)) { c = expand_section_ref(c, dir_name); + char *filename = libprint(p, dir_name); + fprintf(stdout, "\nLibrary\n%s\nsaved to %s\n", p->line + 9, filename); + tfree(filename); + } + else if (ciprefix(".lib", c->line)) + c = expand_section_ref(c, dir_name); + } } @@ -6913,6 +6924,24 @@ static void inp_poly_err(struct card *card) #endif +/* Print the parsed library to lib_out?.lib, with ? a growing number + if multiple libs are saved in a single run. */ +static char* libprint(struct card* t, const char *dir_name) +{ + struct card* tmp; + static int npr = 1; + char *outfile = tprintf("%s/lib_out%d.lib", dir_name, npr); + npr++; + FILE* fd = fopen(outfile, "w"); + if (fd) { + for (tmp = t; tmp; tmp = tmp->nextcard) + if (*(tmp->line) != '*') + fprintf(fd, "%s\n", tmp->line); + fclose(fd); + } + return outfile; +} + /* Used for debugging. You may add * tprint(working);