mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-12-23 19:02:59 +02:00
sch2lib/: avoid global variables for libraries
This commit is contained in:
parent
a03e79de7c
commit
c6713dfbd8
@ -20,13 +20,6 @@
|
||||
#include "lib.h"
|
||||
|
||||
|
||||
struct comp *comps = NULL;
|
||||
|
||||
static struct comp *curr_comp; /* current component */
|
||||
static struct comp **next_comp = &comps;
|
||||
static struct lib_obj **next_obj;
|
||||
|
||||
|
||||
/* ----- Text -------------------------------------------------------------- */
|
||||
|
||||
|
||||
@ -63,7 +56,7 @@ static bool parse_poly(struct lib_poly *poly, const char *line, int points)
|
||||
/* ----- Definitions ------------------------------------------------------- */
|
||||
|
||||
|
||||
static bool parse_def(const char *line)
|
||||
static bool parse_def(struct lib *lib, const char *line)
|
||||
{
|
||||
char *s;
|
||||
char draw_num, draw_name;
|
||||
@ -74,23 +67,23 @@ static bool parse_def(const char *line)
|
||||
&s, &name_offset, &draw_num, &draw_name, &units) != 5)
|
||||
return 0;
|
||||
|
||||
curr_comp = alloc_type(struct comp);
|
||||
lib->curr_comp = alloc_type(struct comp);
|
||||
if (*s == '~')
|
||||
s++;
|
||||
curr_comp->name = s;
|
||||
curr_comp->units = units;
|
||||
lib->curr_comp->name = s;
|
||||
lib->curr_comp->units = units;
|
||||
|
||||
curr_comp->visible = 0;
|
||||
curr_comp->show_pin_name = draw_name == 'Y';
|
||||
curr_comp->show_pin_num = draw_num == 'Y';
|
||||
curr_comp->name_offset = name_offset;
|
||||
lib->curr_comp->visible = 0;
|
||||
lib->curr_comp->show_pin_name = draw_name == 'Y';
|
||||
lib->curr_comp->show_pin_num = draw_num == 'Y';
|
||||
lib->curr_comp->name_offset = name_offset;
|
||||
|
||||
curr_comp->objs = NULL;
|
||||
next_obj = &curr_comp->objs;
|
||||
lib->curr_comp->objs = NULL;
|
||||
lib->next_obj = &lib->curr_comp->objs;
|
||||
|
||||
curr_comp->next = NULL;
|
||||
*next_comp = curr_comp;
|
||||
next_comp = &curr_comp->next;
|
||||
lib->curr_comp->next = NULL;
|
||||
*lib->next_comp = lib->curr_comp;
|
||||
lib->next_comp = &lib->curr_comp->next;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -136,7 +129,7 @@ static bool parse_arc(struct lib_obj *obj, const char *line)
|
||||
/* ----- Library parser ---------------------------------------------------- */
|
||||
|
||||
|
||||
bool lib_parse(struct lib_ctx *ctx, const char *line)
|
||||
bool lib_parse(struct lib *lib, const char *line)
|
||||
{
|
||||
int n = 0;
|
||||
unsigned points;
|
||||
@ -145,39 +138,39 @@ bool lib_parse(struct lib_ctx *ctx, const char *line)
|
||||
unsigned zero1, zero2;
|
||||
char vis;
|
||||
|
||||
ctx->lineno++;
|
||||
lib->lineno++;
|
||||
|
||||
switch (ctx->state) {
|
||||
switch (lib->state) {
|
||||
case lib_skip:
|
||||
if (parse_def(line)) {
|
||||
ctx->state = lib_def;
|
||||
if (parse_def(lib, line)) {
|
||||
lib->state = lib_def;
|
||||
return 1;
|
||||
}
|
||||
return 1;
|
||||
case lib_def:
|
||||
if (sscanf(line, "DRAW%n", &n) == 0 && n) {
|
||||
ctx->state = lib_draw;
|
||||
lib->state = lib_draw;
|
||||
return 1;
|
||||
}
|
||||
if (sscanf(line, "F%d \"\" %*d %*d %*d %*c %c", &n, &vis) == 2
|
||||
|| sscanf(line, "F%d \"%*[^\"]\" %*d %*d %*d %*c %c",
|
||||
&n, &vis) == 2) {
|
||||
if (vis == 'V')
|
||||
curr_comp->visible |= 1 << n;
|
||||
lib->curr_comp->visible |= 1 << n;
|
||||
return 1;
|
||||
}
|
||||
/* @@@ explicitly ignore FPLIST */
|
||||
return 1;
|
||||
case lib_draw:
|
||||
if (sscanf(line, "ENDDRAW%n", &n) == 0 && n) {
|
||||
ctx->state = lib_skip;
|
||||
lib->state = lib_skip;
|
||||
return 1;
|
||||
}
|
||||
|
||||
obj = alloc_type(struct lib_obj);
|
||||
obj->next = NULL;
|
||||
*next_obj = obj;
|
||||
next_obj = &obj->next;
|
||||
*lib->next_obj = obj;
|
||||
lib->next_obj = &obj->next;
|
||||
|
||||
if (sscanf(line, "P %u %u %u %u %n",
|
||||
&points, &obj->unit, &obj->convert, &obj->u.poly.thick,
|
||||
@ -233,7 +226,7 @@ bool lib_parse(struct lib_ctx *ctx, const char *line)
|
||||
if (n == 12) {
|
||||
if (zero1) {
|
||||
fprintf(stderr, "%u: only understand 0 x x\n"
|
||||
"\"%s\"\n", ctx->lineno, line);
|
||||
"\"%s\"\n", lib->lineno, line);
|
||||
exit(1);
|
||||
}
|
||||
obj->u.text.style = decode_style(style);
|
||||
@ -253,13 +246,22 @@ bool lib_parse(struct lib_ctx *ctx, const char *line)
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
fprintf(stderr, "%u: cannot parse\n\"%s\"\n", ctx->lineno, line);
|
||||
fprintf(stderr, "%u: cannot parse\n\"%s\"\n", lib->lineno, line);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
void lib_init(struct lib_ctx *ctx)
|
||||
void lib_reset(struct lib *lib)
|
||||
{
|
||||
ctx->state = lib_skip;
|
||||
ctx->lineno = 0;
|
||||
lib->state = lib_skip;
|
||||
lib->lineno = 0;
|
||||
}
|
||||
|
||||
|
||||
void lib_init(struct lib *lib)
|
||||
{
|
||||
lib_reset(lib);
|
||||
|
||||
lib->comps = NULL;
|
||||
lib->next_comp = &lib->comps;
|
||||
}
|
||||
|
@ -364,11 +364,11 @@ static void draw(const struct comp *comp, const struct lib_obj *obj,
|
||||
}
|
||||
|
||||
|
||||
const struct comp *lib_find(const char *name)
|
||||
const struct comp *lib_find(const struct lib *lib, const char *name)
|
||||
{
|
||||
const struct comp *comp;
|
||||
|
||||
for (comp = comps; comp; comp = comp->next)
|
||||
for (comp = lib->comps; comp; comp = comp->next)
|
||||
if (!strcmp(comp->name, name))
|
||||
return comp;
|
||||
fprintf(stderr, "\"%s\" not found\n", name);
|
||||
|
@ -23,11 +23,6 @@ enum lib_state {
|
||||
lib_draw, /* in drawings */
|
||||
};
|
||||
|
||||
struct lib_ctx {
|
||||
enum lib_state state;
|
||||
unsigned lineno;
|
||||
};
|
||||
|
||||
struct lib_obj {
|
||||
enum lib_obj_type {
|
||||
lib_obj_poly,
|
||||
@ -103,15 +98,28 @@ struct comp {
|
||||
struct comp *next;
|
||||
};
|
||||
|
||||
struct lib {
|
||||
enum lib_state state;
|
||||
unsigned lineno;
|
||||
|
||||
struct comp *comps;
|
||||
|
||||
struct comp *curr_comp; /* current component */
|
||||
struct comp **next_comp;
|
||||
struct lib_obj **next_obj;
|
||||
|
||||
};
|
||||
|
||||
|
||||
extern struct comp *comps;
|
||||
|
||||
|
||||
const struct comp *lib_find(const char *name);
|
||||
const struct comp *lib_find(const struct lib *lib, const char *name);
|
||||
bool lib_field_visible(const struct comp *comp, int n);
|
||||
void lib_render(const struct comp *comp, unsigned unit, const int m[6]);
|
||||
|
||||
bool lib_parse(struct lib_ctx *ctx, const char *line);
|
||||
void lib_init(struct lib_ctx *ctx);
|
||||
bool lib_parse(struct lib *lib, const char *line);
|
||||
void lib_init(struct lib *lib);
|
||||
void lib_reset(struct lib *lib);
|
||||
|
||||
#endif /* !LIB_H */
|
||||
|
@ -57,6 +57,7 @@ void usage(const char *name)
|
||||
|
||||
int main(int argc, char *const *argv)
|
||||
{
|
||||
struct lib lib;
|
||||
struct sch_ctx sch_ctx;
|
||||
bool recurse = 0;
|
||||
char c;
|
||||
@ -81,11 +82,10 @@ int main(int argc, char *const *argv)
|
||||
if (dashdash - optind < 1)
|
||||
usage(*argv);
|
||||
|
||||
lib_init(&lib);
|
||||
for (arg = optind; arg != dashdash - 1; arg++) {
|
||||
struct lib_ctx ctx;
|
||||
|
||||
lib_init(&ctx);
|
||||
file_read(argv[arg], do_lib_parse, &ctx);
|
||||
lib_reset(&lib);
|
||||
file_read(argv[arg], do_lib_parse, &lib);
|
||||
}
|
||||
|
||||
if (dashdash == argc) {
|
||||
@ -112,7 +112,7 @@ found:
|
||||
optind = 0; /* reset getopt */
|
||||
|
||||
sch_init(&sch_ctx, recurse);
|
||||
sch_parse(&sch_ctx, argv[dashdash - 1]);
|
||||
sch_parse(&sch_ctx, argv[dashdash - 1], &lib);
|
||||
gfx_init(*ops, gfx_argc, gfx_argv);
|
||||
if (recurse) {
|
||||
const struct sheet *sheet;
|
||||
|
@ -461,7 +461,7 @@ static bool parse_line(void *user, const char *line)
|
||||
return 1;
|
||||
}
|
||||
if (sscanf(line, "L %ms", &s) == 1) {
|
||||
obj->u.comp.comp = lib_find(s);
|
||||
obj->u.comp.comp = lib_find(ctx->lib, s);
|
||||
free(s);
|
||||
return 1;
|
||||
}
|
||||
@ -538,7 +538,7 @@ static bool parse_line(void *user, const char *line)
|
||||
}
|
||||
|
||||
|
||||
void sch_parse(struct sch_ctx *ctx, const char *file)
|
||||
void sch_parse(struct sch_ctx *ctx, const char *file, const struct lib *lib)
|
||||
{
|
||||
struct sch_file dsc = {
|
||||
.name = file,
|
||||
@ -547,6 +547,7 @@ void sch_parse(struct sch_ctx *ctx, const char *file)
|
||||
};
|
||||
|
||||
ctx->file = &dsc;
|
||||
ctx->lib = lib;
|
||||
file_read(file, parse_line, ctx);
|
||||
}
|
||||
|
||||
|
@ -108,6 +108,8 @@ struct sch_ctx {
|
||||
struct sheet *sheets;
|
||||
struct sheet **next_sheet;
|
||||
|
||||
const struct lib *lib;
|
||||
|
||||
struct sch_file *file;
|
||||
};
|
||||
|
||||
@ -115,7 +117,7 @@ struct sch_ctx {
|
||||
void decode_alignment(struct text *txt, char hor, char vert);
|
||||
|
||||
void sch_render(const struct sheet *sheet);
|
||||
void sch_parse(struct sch_ctx *ctx, const char *line);
|
||||
void sch_parse(struct sch_ctx *ctx, const char *line, const struct lib *lib);
|
||||
void sch_init(struct sch_ctx *ctx, bool recurse);
|
||||
|
||||
#endif /* !SCH_H */
|
||||
|
Loading…
Reference in New Issue
Block a user