Guest User

Untitled

a guest
Feb 21st, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.20 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <iconv.h>
  5.  
  6. int
  7. iconv_convert(char **outstr, char *instr, const char *tocode, const char *fromcode)
  8. {
  9. iconv_t cd;
  10. size_t ins;
  11. char *in;
  12. size_t outbufsiz, outs;
  13. char *outbuf, *out;
  14. size_t ret = 0, irr = 0;
  15. size_t idx = 0;
  16. size_t nconv = 0;
  17. char *str = NULL;
  18.  
  19. cd = iconv_open(tocode, fromcode);
  20. if (cd == (iconv_t)-1)
  21. return -1;
  22.  
  23. ins = strlen(instr);
  24. in = instr;
  25.  
  26. outbufsiz = BUFSIZ;
  27. if ((out = outbuf = malloc(outbufsiz)) == NULL)
  28. return -1;
  29.  
  30. while (ins > 0) {
  31. out = outbuf;
  32. outs = outbufsiz;
  33.  
  34. ret = iconv(cd, &in, &ins, &out, &outs);
  35. nconv = outbufsiz - outs;
  36. if (ret == (size_t)-1) {
  37. switch (errno) {
  38. case EINVAL:
  39. goto err;
  40. case E2BIG:
  41. outbufsiz *= 2;
  42. out = realloc(outbuf, outbufsiz);
  43. if (!out)
  44. goto err;
  45. outbuf = out;
  46. break;
  47. default:
  48. goto err;
  49. }
  50. } else {
  51. irr += ret;
  52. }
  53. if (nconv > 0) {
  54. char *newstr;
  55.  
  56. if (str == NULL)
  57. newstr = malloc(nconv + 1);
  58. else
  59. newstr = realloc(str, idx + nconv + 1);
  60. if (!newstr)
  61. goto err;
  62. str = newstr;
  63. memcpy(&str[idx], outbuf, nconv);
  64. idx += nconv;
  65. }
  66. }
  67. do {
  68. out = outbuf;
  69. outs = outbufsiz;
  70.  
  71. ret = iconv(cd, NULL, NULL, &out, &outs);
  72. nconv = outbufsiz - outs;
  73.  
  74. if (ret == (size_t)-1) {
  75. outbufsiz *= 2;
  76. out = realloc(outbuf, outbufsiz);
  77. if (!out)
  78. goto err;
  79. outbuf = out;
  80. } else {
  81. irr += ret;
  82. }
  83. if (nconv > 0) {
  84. char *newstr;
  85.  
  86. if (str == NULL)
  87. newstr = malloc(nconv + 1);
  88. else
  89. newstr = realloc(str, idx + nconv + 1);
  90. if (!newstr)
  91. goto err;
  92. str = newstr;
  93. memcpy(&str[idx], outbuf, nconv);
  94. idx += nconv;
  95. }
  96. } while (ret == (size_t)-1);
  97.  
  98. if (str == NULL)
  99. str = strdup("");
  100. else
  101. str[idx] = '\0';
  102. if (!str)
  103. goto err;
  104.  
  105. *outstr = str;
  106. iconv_close(cd);
  107. return irr;
  108.  
  109. err:
  110. free(str);
  111. free(outbuf);
  112.  
  113. iconv_close(cd);
  114. return -1;
  115.  
  116. }
  117.  
  118. int
  119. main()
  120. {
  121. char *buf;
  122. int ret;
  123.  
  124. ret = iconv_convert(&buf, "こんにちはこんにちは!", "EUC-JP", "UTF-8");
  125. if (0 <= ret) {
  126. printf("%d: %s\n", ret, buf);
  127. free(buf);
  128. }
  129.  
  130. return 1;
  131. }
Add Comment
Please, Sign In to add comment