comparison ueda/utils/instfileelem.c @ 0:cd92449fdb51

initial import of ueda and ifctf-part-lib from ifctfvax CVS
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 20 Jul 2015 00:24:37 +0000
parents
children e2130f1ef720
comparison
equal deleted inserted replaced
-1:000000000000 0:cd92449fdb51
1 /*
2 * This program instantiates a file element, i.e., locates it by name and emits
3 * it on stdout with the refdes filled in. The value can also be filled in
4 * (optionally).
5 */
6
7 #include <sys/param.h>
8 #include <ctype.h>
9 #include <stdio.h>
10 #include <strings.h>
11
12 char dirlist_pathname[] = "/usr/local/eda/file-element-dirs";
13 char *fpname, *refdes, *value;
14 char fileelem_pathname[MAXPATHLEN];
15
16 main(argc, argv)
17 char **argv;
18 {
19 register FILE *lf, *ef;
20 char linebuf[1024];
21 register char *cp;
22
23 if (argc < 3 || argc > 4) {
24 fprintf(stderr, "usage: %s footprint refdes [value]\n",
25 argv[0]);
26 exit(1);
27 }
28 fpname = argv[1];
29 refdes = argv[2];
30 value = argv[3];
31
32 lf = fopen(dirlist_pathname, "r");
33 if (!lf) {
34 perror(dirlist_pathname);
35 exit(1);
36 }
37 for (ef = NULL; fgets(linebuf, sizeof linebuf, lf); ) {
38 if (linebuf[0] == '\0' || isspace(linebuf[0]))
39 continue;
40 cp = index(linebuf, '\0');
41 while (isspace(cp[-1]))
42 cp--;
43 *cp = '\0';
44 sprintf(fileelem_pathname, "%s/%s", linebuf, fpname);
45 if (ef = fopen(fileelem_pathname, "r"))
46 break;
47 sprintf(fileelem_pathname, "%s/%s.fp", linebuf, fpname);
48 if (ef = fopen(fileelem_pathname, "r"))
49 break;
50 }
51 fclose(lf);
52 if (!ef) {
53 fprintf(stderr, "No footprint named %s\n", fpname);
54 exit(1);
55 }
56
57 while (fgets(linebuf, sizeof linebuf, ef)) {
58 for (cp = linebuf; isspace(*cp); cp++)
59 ;
60 if (!strncmp(cp, "Element", 7) &&
61 (cp[7] == '(' || cp[7] == '[' || isspace(cp[7])))
62 do_element_line(cp + 7);
63 else
64 fputs(linebuf, stdout);
65 }
66 fclose(ef);
67 exit(0);
68 }
69
70 do_element_line(cp)
71 register char *cp;
72 {
73 char opench, closech;
74 char *fields[11], refdesq[64], valueq[64];
75 int nfields;
76 register int c;
77 char *err;
78
79 while (isspace(*cp))
80 cp++;
81 opench = *cp++;
82 switch (opench) {
83 case '(':
84 closech = ')';
85 break;
86 case '[':
87 closech = ']';
88 break;
89 default:
90 err = "no valid opening char";
91 inv: fprintf(stderr, "%s: invalid Element line: %s\n",
92 fileelem_pathname, err);
93 exit(1);
94 }
95
96 for (nfields = 0; ; ) {
97 while (isspace(*cp))
98 cp++;
99 if (!*cp) {
100 badeol: err = "missing closing char";
101 goto inv;
102 }
103 if (*cp == closech) {
104 cp++;
105 break;
106 }
107 if (nfields >= 11) {
108 err = "too many fields";
109 goto inv;
110 }
111 fields[nfields++] = cp;
112 while ((c = *cp) && !isspace(c) && c != closech)
113 cp++;
114 if (!c)
115 goto badeol;
116 *cp++ = '\0';
117 if (c == closech)
118 break;
119 }
120
121 sprintf(refdesq, "\"%s\"", refdes);
122 if (value)
123 sprintf(valueq, "\"%s\"", value);
124 if (nfields == 11 || nfields == 9) {
125 fields[2] = refdesq;
126 if (value)
127 fields[3] = valueq;
128 } else if (nfields == 8)
129 fields[2] = refdesq;
130 else if (nfields == 7)
131 fields[1] = refdesq;
132 else {
133 err = "unrecognized format";
134 goto inv;
135 }
136
137 printf("Element%c", opench);
138 for (c = 0; c < nfields; c++) {
139 if (c)
140 putchar(' ');
141 fputs(fields[c], stdout);
142 }
143 putchar(closech);
144 fputs(cp, stdout);
145 }