Add iconv_msg function.
This commit is contained in:
parent
aa5cc328f4
commit
af08198304
58
parsing.c
58
parsing.c
@ -6,6 +6,8 @@
|
||||
* (see COPYING for full license text)
|
||||
*/
|
||||
|
||||
#include <iconv.h>
|
||||
|
||||
#include "cgit.h"
|
||||
|
||||
int next_char(FILE *f)
|
||||
@ -176,6 +178,62 @@ void cgit_parse_url(const char *url)
|
||||
}
|
||||
}
|
||||
|
||||
static char *iconv_msg(char *msg, const char *encoding)
|
||||
{
|
||||
iconv_t msg_conv = iconv_open(PAGE_ENCODING, encoding);
|
||||
size_t inlen = strlen(msg);
|
||||
char *in;
|
||||
char *out;
|
||||
size_t inleft;
|
||||
size_t outleft;
|
||||
char *buf;
|
||||
char *ret;
|
||||
size_t buf_sz;
|
||||
int again, fail;
|
||||
|
||||
if(msg_conv == (iconv_t)-1)
|
||||
return NULL;
|
||||
|
||||
buf_sz = inlen * 2;
|
||||
buf = xmalloc(buf_sz+1);
|
||||
do {
|
||||
in = msg;
|
||||
inleft = inlen;
|
||||
|
||||
out = buf;
|
||||
outleft = buf_sz;
|
||||
iconv(msg_conv, &in, &inleft, &out, &outleft);
|
||||
|
||||
if(inleft == 0) {
|
||||
fail = 0;
|
||||
again = 0;
|
||||
} else if(inleft != 0 && errno == E2BIG) {
|
||||
fail = 0;
|
||||
again = 1;
|
||||
|
||||
buf_sz *= 2;
|
||||
free(buf);
|
||||
buf = xmalloc(buf_sz+1);
|
||||
} else {
|
||||
fail = 1;
|
||||
again = 0;
|
||||
}
|
||||
} while(again && !fail);
|
||||
|
||||
if(fail) {
|
||||
free(buf);
|
||||
ret = NULL;
|
||||
} else {
|
||||
buf = xrealloc(buf, out - buf);
|
||||
*out = 0;
|
||||
ret = buf;
|
||||
}
|
||||
|
||||
iconv_close(msg_conv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
char *substr(const char *head, const char *tail)
|
||||
{
|
||||
char *buf;
|
||||
|
Loading…
Reference in New Issue
Block a user