projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
str: Make ss_alloc_substring() allocate null-terminated strings.
[pspp]
/
src
/
libpspp
/
str.c
diff --git
a/src/libpspp/str.c
b/src/libpspp/str.c
index 79f3c912e9b649cf39d3ab9a0b37510e25867bf5..9f0cb6e31463ab5caf319114e43fed26f640ae2b 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
@@
-30,6
+30,7
@@
#include <relocatable.h>
#include "minmax.h"
#include "xalloc.h"
#include <relocatable.h>
#include "minmax.h"
#include "xalloc.h"
+#include "xmemdup0.h"
#include "xsize.h"
\f
/* Reverses the order of NBYTES bytes at address P, thus converting
#include "xsize.h"
\f
/* Reverses the order of NBYTES bytes at address P, thus converting
@@
-379,14
+380,13
@@
ss_tail (struct substring ss, size_t cnt)
return ss;
}
return ss;
}
-/* Makes a malloc()'d copy of the contents of OLD
+/* Makes a malloc()'d
, null-terminated
copy of the contents of OLD
and stores it in NEW. */
void
ss_alloc_substring (struct substring *new, struct substring old)
{
and stores it in NEW. */
void
ss_alloc_substring (struct substring *new, struct substring old)
{
- new->string = xm
alloc (
old.length);
+ new->string = xm
emdup0 (old.string,
old.length);
new->length = old.length;
new->length = old.length;
- memcpy (new->string, old.string, old.length);
}
/* Allocates room for a CNT-character string in NEW. */
}
/* Allocates room for a CNT-character string in NEW. */
@@
-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));
}
}
}
}