mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-16 18:51:53 +02:00
genex: add parsing and dumping of alias names
This commit is contained in:
parent
72846f1879
commit
db903c10ba
14
genex/comp.c
14
genex/comp.c
@ -200,13 +200,13 @@ void read_desc(FILE *file)
|
||||
|
||||
|
||||
void set_libs(struct node *node,
|
||||
const char *(*find_lib)(const char *sym, const char **canon,
|
||||
const char *(*find_lib)(const char *sym, const struct name **names,
|
||||
int *units))
|
||||
{
|
||||
while (node) {
|
||||
if (!node->child) {
|
||||
node->lib =
|
||||
find_lib(node->name, &node->canon, &node->units);
|
||||
find_lib(node->name, &node->names, &node->units);
|
||||
if (!node->lib) {
|
||||
fprintf(stderr, "symbol %s not found\n",
|
||||
node->name);
|
||||
@ -223,9 +223,17 @@ static void dump_level(const struct node *tree, int level)
|
||||
{
|
||||
const struct node *n;
|
||||
const struct line *line;
|
||||
const struct name *name;
|
||||
|
||||
for (n = tree; n; n = n->next) {
|
||||
printf("%*s%s\n", 4*level, "", n->name);
|
||||
printf("%*s%s", 4*level, "", n->name);
|
||||
if (n->lib) {
|
||||
for (name = n->names; name; name = name->next)
|
||||
printf("%s%s",
|
||||
name == n->names ? " (" : ", ", name->s);
|
||||
printf(")");
|
||||
}
|
||||
printf("\n");
|
||||
for (line = n->comment; line; line = line->next)
|
||||
printf("%*s\"%s\"\n", 4*level+2, "", line->s);
|
||||
dump_level(n->child, level+1);
|
||||
|
@ -12,6 +12,9 @@
|
||||
#ifndef COMP_H
|
||||
#define COMP_H
|
||||
|
||||
#include "libs.h"
|
||||
|
||||
|
||||
struct line {
|
||||
char *s;
|
||||
struct line *next;
|
||||
@ -20,7 +23,8 @@ struct line {
|
||||
struct node {
|
||||
const char *name;
|
||||
const char *lib; /* NULL if intermediate node */
|
||||
const char *canon; /* canonical name of component */
|
||||
const struct name *names;
|
||||
/* canonical name and aliases of component */
|
||||
int units; /* number of units; undefined if intermediate */
|
||||
struct line *comment; /* NULL if intermediate node */
|
||||
int indent; /* level of indentation (characters) */
|
||||
@ -36,7 +40,7 @@ extern struct node *tree;
|
||||
void read_tree(FILE *file);
|
||||
void read_desc(FILE *file);
|
||||
void set_libs(struct node *node,
|
||||
const char *(*find_lib)(const char *sym, const char **canon,
|
||||
const char *(*find_lib)(const char *sym, const struct name **names,
|
||||
int *units));
|
||||
void dump_tree(void);
|
||||
|
||||
|
32
genex/libs.c
32
genex/libs.c
@ -22,7 +22,7 @@
|
||||
|
||||
|
||||
struct entry {
|
||||
const char *name;
|
||||
struct name *names;
|
||||
int units;
|
||||
struct entry *next;
|
||||
};
|
||||
@ -34,16 +34,16 @@ static struct lib {
|
||||
} *libs = NULL;
|
||||
|
||||
|
||||
const char *lookup_sym(const char *name, const char **canon, int *units)
|
||||
const char *lookup_sym(const char *name, const struct name **names, int *units)
|
||||
{
|
||||
const struct lib *lib;
|
||||
const struct entry *e;
|
||||
|
||||
for (lib = libs; lib; lib = lib->next)
|
||||
for (e = lib->comps; e; e = e->next)
|
||||
if (!strcasecmp(e->name, name)) {
|
||||
if (canon)
|
||||
*canon = e->name;
|
||||
if (!strcasecmp(e->names->s, name)) {
|
||||
if (names)
|
||||
*names = e->names;
|
||||
if (units)
|
||||
*units = e->units;
|
||||
return lib->path;
|
||||
@ -64,11 +64,26 @@ static const char *field(const char *s, int n)
|
||||
}
|
||||
|
||||
|
||||
static void add_name(struct entry *e, char *s)
|
||||
{
|
||||
char *nl;
|
||||
struct name **p;
|
||||
|
||||
nl = strchr(s, '\n');
|
||||
if (nl)
|
||||
*nl = 0;
|
||||
for (p = &e->names; *p; p = &(*p)->next);
|
||||
*p = alloc_type(struct name);
|
||||
(*p)->s = stralloc(s);
|
||||
(*p)->next = NULL;
|
||||
}
|
||||
|
||||
|
||||
void add_lib(const char *path)
|
||||
{
|
||||
FILE *file;
|
||||
struct lib *lib;
|
||||
struct entry *e;
|
||||
struct entry *e = NULL;
|
||||
char buf[1024]; /* @@@ */
|
||||
char *spc;
|
||||
const char *s;
|
||||
@ -86,6 +101,8 @@ void add_lib(const char *path)
|
||||
libs = lib;
|
||||
|
||||
while (fgets(buf, sizeof(buf), file)) {
|
||||
if (!strncmp(buf, "ALIAS ", 6) && e)
|
||||
add_name(e, buf+6);
|
||||
if (strncmp(buf, "DEF ", 4))
|
||||
continue;
|
||||
s = field(buf, 7);
|
||||
@ -101,7 +118,8 @@ void add_lib(const char *path)
|
||||
}
|
||||
*spc = 0;
|
||||
e = alloc_type(struct entry);
|
||||
e->name = stralloc(buf+4);
|
||||
e->names = NULL;
|
||||
add_name(e, buf+4);
|
||||
e->units = atoi(s);
|
||||
if (!e->units) {
|
||||
fprintf(stderr, "invalid number of units in %s\n",
|
||||
|
@ -12,7 +12,12 @@
|
||||
#ifndef LIBS_H
|
||||
#define LIBS_H
|
||||
|
||||
const char *lookup_sym(const char *name, const char **canon, int *units);
|
||||
struct name {
|
||||
const char *s;
|
||||
struct name *next;
|
||||
};
|
||||
|
||||
const char *lookup_sym(const char *name, const struct name **names, int *units);
|
||||
void add_lib(const char *path);
|
||||
void add_libdir(const char *path);
|
||||
|
||||
|
@ -95,7 +95,7 @@ static void make_title(FILE *file, const struct node *node, int unit)
|
||||
fprintf(file, "/%s findfont %d scalefont setfont\n",
|
||||
format.name.font, format.name.size);
|
||||
fprintf(file, "%d %d moveto\n", format.left, -format.name.y);
|
||||
ps_string(file, node->canon);
|
||||
ps_string(file, node->names->s);
|
||||
fprintf(file, " show\n");
|
||||
if (node->units > 1)
|
||||
fprintf(file, " ( \\(%c\\)) show\n", 'A'+unit);
|
||||
@ -177,7 +177,7 @@ static void convert_comp(const struct node *node, FILE *out)
|
||||
if (!i && node->comment)
|
||||
print_comment(out, node->comment);
|
||||
if (asprintf(&tmp, "./sym2xps '%s' '%s' %d '%s' '%s'",
|
||||
node->lib, node->canon, i+1, "tmp", "tmp.ps") < 0) {
|
||||
node->lib, node->names->s, i+1, "tmp", "tmp.ps") < 0) {
|
||||
perror("asprintf");
|
||||
exit(1);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user