projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Const casts.
[pspp]
/
src
/
libpspp
/
str.c
diff --git
a/src/libpspp/str.c
b/src/libpspp/str.c
index 79f3c912e9b649cf39d3ab9a0b37510e25867bf5..bde4de4be5bb4ee13edf877e217537336debfc0a 100644
(file)
--- a/
src/libpspp/str.c
+++ b/
src/libpspp/str.c
@@
-1,5
+1,5
@@
/* 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
@@
-1240,9
+1240,9
@@
ds_steal_cstr (struct string *st)
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)
{
@@
-1251,21
+1251,36
@@
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')
+ switch (c)
{
{
+ case EOF:
+ return length > 0;
+
+ case '\n':
+ ds_put_char (st, c);
+ return true;
+
+ case '\r':
c = getc (stream);
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);
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;
}
return length > 0;
@@
-1450,7
+1465,9
@@
ds_relocate (struct string *st)
{
ds_clear (st);
ds_put_cstr (st, rel);
{
ds_clear (st);
ds_put_cstr (st, rel);
- free ((char *) rel);
+ /* The documentation for relocate says that casting away const
+ and then freeing is appropriate ... */
+ free (CONST_CAST (char *, rel));
}
}
}
}