Root/fped.c

1/*
2 * fped.c - Footprint editor, main function
3 *
4 * Written 2009-2012, 2015-2016 by Werner Almesberger
5 * Copyright 2009-2012, 2015-2016 by Werner Almesberger
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 */
12
13
14#include <stdlib.h>
15#include <stdio.h>
16#include <unistd.h>
17#include <string.h>
18#include <errno.h>
19
20#include "cpp.h"
21#include "util.h"
22#include "error.h"
23#include "obj.h"
24#include "inst.h"
25#include "file.h"
26#include "postscript.h"
27#include "dump.h"
28#include "gui.h"
29#include "delete.h"
30#include "fpd.h"
31#include "fped.h"
32
33
34char *save_file_name = NULL;
35int no_save = 0;
36
37
38static void load_file(const char *name)
39{
40    FILE *file;
41    char line[sizeof(MACHINE_GENERATED)];
42
43    file = fopen(name, "r");
44    if (file) {
45        if (!fgets(line, sizeof(line), file)) {
46            if (ferror(file)) {
47                perror(name);
48                exit(1);
49            }
50            *line = 0;
51        }
52        no_save = strcmp(line, MACHINE_GENERATED);
53        fclose(file);
54        reporter = report_parse_error;
55        run_cpp_on_file(name);
56    } else {
57        if (errno != ENOENT) {
58            perror(name);
59            exit(1);
60        }
61        scan_empty();
62    }
63    (void) yyparse();
64}
65
66
67void reload(void)
68{
69    struct frame *old_frames;
70
71    /* @@@ this needs more work */
72    purge();
73    old_frames = frames;
74    scan_file();
75    load_file(save_file_name);
76    if (!instantiate())
77        frames = old_frames;
78    change_world();
79}
80
81
82static void list_packages(void)
83{
84    const struct pkg *pkg;
85
86    for (pkg = pkgs; pkg; pkg = pkg->next)
87        if (pkg->name)
88            printf("%s\n", pkg->name);
89}
90
91
92static void usage(const char *name)
93{
94    fprintf(stderr,
95"usage: %s [batch_mode] [cpp_option ...] [in_file [out_file]]\n\n"
96"Batch mode options:\n"
97" -g [-1 package]\n"
98" write gnuplot output, then exit\n"
99" -k write KiCad output, then exit\n"
100" -l list package names, then exit\n"
101" -p [-m] write Postscript output, then exit\n"
102" -P [-K] [-m] [-s scale] [-1 package]\n"
103" write Postscript output (full page), then exit\n"
104" -T test mode. Load file, then exit\n"
105" -T -T test mode. Load file, dump to stdout, then exit\n\n"
106"Common options:\n"
107" -1 name output only the specified package\n"
108" -K show the pad type key\n"
109" -m do not show measurements\n"
110" -s scale scale factor for -P (default: auto-scale)\n"
111" -s [width]x[height]\n"
112" auto-scale to fit within specified box. Dimensions in mm.\n"
113" cpp_option -Idir, -Dname[=value], or -Uname\n"
114    , name);
115    exit(1);
116}
117
118
119static int parse_scaling(const char *arg)
120{
121    const char *x;
122    char *end;
123
124    x = strchr(arg, 'x');
125    if (!x) {
126        postscript_params.zoom = strtod(arg, &end);
127        return !*end;
128    }
129    if (x != arg) {
130        postscript_params.max_width = mm_to_units(strtod(arg, &end));
131        if (*end != 'x')
132            return 0;
133    }
134    if (x[1]) {
135        postscript_params.max_height = mm_to_units(strtod(x+1, &end));
136        if (*end)
137            return 0;
138    }
139    return 1;
140}
141
142
143int main(int argc, char **argv)
144{
145    enum {
146        batch_none = 0,
147        batch_kicad,
148        batch_ps,
149        batch_ps_fullpage,
150        batch_gnuplot,
151        batch_test,
152        batch_list,
153    } batch = batch_none;
154    char *name = *argv;
155    char **fake_argv;
156    char *args[2];
157    int fake_argc;
158    char opt[] = "-?";
159    int error;
160    int test_mode = 0;
161    const char *one = NULL;
162    int c;
163
164    while ((c = getopt(argc, argv, "1:gklmps:D:I:KPTU:")) != EOF)
165        switch (c) {
166        case '1':
167            one = optarg;
168            break;
169        case 'g':
170            if (batch)
171                usage(*argv);
172            batch = batch_gnuplot;
173            break;
174        case 'k':
175            if (batch)
176                usage(*argv);
177            batch = batch_kicad;
178            break;
179        case 'l':
180            if (batch)
181                usage(*argv);
182            batch = batch_list;
183            break;
184        case 'm':
185            postscript_params.show_meas = 0;
186            break;
187        case 'p':
188            if (batch)
189                usage(*argv);
190            batch = batch_ps;
191            break;
192        case 'P':
193            if (batch)
194                usage(*argv);
195            batch = batch_ps_fullpage;
196            break;
197        case 'K':
198            postscript_params.show_key = 1;
199            break;
200        case 's':
201            if (batch != batch_ps_fullpage)
202                usage(*argv);
203            if (!parse_scaling(optarg))
204                usage(*argv);
205            break;
206        case 'T':
207            batch = batch_test;
208            test_mode++;
209            break;
210        case 'D':
211        case 'U':
212        case 'I':
213            opt[1] = c;
214            add_cpp_arg(opt);
215            add_cpp_arg(optarg);
216            break;
217        default:
218            usage(name);
219        }
220
221    if (one && batch != batch_ps && batch != batch_ps_fullpage &&
222        batch != batch_gnuplot)
223        usage(name);
224    if (postscript_params.show_key && batch != batch_ps_fullpage)
225        usage(name);
226
227    if (!batch) {
228        args[0] = name;
229        args[1] = NULL;
230        fake_argc = 1;
231        fake_argv = args;
232        error = gui_init(&fake_argc, &fake_argv);
233        if (error)
234            return error;
235    }
236
237    switch (argc-optind) {
238    case 0:
239        scan_empty();
240        (void) yyparse();
241        break;
242    case 1:
243        load_file(argv[optind]);
244        save_file_name = argv[optind];
245        break;
246    case 2:
247        load_file(argv[optind]);
248        save_file_name = argv[optind+1];
249        if (!strcmp(save_file_name, "-"))
250            save_file_name = NULL;
251        break;
252    default:
253        usage(name);
254    }
255
256    if (!pkg_name)
257        pkg_name = stralloc("_");
258
259    reporter = report_to_stderr;
260    if (!instantiate())
261        return 1;
262
263    switch (batch) {
264    case batch_none:
265        error = gui_main();
266        if (error)
267            return error;
268        break;
269    case batch_kicad:
270        write_kicad();
271        break;
272    case batch_ps:
273        write_ps(one);
274        break;
275    case batch_ps_fullpage:
276        write_ps_fullpage(one);
277        break;
278    case batch_gnuplot:
279        write_gnuplot(one);
280        break;
281    case batch_test:
282        if (test_mode > 1)
283            dump(stdout, NULL);
284        break;
285    case batch_list:
286        list_packages();
287        break;
288    default:
289        abort();
290    }
291
292    purge();
293    inst_revert();
294    obj_cleanup();
295    unique_cleanup();
296
297    return 0;
298}
299

Archive Download this file

Branches:
master



interactive