FreeCalypso > hg > ueda-linux
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ueda/utils/instfileelem.c Mon Jul 20 00:24:37 2015 +0000 @@ -0,0 +1,145 @@ +/* + * This program instantiates a file element, i.e., locates it by name and emits + * it on stdout with the refdes filled in. The value can also be filled in + * (optionally). + */ + +#include <sys/param.h> +#include <ctype.h> +#include <stdio.h> +#include <strings.h> + +char dirlist_pathname[] = "/usr/local/eda/file-element-dirs"; +char *fpname, *refdes, *value; +char fileelem_pathname[MAXPATHLEN]; + +main(argc, argv) + char **argv; +{ + register FILE *lf, *ef; + char linebuf[1024]; + register char *cp; + + if (argc < 3 || argc > 4) { + fprintf(stderr, "usage: %s footprint refdes [value]\n", + argv[0]); + exit(1); + } + fpname = argv[1]; + refdes = argv[2]; + value = argv[3]; + + lf = fopen(dirlist_pathname, "r"); + if (!lf) { + perror(dirlist_pathname); + exit(1); + } + for (ef = NULL; fgets(linebuf, sizeof linebuf, lf); ) { + if (linebuf[0] == '\0' || isspace(linebuf[0])) + continue; + cp = index(linebuf, '\0'); + while (isspace(cp[-1])) + cp--; + *cp = '\0'; + sprintf(fileelem_pathname, "%s/%s", linebuf, fpname); + if (ef = fopen(fileelem_pathname, "r")) + break; + sprintf(fileelem_pathname, "%s/%s.fp", linebuf, fpname); + if (ef = fopen(fileelem_pathname, "r")) + break; + } + fclose(lf); + if (!ef) { + fprintf(stderr, "No footprint named %s\n", fpname); + exit(1); + } + + while (fgets(linebuf, sizeof linebuf, ef)) { + for (cp = linebuf; isspace(*cp); cp++) + ; + if (!strncmp(cp, "Element", 7) && + (cp[7] == '(' || cp[7] == '[' || isspace(cp[7]))) + do_element_line(cp + 7); + else + fputs(linebuf, stdout); + } + fclose(ef); + exit(0); +} + +do_element_line(cp) + register char *cp; +{ + char opench, closech; + char *fields[11], refdesq[64], valueq[64]; + int nfields; + register int c; + char *err; + + while (isspace(*cp)) + cp++; + opench = *cp++; + switch (opench) { + case '(': + closech = ')'; + break; + case '[': + closech = ']'; + break; + default: + err = "no valid opening char"; +inv: fprintf(stderr, "%s: invalid Element line: %s\n", + fileelem_pathname, err); + exit(1); + } + + for (nfields = 0; ; ) { + while (isspace(*cp)) + cp++; + if (!*cp) { +badeol: err = "missing closing char"; + goto inv; + } + if (*cp == closech) { + cp++; + break; + } + if (nfields >= 11) { + err = "too many fields"; + goto inv; + } + fields[nfields++] = cp; + while ((c = *cp) && !isspace(c) && c != closech) + cp++; + if (!c) + goto badeol; + *cp++ = '\0'; + if (c == closech) + break; + } + + sprintf(refdesq, "\"%s\"", refdes); + if (value) + sprintf(valueq, "\"%s\"", value); + if (nfields == 11 || nfields == 9) { + fields[2] = refdesq; + if (value) + fields[3] = valueq; + } else if (nfields == 8) + fields[2] = refdesq; + else if (nfields == 7) + fields[1] = refdesq; + else { + err = "unrecognized format"; + goto inv; + } + + printf("Element%c", opench); + for (c = 0; c < nfields; c++) { + if (c) + putchar(' '); + fputs(fields[c], stdout); + } + putchar(closech); + fputs(cp, stdout); +}