mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-12-23 13:04:15 +02:00
eeshow/ (file_open, *_parse): return 0 on error (may still exit)
This commit is contained in:
parent
dfebad4e6a
commit
f4944a5da9
@ -138,10 +138,13 @@ static void *diff_init(int argc, char *const *argv)
|
||||
if (argc - optind < 1)
|
||||
usage(*argv);
|
||||
|
||||
file_open(&sch_file, argv[argc - 1], NULL);
|
||||
if (!file_open(&sch_file, argv[argc - 1], NULL))
|
||||
goto fail_open;
|
||||
for (arg = optind; arg != argc - 1; arg++)
|
||||
lib_parse(&new_lib, argv[arg], &sch_file);
|
||||
sch_parse(&new_sch, &sch_file, &new_lib);
|
||||
if (!lib_parse(&new_lib, argv[arg], &sch_file))
|
||||
goto fail_parse;
|
||||
if (!sch_parse(&new_sch, &sch_file, &new_lib))
|
||||
goto fail_parse;
|
||||
file_close(&sch_file);
|
||||
|
||||
optind = 0;
|
||||
@ -155,6 +158,14 @@ static void *diff_init(int argc, char *const *argv)
|
||||
diff->cr_ctx = cro_img_ops.init(argc, argv);
|
||||
|
||||
return diff;
|
||||
|
||||
fail_parse:
|
||||
file_close(&sch_file);
|
||||
fail_open:
|
||||
sch_free(&new_sch);
|
||||
lib_free(&new_lib);
|
||||
free(diff);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -137,7 +137,7 @@ static void *open_vcs(struct file *file)
|
||||
}
|
||||
|
||||
|
||||
void file_open(struct file *file, const char *name, const struct file *related)
|
||||
bool file_open(struct file *file, const char *name, const struct file *related)
|
||||
{
|
||||
file->name = stralloc(name);
|
||||
file->lineno = 0;
|
||||
@ -148,18 +148,18 @@ void file_open(struct file *file, const char *name, const struct file *related)
|
||||
if (related && related->vcs) {
|
||||
file->vcs = open_vcs(file);
|
||||
if (file->vcs)
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
|
||||
file->file = fopen(name, "r");
|
||||
if (file->file) {
|
||||
if (verbose)
|
||||
fprintf(stderr, "reading %s\n", name);
|
||||
return;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (try_related(file))
|
||||
return;
|
||||
return 1;
|
||||
|
||||
if (verbose)
|
||||
perror(name);
|
||||
@ -167,14 +167,17 @@ void file_open(struct file *file, const char *name, const struct file *related)
|
||||
if (!strchr(name, ':')) {
|
||||
if (!verbose)
|
||||
perror(name);
|
||||
exit(1);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
file->vcs = open_vcs(file);
|
||||
if (!file->vcs) {
|
||||
fprintf(stderr, "could not open %s\n", name);
|
||||
exit(1);
|
||||
}
|
||||
if (file->vcs)
|
||||
return 1;
|
||||
|
||||
fprintf(stderr, "could not open %s\n", name);
|
||||
fail:
|
||||
free((char *) file->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -30,7 +30,7 @@ bool file_cat(const struct file *file, void *user, const char *line);
|
||||
|
||||
char *file_graft_relative(const char *base, const char *name);
|
||||
|
||||
void file_open(struct file *file, const char *name,
|
||||
bool file_open(struct file *file, const char *name,
|
||||
const struct file *related);
|
||||
bool file_read(struct file *file,
|
||||
bool (*parse)(const struct file *file, void *user, const char *line),
|
||||
|
17
eeshow/gui.c
17
eeshow/gui.c
@ -607,15 +607,26 @@ static struct sheet *parse_sheets(int n_args, char **args, bool recurse)
|
||||
int i;
|
||||
|
||||
sch_init(&sch_ctx, recurse);
|
||||
file_open(&sch_file, args[n_args - 1], NULL);
|
||||
if (!file_open(&sch_file, args[n_args - 1], NULL)) {
|
||||
sch_free(&sch_ctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
lib_init(&lib);
|
||||
for (i = 0; i != n_args - 1; i++)
|
||||
lib_parse(&lib, args[i], &sch_file);
|
||||
sch_parse(&sch_ctx, &sch_file, &lib);
|
||||
if (!lib_parse(&lib, args[i], &sch_file))
|
||||
goto fail;
|
||||
if (!sch_parse(&sch_ctx, &sch_file, &lib))
|
||||
goto fail;
|
||||
file_close(&sch_file);
|
||||
|
||||
return sch_ctx.sheets;
|
||||
|
||||
fail:
|
||||
sch_free(&sch_ctx);
|
||||
lib_free(&lib);
|
||||
file_close(&sch_file);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -252,14 +252,17 @@ static bool lib_parse_line(const struct file *file,
|
||||
}
|
||||
|
||||
|
||||
void lib_parse(struct lib *lib, const char *name, const struct file *related)
|
||||
bool lib_parse(struct lib *lib, const char *name, const struct file *related)
|
||||
{
|
||||
struct file file;
|
||||
bool res;
|
||||
|
||||
lib->state = lib_skip;
|
||||
file_open(&file, name, related);
|
||||
file_read(&file, lib_parse_line, lib);
|
||||
if (!file_open(&file, name, related))
|
||||
return 0;
|
||||
res = file_read(&file, lib_parse_line, lib);
|
||||
file_close(&file);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
@ -119,7 +119,7 @@ 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]);
|
||||
|
||||
void lib_parse(struct lib *lib, const char *name, const struct file *related);
|
||||
bool lib_parse(struct lib *lib, const char *name, const struct file *related);
|
||||
void lib_init(struct lib *lib);
|
||||
void lib_free(struct lib *lib);
|
||||
|
||||
|
@ -129,8 +129,10 @@ int main(int argc, char **argv)
|
||||
|
||||
if (argc != optind)
|
||||
usage(*argv);
|
||||
file_open(&file, cat, NULL);
|
||||
file_read(&file, file_cat, NULL);
|
||||
if (!file_open(&file, cat, NULL))
|
||||
return 1;
|
||||
if (!file_read(&file, file_cat, NULL))
|
||||
return 1;
|
||||
file_close(&file);
|
||||
return 0;
|
||||
}
|
||||
@ -158,11 +160,13 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
sch_init(&sch_ctx, recurse);
|
||||
file_open(&sch_file, argv[dashdash - 1], NULL);
|
||||
if (!file_open(&sch_file, argv[dashdash - 1], NULL))
|
||||
return 1;
|
||||
|
||||
lib_init(&lib);
|
||||
for (arg = optind; arg != dashdash - 1; arg++)
|
||||
lib_parse(&lib, argv[arg], &sch_file);
|
||||
if (!lib_parse(&lib, argv[arg], &sch_file))
|
||||
return 1;
|
||||
|
||||
if (dashdash == argc) {
|
||||
gfx_argc = 1;
|
||||
@ -189,7 +193,8 @@ found:
|
||||
|
||||
optind = 0; /* reset getopt */
|
||||
|
||||
sch_parse(&sch_ctx, &sch_file, &lib);
|
||||
if (!sch_parse(&sch_ctx, &sch_file, &lib))
|
||||
return 1;
|
||||
file_close(&sch_file);
|
||||
|
||||
gfx_init(*ops, gfx_argc, gfx_argv);
|
||||
|
@ -314,12 +314,16 @@ static const struct sheet *recurse_sheet(struct sch_ctx *ctx,
|
||||
const char *name = ctx->obj.u.sheet.file;
|
||||
const struct sheet *sheet;
|
||||
struct file file;
|
||||
bool res;
|
||||
|
||||
if (!file_open(&file, name, related))
|
||||
return NULL;
|
||||
sheet = new_sheet(ctx);
|
||||
ctx->state = sch_descr;
|
||||
file_open(&file, name, related);
|
||||
file_read(&file, parse_line, ctx);
|
||||
res = file_read(&file, parse_line, ctx);
|
||||
file_close(&file);
|
||||
if (!res)
|
||||
return NULL; /* caller MUST clean up */
|
||||
end_sheet(ctx);
|
||||
|
||||
return sheet;
|
||||
@ -487,11 +491,16 @@ static bool parse_line(const struct file *file, void *user, const char *line)
|
||||
struct sch_obj *sheet_obj;
|
||||
|
||||
sheet_obj = submit_obj(ctx, sch_obj_sheet);
|
||||
if (ctx->recurse)
|
||||
sheet_obj->u.sheet.sheet =
|
||||
recurse_sheet(ctx, file);
|
||||
else
|
||||
if (ctx->recurse) {
|
||||
const struct sheet *sheet;
|
||||
|
||||
sheet = recurse_sheet(ctx, file);
|
||||
if (!sheet)
|
||||
return 0;
|
||||
sheet_obj->u.sheet.sheet = sheet;
|
||||
} else {
|
||||
sheet_obj->u.sheet.sheet = NULL;
|
||||
}
|
||||
ctx->state = sch_basic;
|
||||
return 1;
|
||||
}
|
||||
@ -543,10 +552,10 @@ static bool parse_line(const struct file *file, void *user, const char *line)
|
||||
}
|
||||
|
||||
|
||||
void sch_parse(struct sch_ctx *ctx, struct file *file, const struct lib *lib)
|
||||
bool sch_parse(struct sch_ctx *ctx, struct file *file, const struct lib *lib)
|
||||
{
|
||||
ctx->lib = lib;
|
||||
file_read(file, parse_line, ctx);
|
||||
return file_read(file, parse_line, ctx);
|
||||
}
|
||||
|
||||
|
||||
|
@ -118,7 +118,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, struct file *file, const struct lib *lib);
|
||||
bool sch_parse(struct sch_ctx *ctx, struct file *file, const struct lib *lib);
|
||||
void sch_init(struct sch_ctx *ctx, bool recurse);
|
||||
void sch_free(struct sch_ctx *ctx);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user