libisdn
T50.c
Go to the documentation of this file.
00001 /*
00002  * T.50 - ISO/IEC 646
00003  *
00004  *      "International Reference Alphabet (IRA / IA5)"
00005  *
00006  * Collection of helper functions
00007  */
00008 #ifdef HAVE_CONFIG_H
00009 #include "config.h"
00010 #endif
00011 
00012 #include "T50.h"
00013 
00014 int ia5_valid_string(const char *in, const int size)
00015 {
00016         for (int i = 0; i < size && in[i]; i++)
00017                 if (!isia5(in[i])) return 0;
00018         return 1;
00019 }
00020 
00021 int ia5_valid_number(const char *in, const int size)
00022 {
00023         for (int i = 0; i < size && in[i]; i++)
00024                 if (!isia5digit(in[i])) return 0;
00025         return 1;
00026 }
00027 
00028 #ifdef HAVE_ICONV
00029 #include <iconv.h>
00030 
00031 #define ICONV_CONVERT(_name, _to, _from)                                \
00032         int _name(const char *in, const int isize, char *out, int *osize)       \
00033         {                                                               \
00034                 char *inp = (char *)in, *outp = out;                    \
00035                 int inleft = isize, outleft = *osize, res = 0;          \
00036                 iconv_t cv = iconv_open(_to, _from);                    \
00037                 if (cv == -1)                                           \
00038                         return -1;                                      \
00039                                                                         \
00040                 if (iconv(cv, &inp, &inleft, &outp, &outleft) < 0) {    \
00041                         switch (errno) {                                \
00042                         case E2BIG:                                     \
00043                                 res = -1;                               \
00044                                 break;                                  \
00045                         default:                                        \
00046                                 break;                                  \
00047                         }                                               \
00048                 }                                                       \
00049                 *osize -= outleft;                                      \
00050                 iconv_close(cv);                                        \
00051                 return res;                                             \
00052         }
00053 #else
00054 #define ICONV_CONVERT(_name, _to, _from)                                \
00055         int _name(const char *in, const int isize, char *out, int *osize)       \
00056         {                                                               \
00057                 return -1;                                              \
00058         }
00059 #endif
00060 
00061 ICONV_CONVERT(ia5_from_utf8, "ISO_646.IRV:1991//TRANSLIT", "UTF-8")
00062 ICONV_CONVERT(ia5_to_utf8,   "UTF-8", "ISO_646.IRV:1991")
00063 
00064 ICONV_CONVERT(ia5_from_latin9, "ISO_646.IRV:1991//TRANSLIT", "ISO_8859-15")
00065 ICONV_CONVERT(ia5_to_latin9,   "ISO_8859-15", "ISO_646.IRV:1991")
00066 
00067 ICONV_CONVERT(ia5_from_latin1, "ISO_646.IRV:1991//TRANSLIT", "ISO_8859-1")
00068 ICONV_CONVERT(ia5_to_latin1,   "ISO_8859-1", "ISO_646.IRV:1991")