mirror of
https://git.zx2c4.com/cgit
synced 2024-11-22 08:28:42 +00:00
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)
|
* (see COPYING for full license text)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <iconv.h>
|
||||||
|
|
||||||
#include "cgit.h"
|
#include "cgit.h"
|
||||||
|
|
||||||
int next_char(FILE *f)
|
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 *substr(const char *head, const char *tail)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
|
Loading…
Reference in New Issue
Block a user