"Fossies" - the Fresh Open Source Software Archive

Member "tin-2.4.1/src/langinfo.c" (12 Oct 2016, 4486 Bytes) of archive /linux/misc/tin-2.4.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "langinfo.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2  * This is a quick-and-dirty emulator of the nl_langinfo(CODESET)
    3  * function defined in the Single Unix Specification for those systems
    4  * (FreeBSD, etc.) that don't have one yet. It behaves as if it had
    5  * been called after setlocale(LC_CTYPE, ""), that is it looks at
    6  * the locale environment variables.
    7  *
    8  * http://www.opengroup.org/onlinepubs/7908799/xsh/langinfo.h.html
    9  *
   10  * Please extend it as needed and suggest improvements to the author.
   11  * This emulator will hopefully become redundant soon as
   12  * nl_langinfo(CODESET) becomes more widely implemented.
   13  *
   14  * Since the proposed Li18nux encoding name registry is still not mature,
   15  * the output follows the MIME registry where possible:
   16  *
   17  *   http://www.iana.org/assignments/character-sets
   18  *
   19  * A possible autoconf test for the availability of nl_langinfo(CODESET)
   20  * can be found in
   21  *
   22  *   http://www.cl.cam.ac.uk/~mgk25/unicode.html#activate
   23  *
   24  * Markus.Kuhn@cl.cam.ac.uk -- 2002-03-11
   25  * Permission to use, copy, modify, and distribute this software
   26  * for any purpose and without fee is hereby granted. The author
   27  * disclaims all warranties with regard to this software.
   28  *
   29  * Latest version:
   30  *
   31  *   http://www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c
   32  */
   33 
   34 #if 0
   35 #   include <stdlib.h>
   36 #   include <string.h>
   37 #   include "langinfo.h"
   38 #else
   39 #   ifndef TIN_H
   40 #       include "tin.h"
   41 #   endif /* !TIN_H */
   42 #endif /* 0 */
   43 
   44 #ifndef NO_LOCALE
   45 #   ifndef HAVE_LANGINFO_CODESET
   46 #       define C_CODESET "US-ASCII"     /* Return this as the encoding of the
   47                   * C/POSIX locale. Could as well one day
   48                   * become "UTF-8". */
   49 
   50 #       define digit(x) ((x) >= '0' && (x) <= '9')
   51 
   52 static char buf[16];
   53 
   54 const char *
   55 tin_nl_langinfo(
   56     nl_item item)
   57 {
   58   char *l, *p;
   59 
   60   if (item != CODESET)
   61     return NULL;
   62 
   63   if (((l = getenv("LC_ALL"))   && *l) ||
   64       ((l = getenv("LC_CTYPE")) && *l) ||
   65       ((l = getenv("LANG"))     && *l)) {
   66     /* check standardized locales */
   67     if (!strcmp(l, "C") || !strcmp(l, "POSIX"))
   68       return C_CODESET;
   69     /* check for encoding name fragment */
   70     if (strstr(l, "UTF") || strstr(l, "utf"))
   71       return "UTF-8";
   72     if ((p = strstr(l, "8859-"))) {
   73       memcpy(buf, "ISO-8859-\0\0", 12);
   74       p += 5;
   75       if (digit(*p)) {
   76     buf[9] = *p++;
   77     if (digit(*p)) buf[10] = *p++;
   78     return buf;
   79       }
   80     }
   81     if (strstr(l, "KOI8-R")) return "KOI8-R";
   82     if (strstr(l, "KOI8-U")) return "KOI8-U";
   83     if (strstr(l, "620")) return "TIS-620";
   84     if (strstr(l, "2312")) return "GB2312";
   85     if (strstr(l, "HKSCS")) return "Big5HKSCS";   /* no MIME charset */
   86     if (strstr(l, "Big5") || strstr(l, "BIG5")) return "Big5";
   87     if (strstr(l, "GBK")) return "GBK";           /* no MIME charset */
   88     if (strstr(l, "18030")) return "GB18030";     /* no MIME charset */
   89     if (strstr(l, "Shift_JIS") || strstr(l, "SJIS")) return "Shift_JIS";
   90     /* check for conclusive modifier */
   91     if (strstr(l, "euro")) return "ISO-8859-15";
   92     /* check for language (and perhaps country) codes */
   93     if (strstr(l, "zh_TW")) return "Big5";
   94     if (strstr(l, "zh_HK")) return "Big5HKSCS";   /* no MIME charset */
   95     if (strstr(l, "zh")) return "GB2312";
   96     if (strstr(l, "ja")) return "EUC-JP";
   97     if (strstr(l, "ko")) return "EUC-KR";
   98     if (strstr(l, "ru")) return "KOI8-R";
   99     if (strstr(l, "uk")) return "KOI8-U";
  100     if (strstr(l, "pl") || strstr(l, "hr") ||
  101     strstr(l, "hu") || strstr(l, "cs") ||
  102     strstr(l, "sk") || strstr(l, "sl")) return "ISO-8859-2";
  103     if (strstr(l, "eo") || strstr(l, "mt")) return "ISO-8859-3";
  104     if (strstr(l, "el")) return "ISO-8859-7";
  105     if (strstr(l, "he")) return "ISO-8859-8";
  106     if (strstr(l, "tr")) return "ISO-8859-9";
  107     if (strstr(l, "th")) return "TIS-620";      /* or ISO-8859-11 */
  108     if (strstr(l, "lt")) return "ISO-8859-13";
  109     if (strstr(l, "cy")) return "ISO-8859-14";
  110     if (strstr(l, "ro")) return "ISO-8859-2";   /* or ISO-8859-16 */
  111     if (strstr(l, "am") || strstr(l, "vi")) return "UTF-8";
  112     /* Send me further rules if you like, but don't forget that we are
  113      * *only* interested in locale naming conventions on platforms
  114      * that do not already provide an nl_langinfo(CODESET) implementation. */
  115     return "ISO-8859-1"; /* should perhaps be "UTF-8" instead */
  116   }
  117   return C_CODESET;
  118 }
  119 #   else
  120 const char *
  121 tin_nl_langinfo(
  122     nl_item item)
  123 {
  124     return nl_langinfo(item);
  125 }
  126 #   endif /* !HAVE_LANGINFO_CODESET */
  127 #else
  128 static void no_langinfo(void);
  129 static void
  130 no_langinfo(    /* ANSI C requires non-empty source file */
  131     void)
  132 {
  133 }
  134 #endif /* !NO_LOCALE */