extern void *iconv_open(char *tocode, char *fromcode); function psi\iconv_open(string $to, string $from) : object { let tocode = strval($to); let fromcode = strval($from); return to_object(iconv_open); } extern size_t iconv (void *cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); function psi\iconv(object $iconv, string &$inbuf, string &$outbuf) : int { let cd = objval($iconv); let inbuf = &strval($inbuf); let inbytesleft = &strlen($inbuf); let outbytesleft = &8192; let outbuf = &calloc(1, 8192); temp result = *outbuf; return to_int(iconv); set $inbuf = to_string(*inbuf, *inbytesleft); set $outbuf = to_string(result, 8192 - *outbytesleft); } extern int iconv_close(void *cd); function psi\iconv_close(object $iconv) : int { let cd = objval($iconv); return to_int(iconv_close); }