projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Avoid problems with G_CONST_RETURN
[pspp]
/
src
/
libpspp
/
u8-istream.c
diff --git
a/src/libpspp/u8-istream.c
b/src/libpspp/u8-istream.c
index 6d4d7707de628afdec78cf9c0b07e325b5b89307..2486ca1ada31c53966e556dfc9932f4ace47a3be 100644
(file)
--- a/
src/libpspp/u8-istream.c
+++ b/
src/libpspp/u8-istream.c
@@
-1,5
+1,5
@@
/* PSPP - a program for statistical analysis.
/* PSPP - a program for statistical analysis.
- Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2010, 2011
, 2012, 2013
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
@@
-22,6
+22,7
@@
#include <errno.h>
#include <fcntl.h>
#include <iconv.h>
#include <errno.h>
#include <fcntl.h>
#include <iconv.h>
+#include <limits.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@
-33,6
+34,7
@@
#include "libpspp/cast.h"
#include "libpspp/compiler.h"
#include "libpspp/encoding-guesser.h"
#include "libpspp/cast.h"
#include "libpspp/compiler.h"
#include "libpspp/encoding-guesser.h"
+#include "libpspp/i18n.h"
#include "gl/c-strcase.h"
#include "gl/localcharset.h"
#include "gl/c-strcase.h"
#include "gl/localcharset.h"
@@
-119,18
+121,27
@@
u8_istream_for_fd (const char *fromcode, int fd)
goto error;
encoding = encoding_guess_head_encoding (fromcode, is->buffer, is->length);
goto error;
encoding = encoding_guess_head_encoding (fromcode, is->buffer, is->length);
- if (!strcmp (encoding, "UTF-8"))
- is->state = S_UTF8;
+ if (is_encoding_utf8 (encoding))
+ {
+ unsigned int bom_len;
+
+ is->state = S_UTF8;
+ bom_len = encoding_guess_bom_length (encoding, is->buffer, is->length);
+ is->head += bom_len;
+ is->length -= bom_len;
+ }
else
{
if (encoding_guess_encoding_is_auto (fromcode)
&& !strcmp (encoding, "ASCII"))
else
{
if (encoding_guess_encoding_is_auto (fromcode)
&& !strcmp (encoding, "ASCII"))
- is->state = S_AUTO;
+ {
+ is->state = S_AUTO;
+ encoding = encoding_guess_parse_encoding (fromcode);
+ }
else
is->state = S_CONVERT;
else
is->state = S_CONVERT;
- is->converter = iconv_open ("UTF-8",
- encoding_guess_parse_encoding (fromcode));
+ is->converter = iconv_open ("UTF-8", encoding);
if (is->converter == (iconv_t) -1)
goto error;
}
if (is->converter == (iconv_t) -1)
goto error;
}
@@
-192,8
+203,12
@@
fill_buffer (struct u8_istream *is)
is->head = is->buffer;
/* Read more input. */
is->head = is->buffer;
/* Read more input. */
- n = read (is->fd, is->buffer + is->length,
- U8_ISTREAM_BUFFER_SIZE - is->length);
+ do
+ {
+ n = read (is->fd, is->buffer + is->length,
+ U8_ISTREAM_BUFFER_SIZE - is->length);
+ }
+ while (n < 0 && errno == EINTR);
if (n > 0)
is->length += n;
return n;
if (n > 0)
is->length += n;
return n;
@@
-252,7
+267,8
@@
convert_iconv (iconv_t converter,
char **inbufp, size_t *inbytesleft,
char **outbufp, size_t *outbytesleft)
{
char **inbufp, size_t *inbytesleft,
char **outbufp, size_t *outbytesleft)
{
- size_t n = iconv (converter, inbufp, inbytesleft, outbufp, outbytesleft);
+ size_t n = iconv (converter, (ICONV_CONST char **) inbufp, inbytesleft,
+ outbufp, outbytesleft);
return n == SIZE_MAX ? errno : 0;
}
return n == SIZE_MAX ? errno : 0;
}