User "tvw" on IRC reported that PSPP failed to parse data that SPSS 18
accepted. We found that the problem was carriage return (CR) characters
in the middle of a line. PSPP treated these as new-lines, but SPSS did
not. This commit adopts the SPSS behavior in PSPP and adjusts one test
that checks this behavior.
This will break reading some old Mac OS files, since Mac OS before version
10 used CR without LF as new-line. Time will tell whether this is a real
problem for our users.
/* PSPP - a program for statistical analysis.
/* 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
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
to ST, false if no characters were read before an I/O error or
end of file (or if MAX_LENGTH was 0).
to ST, false if no characters were read before an I/O error or
end of file (or if MAX_LENGTH was 0).
- This function accepts LF, CR LF, and CR sequences as new-line,
- and translates each of them to a single '\n' new-line
- character in ST. */
+ This function treats LF and CR LF sequences as new-line,
+ translating each of them to a single '\n' new-line character
+ in ST. */
bool
ds_read_line (struct string *st, FILE *stream, size_t max_length)
{
bool
ds_read_line (struct string *st, FILE *stream, size_t max_length)
{
for (length = 0; length < max_length; length++)
{
int c = getc (stream);
for (length = 0; length < max_length; length++)
{
int c = getc (stream);
- if (c == EOF)
- break;
-
- if (c == '\r')
+ case EOF:
+ return length > 0;
+
+ case '\n':
+ ds_put_char (st, c);
+ return true;
+
+ case '\r':
+ /* CR followed by LF is special: translate to \n. */
+ ds_put_char (st, '\n');
+ return true;
+ }
+ else
+ {
+ /* CR followed by anything else is just CR. */
+ ds_put_char (st, '\r');
+ if (c == EOF)
+ return true;
+ break;
+
+ default:
+ ds_put_char (st, c);
- ds_put_char (st, c);
- if (c == '\n')
- return true;
activity="create input.txt"
activity="create input.txt"
-printf '1 2 3\n4 5 6\r\n7 8 9\r10 11 12\n13 14 15 \r\n16 17 18\r' > input.txt
+printf '1 2 3\n4 5 6\r\n7\r8\r9\r\n10 11 12\n13 14 15 \r\n16\r\r17\r18\n' > input.txt
if [ $? -ne 0 ] ; then no_result ; fi
if [ $? -ne 0 ] ; then no_result ; fi
activity="check input.txt"
cksum input.txt > input.cksum
diff input.cksum - <<EOF
activity="check input.txt"
cksum input.txt > input.cksum
diff input.cksum - <<EOF
EOF
if [ $? -ne 0 ] ; then no_result ; fi
EOF
if [ $? -ne 0 ] ; then no_result ; fi