From: Andre Noll Date: Sat, 18 Oct 2008 21:23:46 +0000 (+0200) Subject: Make parse_format_string() return int. X-Git-Tag: v0.0.4~36 X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=commitdiff_plain;h=bd06800e612996d0c4b4c2ec52646a842d301452 Make parse_format_string() return int. It's much cleaner to let public functions return a negative error code on failure. --- diff --git a/error.h b/error.h index 895f9f8..9b0de5a 100644 --- a/error.h +++ b/error.h @@ -26,6 +26,12 @@ _ERROR(OSL, "osl error") \ _ERROR(SIGNAL_SIG_ERR, "signal() returned SIG_ERR") \ _ERROR(OUTPUT, "error writing output file") \ + _ERROR(MALFORMED_FORMAT, "malformed format string") \ + _ERROR(BAD_ALIGN_SPEC, "bad alignment specifier") \ + _ERROR(TRAILING_GARBAGE, "trailing garbage after specifier") \ + _ERROR(UNIT, "no unit allowed here") \ + _ERROR(BAD_UNIT, "invalid unit specifier") \ + _ERROR(BAD_ATOM, "invalid atom") \ /** diff --git a/format.c b/format.c index 3d1daa2..48aa371 100644 --- a/format.c +++ b/format.c @@ -95,12 +95,12 @@ static struct format_item *make_const_string(char *cp, char *ep) return fi; } -static struct format_item *parse_atom(char *ap, struct atom *atoms) +static int parse_atom(char *ap, struct atom *atoms, struct format_item **result) { struct format_item *fi = NULL; int i, n, len; char *col, *ep = strchr(ap, ')'); - char *err_msg = "malformed format string"; + int ret = -E_MALFORMED_FORMAT; if (!ep) goto err; @@ -157,7 +157,7 @@ static struct format_item *parse_atom(char *ap, struct atom *atoms) col--; break; default: - err_msg = "bad alignment spec"; + ret = -E_BAD_ALIGN_SPEC; goto err; } switch (col[2]) { @@ -167,7 +167,7 @@ static struct format_item *parse_atom(char *ap, struct atom *atoms) col += 2; break; default: - err_msg = "trailing garbage after alignment spec"; + ret = -E_TRAILING_GARBAGE; goto err; } /* read width */ @@ -181,11 +181,11 @@ static struct format_item *parse_atom(char *ap, struct atom *atoms) col += 1 + n; break; default: - err_msg = "trailing garbage after width spec"; + ret = -E_TRAILING_GARBAGE; goto err; } if (a->type != AT_SIZE && a->type != AT_COUNT) { - err_msg = "no unit allowed here"; + ret = -E_UNIT; goto err; } if (col[1] == '*') { @@ -199,28 +199,28 @@ static struct format_item *parse_atom(char *ap, struct atom *atoms) break; } if (!units[j]) { - err_msg = "bad unit spec"; + ret = -E_BAD_UNIT; goto err; } if (col + 2 != ep) { - err_msg = "trailing garbage after unit spec"; + ret = -E_TRAILING_GARBAGE; goto err; } goto success; } - err_msg = "invalid atom"; + ret = -E_BAD_ATOM; err: - ERROR_LOG("%s\n", err_msg); free(fi); - return NULL; + return ret; success: - return fi; + *result = fi; + return 1; } -struct format_info *parse_format_string(char *fmt, struct atom *atoms) +int parse_format_string(char *fmt, struct atom *atoms, struct format_info **result) { char *cp, *ap, *ep; - int num_items; + int num_items, ret; struct format_info *info = malloc(sizeof(*info)); info->atoms = atoms; @@ -234,8 +234,8 @@ struct format_info *parse_format_string(char *fmt, struct atom *atoms) num_items++; } info->items = realloc(info->items, (num_items + 1) * sizeof(struct format_info *)); - info->items[num_items] = parse_atom(ap + 2, atoms); - if (!info->items[num_items]) { + ret = parse_atom(ap + 2, atoms, info->items + num_items); + if (ret < 0) { num_items--; goto err; } @@ -249,7 +249,8 @@ struct format_info *parse_format_string(char *fmt, struct atom *atoms) } info->items = realloc(info->items, (num_items + 1) * sizeof(struct format_info *)); info->items[num_items] = NULL; - return info; + *result = info; + return 1; err: for (; num_items >= 0; num_items--) { if (!info->items[num_items]->atom_ptr) @@ -258,7 +259,7 @@ err: } free(info->items); free(info); - return NULL; + return ret; } void free_format_info(struct format_info *info) diff --git a/format.h b/format.h index 4929bff..2b8b7f2 100644 --- a/format.h +++ b/format.h @@ -15,6 +15,6 @@ union atom_value { }; struct format_info; /* opaque */ -struct format_info *parse_format_string(char *fmt, struct atom *atoms); +int parse_format_string(char *fmt, struct atom *atoms, struct format_info **result); char *format_items(struct format_info *info, union atom_value *values); void free_format_info(struct format_info *info);