Move _draw_line() routine from draw.c into HID_DRAW API
[geda-pcb/pcjc2.git] / src / main.c
blob3ab4d56aa0770e05c74680e716f0a2730f0477e6
1 /*
2 * COPYRIGHT
4 * PCB, interactive printed circuit board design
5 * Copyright (C) 1994,1995,1996, 2004 Thomas Nau
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.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * Contact addresses for paper mail and Email:
22 * Thomas Nau, Schlehenweg 15, 88471 Baustetten, Germany
23 * Thomas.Nau@rz.uni-ulm.de
28 /* main program, initializes some stuff and handles user input
30 #ifdef HAVE_CONFIG_H
31 #include "config.h"
32 #endif
34 #ifdef HAVE_LOCALE_H
35 #include <locale.h> /* setlocale() and LC_ALL */
36 #endif
37 #include <stdlib.h>
38 #ifdef HAVE_STRING_H
39 #include <string.h>
40 #endif
41 #include <signal.h>
42 #include <unistd.h>
43 #include <sys/stat.h>
44 #include <time.h> /* Seed for srand() */
46 #include "global.h"
47 #include "data.h"
48 #include "buffer.h"
49 #include "create.h"
50 #include "crosshair.h"
51 #include "draw.h"
52 #include "error.h"
53 #include "file.h"
54 #include "set.h"
55 #include "action.h"
56 #include "misc.h"
57 #include "lrealpath.h"
58 #include "free_atexit.h"
59 #include "polygon.h"
60 #include "pcb-printf.h"
62 #include "hid/common/actions.h"
64 /* This next one is so we can print the help messages. */
65 #include "hid/hidint.h"
67 #ifdef HAVE_DBUS
68 #include "dbus.h"
69 #endif
71 #if ENABLE_NLS
72 #include <libintl.h>
73 #endif
75 #ifdef HAVE_LIBDMALLOC
76 #include <dmalloc.h>
77 #endif
79 #define PCBLIBPATH ".:" PCBLIBDIR
82 #ifdef HAVE_LIBSTROKE
83 extern void stroke_init (void);
84 #endif
87 /* ----------------------------------------------------------------------
88 * initialize signal and error handlers
90 static void
91 InitHandler (void)
94 signal(SIGHUP, CatchSignal);
95 signal(SIGQUIT, CatchSignal);
96 signal(SIGABRT, CatchSignal);
97 signal(SIGSEGV, CatchSignal);
98 signal(SIGTERM, CatchSignal);
99 signal(SIGINT, CatchSignal);
102 /* calling external program by popen() may cause a PIPE signal,
103 * so we ignore it
105 #ifdef SIGPIPE
106 signal (SIGPIPE, SIG_IGN);
107 #endif
111 /* ----------------------------------------------------------------------
112 | command line and rc file processing.
114 static char *command_line_pcb;
116 void
117 copyright (void)
119 printf ("\n"
120 " COPYRIGHT for %s version %s\n\n"
121 " PCB, interactive printed circuit board design\n"
122 " Copyright (C) 1994,1995,1996,1997 Thomas Nau\n"
123 " Copyright (C) 1998, 1999, 2000 Harry Eaton\n\n"
124 " This program is free software; you can redistribute it and/or modify\n"
125 " it under the terms of the GNU General Public License as published by\n"
126 " the Free Software Foundation; either version 2 of the License, or\n"
127 " (at your option) any later version.\n\n"
128 " This program is distributed in the hope that it will be useful,\n"
129 " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
130 " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
131 " GNU General Public License for more details.\n\n"
132 " You should have received a copy of the GNU General Public License\n"
133 " along with this program; if not, write to the Free Software\n"
134 " Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n",
135 Progname, VERSION);
136 exit (0);
139 static inline void
140 u (const char *fmt, ...)
142 va_list ap;
143 va_start (ap, fmt);
144 vfprintf (stderr, fmt, ap);
145 fputc ('\n', stderr);
146 va_end (ap);
149 typedef struct UsageNotes {
150 struct UsageNotes *next;
151 HID_Attribute *seen;
152 } UsageNotes;
154 static UsageNotes *usage_notes = NULL;
156 static void
157 usage_attr (HID_Attribute * a)
159 int i, n;
160 const Unit *unit_list;
161 static char buf[200];
163 if (a->help_text == ATTR_UNDOCUMENTED)
164 return;
166 switch (a->type)
168 case HID_Label:
169 return;
170 case HID_Integer:
171 case HID_Real:
172 sprintf (buf, "--%s <num>", a->name);
173 break;
174 case HID_Coord:
175 sprintf (buf, "--%s <measure>", a->name);
176 break;
177 case HID_String:
178 sprintf (buf, "--%s <string>", a->name);
179 break;
180 case HID_Boolean:
181 sprintf (buf, "--%s", a->name);
182 break;
183 case HID_Mixed:
184 case HID_Enum:
185 sprintf (buf, "--%s ", a->name);
186 if (a->type == HID_Mixed)
187 strcat (buf, " <val>");
188 for (i = 0; a->enumerations[i]; i++)
190 strcat (buf, i ? "|" : "<");
191 strcat (buf, a->enumerations[i]);
193 strcat (buf, ">");
194 break;
195 case HID_Path:
196 sprintf (buf, "--%s <path>", a->name);
197 break;
198 case HID_Unit:
199 unit_list = get_unit_list ();
200 n = get_n_units ();
201 sprintf (buf, "--%s ", a->name);
202 for (i = 0; i < n; i++)
204 strcat (buf, i ? "|" : "<");
205 strcat (buf, unit_list[i].suffix);
207 strcat (buf, ">");
208 break;
211 if (strlen (buf) <= 30)
213 if (a->help_text)
214 fprintf (stderr, " %-30s\t%s\n", buf, a->help_text);
215 else
216 fprintf (stderr, " %-30s\n", buf);
218 else if (a->help_text && strlen (a->help_text) + strlen (buf) < 72)
219 fprintf (stderr, " %s\t%s\n", buf, a->help_text);
220 else if (a->help_text)
221 fprintf (stderr, " %s\n\t\t\t%s\n", buf, a->help_text);
222 else
223 fprintf (stderr, " %s\n", buf);
226 static void
227 usage_hid (HID * h)
229 HID_Attribute *attributes;
230 int i, n_attributes = 0;
231 UsageNotes *note;
233 if (h->gui)
235 fprintf (stderr, "\n%s gui options:\n", h->name);
236 attributes = h->get_export_options (&n_attributes);
238 else
240 fprintf (stderr, "\n%s options:\n", h->name);
241 exporter = h;
242 attributes = exporter->get_export_options (&n_attributes);
243 exporter = NULL;
246 note = (UsageNotes *)malloc (sizeof (UsageNotes));
247 note->next = usage_notes;
248 note->seen = attributes;
249 usage_notes = note;
251 for (i = 0; i < n_attributes; i++)
252 usage_attr (attributes + i);
255 static void
256 usage (void)
258 HID **hl = hid_enumerate ();
259 HID_AttrNode *ha;
260 UsageNotes *note;
261 int i;
262 int n_printer = 0, n_gui = 0, n_exporter = 0;
264 for (i = 0; hl[i]; i++)
266 if (hl[i]->gui)
267 n_gui++;
268 if (hl[i]->printer)
269 n_printer++;
270 if (hl[i]->exporter)
271 n_exporter++;
274 u ("PCB Printed Circuit Board editing program, http://pcb.geda-project.org");
275 u ("%s [-h|-V|--copyright]\t\t\tHelp, version, copyright", Progname);
276 u ("%s [gui options] <pcb file>\t\tto edit", Progname);
277 u ("Available GUI hid%s:", n_gui == 1 ? "" : "s");
278 for (i = 0; hl[i]; i++)
279 if (hl[i]->gui)
280 fprintf (stderr, "\t%-8s %s\n", hl[i]->name, hl[i]->description);
281 u ("%s -p [printing options] <pcb file>\tto print", Progname);
282 u ("Available printing hid%s:", n_printer == 1 ? "" : "s");
283 for (i = 0; hl[i]; i++)
284 if (hl[i]->printer)
285 fprintf (stderr, "\t%-8s %s\n", hl[i]->name, hl[i]->description);
286 u ("%s -x hid [export options] <pcb file>\tto export", Progname);
287 u ("Available export hid%s:", n_exporter == 1 ? "" : "s");
288 for (i = 0; hl[i]; i++)
289 if (hl[i]->exporter)
290 fprintf (stderr, "\t%-8s %s\n", hl[i]->name, hl[i]->description);
292 for (i = 0; hl[i]; i++)
293 if (hl[i]->gui)
294 usage_hid (hl[i]);
295 for (i = 0; hl[i]; i++)
296 if (hl[i]->printer)
297 usage_hid (hl[i]);
298 for (i = 0; hl[i]; i++)
299 if (hl[i]->exporter)
300 usage_hid (hl[i]);
302 u ("\nCommon options:");
303 for (ha = hid_attr_nodes; ha; ha = ha->next)
305 for (note = usage_notes; note && note->seen != ha->attributes; note = note->next)
307 if (note)
308 continue;
309 for (i = 0; i < ha->n; i++)
311 usage_attr (ha->attributes + i);
315 exit (1);
318 static void
319 print_defaults_1 (HID_Attribute * a, void *value)
321 int i;
322 Coord c;
323 double d;
324 const char *s;
326 /* Remember, at this point we've parsed the command line, so they
327 may be in the global variable instead of the default_val. */
328 switch (a->type)
330 case HID_Integer:
331 i = value ? *(int *) value : a->default_val.int_value;
332 fprintf (stderr, "%s %d\n", a->name, i);
333 break;
334 case HID_Boolean:
335 i = value ? *(char *) value : a->default_val.int_value;
336 fprintf (stderr, "%s %s\n", a->name, i ? "yes" : "no");
337 break;
338 case HID_Real:
339 d = value ? *(double *) value : a->default_val.real_value;
340 fprintf (stderr, "%s %g\n", a->name, d);
341 break;
342 case HID_Coord:
343 c = value ? *(Coord *) value : a->default_val.coord_value;
344 pcb_fprintf (stderr, "%s %$mS\n", a->name, c);
345 break;
346 case HID_String:
347 case HID_Path:
348 s = value ? *(char **) value : a->default_val.str_value;
349 fprintf (stderr, "%s \"%s\"\n", a->name, s);
350 break;
351 case HID_Enum:
352 i = value ? *(int *) value : a->default_val.int_value;
353 fprintf (stderr, "%s %s\n", a->name, a->enumerations[i]);
354 break;
355 case HID_Mixed:
356 i = value ?
357 ((HID_Attr_Val*)value)->int_value : a->default_val.int_value;
358 d = value ?
359 ((HID_Attr_Val*)value)->real_value : a->default_val.real_value;
360 fprintf (stderr, "%s %g%s\n", a->name, d, a->enumerations[i]);
361 break;
362 case HID_Label:
363 break;
364 case HID_Unit:
365 i = value ? *(int *) value : a->default_val.int_value;
366 fprintf (stderr, "%s %s\n", a->name, get_unit_list()[i].suffix);
370 static void
371 print_defaults ()
373 HID **hl = hid_enumerate ();
374 HID_Attribute *e;
375 int i, n, hi;
377 for (hi = 0; hl[hi]; hi++)
379 HID *h = hl[hi];
380 if (h->gui)
382 HID_AttrNode *ha;
383 fprintf (stderr, "\ngui defaults:\n");
384 for (ha = hid_attr_nodes; ha; ha = ha->next)
385 for (i = 0; i < ha->n; i++)
386 print_defaults_1 (ha->attributes + i, ha->attributes[i].value);
388 else
390 fprintf (stderr, "\n%s defaults:\n", h->name);
391 exporter = h;
392 e = exporter->get_export_options (&n);
393 exporter = NULL;
394 if (e)
395 for (i = 0; i < n; i++)
396 print_defaults_1 (e + i, 0);
399 exit (1);
402 #define SSET(F,D,N,H) { N, H, \
403 HID_String, 0, 0, { 0, D, 0 }, 0, &Settings.F }
404 #define ISET(F,D,N,H) { N, H, \
405 HID_Integer, 0, 0, { D, 0, 0 }, 0, &Settings.F }
406 #define BSET(F,D,N,H) { N, H, \
407 HID_Boolean, 0, 0, { D, 0, 0 }, 0, &Settings.F }
408 #define RSET(F,D,N,H) { N, H, \
409 HID_Real, 0, 0, { 0, 0, D }, 0, &Settings.F }
410 #define CSET(F,D,N,H) { N, H, \
411 HID_Coord, 0, 0, { 0, 0, 0, D }, 0, &Settings.F }
413 #define COLOR(F,D,N,H) { N, H, \
414 HID_String, 0, 0, { 0, D, 0 }, 0, &Settings.F }
415 #define LAYERCOLOR(N,D) { "layer-color-" #N, "Color for layer " #N, \
416 HID_String, 0, 0, { 0, D, 0 }, 0, &Settings.LayerColor[N-1] }
417 #define LAYERNAME(N,D) { "layer-name-" #N, "Name for layer " #N, \
418 HID_String, 0, 0, { 0, D, 0 }, 0, &Settings.DefaultLayerName[N-1] }
419 #define LAYERSELCOLOR(N) { "layer-selected-color-" #N, "Color for layer " #N " when selected", \
420 HID_String, 0, 0, { 0, "#00ffff", 0 }, 0, &Settings.LayerSelectedColor[N-1] }
422 static int show_help = 0;
423 static int show_version = 0;
424 static int show_copyright = 0;
425 static int show_defaults = 0;
426 static int show_actions = 0;
427 static int do_dump_actions = 0;
428 static char *grid_units;
429 static Increments increment_mm = { 0 };
430 static Increments increment_mil = { 0 };
432 void save_increments (const Increments *mm, const Increments *mil)
434 memcpy (&increment_mm, mm, sizeof (*mm));
435 memcpy (&increment_mil, mil, sizeof (*mil));
438 HID_Attribute main_attribute_list[] = {
440 /* %start-doc options "1 General Options"
441 @ftable @code
442 @item --help
443 Show help on command line options.
444 @end ftable
445 %end-doc
447 {"help", "Show help on command line options", HID_Boolean, 0, 0, {0, 0, 0}, 0,
448 &show_help},
450 /* %start-doc options "1 General Options"
451 @ftable @code
452 @item --version
453 Show version.
454 @end ftable
455 %end-doc
457 {"version", "Show version", HID_Boolean, 0, 0, {0, 0, 0}, 0, &show_version},
459 /* %start-doc options "1 General Options"
460 @ftable @code
461 @item --verbose
462 Be verbose on stdout.
463 @end ftable
464 %end-doc
466 {"verbose", "Be verbose on stdout", HID_Boolean, 0, 0, {0, 0, 0}, 0,
467 &Settings.verbose},
469 /* %start-doc options "1 General Options"
470 @ftable @code
471 @item --copyright
472 Show copyright.
473 @end ftable
474 %end-doc
476 {"copyright", "Show Copyright", HID_Boolean, 0, 0, {0, 0, 0}, 0,
477 &show_copyright},
479 /* %start-doc options "1 General Options"
480 @ftable @code
481 @item --show-defaults
482 Show option defaults.
483 @end ftable
484 %end-doc
486 {"show-defaults", "Show option defaults", HID_Boolean, 0, 0, {0, 0, 0}, 0,
487 &show_defaults},
489 /* %start-doc options "1 General Options"
490 @ftable @code
491 @item --show-actions
492 Show available actions and exit.
493 @end ftable
494 %end-doc
496 {"show-actions", "Show available actions", HID_Boolean, 0, 0, {0, 0, 0}, 0,
497 &show_actions},
499 /* %start-doc options "1 General Options"
500 @ftable @code
501 @item --dump-actions
502 Dump actions (for documentation).
503 @end ftable
504 %end-doc
506 {"dump-actions", "Dump actions (for documentation)", HID_Boolean, 0, 0,
507 {0, 0, 0}, 0, &do_dump_actions},
509 /* %start-doc options "1 General Options"
510 @ftable @code
511 @item --grid-units-mm <string>
512 Set default grid units. Can be mm or mil. Defaults to mil.
513 @end ftable
514 %end-doc
516 {"grid-units", "Default grid units (mm|mil)", HID_String, 0, 0, {0, "mil", 0},
517 0, &grid_units},
519 /* %start-doc options "1 General Options"
520 @ftable @code
521 @item --clear-increment-mm <string>
522 Set default clear increment (amount to change when user presses k or K)
523 when user is using a metric grid unit.
524 @end ftable
525 %end-doc
527 {"clear-increment-mm", "Default clear increment amount (metric)", HID_Coord, 0, 0, {0, 0, 0},
528 0, &increment_mm.clear},
530 /* %start-doc options "1 General Options"
531 @ftable @code
532 @item --grid-increment-mm <string>
533 Set default grid increment (amount to change when user presses g or G)
534 when user is using a metric grid unit.
535 @end ftable
536 %end-doc
538 {"grid-increment-mm", "Default grid increment amount (metric)", HID_Coord, 0, 0, {0, 0, 0},
539 0, &increment_mm.grid},
541 /* %start-doc options "1 General Options"
542 @ftable @code
543 @item --line-increment-mm <string>
544 Set default line increment (amount to change when user presses l or L)
545 when user is using a metric grid unit.
546 @end ftable
547 %end-doc
549 {"line-increment-mm", "Default line increment amount (metric)", HID_Coord, 0, 0, {0, 0, 0},
550 0, &increment_mm.line},
552 /* %start-doc options "1 General Options"
553 @ftable @code
554 @item --size-increment-mm <string>
555 Set default size increment (amount to change when user presses s or S)
556 when user is using a metric grid unit.
557 @end ftable
558 %end-doc
560 {"size-increment-mm", "Default size increment amount (metric)", HID_Coord, 0, 0, {0, 0, 0},
561 0, &increment_mm.size},
563 /* %start-doc options "1 General Options"
564 @ftable @code
565 @item --clear-increment-mil <string>
566 Set default clear increment (amount to change when user presses k or K)
567 when user is using an imperial grid unit.
568 @end ftable
569 %end-doc
571 {"clear-increment-mil", "Default clear increment amount (imperial)", HID_Coord, 0, 0, {0, 0, 0},
572 0, &increment_mil.clear},
574 /* %start-doc options "1 General Options"
575 @ftable @code
576 @item --grid-increment-mil <string>
577 Set default grid increment (amount to change when user presses g or G)
578 when user is using a imperial grid unit.
579 @end ftable
580 %end-doc
582 {"grid-increment-mil", "Default grid increment amount (imperial)", HID_Coord, 0, 0, {0, 0, 0},
583 0, &increment_mil.grid},
585 /* %start-doc options "1 General Options"
586 @ftable @code
587 @item --line-increment-mil <string>
588 Set default line increment (amount to change when user presses l or L)
589 when user is using a imperial grid unit.
590 @end ftable
591 %end-doc
593 {"line-increment-mil", "Default line increment amount (imperial)", HID_Coord, 0, 0, {0, 0, 0},
594 0, &increment_mil.line},
596 /* %start-doc options "1 General Options"
597 @ftable @code
598 @item --size-increment-mil <string>
599 Set default size increment (amount to change when user presses s or S)
600 when user is using a imperial grid unit.
601 @end ftable
602 %end-doc
604 {"size-increment-mil", "Default size increment amount (imperial)", HID_Coord, 0, 0, {0, 0, 0},
605 0, &increment_mil.size},
607 /* %start-doc options "3 Colors"
608 @ftable @code
609 @item --black-color <string>
610 Color value for black. Default: @samp{#000000}
611 @end ftable
612 %end-doc
614 COLOR (BlackColor, "#000000", "black-color", "color value of 'black'"),
616 /* %start-doc options "3 Colors"
617 @ftable @code
618 @item --black-color <string>
619 Color value for white. Default: @samp{#ffffff}
620 @end ftable
621 %end-doc
623 COLOR (WhiteColor, "#ffffff", "white-color", "color value of 'white'"),
625 /* %start-doc options "3 Colors"
626 @ftable @code
627 @item --background-color <string>
628 Background color of the canvas. Default: @samp{#e5e5e5}
629 @end ftable
630 %end-doc
632 COLOR (BackgroundColor, "#e5e5e5", "background-color",
633 "color for background"),
635 /* %start-doc options "3 Colors"
636 @ftable @code
637 @item --crosshair-color <string>
638 Color of the crosshair. Default: @samp{#ff0000}
639 @end ftable
640 %end-doc
642 COLOR (CrosshairColor, "#ff0000", "crosshair-color",
643 "color for the crosshair"),
645 /* %start-doc options "3 Colors"
646 @ftable @code
647 @item --cross-color <string>
648 Color of the cross. Default: @samp{#cdcd00}
649 @end ftable
650 %end-doc
652 COLOR (CrossColor, "#cdcd00", "cross-color", "color of the cross"),
654 /* %start-doc options "3 Colors"
655 @ftable @code
656 @item --via-color <string>
657 Color of vias. Default: @samp{#7f7f7f}
658 @end ftable
659 %end-doc
661 COLOR (ViaColor, "#7f7f7f", "via-color", "color of vias"),
663 /* %start-doc options "3 Colors"
664 @ftable @code
665 @item --via-selected-color <string>
666 Color of selected vias. Default: @samp{#00ffff}
667 @end ftable
668 %end-doc
670 COLOR (ViaSelectedColor, "#00ffff", "via-selected-color",
671 "color for selected vias"),
673 /* %start-doc options "3 Colors"
674 @ftable @code
675 @item --pin-color <string>
676 Color of pins. Default: @samp{#4d4d4d}
677 @end ftable
678 %end-doc
680 COLOR (PinColor, "#4d4d4d", "pin-color", "color of pins"),
682 /* %start-doc options "3 Colors"
683 @ftable @code
684 @item --pin-selected-color <string>
685 Color of selected pins. Default: @samp{#00ffff}
686 @end ftable
687 %end-doc
689 COLOR (PinSelectedColor, "#00ffff", "pin-selected-color",
690 "color of selected pins"),
692 /* %start-doc options "3 Colors"
693 @ftable @code
694 @item --pin-name-color <string>
695 Color of pin names and pin numbers. Default: @samp{#ff0000}
696 @end ftable
697 %end-doc
699 COLOR (PinNameColor, "#ff0000", "pin-name-color",
700 "color for pin names and pin numbers"),
702 /* %start-doc options "3 Colors"
703 @ftable @code
704 @item --element-color <string>
705 Color of components. Default: @samp{#000000}
706 @end ftable
707 %end-doc
709 COLOR (ElementColor, "#000000", "element-color", "color of components"),
711 /* %start-doc options "3 Colors"
712 @ftable @code
713 @item --rat-color <string>
714 Color of ratlines. Default: @samp{#b8860b}
715 @end ftable
716 %end-doc
718 COLOR (RatColor, "#b8860b", "rat-color", "color of ratlines"),
720 /* %start-doc options "3 Colors"
721 @ftable @code
722 @item --invisible-objects-color <string>
723 Color of invisible objects. Default: @samp{#cccccc}
724 @end ftable
725 %end-doc
727 COLOR (InvisibleObjectsColor, "#cccccc", "invisible-objects-color",
728 "color of invisible objects"),
730 /* %start-doc options "3 Colors"
731 @ftable @code
732 @item --invisible-mark-color <string>
733 Color of invisible marks. Default: @samp{#cccccc}
734 @end ftable
735 %end-doc
737 COLOR (InvisibleMarkColor, "#cccccc", "invisible-mark-color",
738 "color of invisible marks"),
740 /* %start-doc options "3 Colors"
741 @ftable @code
742 @item --element-selected-color <string>
743 Color of selected components. Default: @samp{#00ffff}
744 @end ftable
745 %end-doc
747 COLOR (ElementSelectedColor, "#00ffff", "element-selected-color",
748 "color of selected components"),
750 /* %start-doc options "3 Colors"
751 @ftable @code
752 @item --rat-selected-color <string>
753 Color of selected rats. Default: @samp{#00ffff}
754 @end ftable
755 %end-doc
757 COLOR (RatSelectedColor, "#00ffff", "rat-selected-color",
758 "color of selected rats"),
760 /* %start-doc options "3 Colors"
761 @ftable @code
762 @item --connected-color <string>
763 Color to indicate connections. Default: @samp{#00ff00}
764 @end ftable
765 %end-doc
767 COLOR (ConnectedColor, "#00ff00", "connected-color",
768 "color to indicate connections"),
770 /* %start-doc options "3 Colors"
771 @ftable @code
772 @item --off-limit-color <string>
773 Color of off-canvas area. Default: @samp{#cccccc}
774 @end ftable
775 %end-doc
777 COLOR (OffLimitColor, "#cccccc", "off-limit-color",
778 "color of off-canvas area"),
780 /* %start-doc options "3 Colors"
781 @ftable @code
782 @item --grid-color <string>
783 Color of the grid. Default: @samp{#ff0000}
784 @end ftable
785 %end-doc
787 COLOR (GridColor, "#ff0000", "grid-color", "color of the grid"),
789 /* %start-doc options "3 Colors"
790 @ftable @code
791 @item --layer-color-<n> <string>
792 Color of layer @code{<n>}, where @code{<n>} is an integer from 1 to 16.
793 @end ftable
794 %end-doc
796 LAYERCOLOR (1, "#8b2323"),
797 LAYERCOLOR (2, "#3a5fcd"),
798 LAYERCOLOR (3, "#104e8b"),
799 LAYERCOLOR (4, "#cd3700"),
800 LAYERCOLOR (5, "#548b54"),
801 LAYERCOLOR (6, "#8b7355"),
802 LAYERCOLOR (7, "#00868b"),
803 LAYERCOLOR (8, "#228b22"),
804 LAYERCOLOR (9, "#8b2323"),
805 LAYERCOLOR (10, "#3a5fcd"),
806 LAYERCOLOR (11, "#104e8b"),
807 LAYERCOLOR (12, "#cd3700"),
808 LAYERCOLOR (13, "#548b54"),
809 LAYERCOLOR (14, "#8b7355"),
810 LAYERCOLOR (15, "#00868b"),
811 LAYERCOLOR (16, "#228b22"),
812 /* %start-doc options "3 Colors"
813 @ftable @code
814 @item --layer-selected-color-<n> <string>
815 Color of layer @code{<n>}, when selected. @code{<n>} is an integer from 1 to 16.
816 @end ftable
817 %end-doc
819 LAYERSELCOLOR (1),
820 LAYERSELCOLOR (2),
821 LAYERSELCOLOR (3),
822 LAYERSELCOLOR (4),
823 LAYERSELCOLOR (5),
824 LAYERSELCOLOR (6),
825 LAYERSELCOLOR (7),
826 LAYERSELCOLOR (8),
827 LAYERSELCOLOR (9),
828 LAYERSELCOLOR (10),
829 LAYERSELCOLOR (11),
830 LAYERSELCOLOR (12),
831 LAYERSELCOLOR (13),
832 LAYERSELCOLOR (14),
833 LAYERSELCOLOR (15),
834 LAYERSELCOLOR (16),
836 /* %start-doc options "3 Colors"
837 @ftable @code
838 @item --warn-color <string>
839 Color of offending objects during DRC. Default value is @code{"#ff8000"}
840 @end ftable
841 %end-doc
843 COLOR (WarnColor, "#ff8000", "warn-color", "color of offending objects during DRC"),
845 /* %start-doc options "3 Colors"
846 @ftable @code
847 @item --mask-color <string>
848 Color of the mask layer. Default value is @code{"#ff0000"}
849 @end ftable
850 %end-doc
852 COLOR (MaskColor, "#ff0000", "mask-color", "color for solder mask"),
855 /* %start-doc options "5 Sizes"
856 All parameters should be given with an unit. If no unit is given, 1/100 mil
857 (cmil) will be used. Write units without space to the
858 number like @code{3mm}, not @code{3 mm}.
859 Valid Units are:
860 @table @samp
861 @item km
862 Kilometer
863 @item m
864 Meter
865 @item cm
866 Centimeter
867 @item mm
868 Millimeter
869 @item um
870 Micrometer
871 @item nm
872 Nanometer
873 @item in
874 Inch (1in = 0.0254m)
875 @item mil
876 Mil (1000mil = 1in)
877 @item cmil
878 Centimil (1/100 mil)
879 @end table
881 @ftable @code
882 @item --via-thickness <num>
883 Default diameter of vias. Default value is @code{60mil}.
884 @end ftable
885 %end-doc
887 CSET (ViaThickness, MIL_TO_COORD(60), "via-thickness",
888 "default diameter of vias in 1/100 mil"),
890 /* %start-doc options "5 Sizes"
891 @ftable @code
892 @item --via-drilling-hole <num>
893 Default diameter of holes. Default value is @code{28mil}.
894 @end ftable
895 %end-doc
897 CSET (ViaDrillingHole, MIL_TO_COORD(28), "via-drilling-hole",
898 "default diameter of holes"),
900 /* %start-doc options "5 Sizes"
901 @ftable @code
902 @item --line-thickness <num>
903 Default thickness of new lines. Default value is @code{10mil}.
904 @end ftable
905 %end-doc
907 CSET (LineThickness, MIL_TO_COORD(10), "line-thickness",
908 "initial thickness of new lines"),
910 /* %start-doc options "5 Sizes"
911 @ftable @code
912 @item --rat-thickness <num><unit>
913 Thickness of rats. If no unit is given, PCB units are assumed (i.e. 100
914 means "1 nm"). This option allows for a special unit @code{px} which
915 sets the rat thickness to a fixed value in terms of screen pixels.
916 Maximum fixed thickness is 100px. Minimum saling rat thickness is 101nm.
917 Default value is @code{10mil}.
918 @end ftable
919 %end-doc
921 CSET (RatThickness, MIL_TO_COORD(10), "rat-thickness", "thickness of rat lines"),
923 /* %start-doc options "5 Sizes"
924 @ftable @code
925 @item --keepaway <num>
926 Default minimum distance between a track and adjacent copper.
927 Default value is @code{10mil}.
928 @end ftable
929 %end-doc
931 CSET (Keepaway, MIL_TO_COORD(10), "keepaway", "minimum distance between adjacent copper"),
933 /* %start-doc options "5 Sizes"
934 @ftable @code
935 @item --default-PCB-width <num>
936 Default width of the canvas. Default value is @code{6000mil}.
937 @end ftable
938 %end-doc
940 CSET (MaxWidth, MIL_TO_COORD(6000), "default-PCB-width",
941 "default width of the canvas"),
943 /* %start-doc options "5 Sizes"
944 @ftable @code
945 @item --default-PCB-height <num>
946 Default height of the canvas. Default value is @code{5000mil}.
947 @end ftable
948 %end-doc
950 CSET (MaxHeight, MIL_TO_COORD(5000), "default-PCB-height",
951 "default height of the canvas"),
953 /* %start-doc options "5 Sizes"
954 @ftable @code
955 @item --text-scale <num>
956 Default text scale. This value is in percent. Default value is @code{100}.
957 @end ftable
958 %end-doc
960 ISET (TextScale, 100, "text-scale", "default text scale in percent"),
962 /* %start-doc options "5 Sizes"
963 @ftable @code
964 @item --alignment-distance <num>
965 Specifies the distance between the board outline and alignment targets.
966 Default value is @code{2mil}.
967 @end ftable
968 %end-doc
970 CSET (AlignmentDistance, MIL_TO_COORD(2), "alignment-distance",
971 "distance between the boards outline and alignment targets"),
973 /* %start-doc options "7 DRC Options"
974 All parameters should be given with an unit. If no unit is given, 1/100 mil
975 (cmil) will be used for backward compability. Valid units are given in section
976 @ref{Sizes}.
977 %end-doc
981 /* %start-doc options "7 DRC Options"
982 @ftable @code
983 @item --bloat <num>
984 Minimum spacing. Default value is @code{10mil}.
985 @end ftable
986 %end-doc
988 CSET (Bloat, MIL_TO_COORD(10), "bloat", "DRC minimum spacing in 1/100 mil"),
990 /* %start-doc options "7 DRC Options"
991 @ftable @code
992 @item --shrink <num>
993 Minimum touching overlap. Default value is @code{10mil}.
994 @end ftable
995 %end-doc
997 CSET (Shrink, MIL_TO_COORD(10), "shrink", "DRC minimum overlap in 1/100 mils"),
999 /* %start-doc options "7 DRC Options"
1000 @ftable @code
1001 @item --min-width <num>
1002 Minimum width of copper. Default value is @code{10mil}.
1003 @end ftable
1004 %end-doc
1006 CSET (minWid, MIL_TO_COORD(10), "min-width", "DRC minimum copper spacing"),
1008 /* %start-doc options "7 DRC Options"
1009 @ftable @code
1010 @item --min-silk <num>
1011 Minimum width of lines in silk. Default value is @code{10mil}.
1012 @end ftable
1013 %end-doc
1015 CSET (minSlk, MIL_TO_COORD(10), "min-silk", "DRC minimum silk width"),
1017 /* %start-doc options "7 DRC Options"
1018 @ftable @code
1019 @item --min-drill <num>
1020 Minimum diameter of holes. Default value is @code{15mil}.
1021 @end ftable
1022 %end-doc
1024 CSET (minDrill, MIL_TO_COORD(15), "min-drill", "DRC minimum drill diameter"),
1026 /* %start-doc options "7 DRC Options"
1027 @ftable @code
1028 @item --min-ring <num>
1029 Minimum width of annular ring. Default value is @code{10mil}.
1030 @end ftable
1031 %end-doc
1033 CSET (minRing, MIL_TO_COORD(10), "min-ring", "DRC minimum annular ring"),
1036 /* %start-doc options "5 Sizes"
1037 @ftable @code
1038 @item --grid <num>
1039 Initial grid size. Default value is @code{10mil}.
1040 @end ftable
1041 %end-doc
1043 CSET (Grid, MIL_TO_COORD(10), "grid", "Initial grid size in 1/100 mil"),
1045 /* %start-doc options "5 Sizes"
1046 @ftable @code
1047 @item --minimum polygon area <num>
1048 Minimum polygon area.
1049 @end ftable
1050 %end-doc
1052 RSET (IsleArea, MIL_TO_COORD(100) * MIL_TO_COORD(100), "minimum polygon area", 0),
1055 /* %start-doc options "1 General Options"
1056 @ftable @code
1057 @item --backup-interval
1058 Time between automatic backups in seconds. Set to @code{0} to disable.
1059 The default value is @code{60}.
1060 @end ftable
1061 %end-doc
1063 ISET (BackupInterval, 60, "backup-interval",
1064 "Time between automatic backups in seconds. Set to 0 to disable"),
1066 /* %start-doc options "4 Layer Names"
1067 @ftable @code
1068 @item --layer-name-1 <string>
1069 Name of the 1st Layer. Default is @code{"top"}.
1070 @end ftable
1071 %end-doc
1073 LAYERNAME (1, "top"),
1075 /* %start-doc options "4 Layer Names"
1076 @ftable @code
1077 @item --layer-name-2 <string>
1078 Name of the 2nd Layer. Default is @code{"ground"}.
1079 @end ftable
1080 %end-doc
1082 LAYERNAME (2, "ground"),
1084 /* %start-doc options "4 Layer Names"
1085 @ftable @code
1086 @item --layer-name-3 <string>
1087 Name of the 3nd Layer. Default is @code{"signal2"}.
1088 @end ftable
1089 %end-doc
1091 LAYERNAME (3, "signal2"),
1093 /* %start-doc options "4 Layer Names"
1094 @ftable @code
1095 @item --layer-name-4 <string>
1096 Name of the 4rd Layer. Default is @code{"signal3"}.
1097 @end ftable
1098 %end-doc
1100 LAYERNAME (4, "signal3"),
1102 /* %start-doc options "4 Layer Names"
1103 @ftable @code
1104 @item --layer-name-5 <string>
1105 Name of the 5rd Layer. Default is @code{"power"}.
1106 @end ftable
1107 %end-doc
1109 LAYERNAME (5, "power"),
1111 /* %start-doc options "4 Layer Names"
1112 @ftable @code
1113 @item --layer-name-6 <string>
1114 Name of the 6rd Layer. Default is @code{"bottom"}.
1115 @end ftable
1116 %end-doc
1118 LAYERNAME (6, "bottom"),
1120 /* %start-doc options "4 Layer Names"
1121 @ftable @code
1122 @item --layer-name-7 <string>
1123 Name of the 7rd Layer. Default is @code{"outline"}.
1124 @end ftable
1125 %end-doc
1127 LAYERNAME (7, "outline"),
1129 /* %start-doc options "4 Layer Names"
1130 @ftable @code
1131 @item --layer-name-8 <string>
1132 Name of the 8rd Layer. Default is @code{"spare"}.
1133 @end ftable
1134 %end-doc
1136 LAYERNAME (8, "spare"),
1138 /* %start-doc options "1 General Options"
1139 @ftable @code
1140 @item --groups <string>
1141 Layer group string. Defaults to @code{"1,c:2:3:4:5:6,s:7:8"}.
1142 @end ftable
1143 %end-doc
1145 SSET (Groups, "1,c:2:3:4:5:6,s:7:8", "groups", "Layer group string"),
1148 /* %start-doc options "6 Commands"
1149 pcb uses external commands for input output operations. These commands can be
1150 configured at start-up to meet local requirements. The command string may include
1151 special sequences @code{%f}, @code{%p} or @code{%a}. These are replaced when the
1152 command is called. The sequence @code{%f} is replaced by the file name,
1153 @code{%p} gets the path and @code{%a} indicates a package name.
1154 %end-doc
1157 /* %start-doc options "6 Commands"
1158 @ftable @code
1159 @item --font-command <string>
1160 Command to load a font.
1161 @end ftable
1162 %end-doc
1164 SSET (FontCommand, "", "font-command", "Command to load a font"),
1166 /* %start-doc options "6 Commands"
1167 @ftable @code
1168 @item --file-command <string>
1169 Command to read a file.
1170 @end ftable
1171 %end-doc
1173 SSET (FileCommand, "", "file-command", "Command to read a file"),
1175 /* %start-doc options "6 Commands"
1176 @ftable @code
1177 @item --element-command <string>
1178 Command to read a footprint. @*
1179 Defaults to @code{"M4PATH='%p';export M4PATH;echo 'include(%f)' | m4"}
1180 @end ftable
1181 %end-doc
1183 SSET (ElementCommand,
1184 "M4PATH='%p';export M4PATH;echo 'include(%f)' | " GNUM4,
1185 "element-command", "Command to read a footprint"),
1187 /* %start-doc options "6 Commands"
1188 @ftable @code
1189 @item --print-file <string>
1190 Command to print to a file.
1191 @end ftable
1192 %end-doc
1194 SSET (PrintFile, "%f.output", "print-file", "Command to print to a file"),
1196 /* %start-doc options "6 Commands"
1197 @ftable @code
1198 @item --lib-command-dir <string>
1199 Path to the command that queries the library.
1200 @end ftable
1201 %end-doc
1203 SSET (LibraryCommandDir, PCBLIBDIR, "lib-command-dir",
1204 "Path to the command that queries the library"),
1206 /* %start-doc options "6 Commands"
1207 @ftable @code
1208 @item --lib-command <string>
1209 Command to query the library. @*
1210 Defaults to @code{"QueryLibrary.sh '%p' '%f' %a"}
1211 @end ftable
1212 %end-doc
1214 SSET (LibraryCommand, "QueryLibrary.sh '%p' '%f' %a",
1215 "lib-command", "Command to query the library"),
1217 /* %start-doc options "6 Commands"
1218 @ftable @code
1219 @item --lib-contents-command <string>
1220 Command to query the contents of the library. @*
1221 Defaults to @code{"ListLibraryContents.sh %p %f"} or,
1222 on Windows builds, an empty string (to disable this feature).
1223 @end ftable
1224 %end-doc
1226 SSET (LibraryContentsCommand,
1227 #ifdef __WIN32__
1229 #else
1230 "ListLibraryContents.sh '%p' '%f'",
1231 #endif
1232 "lib-contents-command", "Command to query the contents of the library"),
1234 /* %start-doc options "5 Paths"
1235 @ftable @code
1236 @item --lib-newlib <string>
1237 Top level directory for the newlib style library.
1238 @end ftable
1239 %end-doc
1241 SSET (LibraryTree, PCBTREEPATH, "lib-newlib",
1242 "Top level directory for the newlib style library"),
1244 /* %start-doc options "6 Commands"
1245 @ftable @code
1246 @item --save-command <string>
1247 Command to save to a file.
1248 @end ftable
1249 %end-doc
1251 SSET (SaveCommand, "", "save-command", "Command to save to a file"),
1253 /* %start-doc options "5 Paths"
1254 @ftable @code
1255 @item --lib-name <string>
1256 The default filename for the library.
1257 @end ftable
1258 %end-doc
1260 SSET (LibraryFilename, LIBRARYFILENAME, "lib-name",
1261 "The default filename for the library"),
1263 /* %start-doc options "5 Paths"
1264 @ftable @code
1265 @item --default-font <string>
1266 The name of the default font.
1267 @end ftable
1268 %end-doc
1270 SSET (FontFile, "default_font", "default-font",
1271 "File name of default font"),
1273 /* %start-doc options "1 General Options"
1274 @ftable @code
1275 @item --route-styles <string>
1276 A string that defines the route styles. Defaults to @*
1277 @code{"Signal,1000,3600,2000,1000:Power,2500,6000,3500,1000
1278 :Fat,4000,6000,3500,1000:Skinny,600,2402,1181,600"}
1279 @end ftable
1280 %end-doc
1282 SSET (Routes, "Signal,1000,3600,2000,1000:Power,2500,6000,3500,1000"
1283 ":Fat,4000,6000,3500,1000:Skinny,600,2402,1181,600", "route-styles",
1284 "A string that defines the route styles"),
1286 /* %start-doc options "5 Paths"
1287 @ftable @code
1288 @item --file-path <string>
1289 A colon separated list of directories or commands (starts with '|'). The path
1290 is passed to the program specified in @option{--file-command} together with the selected
1291 filename.
1292 @end ftable
1293 %end-doc
1295 SSET (FilePath, "", "file-path", 0),
1297 /* %start-doc options "6 Commands"
1298 @ftable @code
1299 @item --rat-command <string>
1300 Command for reading a netlist. Sequence @code{%f} is replaced by the netlist filename.
1301 @end ftable
1302 %end-doc
1304 SSET (RatCommand, "", "rat-command", "Command for reading a netlist"),
1306 /* %start-doc options "5 Paths"
1307 @ftable @code
1308 @item --font-path <string>
1309 A colon separated list of directories to search the default font. Defaults to
1310 the default library path.
1311 @end ftable
1312 %end-doc
1314 SSET (FontPath, PCBLIBPATH, "font-path",
1315 "Colon separated list of directories to search the default font"),
1317 /* %start-doc options "1 General Options"
1318 @ftable @code
1319 @item --element-path <string>
1320 A colon separated list of directories or commands (starts with '|').
1321 The path is passed to the program specified in @option{--element-command}.
1322 @end ftable
1323 %end-doc
1325 SSET(ElementPath, PCBLIBPATH, "element-path",
1326 "A colon separated list of directories or commands (starts with '|')"),
1328 /* %start-doc options "5 Paths"
1329 @ftable @code
1330 @item --lib-path <string>
1331 A colon separated list of directories that will be passed to the commands specified
1332 by @option{--element-command} and @option{--element-contents-command}.
1333 @end ftable
1334 %end-doc
1336 SSET (LibraryPath, PCBLIBPATH, "lib-path",
1337 "A colon separated list of directories"),
1339 /* %start-doc options "1 General Options"
1340 @ftable @code
1341 @item --action-script <string>
1342 If set, this file is executed at startup.
1343 @end ftable
1344 %end-doc
1346 SSET (ScriptFilename, 0, "action-script",
1347 "If set, this file is executed at startup"),
1349 /* %start-doc options "1 General Options"
1350 @ftable @code
1351 @item --action-string <string>
1352 If set, this string of actions is executed at startup.
1353 @end ftable
1354 %end-doc
1356 SSET (ActionString, 0, "action-string",
1357 "If set, this is executed at startup"),
1359 /* %start-doc options "1 General Options"
1360 @ftable @code
1361 @item --fab-author <string>
1362 Name of author to be put in the Gerber files.
1363 @end ftable
1364 %end-doc
1366 SSET (FabAuthor, "", "fab-author",
1367 "Name of author to be put in the Gerber files"),
1369 /* %start-doc options "1 General Options"
1370 @ftable @code
1371 @item --layer-stack <string>
1372 Initial layer stackup, for setting up an export. A comma separated list of layer
1373 names, layer numbers and layer groups.
1374 @end ftable
1375 %end-doc
1377 SSET (InitialLayerStack, "", "layer-stack",
1378 "Initial layer stackup, for setting up an export."),
1380 SSET (MakeProgram, NULL, "make-program",
1381 "Sets the name and optionally full path to a make(3) program"),
1382 SSET (GnetlistProgram, NULL, "gnetlist",
1383 "Sets the name and optionally full path to the gnetlist(3) program"),
1385 /* %start-doc options "2 General GUI Options"
1386 @ftable @code
1387 @item --pinout-offset-x <num>
1388 Horizontal offset of the pin number display. Defaults to @code{100mil}.
1389 @end ftable
1390 %end-doc
1392 CSET (PinoutOffsetX, MIL_TO_COORD(1), "pinout-offset-x",
1393 "Horizontal offset of the pin number display in mil"),
1395 /* %start-doc options "2 General GUI Options"
1396 @ftable @code
1397 @item --pinout-offset-y <num>
1398 Vertical offset of the pin number display. Defaults to @code{100mil}.
1399 @end ftable
1400 %end-doc
1402 CSET (PinoutOffsetY, MIL_TO_COORD(1), "pinout-offset-y",
1403 "Vertical offset of the pin number display in mil"),
1405 /* %start-doc options "2 General GUI Options"
1406 @ftable @code
1407 @item --pinout-text-offset-x <num>
1408 Horizontal offset of the pin name display. Defaults to @code{800mil}.
1409 @end ftable
1410 %end-doc
1412 CSET (PinoutTextOffsetX, MIL_TO_COORD(8), "pinout-text-offset-x",
1413 "Horizontal offset of the pin name display in mil"),
1415 /* %start-doc options "2 General GUI Options"
1416 @ftable @code
1417 @item --pinout-text-offset-y <num>
1418 Vertical offset of the pin name display. Defaults to @code{-100mil}.
1419 @end ftable
1420 %end-doc
1422 CSET (PinoutTextOffsetY, MIL_TO_COORD(-1), "pinout-text-offset-y",
1423 "Vertical offset of the pin name display in mil"),
1425 /* %start-doc options "2 General GUI Options"
1426 @ftable @code
1427 @item --draw-grid
1428 If set, draw the grid at start-up.
1429 @end ftable
1430 %end-doc
1432 BSET (DrawGrid, 0, "draw-grid", "If set, draw the grid at start-up"),
1434 /* %start-doc options "2 General GUI Options"
1435 @ftable @code
1436 @item --clear-line
1437 If set, new lines clear polygons.
1438 @end ftable
1439 %end-doc
1441 BSET (ClearLine, 1, "clear-line", "If set, new lines clear polygons"),
1443 /* %start-doc options "2 General GUI Options"
1444 @ftable @code
1445 @item --full-poly
1446 If set, new polygons are full ones.
1447 @end ftable
1448 %end-doc
1450 BSET (FullPoly, 0, "full-poly", 0),
1452 /* %start-doc options "2 General GUI Options"
1453 @ftable @code
1454 @item --unique-names
1455 If set, you will not be permitted to change the name of an component to match that
1456 of another component.
1457 @end ftable
1458 %end-doc
1460 BSET (UniqueNames, 1, "unique-names", "Prevents identical component names"),
1462 /* %start-doc options "2 General GUI Options"
1463 @ftable @code
1464 @item --snap-pin
1465 If set, pin centers and pad end points are treated as additional grid points
1466 that the cursor can snap to.
1467 @end ftable
1468 %end-doc
1470 BSET (SnapPin, 1, "snap-pin",
1471 "If set, the cursor snaps to pads and pin centers"),
1473 /* %start-doc options "1 General Options"
1474 @ftable @code
1475 @item --save-last-command
1476 If set, the last user command is saved.
1477 @end ftable
1478 %end-doc
1480 BSET (SaveLastCommand, 0, "save-last-command", 0),
1482 /* %start-doc options "1 General Options"
1483 @ftable @code
1484 @item --save-in-tmp
1485 If set, all data which would otherwise be lost are saved in a temporary file
1486 @file{/tmp/PCB.%i.save} . Sequence @samp{%i} is replaced by the process ID.
1487 @end ftable
1488 %end-doc
1490 BSET (SaveInTMP, 0, "save-in-tmp",
1491 "When set, all data which would otherwise be lost are saved in /tmp"),
1493 /* %start-doc options "2 General GUI Options"
1494 @ftable @code
1495 @item --all-direction-lines
1496 Allow all directions, when drawing new lines.
1497 @end ftable
1498 %end-doc
1500 BSET (AllDirectionLines, 0, "all-direction-lines",
1501 "Allow all directions, when drawing new lines"),
1503 /* %start-doc options "2 General GUI Options"
1504 @ftable @code
1505 @item --show-number
1506 Pinout shows number.
1507 @end ftable
1508 %end-doc
1510 BSET (ShowNumber, 0, "show-number", "Pinout shows number"),
1512 /* %start-doc options "1 General Options"
1513 @ftable @code
1514 @item --reset-after-element
1515 If set, all found connections are reset before a new component is scanned.
1516 @end ftable
1517 %end-doc
1519 BSET (ResetAfterElement, 1, "reset-after-element",
1520 "If set, all found connections are reset before a new component is scanned"),
1522 /* %start-doc options "1 General Options"
1523 @ftable @code
1524 @item --ring-bell-finished
1525 Execute the bell command when all rats are routed.
1526 @end ftable
1527 %end-doc
1529 BSET (RingBellWhenFinished, 0, "ring-bell-finished",
1530 "Execute the bell command when all rats are routed"),
1533 REGISTER_ATTRIBUTES (main_attribute_list)
1534 /* ----------------------------------------------------------------------
1535 * post-process settings.
1537 static void settings_post_process ()
1539 char *tmps;
1541 if (Settings.LibraryCommand != NULL &&
1542 Settings.LibraryCommand[0] != '\0' &&
1543 Settings.LibraryCommand[0] != PCB_DIR_SEPARATOR_C &&
1544 Settings.LibraryCommand[0] != '.')
1546 Settings.LibraryCommand
1548 Concat (Settings.LibraryCommandDir, PCB_DIR_SEPARATOR_S,
1549 Settings.LibraryCommand,
1550 NULL);
1552 if (Settings.LibraryContentsCommand != NULL &&
1553 Settings.LibraryContentsCommand[0] != '\0' &&
1554 Settings.LibraryContentsCommand[0] != PCB_DIR_SEPARATOR_C &&
1555 Settings.LibraryContentsCommand[0] != '.')
1557 Settings.LibraryContentsCommand
1559 Concat (Settings.LibraryCommandDir, PCB_DIR_SEPARATOR_S,
1560 Settings.LibraryContentsCommand, NULL);
1563 if (Settings.LineThickness > MAX_LINESIZE
1564 || Settings.LineThickness < MIN_LINESIZE)
1565 Settings.LineThickness = MIL_TO_COORD(10);
1567 if (Settings.ViaThickness > MAX_PINORVIASIZE
1568 || Settings.ViaThickness < MIN_PINORVIASIZE)
1569 Settings.ViaThickness = MIL_TO_COORD(40);
1571 if (Settings.ViaDrillingHole <= 0)
1572 Settings.ViaDrillingHole =
1573 DEFAULT_DRILLINGHOLE * Settings.ViaThickness / 100;
1575 Settings.MaxWidth = CLAMP (Settings.MaxWidth, MIN_SIZE, MAX_COORD);
1576 Settings.MaxHeight = CLAMP (Settings.MaxHeight, MIN_SIZE, MAX_COORD);
1578 ParseRouteString (Settings.Routes, &Settings.RouteStyle[0], "cmil");
1581 * Make sure we have settings for some various programs we may wish
1582 * to call
1584 if (Settings.MakeProgram == NULL) {
1585 tmps = getenv ("PCB_MAKE_PROGRAM");
1586 if (tmps != NULL)
1587 Settings.MakeProgram = strdup (tmps);
1589 if (Settings.MakeProgram == NULL) {
1590 Settings.MakeProgram = strdup ("make");
1593 if (Settings.GnetlistProgram == NULL) {
1594 tmps = getenv ("PCB_GNETLIST");
1595 if (tmps != NULL)
1596 Settings.GnetlistProgram = strdup (tmps);
1598 if (Settings.GnetlistProgram == NULL) {
1599 Settings.GnetlistProgram = strdup ("gnetlist");
1602 if (grid_units)
1603 Settings.grid_unit = get_unit_struct (grid_units);
1604 if (!grid_units || Settings.grid_unit == NULL)
1605 Settings.grid_unit = get_unit_struct ("mil");
1607 copy_nonzero_increments (get_increments_struct (METRIC), &increment_mm);
1608 copy_nonzero_increments (get_increments_struct (IMPERIAL), &increment_mil);
1610 Settings.increments = get_increments_struct (Settings.grid_unit->family);
1613 /* ----------------------------------------------------------------------
1614 * Print help or version messages.
1617 static void
1618 print_version ()
1620 printf ("PCB version %s\n", VERSION);
1621 exit (0);
1624 /* ----------------------------------------------------------------------
1625 * Figure out the canonical name of the executed program
1626 * and fix up the defaults for various paths
1628 char *bindir = NULL;
1629 char *exec_prefix = NULL;
1630 char *pcblibdir = NULL;
1631 char *pcblibpath = NULL;
1632 char *pcbtreedir = NULL;
1633 char *pcbtreepath = NULL;
1634 char *homedir = NULL;
1636 static void
1637 InitPaths (char *argv0)
1639 size_t l;
1640 int i;
1641 int haspath;
1642 char *t1, *t2;
1643 int found_bindir = 0;
1645 /* see if argv0 has enough of a path to let lrealpath give the
1646 * real path. This should be the case if you invoke pcb with
1647 * something like /usr/local/bin/pcb or ./pcb or ./foo/pcb
1648 * but if you just use pcb and it exists in your path, you'll
1649 * just get back pcb again.
1652 haspath = 0;
1653 for (i = 0; i < strlen (argv0) ; i++)
1655 if (argv0[i] == PCB_DIR_SEPARATOR_C)
1656 haspath = 1;
1659 #ifdef DEBUG
1660 printf ("InitPaths (%s): haspath = %d\n", argv0, haspath);
1661 #endif
1663 if (haspath)
1665 bindir = strdup (lrealpath (argv0));
1666 found_bindir = 1;
1668 else
1670 char *path, *p, *tmps;
1671 struct stat sb;
1672 int r;
1674 tmps = getenv ("PATH");
1676 if (tmps != NULL)
1678 path = strdup (tmps);
1680 /* search through the font path for a font file */
1681 for (p = strtok (path, PCB_PATH_DELIMETER); p && *p;
1682 p = strtok (NULL, PCB_PATH_DELIMETER))
1684 #ifdef DEBUG
1685 printf ("Looking for %s in %s\n", argv0, p);
1686 #endif
1687 if ( (tmps = (char *)malloc ( (strlen (argv0) + strlen (p) + 2) * sizeof (char))) == NULL )
1689 fprintf (stderr, "InitPaths(): malloc failed\n");
1690 exit (1);
1692 sprintf (tmps, "%s%s%s", p, PCB_DIR_SEPARATOR_S, argv0);
1693 r = stat (tmps, &sb);
1694 if (r == 0)
1696 #ifdef DEBUG
1697 printf ("Found it: \"%s\"\n", tmps);
1698 #endif
1699 bindir = lrealpath (tmps);
1700 found_bindir = 1;
1701 free (tmps);
1702 break;
1704 free (tmps);
1706 free (path);
1710 #ifdef DEBUG
1711 printf ("InitPaths(): bindir = \"%s\"\n", bindir);
1712 #endif
1714 if (found_bindir)
1716 /* strip off the executible name leaving only the path */
1717 t2 = NULL;
1718 t1 = strchr (bindir, PCB_DIR_SEPARATOR_C);
1719 while (t1 != NULL && *t1 != '\0')
1721 t2 = t1;
1722 t1 = strchr (t2 + 1, PCB_DIR_SEPARATOR_C);
1724 if (t2 != NULL)
1725 *t2 = '\0';
1727 #ifdef DEBUG
1728 printf ("After stripping off the executible name, we found\n");
1729 printf ("bindir = \"%s\"\n", bindir);
1730 #endif
1732 else
1734 /* we have failed to find out anything from argv[0] so fall back to the original
1735 * install prefix
1737 bindir = strdup (BINDIR);
1740 /* now find the path to exec_prefix */
1741 l = strlen (bindir) + 1 + strlen (BINDIR_TO_EXECPREFIX) + 1;
1742 if ( (exec_prefix = (char *) malloc (l * sizeof (char) )) == NULL )
1744 fprintf (stderr, "InitPaths(): malloc failed\n");
1745 exit (1);
1747 sprintf (exec_prefix, "%s%s%s", bindir, PCB_DIR_SEPARATOR_S,
1748 BINDIR_TO_EXECPREFIX);
1750 /* now find the path to PCBLIBDIR */
1751 l = strlen (bindir) + 1 + strlen (BINDIR_TO_PCBLIBDIR) + 1;
1752 if ( (pcblibdir = (char *) malloc (l * sizeof (char) )) == NULL )
1754 fprintf (stderr, "InitPaths(): malloc failed\n");
1755 exit (1);
1757 sprintf (pcblibdir, "%s%s%s", bindir, PCB_DIR_SEPARATOR_S,
1758 BINDIR_TO_PCBLIBDIR);
1760 /* and the path to PCBTREEDIR */
1761 l = strlen (bindir) + 1 + strlen (BINDIR_TO_PCBTREEDIR) + 1;
1762 if ( (pcbtreedir = (char *) malloc (l * sizeof (char) )) == NULL )
1764 fprintf (stderr, "InitPaths(): malloc failed\n");
1765 exit (1);
1767 sprintf (pcbtreedir, "%s%s%s", bindir, PCB_DIR_SEPARATOR_S,
1768 BINDIR_TO_PCBTREEDIR);
1770 /* and the search path including PCBLIBDIR */
1771 l = strlen (pcblibdir) + 3;
1772 if ( (pcblibpath = (char *) malloc (l * sizeof (char) )) == NULL )
1774 fprintf (stderr, "InitPaths(): malloc failed\n");
1775 exit (1);
1777 sprintf (pcblibpath, ".%s%s", PCB_PATH_DELIMETER, pcblibdir);
1779 /* and the newlib search path */
1780 l = strlen (pcblibdir) + 1 + strlen (pcbtreedir)
1781 + strlen ("pcblib-newlib") + 2;
1782 if ( (pcbtreepath = (char *) malloc (l * sizeof (char) )) == NULL )
1784 fprintf (stderr, "InitPaths(): malloc failed\n");
1785 exit (1);
1787 sprintf (pcbtreepath, "%s%s%s%spcblib-newlib", pcbtreedir,
1788 PCB_PATH_DELIMETER, pcblibdir,
1789 PCB_DIR_SEPARATOR_S);
1791 #ifdef DEBUG
1792 printf ("bindir = %s\n", bindir);
1793 printf ("pcblibdir = %s\n", pcblibdir);
1794 printf ("pcblibpath = %s\n", pcblibpath);
1795 printf ("pcbtreedir = %s\n", pcbtreedir);
1796 printf ("pcbtreepath = %s\n", pcbtreepath);
1797 #endif
1799 l = sizeof (main_attribute_list) / sizeof (main_attribute_list[0]);
1800 for (i = 0; i < l ; i++)
1802 if (NSTRCMP (main_attribute_list[i].name, "lib-command-dir") == 0)
1804 main_attribute_list[i].default_val.str_value = pcblibdir;
1807 if ( (NSTRCMP (main_attribute_list[i].name, "font-path") == 0)
1808 || (NSTRCMP (main_attribute_list[i].name, "element-path") == 0)
1809 || (NSTRCMP (main_attribute_list[i].name, "lib-path") == 0) )
1811 main_attribute_list[i].default_val.str_value = pcblibpath;
1814 if (NSTRCMP (main_attribute_list[i].name, "lib-newlib") == 0)
1816 main_attribute_list[i].default_val.str_value = pcbtreepath;
1822 char *tmps;
1824 tmps = getenv ("HOME");
1826 if (tmps == NULL) {
1827 tmps = getenv ("USERPROFILE");
1830 if (tmps != NULL) {
1831 homedir = strdup (tmps);
1832 } else {
1833 homedir = NULL;
1839 /* ----------------------------------------------------------------------
1840 * main program
1843 char *program_name = 0;
1844 char *program_basename = 0;
1845 char *program_directory = 0;
1847 #include "dolists.h"
1850 main (int argc, char *argv[])
1852 int i;
1854 /* init application:
1855 * - make program name available for error handlers
1856 * - evaluate special options
1857 * - initialize toplevel shell and resources
1858 * - create an empty PCB with default symbols
1859 * - initialize all other widgets
1860 * - update screen and get size of drawing area
1861 * - evaluate command-line arguments
1862 * - register 'call on exit()' function
1865 #include "core_lists.h"
1866 setbuf (stdout, 0);
1867 InitPaths (argv[0]);
1869 bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
1870 textdomain(GETTEXT_PACKAGE);
1871 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
1872 setlocale(LC_ALL,"");
1874 srand ( time(NULL) ); /* Set seed for rand() */
1876 initialize_units();
1877 polygon_init ();
1878 hid_init ();
1880 hid_load_settings ();
1882 program_name = argv[0];
1883 program_basename = strrchr (program_name, PCB_DIR_SEPARATOR_C);
1884 if (program_basename)
1886 program_directory = strdup (program_name);
1887 *strrchr (program_directory, PCB_DIR_SEPARATOR_C) = 0;
1888 program_basename++;
1890 else
1892 program_directory = ".";
1893 program_basename = program_name;
1895 Progname = program_basename;
1897 /* Print usage or version if requested. Then exit. */
1898 if (argc > 1 &&
1899 (strcmp (argv[1], "-h") == 0 ||
1900 strcmp (argv[1], "-?") == 0 ||
1901 strcmp (argv[1], "--help") == 0))
1902 usage ();
1903 if (argc > 1 && strcmp (argv[1], "-V") == 0)
1904 print_version ();
1905 /* Export pcb from command line if requested. */
1906 if (argc > 1 && strcmp (argv[1], "-p") == 0)
1908 exporter = gui = hid_find_printer ();
1909 argc--;
1910 argv++;
1912 else if (argc > 2 && strcmp (argv[1], "-x") == 0)
1914 exporter = gui = hid_find_exporter (argv[2]);
1915 argc -= 2;
1916 argv += 2;
1918 /* Otherwise start GUI. */
1919 else
1920 gui = hid_find_gui ();
1922 /* Exit with error if GUI failed to start. */
1923 if (!gui)
1924 exit (1);
1926 /* Set up layers. */
1927 for (i = 0; i < MAX_LAYER; i++)
1929 char buf[20];
1930 sprintf (buf, "signal%d", i + 1);
1931 Settings.DefaultLayerName[i] = strdup (buf);
1932 Settings.LayerColor[i] = "#c49350";
1933 Settings.LayerSelectedColor[i] = "#00ffff";
1936 gui->parse_arguments (&argc, &argv);
1938 if (show_help || (argc > 1 && argv[1][0] == '-'))
1939 usage ();
1940 if (show_version)
1941 print_version ();
1942 if (show_defaults)
1943 print_defaults ();
1944 if (show_copyright)
1945 copyright ();
1947 settings_post_process ();
1950 if (show_actions)
1952 print_actions ();
1953 exit (0);
1956 if (do_dump_actions)
1958 extern void dump_actions (void);
1959 dump_actions ();
1960 exit (0);
1963 /* Create a new PCB object in memory */
1964 PCB = CreateNewPCB (true);
1965 PCB->Data->LayerN = DEF_LAYER;
1966 ParseGroupString (Settings.Groups, &PCB->LayerGroups, DEF_LAYER);
1967 /* Add silk layers to newly created PCB */
1968 CreateNewPCBPost (PCB, 1);
1969 if (argc > 1)
1970 command_line_pcb = argv[1];
1972 ResetStackAndVisibility ();
1974 if (gui->gui)
1975 InitCrosshair ();
1976 InitHandler ();
1977 InitBuffers ();
1978 SetMode (ARROW_MODE);
1980 if (command_line_pcb)
1982 /* keep filename even if initial load command failed;
1983 * file might not exist
1985 if (LoadPCB (command_line_pcb))
1986 PCB->Filename = strdup (command_line_pcb);
1989 if (Settings.InitialLayerStack
1990 && Settings.InitialLayerStack[0])
1992 LayerStringToLayerStack (Settings.InitialLayerStack);
1995 /* This must be called before any other atexit functions
1996 * are registered, as it configures an atexit function to
1997 * clean up and free various items of allocated memory,
1998 * and must be the last last atexit function to run.
2000 leaky_init ();
2002 /* Register a function to be called when the program terminates.
2003 * This makes sure that data is saved even if LEX/YACC routines
2004 * abort the program.
2005 * If the OS doesn't have at least one of them,
2006 * the critical sections will be handled by parse_l.l
2008 atexit (EmergencySave);
2010 /* read the library file and display it if it's not empty
2012 if (!ReadLibraryContents () && Library.MenuN)
2013 hid_action ("LibraryChanged");
2015 #ifdef HAVE_LIBSTROKE
2016 stroke_init ();
2017 #endif
2019 if (Settings.ScriptFilename)
2021 Message (_("Executing startup script file %s\n"),
2022 Settings.ScriptFilename);
2023 hid_actionl ("ExecuteFile", Settings.ScriptFilename, NULL);
2025 if (Settings.ActionString)
2027 Message (_("Executing startup action %s\n"), Settings.ActionString);
2028 hid_parse_actions (Settings.ActionString);
2031 if (gui->printer || gui->exporter)
2033 // Workaround to fix batch output for non-C locales
2034 setlocale(LC_NUMERIC,"C");
2035 gui->do_export (0);
2036 exit (0);
2039 #if HAVE_DBUS
2040 pcb_dbus_setup();
2041 #endif
2043 EnableAutosave ();
2045 #ifdef DEBUG
2046 printf ("Settings.LibraryCommandDir = \"%s\"\n",
2047 Settings.LibraryCommandDir);
2048 printf ("Settings.FontPath = \"%s\"\n",
2049 Settings.FontPath);
2050 printf ("Settings.ElementPath = \"%s\"\n",
2051 Settings.ElementPath);
2052 printf ("Settings.LibraryPath = \"%s\"\n",
2053 Settings.LibraryPath);
2054 printf ("Settings.LibraryTree = \"%s\"\n",
2055 Settings.LibraryTree);
2056 printf ("Settings.MakeProgram = \"%s\"\n",
2057 UNKNOWN (Settings.MakeProgram));
2058 printf ("Settings.GnetlistProgram = \"%s\"\n",
2059 UNKNOWN (Settings.GnetlistProgram));
2060 #endif
2062 gui->do_export (0);
2063 #if HAVE_DBUS
2064 pcb_dbus_finish();
2065 #endif
2067 return (0);