/* Copyright (C) 2001-2002 Kenichi Suto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include "global.h" #include #include #include void hex_dump(gchar *buf){ gchar *p =buf; while(*p != '\0'){ g_print("%02x ", (unsigned char)*p); p++; } g_print("\n"); } static gchar *locale2jis(gchar *inbuf){ iconv_t cd; const char* ocode = "euc-jp"; const char* icode; // const char* ocode = "iso-2022-jp"; // const char* ocode = "shift_jis"; int r = 0; size_t isize; size_t osize; char *outbuf; guchar *eucbuf=NULL; guchar *euc_p; guchar *jisbuf=NULL; guchar *jis_p; gint i; icode = nl_langinfo(CODESET); if(strcasecmp(icode, "EUC-JP") == 0){ euc_p = inbuf; } else { cd = iconv_open( ocode, icode ); if( (int)cd == -1 ) return(NULL); isize = strlen(inbuf); osize = isize * 4; eucbuf = outbuf = malloc(osize); r = iconv(cd, &inbuf, &isize, &outbuf, &osize); iconv_close(cd); if(r == 1){ perror("iconv"); return(NULL); } euc_p = eucbuf; } jis_p = jisbuf = malloc(strlen(euc_p)*2); while(*euc_p != '\0'){ if(isalnum(*euc_p)){ *jis_p = 0x23; jis_p ++; *jis_p = *euc_p; jis_p ++; } else if(iseuckanji(euc_p)){ *jis_p = *euc_p - 0x80; jis_p ++; euc_p++; *jis_p = *euc_p - 0x80; jis_p ++; } else { *jis_p = 0x21; jis_p ++; *jis_p = 0x29; jis_p ++; } euc_p ++; } *jis_p = '\0'; if(eucbuf != NULL) free(eucbuf); for(i=0;;i++){ if(jisbuf[i] == '\0') break; } return(jisbuf); } static gchar *do_iconv(const gchar *icode, const gchar *ocode, gchar *inbuf){ iconv_t cd; int r = 0; int buflen; size_t isize; size_t osize; char *outbuf; char *result; cd = iconv_open( ocode, icode ); if( (int)cd == -1 ) return(NULL); hex_dump(inbuf); isize = strlen(inbuf); osize = buflen = isize * 2; result = outbuf = malloc(osize); r = iconv(cd, &inbuf, &isize, &outbuf, &osize); iconv_close(cd); result[buflen - osize] = '\0'; g_print("buflen = %d osize = %d\n", buflen, osize); if(r != 0){ perror("iconv"); result[0] = '\0'; return(result); } hex_dump(result); return(result); } gchar *locale2euc(gchar *inbuf){ const char* icode; const char* ocode = "euc-jp"; // "iso-2022-jp" or "shift_jis"; icode = nl_langinfo(CODESET); if(strcasecmp(icode, "EUC-JP") == 0){ return(strdup(inbuf)); } return(do_iconv(icode, ocode, inbuf)); } gchar *euc2locale(gchar *inbuf){ const char* icode = "euc-jp"; // "iso-2022-jp" or "shift_jis"; const char* ocode; ocode = nl_langinfo(CODESET); if(strcasecmp(ocode, "EUC-JP") == 0){ return(strdup(inbuf)); } return(do_iconv(icode, ocode, inbuf)); } inline gboolean isjisp(gchar *buff){ g_assert(buff != NULL); if((buff[0] >= 0x21) && (buff[0] <= 0x74) && (buff[1] >= 0x21) && (buff[1] <= 0x7E)) return(TRUE); return(FALSE); }