From: Ben Pfaff Date: Sun, 16 Apr 2006 18:55:09 +0000 (+0000) Subject: Start reforming error message support. In this phase, we get rid of X-Git-Tag: sav-api~1990 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=52b9fca3a729eaef7d13469029e4391aa033a659;p=pspp Start reforming error message support. In this phase, we get rid of "installation errors" and change all uses of msg() in the output drivers to uses of error() or error_at_line(). --- diff --git a/src/ChangeLog b/src/ChangeLog index 30fab6addd..80a60331ff 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +Sun Apr 16 11:46:51 2006 Ben Pfaff + + Start reforming error message support. In this phase, we get rid + of "installation errors" and change all uses of msg() in the + output drivers to uses of error() or error_at_line(). + + * message.c: (err_vmsg) Get rid of IE, IS support. + Sat Mar 11 14:17:47 WST 2006 John Darrington * automake.mk: Changed the pattern specific AM_CPPFLAGS to two target diff --git a/src/libpspp/ChangeLog b/src/libpspp/ChangeLog index 112de5e10f..45c54dfc08 100644 --- a/src/libpspp/ChangeLog +++ b/src/libpspp/ChangeLog @@ -1,3 +1,11 @@ +Sun Apr 16 11:48:07 2006 Ben Pfaff + + Start reforming error message support. In this phase, we get rid + of "installation errors" and change all uses of msg() in the + output drivers to uses of error() or error_at_line(). + + * message.h: Remove IE, IS enums. + Mon Apr 3 11:10:21 2006 Ben Pfaff * str.c: (ds_separate) Change interface for cleanliness and diff --git a/src/libpspp/message.h b/src/libpspp/message.h index 7505f7b080..f906458524 100644 --- a/src/libpspp/message.h +++ b/src/libpspp/message.h @@ -28,7 +28,6 @@ enum { SE, SW, SM, /* Script error/warning/message. */ - IE, IS, /* Installation error/script error. */ DE, DW, /* Data-file error/warning. */ ME, MW, MM, /* General error/warning/message. */ ERR_CLASS_COUNT, /* Number of message classes. */ diff --git a/src/message.c b/src/message.c index ed9036510c..2e7a003bf3 100644 --- a/src/message.c +++ b/src/message.c @@ -144,9 +144,6 @@ err_vmsg (const struct error *e, const char *format, va_list args) {3, &err_warning_count, N_("warning")}, /* SW */ {3, NULL, N_("note")}, /* SM */ - {0, NULL, N_("installation error")}, /* IE */ - {2, NULL, N_("installation error")}, /* IS */ - {2, &err_error_count, N_("error")}, /* DE */ {2, &err_warning_count, N_("warning")}, /* DW */ diff --git a/src/output/ChangeLog b/src/output/ChangeLog index 1e5f86d746..5a8cdc77a7 100644 --- a/src/output/ChangeLog +++ b/src/output/ChangeLog @@ -1,3 +1,27 @@ +Sun Apr 16 11:48:25 2006 Ben Pfaff + + Start reforming error message support. In this phase, we get rid + of "installation errors" and change all uses of msg() in the + output drivers to uses of error() or error_at_line(). + + * Removed all inclusion of in this directory. + + * output.c: Changed all uses of msg() to error() or + error_at_line(). + (outp_read_devices) Maintain line number in int variable instead + of "struct file_locator". + (tokener) Renamed get_option_token(), rewritten, changed interface. + (outp_parse_options) Change `options' argument to type const + struct string *. Rewritten. + (configure_driver) Passes a struct string * to ->open_driver() + instead of char *. + (outp_get_paper_size) Maintain line number in int variable instead + of "struct file_locator". Removed stupid cache. + + * output.h: (struct outp_class) Change `open_driver' function to + take const struct string * instead of const char *. Updated all + implementations. + Mon Apr 3 11:14:38 2006 Ben Pfaff Rewrite a lot of the output drivers and infrastructure. diff --git a/src/output/ascii.c b/src/output/ascii.c index a0dc1b0109..bafe74acce 100644 --- a/src/output/ascii.c +++ b/src/output/ascii.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -123,7 +122,7 @@ static bool handle_option (struct outp_driver *this, const char *key, const struct string *val); static bool -ascii_open_driver (struct outp_driver *this, const char *options) +ascii_open_driver (struct outp_driver *this, const struct string *options) { struct ascii_driver_ext *x; int i; diff --git a/src/output/html.c b/src/output/html.c index 7451efdc38..3557085f39 100644 --- a/src/output/html.c +++ b/src/output/html.c @@ -20,7 +20,6 @@ #include #include "chart.h" #include "htmlP.h" -#include #include #include #include @@ -29,7 +28,6 @@ #include #include -#include #include #include "error.h" #include "getline.h" @@ -52,7 +50,7 @@ static void print_title_tag (FILE *file, const char *name, const char *content); static bool -html_open_driver (struct outp_driver *this, const char *options) +html_open_driver (struct outp_driver *this, const struct string *options) { struct html_driver_ext *x; diff --git a/src/output/manager.c b/src/output/manager.c index ff65e08453..3b60220b3d 100644 --- a/src/output/manager.c +++ b/src/output/manager.c @@ -19,7 +19,6 @@ #include #include "manager.h" -#include #include #include #include "output.h" diff --git a/src/output/output.c b/src/output/output.c index 0ea8ea49ad..e1f6e3f9d4 100644 --- a/src/output/output.c +++ b/src/output/output.c @@ -19,19 +19,18 @@ #include #include "output.h" -#include #include #include #include #include #include -#include #include #include "htmlP.h" #include "intprops.h" #include #include #include +#include "error.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -163,9 +162,10 @@ check_configure_vec (void) for (n = outp_configure_vec; n; n = n->next) if (n->source == OUTP_S_COMMAND_LINE) - msg (ME, _("Unknown output driver `%s'."), n->name); + error (0, 0, _("unknown output driver `%s'"), n->name); else - msg (IE, _("Output driver `%s' referenced but never defined."), n->name); + error (0, 0, _("output driver `%s' referenced but never defined"), + n->name); outp_configure_clear (); } @@ -258,7 +258,7 @@ init_default_drivers (void) { struct string s; - msg (MM, _("Using default output driver configuration.")); + error (0, 0, _("using default output driver configuration")); ds_create (&s, "list:ascii:listing:" @@ -278,41 +278,39 @@ outp_read_devices (void) FILE *f = NULL; struct string line; - struct file_locator where; + int line_number; init_fn = fn_search_path (fn_getenv_default ("STAT_OUTPUT_INIT_FILE", "devices"), fn_getenv_default ("STAT_OUTPUT_INIT_PATH", config_path), NULL); - where.filename = init_fn; - where.line_number = 0; - err_push_file_locator (&where); ds_init (&line, 128); if (init_fn == NULL) { - msg (IE, _("Cannot find output initialization file. " - "Use `-vvvvv' to view search path.")); + error (0, 0, _("cannot find output initialization file " + "(use `-vvvvv' to view search path)")); goto exit; } f = fopen (init_fn, "r"); if (f == NULL) { - msg (IE, _("Opening %s: %s."), init_fn, strerror (errno)); + error (0, errno, _("cannot open \"%s\""), init_fn); goto exit; } + line_number = 0; for (;;) { char *cp; - if (!ds_get_config_line (f, &line, &where.line_number)) + if (!ds_get_config_line (f, &line, &line_number)) { if (ferror (f)) - msg (ME, _("Reading %s: %s."), init_fn, strerror (errno)); + error (0, errno, _("reading \"%s\""), init_fn); break; } for (cp = ds_c_str (&line); isspace ((unsigned char) *cp); cp++); @@ -334,7 +332,7 @@ outp_read_devices (void) } } else - msg (IS, _("Syntax error.")); + error_at_line (0, 0, init_fn, line_number, _("syntax error")); } } result = 1; @@ -342,9 +340,8 @@ outp_read_devices (void) check_configure_vec (); exit: - err_pop_file_locator (&where); if (f && -1 == fclose (f)) - msg (MW, _("Closing %s: %s."), init_fn, strerror (errno)); + error (0, errno, _("error closing \"%s\""), init_fn); free (init_fn); ds_destroy (&line); delete_macros (); @@ -352,10 +349,10 @@ exit: if (result) { if (outp_driver_list == NULL) - msg (MW, _("No output drivers are active.")); + error (0, 0, _("no active output drivers")); } else - msg (VM (1), _("Error reading device definition file.")); + error (0, 0, _("error reading device definition file")); if (!result || outp_driver_list == NULL) init_default_drivers (); @@ -488,177 +485,174 @@ outp_list_classes (void) putc('\n', stdout); } -static int op_token; /* `=', 'a', 0. */ -static struct string op_tokstr; -static const char *prog; +/* Obtains a token from S starting at position *POS, which is + updated. Errors are reported against the given DRIVER_NAME. + The token is stored in TOKEN. Returns true if successful, + false on syntax error. -/* Parses a token from prog into op_token, op_tokstr. Sets op_token - to '=' on an equals sign, to 'a' on a string or identifier token, - or to 0 at end of line. Returns the new op_token. */ -static int -tokener (void) + Caller is responsible for skipping leading spaces. */ +static bool +get_option_token (const struct string *s, const char *driver_name, + size_t *pos, struct string *token) { - if (op_token == 0) + int c; + + ds_clear (token); + c = ds_at (s, *pos); + if (c == EOF) { - msg (IS, _("Syntax error.")); - return 0; + error (0, 0, _("syntax error parsing options for \"%s\" driver"), + driver_name); + return false; } - - while (isspace ((unsigned char) *prog)) - prog++; - if (!*prog) + else if (c == '\'' || c == '"') { - op_token = 0; - return 0; - } - - if (*prog == '=') - op_token = *prog++; - else - { - ds_clear (&op_tokstr); - - if (*prog == '\'' || *prog == '"') - { - int quote = *prog++; + int quote = c; - while (*prog && *prog != quote) - { - if (*prog != '\\') - ds_putc (&op_tokstr, *prog++); - else - { - int c; + ++*pos; + for (;;) + { + c = ds_at (s, (*pos)++); + if (c == quote) + break; + else if (c == EOF) + { + error (0, 0, + _("reached end of options inside quoted string " + "parsing options for \"%s\" driver"), + driver_name); + return false; + } + else if (c != '\\') + ds_putc (token, c); + else + { + int out; - prog++; - assert ((int) *prog); /* How could a line end in `\'? */ - switch (*prog++) - { - case '\'': - c = '\''; - break; - case '"': - c = '"'; - break; - case '?': - c = '?'; - break; - case '\\': - c = '\\'; - break; - case '}': - c = '}'; - break; - case 'a': - c = '\a'; - break; - case 'b': - c = '\b'; - break; - case 'f': - c = '\f'; - break; - case 'n': - c = '\n'; - break; - case 'r': - c = '\r'; - break; - case 't': - c = '\t'; - break; - case 'v': - c = '\v'; - break; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - c = prog[-1] - '0'; - while (*prog >= '0' && *prog <= '7') - c = c * 8 + *prog++ - '0'; - } - break; - case 'x': - case 'X': - { - c = 0; - while (isxdigit ((unsigned char) *prog)) - { - c *= 16; - if (isdigit ((unsigned char) *prog)) - c += *prog - '0'; - else - c += (tolower ((unsigned char) (*prog)) - - 'a' + 10); - prog++; - } - } - break; - default: - msg (IS, _("Syntax error in string constant.")); - continue; - } - ds_putc (&op_tokstr, (unsigned char) c); - } - } - prog++; - } - else - while (*prog && !isspace ((unsigned char) *prog) && *prog != '=') - ds_putc (&op_tokstr, *prog++); - op_token = 'a'; + switch (ds_at (s, *pos)) + { + case '\'': + out = '\''; + break; + case '"': + out = '"'; + break; + case '\\': + out = '\\'; + break; + case 'a': + out = '\a'; + break; + case 'b': + out = '\b'; + break; + case 'f': + out = '\f'; + break; + case 'n': + out = '\n'; + break; + case 'r': + out = '\r'; + break; + case 't': + out = '\t'; + break; + case 'v': + out = '\v'; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + out = c - '0'; + while (ds_at (s, *pos) >= '0' && ds_at (s, *pos) <= '7') + out = c * 8 + ds_at (s, (*pos)++) - '0'; + break; + case 'x': + case 'X': + out = 0; + while (isxdigit (ds_at (s, *pos))) + { + c = ds_at (s, *pos); + if (!isxdigit (c)) + break; + (*pos)++; + + out *= 16; + if (isdigit (c)) + out += c - '0'; + else + out += tolower (c) - 'a' + 10; + } + break; + default: + error (0, 0, _("syntax error in string constant " + "parsing options for \"%s\" driver"), + driver_name); + return false; + } + ds_putc (token, out); + } + } } - + else + { + do + { + ds_putc (token, c); + c = ds_at (s, ++*pos); + } + while (c != EOF && c != '=' && !isspace (c)); + } + return 1; } bool -outp_parse_options (const char *options, +outp_parse_options (const struct string *options, bool (*callback) (struct outp_driver *, const char *key, const struct string *value), struct outp_driver *driver) { + struct string key = DS_INITIALIZER; + struct string value = DS_INITIALIZER; + size_t pos = 0; bool ok = true; - prog = options; - op_token = -1; - - ds_init (&op_tokstr, 64); - while (ok && tokener ()) + do { - char key[65]; - - if (op_token != 'a') + pos += ds_span (options, pos, " \t"); + if (ds_at (options, pos) == EOF) + break; + + if (!get_option_token (options, driver->name, &pos, &key)) + break; + + pos += ds_span (options, pos, " \t"); + if (ds_at (options, pos) != '=') { - msg (IS, _("Syntax error in options.")); + error (0, 0, _("syntax error expecting `=' " + "parsing options for driver \"%s\""), + driver->name); break; } + pos++; + + pos += ds_span (options, pos, " \t"); + if (!get_option_token (options, driver->name, &pos, &value)) + break; - ds_truncate (&op_tokstr, 64); - strcpy (key, ds_c_str (&op_tokstr)); - - tokener (); - if (op_token != '=') - { - msg (IS, _("Syntax error in options (`=' expected).")); - break; - } - - tokener (); - if (op_token != 'a') - { - msg (IS, _("Syntax error in options (value expected after `=').")); - break; - } - ok = callback (driver, key, &op_tokstr); + ok = callback (driver, ds_c_str (&key), &value); } - ds_destroy (&op_tokstr); + while (ok); + + ds_destroy (&key); + ds_destroy (&value); return ok; } @@ -695,7 +689,8 @@ configure_driver (const struct string *driver_name, break; if (c == NULL) { - msg (IS, _("Unknown output driver class `%s'."), ds_c_str (class_name)); + error (0, 0, _("unknown output driver class `%s'"), + ds_c_str (class_name)); return; } @@ -716,7 +711,7 @@ configure_driver (const struct string *driver_name, else if (!strcmp (type, "printer")) device |= OUTP_DEV_PRINTER; else - msg (IS, _("Unknown device type `%s'."), type); + error (0, 0, _("unknown device type `%s'"), type); } ds_destroy (&token); } @@ -733,10 +728,10 @@ configure_driver (const struct string *driver_name, d->prc = NULL; /* Open driver. */ - if (!d->class->open_driver (d, ds_c_str (options))) + if (!d->class->open_driver (d, options)) { - msg (IS, _("Can't initialize output driver `%s' of class `%s'."), - d->name, d->class->name); + error (0, 0, _("cannot initialize output driver `%s' of class `%s'"), + d->name, d->class->name); free (d->name); free (d); return; @@ -780,7 +775,8 @@ configure_driver_line (struct string *line) if (!ds_is_empty (&tokens[0]) && !ds_is_empty (&tokens[1])) configure_driver (&tokens[0], &tokens[1], &tokens[2], &tokens[3]); else - msg (IS, _("Driver definition line missing driver name or class name")); + error (0, 0, + _("driver definition line missing driver name or class name")); for (i = 0; i < 4; i++) ds_destroy (&tokens[i]); @@ -926,7 +922,8 @@ outp_evaluate_dimension (char *dimen, char **tail) factor = 72000 / 72.27 / 65536.0; break; default: - msg (SE, _("Unit \"%s\" is unknown in dimension \"%s\"."), s, dimen); + error (0, 0, + _("unit \"%s\" is unknown in dimension \"%s\""), s, dimen); *tail = NULL; return 0; } @@ -941,7 +938,7 @@ outp_evaluate_dimension (char *dimen, char **tail) lossage: *tail = NULL; - msg (SE, _("Bad dimension \"%s\"."), dimen); + error (0, 0, _("bad dimension \"%s\""), dimen); return 0; } @@ -967,7 +964,7 @@ internal_get_paper_size (char *size, int *h, int *v) tail += 2; else { - msg (SE, _("`x' expected in paper size `%s'."), size); + error (0, 0, _("`x' expected in paper size `%s'"), size); return 0; } *v = outp_evaluate_dimension (tail, &tail); @@ -977,7 +974,7 @@ internal_get_paper_size (char *size, int *h, int *v) tail++; if (*tail) { - msg (SE, _("Trailing garbage `%s' on paper size `%s'."), tail, size); + error (0, 0, _("trailing garbage `%s' on paper size `%s'"), tail, size); return 0; } @@ -1000,20 +997,15 @@ outp_get_paper_size (char *size, int *h, int *v) int h, v; }; - static struct paper_size cache[4]; - static int use; - FILE *f; char *pprsz_fn; struct string line; - struct file_locator where; + int line_number = 0; int free_it = 0; int result = 0; - int min_value, min_index; char *ep; - int i; while (isspace ((unsigned char) *size)) size++; @@ -1026,7 +1018,7 @@ outp_get_paper_size (char *size, int *h, int *v) ep--; if (ep == size) { - msg (SE, _("Paper size name must not be empty.")); + error (0, 0, _("paper size name cannot be empty")); return 0; } @@ -1034,37 +1026,24 @@ outp_get_paper_size (char *size, int *h, int *v) if (*ep) *ep = 0; - use++; - for (i = 0; i < 4; i++) - if (cache[i].name != NULL && !strcasecmp (cache[i].name, size)) - { - *h = cache[i].h; - *v = cache[i].v; - cache[i].use = use; - return 1; - } - pprsz_fn = fn_search_path (fn_getenv_default ("STAT_OUTPUT_PAPERSIZE_FILE", "papersize"), fn_getenv_default ("STAT_OUTPUT_INIT_PATH", config_path), NULL); - where.filename = pprsz_fn; - where.line_number = 0; - err_push_file_locator (&where); ds_init (&line, 128); if (pprsz_fn == NULL) { - msg (IE, _("Cannot find `papersize' configuration file.")); + error (0, 0, _("cannot find `papersize' configuration file")); goto exit; } f = fopen (pprsz_fn, "r"); if (!f) { - msg (IE, _("Opening %s: %s."), pprsz_fn, strerror (errno)); + error (0, errno, _("error opening \"%s\""), pprsz_fn); goto exit; } @@ -1072,10 +1051,10 @@ outp_get_paper_size (char *size, int *h, int *v) { char *cp, *bp, *ep; - if (!ds_get_config_line (f, &line, &where.line_number)) + if (!ds_get_config_line (f, &line, &line_number)) { if (ferror (f)) - msg (ME, _("Reading %s: %s."), pprsz_fn, strerror (errno)); + error (0, errno, _("error reading \"%s\""), pprsz_fn); break; } for (cp = ds_c_str (&line); isspace ((unsigned char) *cp); cp++); @@ -1102,36 +1081,20 @@ outp_get_paper_size (char *size, int *h, int *v) break; lex_error: - msg (IE, _("Syntax error in paper size definition.")); + error_at_line (0, 0, pprsz_fn, line_number, + _("syntax error in paper size definition")); } /* We found the one we want! */ result = internal_get_paper_size (size, h, v); - if (result) - { - min_value = cache[0].use; - min_index = 0; - for (i = 1; i < 4; i++) - if (cache[0].use < min_value) - { - min_value = cache[i].use; - min_index = i; - } - free (cache[min_index].name); - cache[min_index].name = xstrdup (size); - cache[min_index].use = use; - cache[min_index].h = *h; - cache[min_index].v = *v; - } exit: - err_pop_file_locator (&where); ds_destroy (&line); if (free_it) free (size); if (!result) - msg (VM (1), _("Error reading paper size definition file.")); + error (0, 0, _("error reading paper size definition file")); return result; } diff --git a/src/output/output.h b/src/output/output.h index cf3101e28a..8f44b1d9f7 100644 --- a/src/output/output.h +++ b/src/output/output.h @@ -70,7 +70,7 @@ struct outp_class const char *name; /* Name of this driver class. */ int special; /* Boolean value. */ - bool (*open_driver) (struct outp_driver *, const char *options); + bool (*open_driver) (struct outp_driver *, const struct string *options); bool (*close_driver) (struct outp_driver *); void (*open_page) (struct outp_driver *); @@ -148,7 +148,7 @@ void outp_list_classes (void); void outp_enable_device (int enable, int device); struct outp_driver *outp_drivers (struct outp_driver *); -bool outp_parse_options (const char *options, +bool outp_parse_options (const struct string *options, bool (*) (struct outp_driver *, const char *key, const struct string *value), struct outp_driver *); diff --git a/src/output/postscript.c b/src/output/postscript.c index 53e81104f8..43b19f2bfb 100644 --- a/src/output/postscript.c +++ b/src/output/postscript.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -130,7 +129,7 @@ static void setup_font (struct outp_driver *this, struct font *, int index); /* Driver initialization. */ static bool -ps_open_driver (struct outp_driver *this, const char *options) +ps_open_driver (struct outp_driver *this, const struct string *options) { struct ps_driver_ext *x; size_t i; diff --git a/src/output/table.c b/src/output/table.c index 42361702b5..eac8d90f18 100644 --- a/src/output/table.c +++ b/src/output/table.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include diff --git a/src/ui/gui/ChangeLog b/src/ui/gui/ChangeLog index 985f0033a6..f0c95e511a 100644 --- a/src/ui/gui/ChangeLog +++ b/src/ui/gui/ChangeLog @@ -1,3 +1,11 @@ +Sun Apr 16 11:53:25 2006 Ben Pfaff + + Start reforming error message support. In this phase, we get rid + of "installation errors" and change all uses of msg() in the + output drivers to uses of error() or error_at_line(). + + * message-dialog.c: (vmsg) Removed IE, IS support. + Mon Mar 13 16:42:44 WST 2006 John Darrington * psppire.c: Supported (sort of) the --help and --version options. diff --git a/src/ui/gui/message-dialog.c b/src/ui/gui/message-dialog.c index c9ca4a1c57..01eb8ce509 100644 --- a/src/ui/gui/message-dialog.c +++ b/src/ui/gui/message-dialog.c @@ -52,7 +52,6 @@ vmsg(int klass, const char *fmt, va_list args) switch (klass) { case SE: - case IE: case DE: case ME: message_type = GTK_MESSAGE_ERROR; @@ -63,7 +62,6 @@ vmsg(int klass, const char *fmt, va_list args) message_type = GTK_MESSAGE_WARNING; break; case SM: - case IS: case MM: default: message_type = GTK_MESSAGE_INFO; @@ -78,11 +76,6 @@ vmsg(int klass, const char *fmt, va_list args) msg = g_strdup(_("Script Error")); break; - case IE: - case IS: - msg = g_strdup(_("Installation Error")); - break; - case DE: case DW: msg = g_strdup(_("Data File Error"));