X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Flibpspp%2Fi18n-test.c;h=a4993a8d0280b13a6c4b80a70371cec5863ab2c1;hb=e804300543c1c37393cb6d777e8a2f05686ff2cb;hp=03b96f2e431ba9a4ad993cc7dc93856afdd743af;hpb=f5099c58d17e8f66a74a84918e688ef17936d392;p=pspp diff --git a/tests/libpspp/i18n-test.c b/tests/libpspp/i18n-test.c index 03b96f2e43..a4993a8d02 100644 --- a/tests/libpspp/i18n-test.c +++ b/tests/libpspp/i18n-test.c @@ -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 @@ -22,30 +22,114 @@ #include "libpspp/i18n.h" +#include "gl/xalloc.h" + #undef NDEBUG #include +/* 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; }