forked from thomasklingbeil/chan_datacard
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathchar_conv.c
113 lines (90 loc) · 2.23 KB
/
char_conv.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Copyright (C) 2009 - 2010 Artem Makhutov
* Artem Makhutov <[email protected]>
* http://www.makhutov.org
*
* This functions are used to convert hex encoded
* UCS-2 to UTF-8 and vice versa.
*/
#include <stdio.h>
#include <string.h>
#include <iconv.h>
#include "char_conv.h"
size_t convert_string(char *in, size_t in_length, char *out, size_t out_length, char *from, char *to)
{
int res;
size_t inbytesleft = in_length;
size_t outbytesleft = out_length;
char *in_ptr = &in[0];
char *out_ptr = &out[0];
iconv_t cd;
if (out_length-in_length<0) {
return -1;
}
if ((cd = iconv_open(to, from)) == (iconv_t)(-1)) {
return -2;
}
res = iconv(cd, &in_ptr, &inbytesleft, &out_ptr, &outbytesleft);
if (res < 0) {
return -3;
}
iconv_close(cd);
out_ptr[0]='\0';
return (out_length-outbytesleft);
}
size_t hexstr_to_ucs2char(char *in, size_t in_length, char *out, size_t out_length)
{
size_t i = 0;
size_t x = 0;
int hexval = 0;
char buf[] = " ";
if ((out_length*2)<in_length) return -1;
for (i=0;i<in_length/2;i++) {
buf[0] = in[(i*2)];
buf[1] = in[(i*2)+1];
if (sscanf(buf, "%x", &hexval) != 1) {
return -1;
}
out[x] = hexval;
x++;
}
x = (x - (x%2));
return x;
}
size_t ucs2char_to_hexstr(char *in, size_t in_length, char *out, size_t out_length)
{
size_t i = 0;
size_t x = 0;
char buf[] = " ";
if ((out_length*4)<in_length) return -1;
for (i=0;i<in_length;i++) {
snprintf(buf,sizeof(buf),"%X",in[i]);
if (buf[1] == '\0') {
buf[1] = buf[0];
buf[0] = '0';
}
out[x] = buf[0];
out[x+1] = buf[1];
x=x+2;
}
out[x] = '\0';
return x;
}
size_t hexstr_ucs2_to_utf8(char *in, size_t in_length, char *out, size_t out_length)
{
char buf[out_length];
size_t res;
if ((out_length*2)<in_length) return -1;
if ((res = hexstr_to_ucs2char(in, in_length, buf, out_length)) < 0) return res;
res = convert_string(buf, res, out, out_length, "UCS-2BE", "UTF-8");
return res;
}
size_t utf8_to_hexstr_ucs2(char *in, size_t in_length, char *out, size_t out_length)
{
char buf[out_length];
size_t res;
if (out_length<in_length) return -1;
if ((res = convert_string(in, in_length, buf, out_length, "UTF-8", "UCS-2BE")) < 0) return res;
res = ucs2char_to_hexstr(buf, res, out, out_length);
return res;
}