Files
nunuhara_xsystem4/src/tools/conv.c
T
Nunuhara Cabbage b7c12b1ce0 tools: allow changing input/output text encoding
Use iconv instead of utfsjis.h so that text encodings other than UTF-8
and SJIS can be used. For three reasons:

* to allow using other encodings for dumped files (e.g. UTF-16, SJIS)
* to support existing Chinese translations, which use GBK-encoded text
* to support theoretical translations to other languages that can't be
  represented in SJIS
2020-02-28 20:18:28 -08:00

50 lines
1.4 KiB
C

/* Copyright (C) 2019 Nunuhara Cabbage <nunuhara@haniwa.technology>
*
* 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, see <http://gnu.org/licenses/>.
*/
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <iconv.h>
#include "system4.h"
char *convert_text(iconv_t cd, const char *str)
{
size_t inbytesleft = strlen(str);
char *inbuf = (char*)str;
size_t outbuf_size = inbytesleft;
size_t outbytesleft = outbuf_size;
char *outbuf = xmalloc(outbuf_size+1);
char *outptr = outbuf;
while (inbytesleft) {
if (iconv(cd, &inbuf, &inbytesleft, &outptr, &outbytesleft) == (size_t)-1 && errno != E2BIG) {
ERROR("iconv: %s", strerror(errno));
}
// reallocate outbuf
size_t out_index = outbuf_size - outbytesleft;
outbytesleft += outbuf_size;
outbuf_size *= 2;
outbuf = xrealloc(outbuf, outbuf_size+1);
outptr = outbuf + out_index;
}
*outptr = '\0';
return outbuf;
}