X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-reader.c;h=125d7be2598a37bb516c80b35d3839a794c3811a;hb=578bc59e7ec144bc8424e9a58807a791314cc0e8;hp=8745cfc68fb5acf7e1cf02d4a7c7366c2504c132;hpb=8d6bfdd2a100bf8166b3b0b3f006d46f3e7a59e9;p=pspp diff --git a/src/data/por-file-reader.c b/src/data/por-file-reader.c index 8745cfc68f..125d7be259 100644 --- a/src/data/por-file-reader.c +++ b/src/data/por-file-reader.c @@ -43,7 +43,6 @@ #include "libpspp/pool.h" #include "libpspp/str.h" -#include "gl/intprops.h" #include "gl/minmax.h" #include "gl/xalloc.h" #include "gl/xmemdup0.h" @@ -78,7 +77,7 @@ struct pfm_reader int line_length; /* Number of characters so far on this line. */ char cc; /* Current character. */ char *trans; /* 256-byte character set translation table. */ - int var_cnt; /* Number of variables. */ + int n_vars; /* Number of variables. */ int weight_index; /* 0-based index of weight variable, or -1. */ struct caseproto *proto; /* Format of output cases. */ bool ok; /* Set false on I/O error. */ @@ -103,7 +102,6 @@ error (struct pfm_reader *r, const char *msg,...) static void error (struct pfm_reader *r, const char *msg, ...) { - struct msg m; struct string text; va_list args; @@ -114,16 +112,13 @@ error (struct pfm_reader *r, const char *msg, ...) ds_put_vformat (&text, msg, args); va_end (args); - m.category = MSG_C_GENERAL; - m.severity = MSG_S_ERROR; - m.file_name = NULL; - m.first_line = 0; - m.last_line = 0; - m.first_column = 0; - m.last_column = 0; - m.text = ds_cstr (&text); - - msg_emit (&m); + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { + .category = MSG_C_GENERAL, + .severity = MSG_S_ERROR, + .text = ds_steal_cstr (&text), + }; + msg_emit (m); r->ok = false; @@ -135,7 +130,6 @@ error (struct pfm_reader *r, const char *msg, ...) static void warning (struct pfm_reader *r, const char *msg, ...) { - struct msg m; struct string text; va_list args; @@ -146,16 +140,13 @@ warning (struct pfm_reader *r, const char *msg, ...) ds_put_vformat (&text, msg, args); va_end (args); - m.category = MSG_C_GENERAL; - m.severity = MSG_S_WARNING; - m.file_name = NULL; - m.first_line = 0; - m.last_line = 0; - m.first_column = 0; - m.last_column = 0; - m.text = ds_cstr (&text); - - msg_emit (&m); + struct msg *m = xmalloc (sizeof *m); + *m = (struct msg) { + .category = MSG_C_GENERAL, + .severity = MSG_S_WARNING, + .text = ds_steal_cstr (&text), + }; + msg_emit (m); } /* Close and destroy R. @@ -224,7 +215,7 @@ advance (struct pfm_reader *r) r->line_length = 0; } if (c == EOF) - error (r, _("unexpected end of file")); + error (r, _("Unexpected end of file")); if (r->trans != NULL) c = r->trans[c]; @@ -274,7 +265,7 @@ pfm_open (struct file_handle *fh) r->line_length = 0; r->weight_index = -1; r->trans = NULL; - r->var_cnt = 0; + r->n_vars = 0; r->proto = NULL; r->ok = true; if (setjmp (r->bail_out)) @@ -597,7 +588,7 @@ read_version_data (struct pfm_reader *r, struct any_read_info *info) info->float_format = FLOAT_NATIVE_DOUBLE; info->integer_format = INTEGER_NATIVE; info->compression = ANY_COMP_NONE; - info->case_cnt = -1; + info->n_cases = -1; /* Date. */ info->creation_date = xmalloc (11); @@ -632,28 +623,19 @@ static struct fmt_spec convert_format (struct pfm_reader *r, const int portable_format[3], struct variable *v, bool *report_error) { - struct fmt_spec format; - bool ok; - - if (!fmt_from_io (portable_format[0], &format.type)) + enum fmt_type type; + if (fmt_from_io (portable_format[0], &type)) { - if (*report_error) - warning (r, _("%s: Bad format specifier byte (%d). Variable " - "will be assigned a default format."), - var_get_name (v), portable_format[0]); - goto assign_default; - } - - format.w = portable_format[1]; - format.d = portable_format[2]; + struct fmt_spec format = { + .type = type, + .w = portable_format[1], + .d = portable_format[2], + }; - msg_disable (); - ok = (fmt_check_output (&format) - && fmt_check_width_compat (&format, var_get_width (v))); - msg_enable (); + if (fmt_check_output (&format) + && fmt_check_width_compat (&format, var_get_width (v))) + return format; - if (!ok) - { if (*report_error) { char fmt_string[FMT_STRING_LEN_MAX + 1]; @@ -667,12 +649,15 @@ convert_format (struct pfm_reader *r, const int portable_format[3], "invalid format specifier %s."), var_get_name (v), var_get_width (v), fmt_string); } - goto assign_default; + } + else + { + if (*report_error) + warning (r, _("%s: Bad format specifier byte (%d). Variable " + "will be assigned a default format."), + var_get_name (v), portable_format[0]); } - return format; - -assign_default: *report_error = false; return fmt_default_for_width (var_get_width (v)); } @@ -689,9 +674,9 @@ read_variables (struct pfm_reader *r, struct dictionary *dict) if (!match (r, '4')) error (r, _("Expected variable count record.")); - r->var_cnt = read_int (r); - if (r->var_cnt <= 0) - error (r, _("Invalid number of variables %d."), r->var_cnt); + r->n_vars = read_int (r); + if (r->n_vars <= 0) + error (r, _("Invalid number of variables %d."), r->n_vars); if (match (r, '5')) read_int (r); @@ -703,7 +688,7 @@ read_variables (struct pfm_reader *r, struct dictionary *dict) error (r, _("Weight variable name (%s) truncated."), weight_name); } - for (i = 0; i < r->var_cnt; i++) + for (i = 0; i < r->n_vars; i++) { int width; char name[256]; @@ -725,8 +710,7 @@ read_variables (struct pfm_reader *r, struct dictionary *dict) for (j = 0; j < 6; j++) fmt[j] = read_int (r); - if (!dict_id_is_valid (dict, name, false) - || *name == '#' || *name == '$') + if (!dict_id_is_valid (dict, name) || *name == '#' || *name == '$') error (r, _("Invalid variable name `%s' in position %d."), name, i); str_uppercase (name); @@ -739,9 +723,9 @@ read_variables (struct pfm_reader *r, struct dictionary *dict) unsigned long int i; for (i = 1; ; i++) { - char try_name[8 + 1 + INT_STRLEN_BOUND (i) + 1]; - sprintf (try_name, "%s_%lu", name, i); + char *try_name = xasprintf ("%s_%lu", name, i); v = dict_create_var (dict, try_name, width); + free (try_name); if (v != NULL) break; } @@ -868,11 +852,8 @@ read_value_label (struct pfm_reader *r, struct dictionary *dict) static void read_documents (struct pfm_reader *r, struct dictionary *dict) { - int line_cnt; - int i; - - line_cnt = read_int (r); - for (i = 0; i < line_cnt; i++) + int n_lines = read_int (r); + for (int i = 0; i < n_lines; i++) { char line[256]; read_string (r, line); @@ -905,12 +886,12 @@ por_file_casereader_read (struct casereader *reader, void *r_) return NULL; } - for (i = 0; i < r->var_cnt; i++) + for (i = 0; i < r->n_vars; i++) { int width = caseproto_get_width (r->proto, i); if (width == 0) - case_data_rw_idx (c, i)->f = read_float (r); + *case_num_rw_idx (c, i) = read_float (r); else { uint8_t buf[256]; @@ -929,28 +910,28 @@ pfm_detect (FILE *file) { unsigned char header[464]; char trans[256]; - int cooked_cnt, raw_cnt, line_len; + int n_cooked, n_raws, line_len; int i; - cooked_cnt = raw_cnt = 0; + n_cooked = n_raws = 0; line_len = 0; - while (cooked_cnt < sizeof header) + while (n_cooked < sizeof header) { int c = getc (file); - if (c == EOF || raw_cnt++ > 512) + if (c == EOF || n_raws++ > 512) return ferror (file) ? -errno : 0; else if (c == '\n') { - while (line_len < 80 && cooked_cnt < sizeof header) + while (line_len < 80 && n_cooked < sizeof header) { - header[cooked_cnt++] = ' '; + header[n_cooked++] = ' '; line_len++; } line_len = 0; } else if (c != '\r') { - header[cooked_cnt++] = c; + header[n_cooked++] = c; line_len++; } }