X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flibpspp%2Fu8-istream.c;h=2486ca1ada31c53966e556dfc9932f4ace47a3be;hb=bc2bcb0e2e77b4b02a32d6179b8ee6673bfdffa6;hp=77c14133eabb271da894859345ae73e85a9a65b0;hpb=d6c75296e5573a997c79a7af1195b6a619c0190c;p=pspp diff --git a/src/libpspp/u8-istream.c b/src/libpspp/u8-istream.c index 77c14133ea..2486ca1ada 100644 --- a/src/libpspp/u8-istream.c +++ b/src/libpspp/u8-istream.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2010, 2011, 2012 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 @@ -122,17 +122,26 @@ u8_istream_for_fd (const char *fromcode, int fd) encoding = encoding_guess_head_encoding (fromcode, is->buffer, is->length); if (is_encoding_utf8 (encoding)) - is->state = S_UTF8; + { + 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")) - is->state = S_AUTO; + { + is->state = S_AUTO; + encoding = encoding_guess_parse_encoding (fromcode); + } 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; } @@ -194,8 +203,12 @@ fill_buffer (struct u8_istream *is) 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;