/* * main.c - Convert Eeschema schematics to FIG * * Written 2016 by Werner Almesberger * Copyright 2016 by Werner Almesberger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. */ #include #include #include #include #include "fig.h" #include "gfx.h" #include "lib.h" #include "sch.h" static bool do_sch_parse(void *ctx, const char *line) { return sch_parse(ctx, line); } static bool do_lib_parse(void *ctx, const char *line) { return lib_parse(ctx, line); } static void read_file(const char *name, void *ctx, bool (*parse)(void *ctx, const char *line)) { FILE *file; char buf[1000]; char *nl; file = fopen(name, "r"); if (!file) { perror(name); exit(1); } while (fgets(buf, sizeof(buf), file)) { nl = strchr(buf, '\n'); if (nl) *nl = 0; if (!parse(ctx, buf)) break; } fclose(file); } static void usage(const char *name) { fprintf(stderr, "usage: %s [-t template.fig] [-Dvar=value ...] [file.lib ...] file.sch\n", name); exit(1); } int main(int argc, char **argv) { const char *template = NULL; char c; int arg; int n_vars = 0; const char **vars = NULL; while ((c = getopt(argc, argv, "t:D:")) != EOF) switch (c) { case 't': template = optarg; break; case 'D': if (!strchr(optarg, '=')) usage(*argv); n_vars++; vars = realloc(vars, sizeof(const char *) * n_vars); vars[n_vars - 1] = optarg; break; default: usage(*argv); } if (argc - optind < 1) usage(*argv); gfx_init(&fig_ops, template, n_vars, vars); for (arg = optind; arg != argc; arg++) { if (arg == argc - 1) { struct sch_ctx ctx; sch_init(&ctx); read_file(argv[arg], &ctx, do_sch_parse); } else { struct lib_ctx ctx; lib_init(&ctx); read_file(argv[arg], &ctx, do_lib_parse); } } gfx_end(); }