mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-19 10:38:26 +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)
|
if (argc - optind < 1)
|
||||||
usage(*argv);
|
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++)
|
for (arg = optind; arg != argc - 1; arg++)
|
||||||
lib_parse(&new_lib, argv[arg], &sch_file);
|
if (!lib_parse(&new_lib, argv[arg], &sch_file))
|
||||||
sch_parse(&new_sch, &sch_file, &new_lib);
|
goto fail_parse;
|
||||||
|
if (!sch_parse(&new_sch, &sch_file, &new_lib))
|
||||||
|
goto fail_parse;
|
||||||
file_close(&sch_file);
|
file_close(&sch_file);
|
||||||
|
|
||||||
optind = 0;
|
optind = 0;
|
||||||
@ -155,6 +158,14 @@ static void *diff_init(int argc, char *const *argv)
|
|||||||
diff->cr_ctx = cro_img_ops.init(argc, argv);
|
diff->cr_ctx = cro_img_ops.init(argc, argv);
|
||||||
|
|
||||||
return diff;
|
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->name = stralloc(name);
|
||||||
file->lineno = 0;
|
file->lineno = 0;
|
||||||
@ -148,18 +148,18 @@ void file_open(struct file *file, const char *name, const struct file *related)
|
|||||||
if (related && related->vcs) {
|
if (related && related->vcs) {
|
||||||
file->vcs = open_vcs(file);
|
file->vcs = open_vcs(file);
|
||||||
if (file->vcs)
|
if (file->vcs)
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
file->file = fopen(name, "r");
|
file->file = fopen(name, "r");
|
||||||
if (file->file) {
|
if (file->file) {
|
||||||
if (verbose)
|
if (verbose)
|
||||||
fprintf(stderr, "reading %s\n", name);
|
fprintf(stderr, "reading %s\n", name);
|
||||||
return;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (try_related(file))
|
if (try_related(file))
|
||||||
return;
|
return 1;
|
||||||
|
|
||||||
if (verbose)
|
if (verbose)
|
||||||
perror(name);
|
perror(name);
|
||||||
@ -167,14 +167,17 @@ void file_open(struct file *file, const char *name, const struct file *related)
|
|||||||
if (!strchr(name, ':')) {
|
if (!strchr(name, ':')) {
|
||||||
if (!verbose)
|
if (!verbose)
|
||||||
perror(name);
|
perror(name);
|
||||||
exit(1);
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
file->vcs = open_vcs(file);
|
file->vcs = open_vcs(file);
|
||||||
if (!file->vcs) {
|
if (file->vcs)
|
||||||
fprintf(stderr, "could not open %s\n", name);
|
return 1;
|
||||||
exit(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);
|
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);
|
const struct file *related);
|
||||||
bool file_read(struct file *file,
|
bool file_read(struct file *file,
|
||||||
bool (*parse)(const struct file *file, void *user, const char *line),
|
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;
|
int i;
|
||||||
|
|
||||||
sch_init(&sch_ctx, recurse);
|
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);
|
lib_init(&lib);
|
||||||
for (i = 0; i != n_args - 1; i++)
|
for (i = 0; i != n_args - 1; i++)
|
||||||
lib_parse(&lib, args[i], &sch_file);
|
if (!lib_parse(&lib, args[i], &sch_file))
|
||||||
sch_parse(&sch_ctx, &sch_file, &lib);
|
goto fail;
|
||||||
|
if (!sch_parse(&sch_ctx, &sch_file, &lib))
|
||||||
|
goto fail;
|
||||||
file_close(&sch_file);
|
file_close(&sch_file);
|
||||||
|
|
||||||
return sch_ctx.sheets;
|
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;
|
struct file file;
|
||||||
|
bool res;
|
||||||
|
|
||||||
lib->state = lib_skip;
|
lib->state = lib_skip;
|
||||||
file_open(&file, name, related);
|
if (!file_open(&file, name, related))
|
||||||
file_read(&file, lib_parse_line, lib);
|
return 0;
|
||||||
|
res = file_read(&file, lib_parse_line, lib);
|
||||||
file_close(&file);
|
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);
|
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_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_init(struct lib *lib);
|
||||||
void lib_free(struct lib *lib);
|
void lib_free(struct lib *lib);
|
||||||
|
|
||||||
|
@ -129,8 +129,10 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
if (argc != optind)
|
if (argc != optind)
|
||||||
usage(*argv);
|
usage(*argv);
|
||||||
file_open(&file, cat, NULL);
|
if (!file_open(&file, cat, NULL))
|
||||||
file_read(&file, file_cat, NULL);
|
return 1;
|
||||||
|
if (!file_read(&file, file_cat, NULL))
|
||||||
|
return 1;
|
||||||
file_close(&file);
|
file_close(&file);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -158,11 +160,13 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
sch_init(&sch_ctx, recurse);
|
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);
|
lib_init(&lib);
|
||||||
for (arg = optind; arg != dashdash - 1; arg++)
|
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) {
|
if (dashdash == argc) {
|
||||||
gfx_argc = 1;
|
gfx_argc = 1;
|
||||||
@ -189,7 +193,8 @@ found:
|
|||||||
|
|
||||||
optind = 0; /* reset getopt */
|
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);
|
file_close(&sch_file);
|
||||||
|
|
||||||
gfx_init(*ops, gfx_argc, gfx_argv);
|
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 char *name = ctx->obj.u.sheet.file;
|
||||||
const struct sheet *sheet;
|
const struct sheet *sheet;
|
||||||
struct file file;
|
struct file file;
|
||||||
|
bool res;
|
||||||
|
|
||||||
|
if (!file_open(&file, name, related))
|
||||||
|
return NULL;
|
||||||
sheet = new_sheet(ctx);
|
sheet = new_sheet(ctx);
|
||||||
ctx->state = sch_descr;
|
ctx->state = sch_descr;
|
||||||
file_open(&file, name, related);
|
res = file_read(&file, parse_line, ctx);
|
||||||
file_read(&file, parse_line, ctx);
|
|
||||||
file_close(&file);
|
file_close(&file);
|
||||||
|
if (!res)
|
||||||
|
return NULL; /* caller MUST clean up */
|
||||||
end_sheet(ctx);
|
end_sheet(ctx);
|
||||||
|
|
||||||
return sheet;
|
return sheet;
|
||||||
@ -487,11 +491,16 @@ static bool parse_line(const struct file *file, void *user, const char *line)
|
|||||||
struct sch_obj *sheet_obj;
|
struct sch_obj *sheet_obj;
|
||||||
|
|
||||||
sheet_obj = submit_obj(ctx, sch_obj_sheet);
|
sheet_obj = submit_obj(ctx, sch_obj_sheet);
|
||||||
if (ctx->recurse)
|
if (ctx->recurse) {
|
||||||
sheet_obj->u.sheet.sheet =
|
const struct sheet *sheet;
|
||||||
recurse_sheet(ctx, file);
|
|
||||||
else
|
sheet = recurse_sheet(ctx, file);
|
||||||
|
if (!sheet)
|
||||||
|
return 0;
|
||||||
|
sheet_obj->u.sheet.sheet = sheet;
|
||||||
|
} else {
|
||||||
sheet_obj->u.sheet.sheet = NULL;
|
sheet_obj->u.sheet.sheet = NULL;
|
||||||
|
}
|
||||||
ctx->state = sch_basic;
|
ctx->state = sch_basic;
|
||||||
return 1;
|
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;
|
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 decode_alignment(struct text *txt, char hor, char vert);
|
||||||
|
|
||||||
void sch_render(const struct sheet *sheet);
|
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_init(struct sch_ctx *ctx, bool recurse);
|
||||||
void sch_free(struct sch_ctx *ctx);
|
void sch_free(struct sch_ctx *ctx);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user