mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-26 03:54:04 +02:00
b2/: run variable substitution on BOM entries (untested)
This commit is contained in:
parent
4fb17f6e95
commit
ec04163f44
50
b2/bom.c
50
b2/bom.c
@ -13,9 +13,14 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "lang.h"
|
#include "lang.h"
|
||||||
|
#include "relop.h"
|
||||||
|
#include "param.h"
|
||||||
|
#include "subst.h"
|
||||||
|
#include "subex.h"
|
||||||
#include "bom.h"
|
#include "bom.h"
|
||||||
|
|
||||||
|
|
||||||
@ -61,6 +66,7 @@ struct bom *bom_parse_line(const char *s)
|
|||||||
b->sym = NULL;
|
b->sym = NULL;
|
||||||
b->fields = NULL;
|
b->fields = NULL;
|
||||||
b->n_fields = 0;
|
b->n_fields = 0;
|
||||||
|
b->vars = 0;
|
||||||
|
|
||||||
for (s = t; *t && *t != '\n'; s = t+1) {
|
for (s = t; *t && *t != '\n'; s = t+1) {
|
||||||
while (*s == ' ' || *s == '\t')
|
while (*s == ' ' || *s == '\t')
|
||||||
@ -99,3 +105,47 @@ void bom_set_sym(const char *ref, const char *sym)
|
|||||||
yyerrorf("symbol is already set in \"%s\"", ref);
|
yyerrorf("symbol is already set in \"%s\"", ref);
|
||||||
b->sym = sym;
|
b->sym = sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void add_var(struct param ***last, struct param *var)
|
||||||
|
{
|
||||||
|
**last = var;
|
||||||
|
*last = &var->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int bom_subst(struct bom *b, const struct subst *sub)
|
||||||
|
{
|
||||||
|
char tmp[4];
|
||||||
|
struct param *vars = NULL, **last = &vars;
|
||||||
|
struct param *out;
|
||||||
|
int i, res;
|
||||||
|
|
||||||
|
/* must be last, for removal with n_bom-- to work */
|
||||||
|
assert(b == bom+n_bom-1);
|
||||||
|
|
||||||
|
/* set input variables */
|
||||||
|
add_var(&last, make_var("REF", rel_eq, b->ref));
|
||||||
|
if (b->n_fields && *b->fields[0])
|
||||||
|
add_var(&last, make_var("VAL", rel_eq, b->fields[0]));
|
||||||
|
if (b->n_fields > 1 && *b->fields[1])
|
||||||
|
add_var(&last, make_var("FP", rel_eq, b->fields[1]));
|
||||||
|
else
|
||||||
|
yywarnf("\"%s\" has no footprint", b->ref);
|
||||||
|
for (i = 2; i != b->n_fields; i++)
|
||||||
|
if (*b->fields[i]) {
|
||||||
|
sprintf(tmp, "F%d", i-1);
|
||||||
|
add_var(&last, make_var(tmp, rel_eq, b->fields[i]));
|
||||||
|
}
|
||||||
|
if (b->sym)
|
||||||
|
add_var(&last, make_var("SYM", rel_eq, b->sym));
|
||||||
|
|
||||||
|
/* run substitutions */
|
||||||
|
res = substitute(sub, vars, &out);
|
||||||
|
free_vars(vars);
|
||||||
|
if (res)
|
||||||
|
b->vars = out;
|
||||||
|
else
|
||||||
|
n_bom--;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
2
b2/bom.h
2
b2/bom.h
@ -14,6 +14,7 @@
|
|||||||
#define BOM_H
|
#define BOM_H
|
||||||
|
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
|
#include "subst.h"
|
||||||
|
|
||||||
|
|
||||||
struct bom {
|
struct bom {
|
||||||
@ -30,5 +31,6 @@ extern int n_bom;
|
|||||||
|
|
||||||
struct bom *bom_parse_line(const char *s);
|
struct bom *bom_parse_line(const char *s);
|
||||||
void bom_set_sym(const char *ref, const char *sym);
|
void bom_set_sym(const char *ref, const char *sym);
|
||||||
|
int bom_subst(struct bom *b, const struct subst *sub);
|
||||||
|
|
||||||
#endif /* !BOM_H */
|
#endif /* !BOM_H */
|
||||||
|
11
b2/lang.l
11
b2/lang.l
@ -103,6 +103,15 @@ void parse_symbols(const char *name)
|
|||||||
do_parse(name, START_SYMBOLS, 1, 0);
|
do_parse(name, START_SYMBOLS, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void process_bom_line(const char *s)
|
||||||
|
{
|
||||||
|
struct bom *b;
|
||||||
|
|
||||||
|
b = bom_parse_line(s);
|
||||||
|
bom_subst(b, substitutions);
|
||||||
|
}
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
@ -138,7 +147,7 @@ PAT "\\"[^\t\n]|[^ \t\n\\]
|
|||||||
<BOM>"eeschema \("[^\n]* { hash = 0;
|
<BOM>"eeschema \("[^\n]* { hash = 0;
|
||||||
return BOM_EESCHEMA; }
|
return BOM_EESCHEMA; }
|
||||||
<BOM>"|"[^\n]* { if (hash == 1)
|
<BOM>"|"[^\n]* { if (hash == 1)
|
||||||
bom_parse_line(yytext); }
|
process_bom_line(yytext); }
|
||||||
<BOM>"#End Cmp" { YY_FLUSH_BUFFER;
|
<BOM>"#End Cmp" { YY_FLUSH_BUFFER;
|
||||||
return 0; }
|
return 0; }
|
||||||
<BOM>#[^\n]* hash++;
|
<BOM>#[^\n]* hash++;
|
||||||
|
Loading…
Reference in New Issue
Block a user