mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-26 07:13:08 +02:00
b2/: add currency database
This commit is contained in:
parent
24a32525e2
commit
c3a68453d0
@ -83,4 +83,4 @@ spotless: clean
|
|||||||
# ----- Experiments -----------------------------------------------------------
|
# ----- Experiments -----------------------------------------------------------
|
||||||
|
|
||||||
try:
|
try:
|
||||||
$(VALGRIND) ./boom HIERARCHY -c CHAR -i INV
|
$(VALGRIND) ./boom HIERARCHY -c CHAR -x CURR -i INV
|
||||||
|
@ -42,6 +42,7 @@ static void usage(const char *name)
|
|||||||
" file types:\n"
|
" file types:\n"
|
||||||
" -c characteristics\n"
|
" -c characteristics\n"
|
||||||
" -i inventory\n"
|
" -i inventory\n"
|
||||||
|
" -x currency exchange\n"
|
||||||
, name);
|
, name);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -58,6 +59,8 @@ int main(int argc, char **argv)
|
|||||||
parse = parse_characteristics;
|
parse = parse_characteristics;
|
||||||
else if (!strcmp(argv[i], "-i"))
|
else if (!strcmp(argv[i], "-i"))
|
||||||
parse = parse_inventory;
|
parse = parse_inventory;
|
||||||
|
else if (!strcmp(argv[i], "-x"))
|
||||||
|
parse = parse_currencies;
|
||||||
else
|
else
|
||||||
usage(*argv);
|
usage(*argv);
|
||||||
} else {
|
} else {
|
||||||
|
63
b2/db.c
63
b2/db.c
@ -173,7 +173,7 @@ static void dump_stock(FILE *file, const struct stock *s)
|
|||||||
const struct price *p;
|
const struct price *p;
|
||||||
|
|
||||||
fprintf(file, " %s %d %d %s %g",
|
fprintf(file, " %s %d %d %s %g",
|
||||||
s->cat, s->avail, s->package, "???", s->add);
|
s->cat, s->avail, s->package, s->curr->name, s->add);
|
||||||
for (p = s->price; p; p = p->next)
|
for (p = s->price; p; p = p->next)
|
||||||
fprintf(file, " %d %g", p->qty, p->value);
|
fprintf(file, " %d %g", p->qty, p->value);
|
||||||
fprintf(file, "\n");
|
fprintf(file, "\n");
|
||||||
@ -196,3 +196,64 @@ void part_dump(FILE *file, const struct part *part)
|
|||||||
if (part->stock)
|
if (part->stock)
|
||||||
dump_stock(file, part->stock);
|
dump_stock(file, part->stock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- Currencies -------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
static struct currency *currencies = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
const struct currency *currency_lookup(const char *name)
|
||||||
|
{
|
||||||
|
const struct currency *c;
|
||||||
|
|
||||||
|
for (c = currencies; c; c = c->next)
|
||||||
|
if (c->name == name)
|
||||||
|
break;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double currency_convert(const struct currency *from, const struct currency *to,
|
||||||
|
double value)
|
||||||
|
{
|
||||||
|
const struct exchange *ex;
|
||||||
|
|
||||||
|
for (ex = from->exchange; ex; ex = ex->next)
|
||||||
|
if (ex->dst == to)
|
||||||
|
return ex->rate*value;
|
||||||
|
fprintf(stderr, "cannot convert %s to %s\n", from->name, to->name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct currency *currency_add(const char *name)
|
||||||
|
{
|
||||||
|
struct currency **c;
|
||||||
|
|
||||||
|
for (c = ¤cies; *c; c = &(*c)->next)
|
||||||
|
if ((*c)->name == name)
|
||||||
|
return *c;
|
||||||
|
*c = alloc_type(struct currency);
|
||||||
|
(*c)->name = name;
|
||||||
|
(*c)->exchange = NULL;
|
||||||
|
(*c)->next = NULL;
|
||||||
|
return *c;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void currency_exchange(struct currency *from, const struct currency *to,
|
||||||
|
double rate)
|
||||||
|
{
|
||||||
|
struct exchange **ex;
|
||||||
|
|
||||||
|
for (ex = &from->exchange; *ex; ex = &(*ex)->next)
|
||||||
|
if ((*ex)->dst == to)
|
||||||
|
yyerrorf("exchange %s -> %s is already defined",
|
||||||
|
from->name, to->name);
|
||||||
|
*ex = alloc_type(struct exchange);
|
||||||
|
(*ex)->dst = to;
|
||||||
|
(*ex)->rate = rate;
|
||||||
|
(*ex)->next = NULL;
|
||||||
|
}
|
||||||
|
9
b2/db.h
9
b2/db.h
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
struct exchange {
|
struct exchange {
|
||||||
const struct currency *dst;
|
const struct currency *dst;
|
||||||
double factor;
|
double rate; /* dst = rate*src */
|
||||||
struct exchange *next;
|
struct exchange *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -98,4 +98,11 @@ void part_finalize(struct part *part, const struct action *act);
|
|||||||
void part_add_stock(struct part *part, struct stock *stock);
|
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);
|
||||||
|
|
||||||
|
const struct currency *currency_lookup(const char *name);
|
||||||
|
double currency_convert(const struct currency *from, const struct currency *to,
|
||||||
|
double value);
|
||||||
|
struct currency *currency_add(const char *name);
|
||||||
|
void currency_exchange(struct currency *from, const struct currency *to,
|
||||||
|
double rate);
|
||||||
|
|
||||||
#endif /* !DB_H */
|
#endif /* !DB_H */
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
void parse_hierarchy(void);
|
void parse_hierarchy(void);
|
||||||
void parse_characteristics(void);
|
void parse_characteristics(void);
|
||||||
void parse_inventory(void);
|
void parse_inventory(void);
|
||||||
|
void parse_currencies(void);
|
||||||
|
|
||||||
void yywarnf(const char *fmt, ...);
|
void yywarnf(const char *fmt, ...);
|
||||||
void yyerrorf(const char *fmt, ...);
|
void yyerrorf(const char *fmt, ...);
|
||||||
|
@ -53,6 +53,14 @@ void parse_inventory(void)
|
|||||||
yyparse();
|
yyparse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void parse_currencies(void)
|
||||||
|
{
|
||||||
|
start_token = START_EXCHANGE;
|
||||||
|
expose_nl = 1;
|
||||||
|
lineno = 1;
|
||||||
|
yyparse();
|
||||||
|
}
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
41
b2/lang.y
41
b2/lang.y
@ -24,6 +24,8 @@
|
|||||||
|
|
||||||
|
|
||||||
static struct action hierarchy;
|
static struct action hierarchy;
|
||||||
|
static struct currency *curr;
|
||||||
|
|
||||||
|
|
||||||
static struct field_stack {
|
static struct field_stack {
|
||||||
const struct field *field;
|
const struct field *field;
|
||||||
@ -82,6 +84,7 @@ static const struct field *top_field(void)
|
|||||||
|
|
||||||
|
|
||||||
%token START_HIERARCHY START_CHAR START_INVENTORY
|
%token START_HIERARCHY START_CHAR START_INVENTORY
|
||||||
|
%token START_EXCHANGE
|
||||||
%token TOK_LE TOK_GE TOK_NL
|
%token TOK_LE TOK_GE TOK_NL
|
||||||
%token <s> WORD
|
%token <s> WORD
|
||||||
|
|
||||||
@ -106,6 +109,7 @@ all:
|
|||||||
START_HIERARCHY hierarchy
|
START_HIERARCHY hierarchy
|
||||||
| START_CHAR characteristics
|
| START_CHAR characteristics
|
||||||
| START_INVENTORY inventory
|
| START_INVENTORY inventory
|
||||||
|
| START_EXCHANGE exchange
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -432,7 +436,9 @@ stock:
|
|||||||
$$->cat = $1;
|
$$->cat = $1;
|
||||||
$$->avail = $2;
|
$$->avail = $2;
|
||||||
$$->package = $3;
|
$$->package = $3;
|
||||||
$$->curr = NULL; /* @@@ later -- currency($4); */
|
$$->curr = currency_lookup($4);
|
||||||
|
if (!$$->curr)
|
||||||
|
yyerrorf("unknown currency %s", $4);
|
||||||
$$->add = $5;
|
$$->add = $5;
|
||||||
$$->price = $6;
|
$$->price = $6;
|
||||||
}
|
}
|
||||||
@ -481,3 +487,36 @@ float:
|
|||||||
yyerrorf("\"%s\" is not a number", $1);
|
yyerrorf("\"%s\" is not a number", $1);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- Currency exchange ------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
exchange:
|
||||||
|
| TOK_NL
|
||||||
|
| currency exchange
|
||||||
|
;
|
||||||
|
|
||||||
|
currency:
|
||||||
|
WORD
|
||||||
|
{
|
||||||
|
curr = currency_add($1);
|
||||||
|
}
|
||||||
|
rates TOK_NL
|
||||||
|
;
|
||||||
|
|
||||||
|
rates:
|
||||||
|
| rate rates
|
||||||
|
;
|
||||||
|
|
||||||
|
rate:
|
||||||
|
WORD float
|
||||||
|
{
|
||||||
|
const struct currency *to;
|
||||||
|
|
||||||
|
/* add and not lookup, since we just introduce the
|
||||||
|
currency here */
|
||||||
|
to = currency_add($1);
|
||||||
|
currency_exchange(curr, to, $2);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
Loading…
Reference in New Issue
Block a user