html: Pop up tooltip with table notes in output.
[pspp] / tests / libpspp / i18n-test.c
index 03b96f2e431ba9a4ad993cc7dc93856afdd743af..a4993a8d0280b13a6c4b80a70371cec5863ab2c1 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011, 2012 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
 
 #include "libpspp/i18n.h"
 
+#include "gl/xalloc.h"
+
 #undef NDEBUG
 #include <assert.h>
 
+/* Returns a malloc()'d copy of INPUT with \ooo octal escapes replaced by their
+   values. */
+static char *
+backslash_decode (const char *input)
+{
+  char *output = xmalloc (strlen (input) + 1);
+  char *p = output;
+  for (; *input; input++)
+    {
+      if (*input == '\\' && input[1] >= '0' && input[1] <= '7')
+        {
+          uint8_t c = 0;
+          while (input[1] >= '0' && input[1] <= '7')
+            c = c * 8 + (*++input - '0');
+          *p++ = c;
+        }
+      else
+        *p++ = *input;
+    }
+  *p = '\0';
+
+  return output;
+}
+
 int
 main (int argc, char *argv[])
 {
-  char *s;
+  i18n_init ();
+
+  if (argc > 1 && !strcmp (argv[1], "supports_encodings"))
+    {
+      int status = 0;
+      int i;
 
-  if (argc != 4)
+      for (i = 2; i < argc; i++)
+        if (!is_encoding_supported (argv[i]))
+          {
+            printf ("encoding \"%s\" is NOT supported\n", argv[i]);
+            status = 77;
+          }
+      i18n_done ();
+      exit (status);
+    }
+  if (argc == 5 && !strcmp (argv[1], "recode"))
+    {
+      const char *from = argv[2];
+      const char *to = argv[3];
+      char *string = backslash_decode (argv[4]);
+      char *result = recode_string (to, from, string, -1);
+      puts (result);
+      assert (strlen (result) == recode_string_len (to, from, string, -1));
+      free (string);
+      free (result);
+    }
+  else if (argc == 6 && !strcmp (argv[1], "concat"))
+    {
+      char *head = backslash_decode (argv[2]);
+      char *tail = backslash_decode (argv[3]);
+      const char *encoding = argv[4];
+      int max_len = atoi (argv[5]);
+      char *result;
+
+      result = utf8_encoding_concat (head, tail, encoding, max_len);
+      puts (result);
+
+      assert (strlen (result)
+              == utf8_encoding_concat_len (head, tail, encoding, max_len));
+
+      if (tail[0] == '\0')
+        {
+          char *result2 = utf8_encoding_trunc (head, encoding, max_len);
+          assert (!strcmp (result, result2));
+          assert (strlen (result2)
+                  == utf8_encoding_trunc_len (head, encoding, max_len));
+          free (result2);
+        }
+
+      free (result);
+      free (head);
+      free (tail);
+    }
+  else
     {
-      fprintf (stderr,
-               "usage: %s FROM TO STRING\n"
-               "where FROM is the source encoding,\n"
-               "      TO is the target encoding,\n"
-               "      and STRING is the text to recode.\n",
-               argv[0]);
+      fprintf (stderr, "\
+usage: %s supports_encodings ENCODING...\n\
+where ENCODING is the name of an encoding.\n\
+Exits with status 0 if all the encodings are supported, 77 otherwise.\n\
+\n\
+usage: %s recode FROM TO STRING\n\
+where FROM is the source encoding,\n\
+      TO is the target encoding,\n\
+      and STRING is the text to recode.\n\
+\n\
+usage: %s concat HEAD TAIL ENCODING MAX_LEN\n\
+where HEAD is the first string to concatenate\n\
+      TAIL is the second string to concatenate\n\
+      ENCODING is the encoding in which to measure the result's length\n\
+      MAX_LEN is the maximum length of the result in ENCODING.\n",
+               argv[0], argv[0], argv[0]);
       return EXIT_FAILURE;
     }
 
-  i18n_init ();
-  s = recode_string (argv[2], argv[1], argv[3], -1);
-  puts (s);
-  assert (strlen (s) == recode_string_len (argv[2], argv[1], argv[3], -1));
-  free (s);
+  i18n_done ();
 
   return 0;
 }