mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-26 22:03:08 +02:00
b2/: add parsing of KiCad eeschema BOMs (option -b)
This commit is contained in:
parent
7c8fc30541
commit
ddd22ba16c
@ -13,7 +13,7 @@ SHELL = /bin/bash
|
|||||||
|
|
||||||
CFLAGS = -g -Wall $(shell pkg-config --cflags glib-2.0)
|
CFLAGS = -g -Wall $(shell pkg-config --cflags glib-2.0)
|
||||||
SLOPPY = -Wno-unused -Wno-implicit-function-declaration
|
SLOPPY = -Wno-unused -Wno-implicit-function-declaration
|
||||||
OBJS = boom.o chr.o comp.o db.o dump.o eval.o param.o relop.o \
|
OBJS = bom.o boom.o chr.o comp.o db.o dump.o eval.o param.o relop.o \
|
||||||
subex.o subst.o util.o \
|
subex.o subst.o util.o \
|
||||||
vstring.o lex.yy.o y.tab.o
|
vstring.o lex.yy.o y.tab.o
|
||||||
LDLIBS = -lfl $(shell pkg-config --libs glib-2.0)
|
LDLIBS = -lfl $(shell pkg-config --libs glib-2.0)
|
||||||
|
71
b2/bom.c
Normal file
71
b2/bom.c
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* bom.c - BOM data
|
||||||
|
*
|
||||||
|
* Copyright 2012 by Werner Almesberger
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
#include "lang.h"
|
||||||
|
#include "bom.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct bom *bom = NULL;
|
||||||
|
int n_bom = 0;
|
||||||
|
|
||||||
|
|
||||||
|
struct bom *bom_parse_line(const char *s)
|
||||||
|
{
|
||||||
|
struct bom *b;
|
||||||
|
const char *t;
|
||||||
|
char *f;
|
||||||
|
|
||||||
|
bom = realloc(bom, sizeof(struct bom)*(n_bom+1));
|
||||||
|
if (!bom)
|
||||||
|
abort();
|
||||||
|
b = bom+n_bom++;
|
||||||
|
|
||||||
|
if (*s++ != '|')
|
||||||
|
abort();
|
||||||
|
while (*s == ' ' || *s == '\t')
|
||||||
|
s++;
|
||||||
|
for (t = s+1; *t && !isspace(*t); t++);
|
||||||
|
if (!*t)
|
||||||
|
yyerror("invalid BOM record (1)\n");
|
||||||
|
b->ref = stralloc_n(s, t-s);
|
||||||
|
b->sym = NULL;
|
||||||
|
b->fields = NULL;
|
||||||
|
b->n_fields = 0;
|
||||||
|
|
||||||
|
for (s = t; *t && *t != '\n'; s = t+1) {
|
||||||
|
while (*s == ' ' || *s == '\t')
|
||||||
|
s++;
|
||||||
|
if (*s == ';' || *s == '\n') {
|
||||||
|
f = NULL;
|
||||||
|
t = s;
|
||||||
|
} else {
|
||||||
|
for (t = s+1; *t && *t != ';' && !isspace(*t); t++);
|
||||||
|
f = stralloc_n(s, t-s);
|
||||||
|
while (*t == ' ' || *t == '\t')
|
||||||
|
t++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* VAL, FP, F1 ... */
|
||||||
|
b->fields =
|
||||||
|
realloc(b->fields, sizeof(const char *)*(b->n_fields+1));
|
||||||
|
if (!b->fields)
|
||||||
|
abort();
|
||||||
|
b->fields[b->n_fields] = f ? unique(f) : unique("");
|
||||||
|
b->n_fields++;
|
||||||
|
free(f);
|
||||||
|
}
|
||||||
|
return b;
|
||||||
|
}
|
34
b2/bom.h
Normal file
34
b2/bom.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* bom.h - BOM data
|
||||||
|
*
|
||||||
|
* Copyright 2012 by Werner Almesberger
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef BOM_H
|
||||||
|
#define BOM_H
|
||||||
|
|
||||||
|
#include "param.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct bom {
|
||||||
|
const char *ref; /* component reference */
|
||||||
|
const char *sym; /* symbol */
|
||||||
|
const char **fields; /* fields */
|
||||||
|
int n_fields;
|
||||||
|
const struct param *vars; /* variables (before conversion) */
|
||||||
|
const struct bom *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct bom *bom;
|
||||||
|
extern int n_bom;
|
||||||
|
|
||||||
|
|
||||||
|
struct bom *bom_parse_line(const char *line);
|
||||||
|
|
||||||
|
#endif /* !BOM_H */
|
@ -82,6 +82,7 @@ static void usage(const char *name)
|
|||||||
" -x currency exchange\n"
|
" -x currency exchange\n"
|
||||||
" -p providers\n"
|
" -p providers\n"
|
||||||
" -s substitutions\n"
|
" -s substitutions\n"
|
||||||
|
" -b KiCad eeschema BOM\n"
|
||||||
" -q var=value ... run substitutions with the specified inputs\n"
|
" -q var=value ... run substitutions with the specified inputs\n"
|
||||||
" -Q var=value ... run substitutions and then do parametric search\n"
|
" -Q var=value ... run substitutions and then do parametric search\n"
|
||||||
, name);
|
, name);
|
||||||
@ -107,6 +108,8 @@ int main(int argc, char **argv)
|
|||||||
process = parse_providers;
|
process = parse_providers;
|
||||||
else if (!strcmp(argv[i], "-s"))
|
else if (!strcmp(argv[i], "-s"))
|
||||||
process = parse_substitutions;
|
process = parse_substitutions;
|
||||||
|
else if (!strcmp(argv[i], "-b"))
|
||||||
|
process = parse_kicad_bom;
|
||||||
else if (!strcmp(argv[i], "-q"))
|
else if (!strcmp(argv[i], "-q"))
|
||||||
process = add_var;
|
process = add_var;
|
||||||
else if (!strcmp(argv[i], "-Q")) {
|
else if (!strcmp(argv[i], "-Q")) {
|
||||||
|
@ -28,6 +28,7 @@ void parse_inventory(const char *name);
|
|||||||
void parse_currencies(const char *name);
|
void parse_currencies(const char *name);
|
||||||
void parse_providers(const char *name);
|
void parse_providers(const char *name);
|
||||||
void parse_substitutions(const char *name);
|
void parse_substitutions(const char *name);
|
||||||
|
void parse_kicad_bom(const char *name);
|
||||||
|
|
||||||
void yywarnf(const char *fmt, ...);
|
void yywarnf(const char *fmt, ...);
|
||||||
void __attribute__((noreturn)) yyerrorf(const char *fmt, ...);
|
void __attribute__((noreturn)) yyerrorf(const char *fmt, ...);
|
||||||
|
27
b2/lang.l
27
b2/lang.l
@ -18,6 +18,7 @@
|
|||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
#include "chr.h"
|
#include "chr.h"
|
||||||
|
#include "bom.h"
|
||||||
#include "y.tab.h"
|
#include "y.tab.h"
|
||||||
#include "lang.h"
|
#include "lang.h"
|
||||||
|
|
||||||
@ -25,8 +26,9 @@
|
|||||||
extern int yyparse(void);
|
extern int yyparse(void);
|
||||||
|
|
||||||
static int start_token;
|
static int start_token;
|
||||||
static int expose_nl;
|
static int expose_nl; /* 0: ignore \n; 1: return TOK_NL */
|
||||||
static int pattern;
|
static int pattern; /* 0: = relops are normal; 1: relops switch to PAT */
|
||||||
|
static int hash; /* number of hashes seen in BOM mode */
|
||||||
static const char *file_name;
|
static const char *file_name;
|
||||||
static int lineno;
|
static int lineno;
|
||||||
|
|
||||||
@ -107,6 +109,7 @@ ID [-_A-Za-z0-9()+./]
|
|||||||
PAT "\\"[^\t\n]|[^ \t\n\\]
|
PAT "\\"[^\t\n]|[^ \t\n\\]
|
||||||
|
|
||||||
%s ID PAT
|
%s ID PAT
|
||||||
|
%x BOM
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
@ -126,6 +129,16 @@ PAT "\\"[^\t\n]|[^ \t\n\\]
|
|||||||
yylval.s = stralloc(yytext);
|
yylval.s = stralloc(yytext);
|
||||||
return PATTERN; }
|
return PATTERN; }
|
||||||
|
|
||||||
|
<BOM>"eeschema \("[^\n]* { hash = 0;
|
||||||
|
return BOM_EESCHEMA; }
|
||||||
|
<BOM>"|"[^\n]* { if (hash == 1)
|
||||||
|
bom_parse_line(yytext); }
|
||||||
|
<BOM>"#End Cmp" { YY_FLUSH_BUFFER;
|
||||||
|
return 0; }
|
||||||
|
<BOM>#[^\n]* hash++;
|
||||||
|
<BOM>\n lineno++;
|
||||||
|
<BOM>. return *yytext;
|
||||||
|
|
||||||
[<>=] { if (pattern)
|
[<>=] { if (pattern)
|
||||||
BEGIN(PAT);
|
BEGIN(PAT);
|
||||||
return *yytext; }
|
return *yytext; }
|
||||||
@ -183,3 +196,13 @@ void __attribute__((noreturn)) yyerror(const char *s)
|
|||||||
fprintf(stderr, "%s:%d: %s\n", file_name, lineno, s);
|
fprintf(stderr, "%s:%d: %s\n", file_name, lineno, s);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Define parse_kicad_bom here, so that we have access to BOM and INITIAL */
|
||||||
|
|
||||||
|
void parse_kicad_bom(const char *name)
|
||||||
|
{
|
||||||
|
BEGIN(BOM);
|
||||||
|
do_parse(name, START_BOM, 1, 0);
|
||||||
|
BEGIN(INITIAL);
|
||||||
|
}
|
||||||
|
18
b2/lang.y
18
b2/lang.y
@ -101,7 +101,8 @@ static struct subst *parse_jump(const char *keyword, const char *target)
|
|||||||
|
|
||||||
|
|
||||||
%token START_HIERARCHY START_CHAR START_INVENTORY
|
%token START_HIERARCHY START_CHAR START_INVENTORY
|
||||||
%token START_EXCHANGE START_PROVIDERS START_SUBST
|
%token START_EXCHANGE START_PROVIDERS START_SUBST START_BOM
|
||||||
|
%token BOM_EESCHEMA
|
||||||
%token TOK_LE TOK_GE TOK_NL
|
%token TOK_LE TOK_GE TOK_NL
|
||||||
%token <s> WORD PATTERN
|
%token <s> WORD PATTERN
|
||||||
|
|
||||||
@ -138,6 +139,7 @@ all:
|
|||||||
{
|
{
|
||||||
substitutions = $2;
|
substitutions = $2;
|
||||||
}
|
}
|
||||||
|
| START_BOM bom
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -653,3 +655,17 @@ opt_block:
|
|||||||
$$ = $2;
|
$$ = $2;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- KiCad BOM (from eeschema) ----------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
bom:
|
||||||
|
BOM_EESCHEMA
|
||||||
|
/*
|
||||||
|
* The KiCad BOM syntax is quite alien, so we just check the
|
||||||
|
* overall structure here, leave extracting the lines with
|
||||||
|
* actual content to the lexer, and do all the detail work in
|
||||||
|
* bom.c
|
||||||
|
*/
|
||||||
|
;
|
||||||
|
Loading…
Reference in New Issue
Block a user