encoding-guesser: New function encoding_guess_whole_file().
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 12 May 2011 05:24:59 +0000 (22:24 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 12 May 2011 05:36:57 +0000 (22:36 -0700)
This will be used for the first time in an upcoming commit.

src/libpspp/encoding-guesser.c
src/libpspp/encoding-guesser.h

index 298861e088d20b932560b13bb6dbeb5a831f4d13..7d10015e2ea2961febf0efb8edb47d66e30033a8 100644 (file)
@@ -283,3 +283,30 @@ encoding_guess_tail_is_utf8 (const void *data, size_t n)
           : is_all_utf8_text (data, n));
 }
 
+/* Attempts to guess the encoding of a text file based on ENCODING, an encoding
+   name in one of the forms described at the top of encoding-guesser.h, and the
+   SIZE byts in DATA, which contains the entire contents of the file.  Returns
+   the guessed encoding, which might be ENCODING itself or a suffix of it or a
+   statically allocated string.
+
+   Encoding autodetection only takes place if ENCODING actually specifies
+   autodetection.  See encoding-guesser.h for details. */
+const char *
+encoding_guess_whole_file (const char *encoding, const void *text, size_t size)
+{
+  const char *guess;
+
+  guess = encoding_guess_head_encoding (encoding, text, size);
+  if (!strcmp (guess, "ASCII") && encoding_guess_encoding_is_auto (encoding))
+    {
+      size_t ofs = encoding_guess_count_ascii (text, size);
+      if (ofs < size)
+        return encoding_guess_tail_encoding (encoding,
+                                             (const char *) text + ofs,
+                                             size - ofs);
+      else
+        return encoding_guess_parse_encoding (encoding);
+    }
+  else
+    return guess;
+}
index 2ec2fee2aaa19e0849cb64af078d8b730dad9f7c..0a7d1f99a4207d1cdbf6282d50343e588af82686 100644 (file)
@@ -115,6 +115,10 @@ bool encoding_guess_tail_is_utf8 (const void *, size_t);
 const char *encoding_guess_tail_encoding (const char *encoding,
                                           const void *, size_t);
 
+/* Guessing from entire file contents. */
+const char *encoding_guess_whole_file (const char *encoding,
+                                       const void *, size_t);
+
 /* Returns true if C is a byte that might appear in an ASCII text file,
    false otherwise. */
 static inline bool