X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fpor-file-reader.c;h=c148a7f09a0792bfe9c964ceb57fea3ffc85d43f;hb=refs%2Fbuilds%2F20100915040502%2Fpspp;hp=96af30b12667a6b5fab958b8f8e23c8fb0d8fb98;hpb=04d2c99833753252b724dd9d4f15cc3a80b6bec8;p=pspp diff --git a/src/data/por-file-reader.c b/src/data/por-file-reader.c index 96af30b126..c148a7f09a 100644 --- a/src/data/por-file-reader.c +++ b/src/data/por-file-reader.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc. + Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -37,7 +37,6 @@ #include #include #include -#include #include #include #include @@ -96,14 +95,14 @@ error (struct pfm_reader *r, const char *msg, ...) va_list args; ds_init_empty (&text); - ds_put_format (&text, _("portable file %s corrupt at offset 0x%lx: "), - fh_get_file_name (r->fh), ftell (r->file)); + ds_put_format (&text, _("portable file %s corrupt at offset 0x%llx: "), + fh_get_file_name (r->fh), (long long int) ftello (r->file)); va_start (args, msg); ds_put_vformat (&text, msg, args); va_end (args); - m.category = MSG_GENERAL; - m.severity = MSG_ERROR; + m.category = MSG_C_GENERAL; + m.severity = MSG_S_ERROR; m.where.file_name = NULL; m.where.line_number = 0; m.text = ds_cstr (&text); @@ -125,14 +124,14 @@ warning (struct pfm_reader *r, const char *msg, ...) va_list args; ds_init_empty (&text); - ds_put_format (&text, _("reading portable file %s at offset 0x%lx: "), - fh_get_file_name (r->fh), ftell (r->file)); + ds_put_format (&text, _("reading portable file %s at offset 0x%llx: "), + fh_get_file_name (r->fh), (long long int) ftello (r->file)); va_start (args, msg); ds_put_vformat (&text, msg, args); va_end (args); - m.category = MSG_GENERAL; - m.severity = MSG_WARNING; + m.category = MSG_C_GENERAL; + m.severity = MSG_S_WARNING; m.where.file_name = NULL; m.where.line_number = 0; m.text = ds_cstr (&text); @@ -447,6 +446,28 @@ read_string (struct pfm_reader *r, char *buf) *buf = '\0'; } + +/* Reads a string into BUF, which must have room for 256 + characters. + Returns the number of bytes read. +*/ +static size_t +read_bytes (struct pfm_reader *r, uint8_t *buf) +{ + int n = read_int (r); + if (n < 0 || n > 255) + error (r, _("Bad string length %d."), n); + + while (n-- > 0) + { + *buf++ = r->cc; + advance (r); + } + return n; +} + + + /* Reads a string and returns a copy of it allocated from R's pool. */ static char * @@ -739,9 +760,9 @@ parse_value (struct pfm_reader *r, int width, union value *v) value_init (v, width); if (width > 0) { - char string[256]; - read_string (r, string); - value_copy_str_rpad (v, width, string, ' '); + uint8_t buf[256]; + size_t n_bytes = read_bytes (r, buf); + value_copy_buf_rpad (v, width, buf, n_bytes, ' '); } else v->f = read_float (r); @@ -819,7 +840,6 @@ por_file_casereader_read (struct casereader *reader, void *r_) struct pfm_reader *r = r_; struct ccase *volatile c; size_t i; - size_t idx; c = case_create (r->proto); setjmp (r->bail_out); @@ -837,22 +857,17 @@ por_file_casereader_read (struct casereader *reader, void *r_) return NULL; } - idx = 0; for (i = 0; i < r->var_cnt; i++) { int width = caseproto_get_width (r->proto, i); if (width == 0) - { - case_data_rw_idx (c, idx)->f = read_float (r); - idx++; - } + case_data_rw_idx (c, i)->f = read_float (r); else { - char string[256]; - read_string (r, string); - buf_copy_str_rpad (case_str_rw_idx (c, idx), width, string, ' '); - idx += DIV_RND_UP (width, MAX_SHORT_STRING); + uint8_t buf[256]; + size_t n_bytes = read_bytes (r, buf); + u8_buf_copy_rpad (case_str_rw_idx (c, i), width, buf, n_bytes, ' '); } } @@ -866,17 +881,30 @@ pfm_detect (FILE *file) { unsigned char header[464]; char trans[256]; - int cooked_cnt, raw_cnt; + int cooked_cnt, raw_cnt, line_len; int i; cooked_cnt = raw_cnt = 0; + line_len = 0; while (cooked_cnt < sizeof header) { int c = getc (file); if (c == EOF || raw_cnt++ > 512) return false; - else if (c != '\n' && c != '\r') - header[cooked_cnt++] = c; + else if (c == '\n') + { + while (line_len < 80 && cooked_cnt < sizeof header) + { + header[cooked_cnt++] = ' '; + line_len++; + } + line_len = 0; + } + else if (c != '\r') + { + header[cooked_cnt++] = c; + line_len++; + } } memset (trans, 0, 256);