X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fdata-in.c;h=0c21a380ea2a0833641052ea5dba578441c66c55;hb=16aa47dbdde420fe82032f7d2e166fdf4e974df5;hp=0ce42fa652a4085fe457ba134e284c9767f5014a;hpb=28c30ee5393be3eab865718be626b1efafdcf11b;p=pspp-builds.git diff --git a/src/data-in.c b/src/data-in.c index 0ce42fa6..0c21a380 100644 --- a/src/data-in.c +++ b/src/data-in.c @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include #include "data-in.h" @@ -26,9 +26,9 @@ #include #include #include -#include "bool.h" +#include #include "error.h" -#include "getline.h" +#include "getl.h" #include "calendar.h" #include "lexer.h" #include "magic.h" @@ -36,9 +36,11 @@ #include "settings.h" #include "str.h" #include "var.h" - -#include "debug-print.h" +#include "gettext.h" +#define _(msgid) gettext (msgid) + +#include "debug-print.h" /* Specialized error routine. */ @@ -89,10 +91,10 @@ dls_error (const struct data_in *i, const char *format, ...) static void trim_whitespace (struct data_in *i) { - while (i->s < i->e && isspace (i->s[0])) + while (i->s < i->e && isspace ((unsigned char) i->s[0])) i->s++; - while (i->s < i->e && isspace (i->e[-1])) + while (i->s < i->e && isspace ((unsigned char) i->e[-1])) i->e--; } @@ -170,7 +172,7 @@ parse_numeric (struct data_in *i) exponent = 0; for (; have_char (i); i->s++) { - if (isdigit (*i->s)) + if (isdigit ((unsigned char) *i->s)) { digit_cnt++; @@ -212,14 +214,12 @@ parse_numeric (struct data_in *i) return false; } - if (have_char (i) - && (tolower (*i->s) == 'e' || tolower (*i->s) == 'd' - || (type == FMT_E && (*i->s == '+' || *i->s == '-')))) + if (have_char (i) && strchr ("eEdD-+", *i->s)) { /* Get the exponent specified after the `e' or `E'. */ long exp; - if (isalpha (*i->s)) + if (isalpha ((unsigned char) *i->s)) i->s++; if (!parse_int (i, &exp)) { @@ -291,18 +291,18 @@ hexit_value (int c) static inline bool parse_N (struct data_in *i) { - const unsigned char *cp; + const char *cp; i->v->f = 0; for (cp = i->s; cp < i->e; cp++) { - if (!isdigit (*cp)) + if (!isdigit ((unsigned char) *cp)) { dls_error (i, _("All characters in field must be digits.")); return false; } - i->v->f = i->v->f * 10.0 + *cp - '0'; + i->v->f = i->v->f * 10.0 + (*cp - '0'); } apply_implied_decimals (i); @@ -313,14 +313,14 @@ static inline bool parse_PIBHEX (struct data_in *i) { double n; - const unsigned char *cp; + const char *cp; trim_whitespace (i); n = 0.0; for (cp = i->s; cp < i->e; cp++) { - if (!isxdigit (*cp)) + if (!isxdigit ((unsigned char) *cp)) { dls_error (i, _("Unrecognized character in field.")); return false; @@ -345,10 +345,10 @@ parse_RBHEX (struct data_in *i) } { - const unsigned char *cp; + const char *cp; for (cp = i->s; cp < i->e; cp++) - if (!isxdigit (*cp)) + if (!isxdigit ((unsigned char) *cp)) { dls_error (i, _("Field must contain only hex digits.")); return false; @@ -416,7 +416,7 @@ parse_Z (struct data_in *i) /* Copy digits into buf[1 ... len - 1] and terminate string. */ { - const unsigned char *sp; + const char *sp; char *dp; for (sp = i->s, dp = buf + 1; sp < i->e - 1; sp++, dp++) @@ -440,8 +440,8 @@ parse_Z (struct data_in *i) { char *tail; - i->v->f = strtod ((char *) buf, (char **) &tail); - if ((unsigned char *) tail != i->e) + i->v->f = strtod (buf, &tail); + if (tail != i->e) { dls_error (i, _("Error in syntax of zoned decimal number.")); return false; @@ -457,19 +457,21 @@ parse_Z (struct data_in *i) static inline bool parse_IB (struct data_in *i) { +#ifndef WORDS_BIGENDIAN char buf[64]; - const char *p; +#endif + const unsigned char *p; unsigned char xor; /* We want the data to be in big-endian format. If this is a little-endian machine, reverse the byte order. */ #ifdef WORDS_BIGENDIAN - p = i->s; + p = (const unsigned char *) i->s; #else memcpy (buf, i->s, i->e - i->s); - mm_reverse (buf, i->e - i->s); - p = buf; + buf_reverse (buf, i->e - i->s); + p = (const unsigned char *) buf; #endif /* If the value is negative, we need to logical-NOT each value @@ -505,10 +507,10 @@ parse_PIB (struct data_in *i) i->v->f = 0.0; #if WORDS_BIGENDIAN for (j = 0; j < i->e - i->s; j++) - i->v->f = i->v->f * 256.0 + i->s[j]; + i->v->f = i->v->f * 256.0 + (unsigned char) i->s[j]; #else for (j = i->e - i->s - 1; j >= 0; j--) - i->v->f = i->v->f * 256.0 + i->s[j]; + i->v->f = i->v->f * 256.0 + (unsigned char) i->s[j]; #endif apply_implied_decimals (i); @@ -519,15 +521,15 @@ parse_PIB (struct data_in *i) static inline bool parse_P (struct data_in *i) { - const unsigned char *cp; + const char *cp; i->v->f = 0.0; for (cp = i->s; cp < i->e - 1; cp++) { - i->v->f = i->v->f * 10 + (*cp >> 4); + i->v->f = i->v->f * 10 + ((*cp >> 4) & 15); i->v->f = i->v->f * 10 + (*cp & 15); } - i->v->f = i->v->f * 10 + (*cp >> 4); + i->v->f = i->v->f * 10 + ((*cp >> 4) & 15); if ((*cp ^ (*cp >> 1)) & 0x10) i->v->f = -i->v->f; @@ -539,12 +541,12 @@ parse_P (struct data_in *i) static inline bool parse_PK (struct data_in *i) { - const unsigned char *cp; + const char *cp; i->v->f = 0.0; for (cp = i->s; cp < i->e; cp++) { - i->v->f = i->v->f * 10 + (*cp >> 4); + i->v->f = i->v->f * 10 + ((*cp >> 4) & 15); i->v->f = i->v->f * 10 + (*cp & 15); } @@ -564,7 +566,7 @@ parse_RB (struct data_in *i) u; memset (u.c, 0, sizeof u.c); - memcpy (u.c, i->s, min ((int) sizeof (u.c), i->e - i->s)); + memcpy (u.c, i->s, min (sizeof u.c, (size_t) (i->e - i->s))); i->v->f = u.d; return true; @@ -573,16 +575,7 @@ parse_RB (struct data_in *i) static inline bool parse_A (struct data_in *i) { - ptrdiff_t len = i->e - i->s; - - if (len >= i->format.w) - memcpy (i->v->s, i->s, i->format.w); - else - { - memcpy (i->v->s, i->s, len); - memset (i->v->s + len, ' ', i->format.w - len); - } - + buf_copy_rpad (i->v->s, i->format.w, i->s, i->e - i->s); return true; } @@ -598,10 +591,10 @@ parse_AHEX (struct data_in *i) } { - const unsigned char *cp; + const char *cp; for (cp = i->s; cp < i->e; cp++) - if (!isxdigit (*cp)) + if (!isxdigit ((unsigned char) *cp)) { dls_error (i, _("Field must contain only hex digits.")); return false; @@ -667,7 +660,7 @@ parse_int (struct data_in *i, long *result) force_have_char (i); } - if (!isdigit (*i->s)) + if (!isdigit ((unsigned char) *i->s)) { dls_error (i, _("Digit expected in field.")); return false; @@ -676,8 +669,8 @@ parse_int (struct data_in *i, long *result) *result = 0; for (;;) { - *result = *result * 10 + *i->s++ - '0'; - if (!have_char (i) || !isdigit (*i->s)) + *result = *result * 10 + (*i->s++ - '0'); + if (!have_char (i) || !isdigit ((unsigned char) *i->s)) break; } @@ -710,7 +703,7 @@ parse_date_delimiter (struct data_in *i) bool delim = false; while (have_char (i) - && (*i->s == '-' || *i->s == '/' || isspace (*i->s) + && (*i->s == '-' || *i->s == '/' || isspace ((unsigned char) *i->s) || *i->s == '.' || *i->s == ',')) { delim = true; @@ -745,7 +738,7 @@ parse_enum (struct data_in *i, const char *what, /* Consume alphabetic characters. */ name = i->s; length = 0; - while (have_char (i) && isalpha (*i->s)) + while (have_char (i) && isalpha ((unsigned char) *i->s)) { length++; i->s++; @@ -760,7 +753,7 @@ parse_enum (struct data_in *i, const char *what, if ((ep->can_abbreviate && lex_id_match_len (ep->name, strlen (ep->name), name, length)) || (!ep->can_abbreviate && length == strlen (ep->name) - && !memcmp (name, ep->name, length))) + && !buf_compare_case (name, ep->name, length))) { *output = ep->value; return true; @@ -809,7 +802,7 @@ parse_month (struct data_in *i, long *month) if (!force_have_char (i)) return false; - if (isdigit (*i->s)) + if (isdigit ((unsigned char) *i->s)) { if (!parse_int (i, month)) return false; @@ -896,7 +889,7 @@ static bool parse_q_delimiter (struct data_in *i) { skip_whitespace (i); - if (!have_char (i) || tolower (*i->s) != 'q') + if (!have_char (i) || tolower ((unsigned char) *i->s) != 'q') { dls_error (i, _("`Q' expected between quarter and year.")); return false; @@ -923,7 +916,8 @@ parse_wk_delimiter (struct data_in *i) { skip_whitespace (i); if (i->s + 1 >= i->e - || tolower (i->s[0]) != 'w' || tolower (i->s[1]) != 'k') + || tolower ((unsigned char) i->s[0]) != 'w' + || tolower ((unsigned char) i->s[1]) != 'k') { dls_error (i, _("`WK' expected between week and year.")); return false; @@ -938,7 +932,8 @@ parse_time_delimiter (struct data_in *i) { bool delim = false; - while (have_char (i) && (*i->s == ':' || *i->s == '.' || isspace (*i->s))) + while (have_char (i) && (*i->s == ':' || *i->s == '.' + || isspace ((unsigned char) *i->s))) { delim = true; i->s++; @@ -984,24 +979,24 @@ parse_opt_second (struct data_in *i, double *second) char *cp; while (have_char (i) - && (*i->s == ':' || *i->s == '.' || isspace (*i->s))) + && (*i->s == ':' || *i->s == '.' || isspace ((unsigned char) *i->s))) { delim = true; i->s++; } - if (!delim || !isdigit (*i->s)) + if (!delim || !isdigit ((unsigned char) *i->s)) { *second = 0.0; return true; } cp = buf; - while (have_char (i) && isdigit (*i->s)) + while (have_char (i) && isdigit ((unsigned char) *i->s)) *cp++ = *i->s++; if (have_char (i) && *i->s == '.') *cp++ = *i->s++; - while (have_char (i) && isdigit (*i->s)) + while (have_char (i) && isdigit ((unsigned char) *i->s)) *cp++ = *i->s++; *cp = '\0'; @@ -1363,6 +1358,8 @@ data_in (struct data_in *i) { const struct fmt_desc *const fmt = &formats[i->format.type]; + assert (check_input_specifier (&i->format, 0)); + /* Check that we've got a string to work with. */ if (i->e == i->s || i->format.w <= 0) { @@ -1383,12 +1380,12 @@ data_in (struct data_in *i) if (fmt->cat & FCAT_BLANKS_SYSMIS) { - const unsigned char *cp; + const char *cp; cp = i->s; for (;;) { - if (!isspace (*cp)) + if (!isspace ((unsigned char) *cp)) break; if (++cp == i->e)