mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-26 21:01:31 +02:00
b2/: add parsing of part inventories (WIP)
Also simplify representation of packaging variants.
This commit is contained in:
parent
1394c6b61c
commit
e99a9f4705
2
b2/INV
Normal file
2
b2/INV
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
FOO R101X CT 1234 1 USD 0 1 0.1 10 0.8 100 6
|
||||||
|
FOO R101X-T TR 1234 3000 USD 0 3000 13
|
10
b2/db.c
10
b2/db.c
@ -158,6 +158,16 @@ void part_finalize(struct part *part, const struct action *act)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void part_add_stock(struct part *part, struct stock *stock)
|
||||||
|
{
|
||||||
|
if (!part->stock) {
|
||||||
|
part->stock = stock;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
yyerrorf("part %s %s already has stock", part->domain, part->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void part_dump(FILE *file, const struct part *part)
|
void part_dump(FILE *file, const struct part *part)
|
||||||
{
|
{
|
||||||
const struct param *p;
|
const struct param *p;
|
||||||
|
44
b2/db.h
44
b2/db.h
@ -28,28 +28,57 @@ struct currency {
|
|||||||
struct currency *next;
|
struct currency *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If quantity increases, next entry is next higher discount.
|
||||||
|
* If quantity decreases, next entries are prices after reaching the large
|
||||||
|
* quantity.
|
||||||
|
*
|
||||||
|
* Examples:
|
||||||
|
*
|
||||||
|
* An order of 12 units with the prices below
|
||||||
|
*
|
||||||
|
* a) 1 0.5 10 4.0 100 30.0
|
||||||
|
* b) 1 0.5 10 4.0 1 0.4 100 30.0
|
||||||
|
*
|
||||||
|
* would cost
|
||||||
|
*
|
||||||
|
* a) 1*4.0+2*0.5 = 5.0
|
||||||
|
* b) 1*4.0+2*0.4 = 4.8
|
||||||
|
*/
|
||||||
|
|
||||||
struct price {
|
struct price {
|
||||||
int qty; /* order quantity */
|
int qty; /* order quantity */
|
||||||
double value; /* per quantity cost */
|
double value; /* per quantity cost */
|
||||||
const struct currency *curr;
|
struct price *next; /* next qty */
|
||||||
int fract; /* 0 if > qty at same price; 1 if multiples of qty */
|
|
||||||
struct price *next; /* next lower qty */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct provider {
|
struct provider {
|
||||||
const char *name;
|
const char *name;
|
||||||
double shipping; /* S&H cost */
|
double shipping; /* S&H cost */
|
||||||
double minimum; /* minimum order */
|
double minimum; /* value of minimum order, before S&H */
|
||||||
const struct currency *curr;
|
const struct currency *curr;
|
||||||
struct provider *next;
|
struct provider *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handling of multiple forms of packaging:
|
||||||
|
*
|
||||||
|
* - category is a keyword that identifies the packaging type, e.g.,
|
||||||
|
* T for tape/tray, MAN for manual feeding, etc.
|
||||||
|
* - a query can be constrained to a set of categories
|
||||||
|
* - conversion options (e.g., "Digi-Reel") can be expressed as additional
|
||||||
|
* entries
|
||||||
|
*
|
||||||
|
* @@@ To do: shared availability
|
||||||
|
*/
|
||||||
|
|
||||||
struct stock {
|
struct stock {
|
||||||
|
const char *cat; /* category */
|
||||||
int avail; /* items in stock */
|
int avail; /* items in stock */
|
||||||
int package; /* "natural" quantity (reel, tray, bag, etc.) */
|
int package; /* "natural" quantity (reel, tray, bag, etc.) */
|
||||||
struct price *manual; /* single parts, for manual assembly only */
|
const struct currency *curr;
|
||||||
double reeling; /* cost of converting "manual" to "fab"; <0 if n/a */
|
double add; /* additive element of cost */
|
||||||
struct price *fab; /* for automated assembly */
|
struct price *price;
|
||||||
} stock;
|
} stock;
|
||||||
|
|
||||||
struct part {
|
struct part {
|
||||||
@ -66,6 +95,7 @@ struct part *part_lookup(const char *domain, const char *name);
|
|||||||
struct part *part_add(const char *domain, const char *name);
|
struct part *part_add(const char *domain, const char *name);
|
||||||
void part_alias(struct part *a, struct part *b);
|
void part_alias(struct part *a, struct part *b);
|
||||||
void part_finalize(struct part *part, const struct action *act);
|
void part_finalize(struct part *part, const struct action *act);
|
||||||
|
void part_add_stock(struct part *part, struct stock *stock);
|
||||||
void part_dump(FILE *file, const struct part *part);
|
void part_dump(FILE *file, const struct part *part);
|
||||||
|
|
||||||
#endif /* !DB_H */
|
#endif /* !DB_H */
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
void parse_hierarchy(void);
|
void parse_hierarchy(void);
|
||||||
void parse_characteristics(void);
|
void parse_characteristics(void);
|
||||||
|
void parse_inventory(void);
|
||||||
|
|
||||||
void yywarnf(const char *fmt, ...);
|
void yywarnf(const char *fmt, ...);
|
||||||
void yyerrorf(const char *fmt, ...);
|
void yyerrorf(const char *fmt, ...);
|
||||||
|
@ -44,6 +44,15 @@ void parse_characteristics(void)
|
|||||||
yyparse();
|
yyparse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void parse_inventory(void)
|
||||||
|
{
|
||||||
|
start_token = START_INVENTORY;
|
||||||
|
expose_nl = 1;
|
||||||
|
lineno = 1;
|
||||||
|
yyparse();
|
||||||
|
}
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
97
b2/lang.y
97
b2/lang.y
@ -64,6 +64,8 @@ static const struct field *top_field(void)
|
|||||||
|
|
||||||
%union {
|
%union {
|
||||||
const char *s;
|
const char *s;
|
||||||
|
int num;
|
||||||
|
double fnum;
|
||||||
struct equiv *equiv;
|
struct equiv *equiv;
|
||||||
struct names *names;
|
struct names *names;
|
||||||
struct format *format;
|
struct format *format;
|
||||||
@ -74,13 +76,17 @@ static const struct field *top_field(void)
|
|||||||
struct action act;
|
struct action act;
|
||||||
struct part *part;
|
struct part *part;
|
||||||
struct param *param;
|
struct param *param;
|
||||||
|
struct price *price;
|
||||||
|
struct stock *stock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
%token START_HIERARCHY START_CHAR
|
%token START_HIERARCHY START_CHAR START_INVENTORY
|
||||||
%token TOK_LE TOK_GE TOK_NL
|
%token TOK_LE TOK_GE TOK_NL
|
||||||
%token <s> WORD
|
%token <s> WORD
|
||||||
|
|
||||||
|
%type <num> int
|
||||||
|
%type <fnum> float
|
||||||
%type <equiv> nameqs
|
%type <equiv> nameqs
|
||||||
%type <names> names nameq
|
%type <names> names nameq
|
||||||
%type <format> format
|
%type <format> format
|
||||||
@ -89,16 +95,23 @@ static const struct field *top_field(void)
|
|||||||
%type <sel> selectors
|
%type <sel> selectors
|
||||||
%type <cond> conditions condition
|
%type <cond> conditions condition
|
||||||
%type <act> opt_wildcard action
|
%type <act> opt_wildcard action
|
||||||
%type <part> part
|
%type <part> part inventory_item
|
||||||
%type <param> param params
|
%type <param> param params
|
||||||
|
%type <price> prices price
|
||||||
|
%type <stock> stock
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
all:
|
all:
|
||||||
START_HIERARCHY hierarchy
|
START_HIERARCHY hierarchy
|
||||||
| START_CHAR characteristics
|
| START_CHAR characteristics
|
||||||
|
| START_INVENTORY inventory
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- Characteristics hierarchy ----------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
hierarchy:
|
hierarchy:
|
||||||
nameset hierarchy
|
nameset hierarchy
|
||||||
| action
|
| action
|
||||||
@ -349,6 +362,10 @@ format:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- Part characteristics --------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
characteristics:
|
characteristics:
|
||||||
| TOK_NL
|
| TOK_NL
|
||||||
| part characteristics
|
| part characteristics
|
||||||
@ -389,3 +406,79 @@ param:
|
|||||||
$$->value.u.name = $3;
|
$$->value.u.name = $3;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- Part inventory ---------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
inventory:
|
||||||
|
| TOK_NL
|
||||||
|
| inventory_item inventory
|
||||||
|
;
|
||||||
|
|
||||||
|
inventory_item:
|
||||||
|
WORD WORD stock TOK_NL
|
||||||
|
{
|
||||||
|
$$ = part_lookup($1, $2);
|
||||||
|
if (!$$)
|
||||||
|
$$ = part_add($1, $2);
|
||||||
|
part_add_stock($$, $3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
stock:
|
||||||
|
WORD int int WORD float prices
|
||||||
|
{
|
||||||
|
$$ = alloc_type(struct stock);
|
||||||
|
$$->cat = $1;
|
||||||
|
$$->avail = $2;
|
||||||
|
$$->package = $3;
|
||||||
|
$$->curr = NULL; /* @@@ later -- currency($4); */
|
||||||
|
$$->add = $5;
|
||||||
|
$$->price = $6;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
prices:
|
||||||
|
price
|
||||||
|
{
|
||||||
|
$$ = $1;
|
||||||
|
}
|
||||||
|
| price prices
|
||||||
|
{
|
||||||
|
$$ = $1;
|
||||||
|
$$->next = $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
price:
|
||||||
|
int float
|
||||||
|
{
|
||||||
|
$$ = alloc_type(struct price);
|
||||||
|
$$->qty = $1;
|
||||||
|
$$->value = $2;
|
||||||
|
$$->next = NULL;
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
int:
|
||||||
|
WORD
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
$$ = strtol($1, &end, 10);
|
||||||
|
if (*end)
|
||||||
|
yyerrorf("\"%s\" is not an integer", $1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
float:
|
||||||
|
WORD
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
|
||||||
|
$$ = strtod($1, &end);
|
||||||
|
if (*end)
|
||||||
|
yyerrorf("\"%s\" is not a number", $1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
Loading…
Reference in New Issue
Block a user