7 #include <stringprep.h>
13 #define MAX_DNSLEN 4096
15 static char * default_charset= "ISO-8859-1";
18 idn_prep(char * string, char * charset, char * profile)
21 char * res_str = NULL;
25 utf8 = stringprep_convert(string, "UTF-8", charset);
29 res = stringprep_profile(utf8, &output, profile, 0);
32 if( (res != STRINGPREP_OK) || !output)
35 res_str = stringprep_convert(output, charset, "UTF-8");
42 constant(char *name, int len, int arg)
53 if (strEQ(name + 0, "IDNA_ALLOW_UNASSIGNED"))
55 return IDNA_ALLOW_UNASSIGNED;
58 if (strEQ(name + 0, "IDNA_USE_STD3_ASCII_RULES"))
60 return IDNA_USE_STD3_ASCII_RULES;
67 MODULE = Net::LibIDN PACKAGE = Net::LibIDN
76 char * s = SvPV(sv, len);
79 RETVAL = constant(s,len,arg);
85 idn_to_ascii(string, charset=default_charset, flags=0)
91 char * utf8_str = NULL;
92 char * tmp_str = NULL;
95 utf8_str = stringprep_convert(string, "UTF-8", charset);
98 res = idna_to_ascii_8z(utf8_str, &tmp_str, flags);
105 if (res!=IDNA_SUCCESS)
118 idn_to_unicode(string, charset=default_charset, flags=0)
124 char * tmp_str = NULL;
125 char * res_str = NULL;
128 res = idna_to_unicode_8z8z(string, &tmp_str, flags);
129 if(res != IDNA_SUCCESS)
135 res_str = stringprep_convert(tmp_str, charset, "UTF-8");
154 idn_punycode_encode(string, charset=default_charset)
159 char * utf8_str = NULL;
162 char * tmp_str = NULL;
163 char * res_str = NULL;
166 utf8_str = stringprep_convert(string, "UTF-8", charset);
169 q = stringprep_utf8_to_ucs4(utf8_str, -1, &len);
182 tmp_str = malloc(MAX_DNSLEN*sizeof(char));
184 res = punycode_encode(len, q, NULL, &len2, tmp_str);
187 if (res != PUNYCODE_SUCCESS)
192 tmp_str[len2] = '\0';
194 res_str = stringprep_convert(tmp_str, charset, "UTF-8");
208 idn_punycode_decode(string, charset=default_charset)
213 char * utf8_str = NULL;
216 char * res_str = NULL;
220 q = (uint32_t *) malloc(MAX_DNSLEN * sizeof(q[0]));
224 res = punycode_decode(strlen(string), string, &len, q, NULL );
230 if (res != PUNYCODE_SUCCESS)
236 utf8_str = stringprep_ucs4_to_utf8(q, -1, NULL, NULL);
241 res_str = stringprep_convert(utf8_str, charset, "UTF-8");
261 idn_prep_name(string, charset=default_charset)
266 char * res_str = NULL;
268 res_str = idn_prep(string, charset, "Nameprep");
281 idn_prep_kerberos5(string, charset=default_charset)
286 char * res_str = NULL;
288 res_str = idn_prep(string, charset, "KRBprep");
300 idn_prep_node(string, charset=default_charset)
305 char * res_str = NULL;
307 res_str = idn_prep(string, charset, "Nodeprep");
320 idn_prep_resource(string, charset=default_charset)
325 char * res_str = NULL;
327 res_str = idn_prep(string, charset, "Resourceprep");
340 idn_prep_plain(string, charset=default_charset)
345 char * res_str = NULL;
347 res_str = idn_prep(string, charset, "plain");
360 idn_prep_trace(string, charset=default_charset)
365 char * res_str = NULL;
367 res_str = idn_prep(string, charset, "trace");
380 idn_prep_sasl(string, charset=default_charset)
385 char * res_str = NULL;
387 res_str = idn_prep(string, charset, "SASLprep");
400 idn_prep_iscsi(string, charset=default_charset)
405 char * res_str = NULL;
407 res_str = idn_prep(string, charset, "ISCSIprep");
422 tld_check(string, errpos, ...)
428 char * charset = default_charset;
430 const Tld_table * tld_table = NULL;
433 char * utf8_str = NULL;
434 char * tmp_str = NULL;
439 if (ST(2) != &PL_sv_undef)
440 charset = (char*)SvPV(ST(2), c_len);
444 tld = (char*)SvPV(ST(3), c_len);
445 tld_table = tld_default_table(tld, NULL);
447 utf8_str = stringprep_convert(string, "UTF-8", charset);
452 res = stringprep_profile(utf8_str, &tmp_str, "Nameprep", 0);
454 if (res != STRINGPREP_OK)
460 q = stringprep_utf8_to_ucs4(tmp_str, -1, &len);
466 res = tld_check_4t(q, len, &errpos, tld_table);
471 res = tld_check_8z(tmp_str, &errpos, NULL);
474 if (res == TLD_SUCCESS)
478 else if (res == TLD_INVALID)
495 char *res_str = NULL;
498 res = tld_get_z(string, &res_str);
499 if (res == TLD_SUCCESS)
518 const Tld_table * tld_table = NULL;
521 const Tld_table_element *e;
524 tld_table = tld_default_table(tld, NULL);
527 rh = (HV *)sv_2mortal((SV *)newHV());
528 hv_store(rh, "name", 4, newSVpv(tld_table->name, 0), 0);
529 hv_store(rh, "version", 7, newSVpv(tld_table->version, 0), 0);
530 hv_store(rh, "nvalid", 6, newSVuv(tld_table->nvalid), 0);
531 ra = (AV *)sv_2mortal((SV *)newAV());
532 for (pos=0, e = tld_table->valid; pos<tld_table->nvalid; pos++,e++)
534 reh = (HV *)sv_2mortal((SV *)newHV());
535 hv_store(reh, "start", 5, newSVuv(e->start), 0);
536 hv_store(reh, "end", 3, newSVuv(e->end), 0);
537 av_push(ra, newRV((SV *)reh));
539 hv_store(rh, "valid", 5, newRV((SV*)ra), 0);
540 RETVAL = newRV((SV*)rh);
549 #endif /* #ifdef HAVE_TLD */