libisdn
|
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")