1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-12-23 05:54:37 +02:00

gencat/: keep "struct entry" ptr in "struct node" instead of duplicating content

This commit is contained in:
Werner Almesberger 2012-07-11 22:54:07 -03:00
parent 6e0015cdd6
commit 1b6bf60c56
5 changed files with 25 additions and 32 deletions

View File

@ -21,21 +21,15 @@
#include "libs.h"
const char *lookup_sym(const struct lib *lib, const char *name,
const struct name **names, int *units)
const struct entry *lookup_sym(const struct lib *lib, const char *name)
{
const struct file *file;
const struct entry *e;
for (file = lib->files; file; file = file->next)
for (e = file->entries; e; e = e->next)
if (!strcasecmp(e->names->s, name)) {
if (names)
*names = e->names;
if (units)
*units = e->units;
return file->path;
}
if (!strcasecmp(e->names->s, name))
return e;
return NULL;
}

View File

@ -40,8 +40,7 @@ struct lib {
extern struct lib comp_lib;
const char *lookup_sym(const struct lib *lib, const char *name,
const struct name **names, int *units);
const struct entry *lookup_sym(const struct lib *lib, const char *name);
void add_name(struct entry *e, char *s);
struct entry *new_entry(struct lib *lib, int units);
void add_lib(struct lib *lib, const char *path);

View File

@ -117,7 +117,7 @@ static void collect_names(const struct node *node, const char ***idx, int *n)
if (node->child)
collect_names(node->child, idx, n);
else {
for (name = node->names; name; name = name->next) {
for (name = node->e->names; name; name = name->next) {
(*n)++;
*idx = realloc(*idx, *n*sizeof(char *));
if (!*idx)
@ -224,8 +224,8 @@ 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);
for (name = node->names; name; name = name->next) {
if (name != node->names)
for (name = node->e->names; name; name = name->next) {
if (name != node->e->names)
fprintf(file, "(, ) show 0.5 setgray\n");
ps_string(file, name->s);
fprintf(file, " show\n");
@ -235,7 +235,7 @@ static void make_title(FILE *file, const struct node *node, int unit)
free(s);
}
fprintf(file, "0 setgray\n");
if (node->units > 1)
if (node->e->units > 1)
fprintf(file, " ( \\(%c\\)) show\n", 'A'+unit);
fprintf(file, "/%s findfont %d scalefont setfont\n",
@ -246,7 +246,7 @@ static void make_title(FILE *file, const struct node *node, int unit)
fprintf(file, "/%s findfont %d scalefont setfont\n",
format.lib.font, format.lib.size);
fprintf(file, "%d %d moveto\n", format.left, -format.lib.y);
ps_string(file, node->lib);
ps_string(file, node->e->file->path);
fprintf(file, " show\n");
fprintf(file, "grestore\n");
@ -313,7 +313,7 @@ static void convert_comp(const struct node *node, FILE *out)
char *tmp;
int i, res;
for (i = 0; i != node->units; i++) {
for (i = 0; i != node->e->units; i++) {
if (!quiet) {
fprintf(stderr, "\r%u/%u", ++done, total);
fflush(stderr);
@ -322,7 +322,8 @@ 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->names->s, i+1, "tmp", "tmp.ps") < 0) {
node->e->file->path, node->e->names->s, i+1,
"tmp", "tmp.ps") < 0) {
perror("asprintf");
exit(1);
}
@ -367,7 +368,7 @@ static int count_tree(const struct node *node)
if (node->child)
sum += count_tree(node->child);
else
sum += node->units;
sum += node->e->units;
node = node->next;
}
return sum;

View File

@ -68,7 +68,7 @@ next:
name[e-s+1] = 0;
node = alloc_type(struct node);
node->name = name;
node->lib = NULL;
node->e = NULL;
node->comment = NULL;
node->indent = n;
node->child = node->next = NULL;
@ -208,9 +208,8 @@ void set_libs(struct node *node)
{
while (node) {
if (!node->child) {
node->lib = lookup_sym(&comp_lib, node->name,
&node->names, &node->units);
if (!node->lib) {
node->e = lookup_sym(&comp_lib, node->name);
if (!node->e) {
fprintf(stderr, "symbol %s not found\n",
node->name);
exit(1);
@ -230,10 +229,10 @@ static void dump_tree_level(const struct node *tree, int level)
for (n = tree; n; n = n->next) {
printf("%*s%s", 4*level, "", n->name);
if (n->lib) {
for (name = n->names; name; name = name->next)
if (n->e) {
for (name = n->e->names; name; name = name->next)
printf("%s%s",
name == n->names ? " (" : ", ", name->s);
name == n->e->names ? " (" : ", ", name->s);
printf(")");
}
printf("\n");
@ -255,8 +254,8 @@ static void dump_comp_level(const struct node *tree)
const struct node *n;
for (n = tree; n; n = n->next) {
if (n->lib)
printf("%s\n", n->names->s);
if (n->e)
printf("%s\n", n->e->names->s);
dump_comp_level(n->child);
}
}

View File

@ -12,6 +12,9 @@
#ifndef TREE_H
#define TREE_H
#include "libs.h"
struct line {
char *s;
struct line *next;
@ -19,10 +22,7 @@ struct line {
struct node {
const char *name;
const char *lib; /* NULL if intermediate node */
const struct name *names;
/* canonical name and aliases of component */
int units; /* number of units; undefined if intermediate */
const struct entry *e; /* NULL if intermediate node */
struct line *comment; /* NULL if intermediate node */
int indent; /* level of indentation (characters) */
struct node *parent;