FreeCalypso > hg > ueda-linux
comparison ueda/utils/cutelements.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 cuts the "elements PCB" constructed by the | |
| 3 * ueda-getfps | ueda-runm4 pipeline into one file per element. | |
| 4 * | |
| 5 * Alternatively, this program can also be used to extract all elements | |
| 6 * out of any PCB layout file. | |
| 7 */ | |
| 8 | |
| 9 #include <ctype.h> | |
| 10 #include <stdio.h> | |
| 11 #include <strings.h> | |
| 12 | |
| 13 char *inputname; | |
| 14 FILE *inf; | |
| 15 int lineno, in_element, parencount; | |
| 16 FILE *elemf; | |
| 17 | |
| 18 char * | |
| 19 do_element_line(cp) | |
| 20 register char *cp; | |
| 21 { | |
| 22 char copybuf[1024]; | |
| 23 char opench, closech; | |
| 24 char *fields[11], *pcbname; | |
| 25 int nfields; | |
| 26 register int c; | |
| 27 char *err; | |
| 28 | |
| 29 if (in_element) { | |
| 30 fprintf(stderr, "%s: line %d: nested Element\n", inputname, | |
| 31 lineno); | |
| 32 exit(1); | |
| 33 } | |
| 34 if (parencount) { | |
| 35 fprintf(stderr, | |
| 36 "%s: line %d: Element not at the top nesting level\n", | |
| 37 inputname, lineno); | |
| 38 exit(1); | |
| 39 } | |
| 40 | |
| 41 while (isspace(*cp)) | |
| 42 cp++; | |
| 43 opench = *cp++; | |
| 44 switch (opench) { | |
| 45 case '(': | |
| 46 closech = ')'; | |
| 47 break; | |
| 48 case '[': | |
| 49 closech = ']'; | |
| 50 break; | |
| 51 default: | |
| 52 err = "no valid opening char"; | |
| 53 inv: fprintf(stderr, "%s: line %d: invalid Element line: %s\n", | |
| 54 inputname, lineno, err); | |
| 55 exit(1); | |
| 56 } | |
| 57 | |
| 58 strcpy(copybuf, cp); | |
| 59 cp = copybuf; | |
| 60 | |
| 61 for (nfields = 0; ; ) { | |
| 62 while (isspace(*cp)) | |
| 63 cp++; | |
| 64 if (!*cp) { | |
| 65 badeol: err = "missing closing char"; | |
| 66 goto inv; | |
| 67 } | |
| 68 if (*cp == closech) { | |
| 69 cp++; | |
| 70 break; | |
| 71 } | |
| 72 if (nfields >= 11) { | |
| 73 err = "too many fields"; | |
| 74 goto inv; | |
| 75 } | |
| 76 if (*cp == '\"') { | |
| 77 cp++; | |
| 78 for (fields[nfields++] = cp; c = *cp; cp++) | |
| 79 if (c == '\"') | |
| 80 break; | |
| 81 } else { | |
| 82 fields[nfields++] = cp; | |
| 83 while ((c = *cp) && !isspace(c) && c != closech) | |
| 84 cp++; | |
| 85 } | |
| 86 if (!c) | |
| 87 goto badeol; | |
| 88 *cp++ = '\0'; | |
| 89 if (c == closech) | |
| 90 break; | |
| 91 } | |
| 92 | |
| 93 switch (nfields) { | |
| 94 case 7: | |
| 95 pcbname = fields[1]; | |
| 96 break; | |
| 97 case 8: | |
| 98 case 9: | |
| 99 case 11: | |
| 100 pcbname = fields[2]; | |
| 101 break; | |
| 102 default: | |
| 103 err = "unrecognized format"; | |
| 104 goto inv; | |
| 105 } | |
| 106 open_element(pcbname); | |
| 107 | |
| 108 return(cp); | |
| 109 } | |
| 110 | |
| 111 open_element(name) | |
| 112 register char *name; | |
| 113 { | |
| 114 elemf = fopen(name, "w"); | |
| 115 if (!elemf) { | |
| 116 fprintf(stderr, "cannot create file: %s\n", name); | |
| 117 exit(1); | |
| 118 } | |
| 119 in_element = 1; | |
| 120 } | |
| 121 | |
| 122 main(argc, argv) | |
| 123 char **argv; | |
| 124 { | |
| 125 char linebuf[1024]; | |
| 126 register char *cp; | |
| 127 | |
| 128 if (argc > 2) { | |
| 129 fprintf(stderr, "usage: %s [collection_file]\n", argv[0]); | |
| 130 exit(1); | |
| 131 } | |
| 132 if (argc == 2) { | |
| 133 inputname = argv[1]; | |
| 134 inf = fopen(inputname, "r"); | |
| 135 if (!inf) { | |
| 136 perror(inputname); | |
| 137 exit(1); | |
| 138 } | |
| 139 } else { | |
| 140 inputname = "stdin"; | |
| 141 inf = stdin; | |
| 142 } | |
| 143 | |
| 144 for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) { | |
| 145 for (cp = linebuf; isspace(*cp); cp++) | |
| 146 ; | |
| 147 if (!strncmp(cp, "Element", 7) && | |
| 148 (cp[7] == '(' || cp[7] == '[' || isspace(cp[7]))) | |
| 149 cp = do_element_line(cp + 7); | |
| 150 if (in_element) | |
| 151 fputs(linebuf, elemf); | |
| 152 scan_parens(cp); | |
| 153 } | |
| 154 | |
| 155 if (parencount || in_element) { | |
| 156 fprintf(stderr, "%s: unclosed structure(s) at the end\n", | |
| 157 inputname); | |
| 158 exit(1); | |
| 159 } | |
| 160 exit(0); | |
| 161 } | |
| 162 | |
| 163 scan_parens(line) | |
| 164 char *line; | |
| 165 { | |
| 166 register char *cp; | |
| 167 register int c; | |
| 168 | |
| 169 for (cp = line; c = *cp; cp++) { | |
| 170 if (c == '\'' && cp[1] && cp[2] == '\'') { | |
| 171 cp += 2; | |
| 172 continue; | |
| 173 } | |
| 174 if (c == '(' || c == '[') | |
| 175 parencount++; | |
| 176 else if (c == ')' || c == ']') { | |
| 177 parencount--; | |
| 178 if (parencount < 0) { | |
| 179 fprintf(stderr, | |
| 180 "%s: line %d: negative paren count\n", | |
| 181 inputname, lineno); | |
| 182 exit(1); | |
| 183 } | |
| 184 if ((parencount == 0) && in_element) { | |
| 185 fclose(elemf); | |
| 186 in_element = 0; | |
| 187 } | |
| 188 } else if (c == '#') | |
| 189 return; | |
| 190 } | |
| 191 } |
