charset.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:3k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* plugin_common - Routines common to several plugins
  2.  * Copyright (C) 2002,2003,2004,2005  Josh Coalson
  3.  *
  4.  * Only slightly modified charset.c from:
  5.  *  EasyTAG - Tag editor for MP3 and OGG files
  6.  *  Copyright (C) 1999-2001  H鍁ard Kv錶en <havardk@xmms.org>
  7.  *
  8.  * This program is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License
  10.  * as published by the Free Software Foundation; either version 2
  11.  * of the License, or (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this program; if not, write to the Free Software
  20.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <errno.h>
  26. #ifdef HAVE_CONFIG_H
  27. #include <config.h>
  28. #endif
  29. #ifdef HAVE_ICONV
  30. #include <iconv.h>
  31. #endif
  32. #ifdef HAVE_LANGINFO_CODESET
  33. #include <langinfo.h>
  34. #endif
  35. #include "charset.h"
  36. /*************
  37.  * Functions *
  38.  *************/
  39. char* FLAC_plugin__charset_get_current (void)
  40. {
  41. char *charset = getenv("CHARSET");
  42. #ifdef HAVE_LANGINFO_CODESET
  43. if (!charset)
  44. charset = nl_langinfo(CODESET);
  45. #endif
  46. if (!charset)
  47. charset = "ISO-8859-1";
  48. return charset;
  49. }
  50. #ifdef HAVE_ICONV
  51. char* FLAC_plugin__charset_convert_string (const char *string, char *from, char *to)
  52. {
  53. size_t outleft, outsize, length;
  54. iconv_t cd;
  55. char *out, *outptr;
  56. const char *input = string;
  57. if (!string)
  58. return NULL;
  59. length = strlen(string);
  60. if ((cd = iconv_open(to, from)) == (iconv_t)-1)
  61. {
  62. #ifdef DEBUG
  63. fprintf(stderr, "convert_string(): Conversion not supported. Charsets: %s -> %s", from, to);
  64. #endif
  65. return strdup(string);
  66. }
  67. /* Due to a GLIBC bug, round outbuf_size up to a multiple of 4 */
  68. /* + 1 for nul in case len == 1 */
  69. outsize = ((length + 3) & ~3) + 1;
  70. out = (char*)malloc(outsize);
  71. outleft = outsize - 1;
  72. outptr = out;
  73. retry:
  74. if (iconv(cd, (char**)&input, &length, &outptr, &outleft) == -1)
  75. {
  76. int used;
  77. switch (errno)
  78. {
  79. case E2BIG:
  80. used = outptr - out;
  81. outsize = (outsize - 1) * 2 + 1;
  82. out = realloc(out, outsize);
  83. outptr = out + used;
  84. outleft = outsize - 1 - used;
  85. goto retry;
  86. case EINVAL:
  87. break;
  88. case EILSEQ:
  89. /* Invalid sequence, try to get the rest of the string */
  90. input++;
  91. length = strlen(input);
  92. goto retry;
  93. default:
  94. #ifdef DEBUG
  95. fprintf(stderr, "convert_string(): Conversion failed. Inputstring: %s; Error: %s", string, strerror(errno));
  96. #endif
  97. break;
  98. }
  99. }
  100. *outptr = '';
  101. iconv_close(cd);
  102. return out;
  103. }
  104. #else
  105. char* FLAC_plugin__charset_convert_string (const char *string, char *from, char *to)
  106. {
  107. (void)from, (void)to;
  108. if (!string)
  109. return NULL;
  110. return strdup(string);
  111. }
  112. #endif
  113. #ifdef HAVE_ICONV
  114. int FLAC_plugin__charset_test_conversion (char *from, char *to)
  115. {
  116. iconv_t cd;
  117. if ((cd=iconv_open(to,from)) == (iconv_t)-1)
  118. {
  119. /* Conversion not supported */
  120. return 0;
  121. }
  122. iconv_close(cd);
  123. return 1;
  124. }
  125. #else
  126. int FLAC_plugin__charset_test_conversion (char *from, char *to)
  127. {
  128. (void)from, (void)to;
  129. return 1;
  130. }
  131. #endif