summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWerner Almesberger <werner@almesberger.net>2016-08-22 20:47:06 -0300
committerWerner Almesberger <werner@almesberger.net>2016-08-22 20:49:29 -0300
commit8dfb6b2c9f722d70b30e5794fe20ce9450dd05d4 (patch)
tree757749cdbd459d5460f893f6cf6116790845cb3b
parentc9a05d88435e5cc47492b4b62f8312ad8011fd2c (diff)
downloadeeshow-8dfb6b2c9f722d70b30e5794fe20ce9450dd05d4.tar.gz
eeshow-8dfb6b2c9f722d70b30e5794fe20ce9450dd05d4.tar.bz2
eeshow-8dfb6b2c9f722d70b30e5794fe20ce9450dd05d4.zip
eeshow/: change file name handling from positional to be extension-driven
This also enables versioning for page layouts. We no longer need the option -P.
-rw-r--r--Makefile2
-rw-r--r--gui/common.h6
-rw-r--r--gui/gui.c46
-rw-r--r--gui/gui.h9
-rw-r--r--gui/render.c4
-rw-r--r--main.c64
-rw-r--r--main.h2
7 files changed, 70 insertions, 63 deletions
diff --git a/Makefile b/Makefile
index bf657a6..5fd498f 100644
--- a/Makefile
+++ b/Makefile
@@ -131,7 +131,7 @@ neo900.pdf: $(NAME) sch2pdf neo900-template.fig
$(NEO900_HW)/neo900.sch
pdf: $(NAME)
- ./eeshow -r -P $(NEO900_HW)/neo900pageframe_A3.kicad_wks \
+ ./eeshow -r $(NEO900_HW)/neo900pageframe_A3.kicad_wks \
neo900.lib kicad-libs/components/powered.lib \
$(NEO900_HW)/neo900.sch -- pdf -o neo900.pdf
diff --git a/gui/common.h b/gui/common.h
index c67ef76..32a9a19 100644
--- a/gui/common.h
+++ b/gui/common.h
@@ -52,9 +52,11 @@ struct gui_hist {
struct gui_sheet *sheets; /* NULL if failed */
unsigned age; /* 0-based; uncommitted or HEAD = 0 */
+ struct pl_ctx *pl; /* NULL if none or failed */
+
/* caching support */
void **oids; /* file object IDs */
- int libs_open;
+ unsigned libs_open;
struct sch_ctx sch_ctx;
struct lib lib; /* combined library */
bool identical; /* identical with previous entry */
@@ -68,8 +70,6 @@ struct gui_ctx {
float scale; /* pixels = eeschema * scale */
int x, y; /* center, in eeschema coordinates */
- struct pl_ctx *pl; // @@@
-
struct gui_hist *hist; /* revision history; NULL if none */
struct hist *vcs_hist; /* underlying VCS data; NULL if none */
diff --git a/gui/gui.c b/gui/gui.c
index 98b98b7..f41e90a 100644
--- a/gui/gui.c
+++ b/gui/gui.c
@@ -30,6 +30,7 @@
#include "misc/util.h"
#include "misc/diag.h"
#include "file/git-hist.h"
+#include "kicad/ext.h"
#include "kicad/pl.h"
#include "kicad/lib.h"
#include "kicad/sch.h"
@@ -212,12 +213,13 @@ static struct gui_sheet *get_sheets(struct gui_ctx *ctx, struct gui_hist *hist,
*/
static const struct sheet *parse_files(struct gui_hist *hist,
- int n_args, char **args, bool recurse, struct gui_hist *prev)
+ const struct file_names *fn, bool recurse, struct gui_hist *prev)
{
char *rev = NULL;
struct file sch_file;
- struct file lib_files[n_args - 1];
- int libs_open, i;
+ struct file lib_files[fn->n_libs];
+ struct file pl_file;
+ unsigned libs_open, i;
bool libs_cached = 0;
bool ok;
@@ -225,7 +227,7 @@ static const struct sheet *parse_files(struct gui_hist *hist,
rev = vcs_git_get_rev(hist->vcs_hist);
sch_init(&hist->sch_ctx, recurse);
- ok = file_open_revision(&sch_file, rev, args[n_args - 1], NULL);
+ ok = file_open_revision(&sch_file, rev, fn->sch, NULL);
if (rev)
free(rev);
@@ -235,11 +237,22 @@ static const struct sheet *parse_files(struct gui_hist *hist,
}
lib_init(&hist->lib);
- for (libs_open = 0; libs_open != n_args - 1; libs_open++)
- if (!file_open(lib_files + libs_open, args[libs_open],
+ for (libs_open = 0; libs_open != fn->n_libs; libs_open++)
+ if (!file_open(lib_files + libs_open, fn->libs[libs_open],
&sch_file))
goto fail;
+ if (fn->pl) {
+ if (!file_open(&pl_file, fn->pl, &sch_file))
+ goto fail;
+ hist->pl = pl_parse(&pl_file);
+ file_close(&pl_file);
+ /*
+ * We treat failing to parse the page layout as a "minor"
+ * failure and don't reject the revision just because of it.
+ */
+ }
+
if (hist->vcs_hist) {
hist->oids = alloc_type_n(void *, libs_open);
hist->libs_open = libs_open;
@@ -293,8 +306,7 @@ fail:
struct add_hist_ctx {
struct gui_ctx *ctx;
- int n_args;
- char **args;
+ const struct file_names *fn;
bool recurse;
unsigned limit;
};
@@ -324,7 +336,8 @@ static void add_hist(void *user, struct hist *h)
hist->vcs_hist = h;
hist->libs_open = 0;
hist->identical = 0;
- sch = parse_files(hist, ahc->n_args, ahc->args, ahc->recurse, prev);
+ hist->pl = NULL;
+ sch = parse_files(hist, ahc->fn, ahc->recurse, prev);
hist->sheets = sch ? get_sheets(ctx, hist, sch) : NULL;
hist->age = age;
@@ -336,13 +349,12 @@ static void add_hist(void *user, struct hist *h)
}
-static void get_revisions(struct gui_ctx *ctx,
- int n_args, char **args, bool recurse, int limit)
+static void get_revisions(struct gui_ctx *ctx, const struct file_names *fn,
+ bool recurse, int limit)
{
struct add_hist_ctx add_hist_ctx = {
.ctx = ctx,
- .n_args = n_args,
- .args = args,
+ .fn = fn,
.recurse = recurse,
.limit = limit ? limit < 0 ? -limit : limit : -1,
};
@@ -383,14 +395,12 @@ static void get_history(struct gui_ctx *ctx, const char *sch_name, int limit)
/* ----- Initialization ---------------------------------------------------- */
-int gui(unsigned n_args, char **args, bool recurse, int limit,
- struct pl_ctx *pl)
+int gui(const struct file_names *fn, bool recurse, int limit)
{
GtkWidget *window;
char *title;
struct gui_ctx ctx = {
.scale = 1 / 16.0,
- .pl = pl, // @@@
.hist = NULL,
.vcs_hist = NULL,
.showing_history= 0,
@@ -422,11 +432,11 @@ int gui(unsigned n_args, char **args, bool recurse, int limit,
gtk_widget_show_all(window);
- get_history(&ctx, args[n_args - 1], limit);
+ get_history(&ctx, fn->sch, limit);
if (ctx.hist_size)
setup_progress_bar(&ctx, window);
- get_revisions(&ctx, n_args, args, recurse, limit);
+ get_revisions(&ctx, fn, recurse, limit);
for (ctx.new_hist = ctx.hist; ctx.new_hist && !ctx.new_hist->sheets;
ctx.new_hist = ctx.new_hist->next);
if (!ctx.new_hist)
diff --git a/gui/gui.h b/gui/gui.h
index f0307cb..bd80284 100644
--- a/gui/gui.h
+++ b/gui/gui.h
@@ -15,12 +15,9 @@
#include <stdbool.h>
-/*
- * Note: this isn't (argc, argv) ! args stars right with the first file name
- * and there is no NULL at the end.
- */
+#include "kicad/ext.h"
+
-int gui(unsigned n_args, char **args, bool recurse, int limit,
- struct pl_ctx *pl);
+int gui(const struct file_names *fn, bool recurse, int limit);
#endif /* !GUI_GUI_H */
diff --git a/gui/render.c b/gui/render.c
index 465128d..ec4db2e 100644
--- a/gui/render.c
+++ b/gui/render.c
@@ -231,8 +231,8 @@ void render_sheet(struct gui_sheet *sheet)
char *argv[] = { "gui", NULL };
gfx_init(&cro_canvas_ops, 1, argv);
- if (sheet->ctx && sheet->ctx->pl) /* @@@ no pl_render for delta */
- pl_render(sheet->ctx->pl, sheet->hist->sch_ctx.sheets,
+ if (sheet->hist && sheet->hist->pl) /* @@@ no pl_render for delta */
+ pl_render(sheet->hist->pl, sheet->hist->sch_ctx.sheets,
sheet->sch);
sch_render(sheet->sch);
cro_canvas_end(gfx_ctx,
diff --git a/main.c b/main.c
index b31e7b9..f426741 100644
--- a/main.c
+++ b/main.c
@@ -1,5 +1,5 @@
/*
- * main.c - Convert Eeschema schematics to FIG
+ * main.c - Visualize and convert Eeschema schematics
*
* Written 2016 by Werner Almesberger
* Copyright 2016 by Werner Almesberger
@@ -26,6 +26,7 @@
#include "gfx/diff.h"
#include "gfx/gfx.h"
#include "file/file.h"
+#include "kicad/ext.h"
#include "kicad/sexpr.h"
#include "kicad/pl.h"
#include "kicad/lib.h"
@@ -60,12 +61,12 @@ static void sexpr(void)
exit(1);
}
-
+
void usage(const char *name)
{
fprintf(stderr,
-"usage: %s [gtk_flags] [-r] [-N n] [[rev:]file.lib ...] [rev:]file.sch\n"
-" %s [-r] [-v ...] [[rev:]file.lib ...] [rev:]file.sch\n"
+"usage: %s [gtk_flags] [-r] [-N n] kicad_file ...\n"
+" %s [-r] [-v ...] kicad_file ...\n"
" %*s[-- driver_spec]\n"
" %s [-v ...] -C [rev:]file\n"
" %s [-v ...] -H path_into_repo\n"
@@ -73,7 +74,10 @@ void usage(const char *name)
" %s -V\n"
" %s gdb ...\n"
"\n"
-" rev git revision\n"
+" kicad_file [rev:]file.ext\n"
+" ext .lib, .sch, or .kicad_wks\n"
+" rev git revision\n"
+"\n"
" -r recurse into sub-sheets\n"
" -v increase verbosity of diagnostic output\n"
" -C 'cat' the file to standard output\n"
@@ -121,12 +125,13 @@ int main(int argc, char **argv)
const char *cat = NULL;
const char *history = NULL;
const char *fmt = NULL;
- const char *page_layout = NULL;
struct pl_ctx *pl = NULL;
int limit = 0;
char c;
- int arg, dashdash;
+ int dashdash;
+ unsigned i;
bool have_dashdash = 0;
+ struct file_names file_names;
int gfx_argc;
char **gfx_argv;
const struct gfx_ops **ops = ops_list;
@@ -153,7 +158,7 @@ int main(int argc, char **argv)
if (!have_dashdash)
gtk_init(&argc, &argv);
- while ((c = getopt(dashdash, argv, "P:rvC:F:H:N:SV")) != EOF)
+ while ((c = getopt(dashdash, argv, "rvC:F:H:N:SV")) != EOF)
switch (c) {
case 'r':
recurse = 1;
@@ -173,9 +178,6 @@ int main(int argc, char **argv)
case 'N':
limit = atoi(optarg);
break;
- case 'P':
- page_layout = optarg;
- break;
case 'S':
sexpr();
return 0;
@@ -215,39 +217,37 @@ int main(int argc, char **argv)
return 0;
}
- if (page_layout) {
- struct file file;
-
- if (!file_open(&file, page_layout, NULL))
- return 1;
- pl = pl_parse(&file);
- file_close(&file);
- if (!pl)
- return 1;
- }
-
if (dashdash - optind < 1)
usage(*argv);
- if (!have_dashdash) {
- unsigned n = argc - optind;
- char **args;
+ classify_files(&file_names, argv + optind, dashdash - optind);
+ if (!file_names.sch)
+ fatal("top sheet name required");
- args = alloc_type_n(char *, n);
- memcpy(args, argv + optind, sizeof(const char *) * n);
-
+ if (!have_dashdash) {
optind = 0; /* reset getopt */
- return gui(n, args, recurse, limit, pl);
+ return gui(&file_names, recurse, limit);
}
sch_init(&sch_ctx, recurse);
- if (!file_open(&sch_file, argv[dashdash - 1], NULL))
+ if (!file_open(&sch_file, file_names.sch, NULL))
return 1;
lib_init(&lib);
- for (arg = optind; arg != dashdash - 1; arg++)
- if (!lib_parse(&lib, argv[arg], &sch_file))
+ for (i = 0; i != file_names.n_libs; i++)
+ if (!lib_parse(&lib, file_names.libs[i], &sch_file))
+ return 1;
+
+ if (file_names.pl) {
+ struct file file;
+
+ if (!file_open(&file, file_names.pl, &sch_file))
+ return 1;
+ pl = pl_parse(&file);
+ file_close(&file);
+ if (!pl)
return 1;
+ }
if (dashdash == argc) {
gfx_argc = 1;
diff --git a/main.h b/main.h
index eb3587c..6ff02cf 100644
--- a/main.h
+++ b/main.h
@@ -1,5 +1,5 @@
/*
- * main.h - Convert Eeschema schematics to FIG
+ * main.h - Visualize and convert Eeschema schematics
*
* Written 2016 by Werner Almesberger
* Copyright 2016 by Werner Almesberger