/* 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
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)
{
for (length = 0; length < max_length; length++)
{
int c = getc (stream);
- if (c == EOF)
- break;
-
- if (c == '\r')
+ switch (c)
{
+ case EOF:
+ return length > 0;
+
+ case '\n':
+ ds_put_char (st, c);
+ return true;
+
+ case '\r':
c = getc (stream);
- if (c != '\n')
+ if (c == '\n')
{
+ /* 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;
ungetc (c, stream);
- c = '\n';
}
+ break;
+
+ default:
+ ds_put_char (st, c);
}
- ds_put_char (st, c);
- if (c == '\n')
- return true;
}
return length > 0;
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
activity="check input.txt"
cksum input.txt > input.cksum
diff input.cksum - <<EOF
-4116052799 48 input.txt
+1732021750 50 input.txt
EOF
if [ $? -ne 0 ] ; then no_result ; fi