]> pilppa.org Git - libcharencoding.git/blob - src/charencoding.c
libcharencoding: initial version
[libcharencoding.git] / src / charencoding.c
1 /**
2  * Copyright (c) 2009-2010 Mika Laitio <lamikr@pilppa.org>
3  *
4  * This file and library is covered by the LGPL version 3, read LICENSE for details.
5  *
6  * History:
7  * - Created charencoding.c on: Nov 25, 2009
8  */
9
10 #include <errno.h>
11 #include <stdarg.h>
12 #include <stdbool.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <string.h>
16 #include <iconv.h>
17
18 #include "internal/charencoding_internal.h"
19 #include "internal/utf8.h"
20
21 #define LOCALE_CHARSET_UTF8 "UTF-8"
22
23 static bool _locale_charset_utf8_check_initialized      = false;
24 static bool _locale_is_utf8                             = false;
25
26 bool is_utf8_locale()
27 {
28         const char *locale_charset;
29
30         if (_locale_charset_utf8_check_initialized == false) {
31                 locale_charset = get_locale_charset_alias();
32                 if (strcmp(locale_charset, LOCALE_CHARSET_UTF8) == 0) {
33                         _locale_is_utf8 = true;
34                 }
35                 else {
36                         _locale_is_utf8 = false;
37                 }
38                 _locale_charset_utf8_check_initialized = true;
39         }
40         return _locale_is_utf8;
41 }
42
43 char *str_encode(const char *src,
44                 const char *src_charset,
45                 const char *trgt_charset,
46                 int *err_flg)
47 {
48         iconv_t conversion_desc;
49         char    *ret_val;
50         int     cmp_res;
51         size_t  src_length;
52         size_t  trgt_length;
53
54         ret_val         = NULL;
55         *err_flg        = 0;
56         if (src != NULL) {
57                 cmp_res = strcasecmp(src_charset,
58                                  trgt_charset);
59                 if ((cmp_res == 0) ||
60                     (strlen(src) == 0)) {
61                         ret_val = strdup(src);
62                         if (ret_val == NULL) {
63                                 *err_flg        = ENOMEM;
64                         }
65                 }
66                 else {
67                         conversion_desc = iconv_open(trgt_charset,
68                                                 src_charset);
69                         if (conversion_desc != (iconv_t)-1) {
70                                 src_length      = strlen(src);
71                                 trgt_length     = 0;
72                                 ret_val         = str_iconv_encode(conversion_desc,
73                                                                 src,
74                                                                 src_length,
75                                                                 &trgt_length,
76                                                                 err_flg);
77                                 if (*err_flg == 0) {
78                                         *err_flg        = iconv_close(conversion_desc);
79                                 }
80                                 else {
81                                         if (ret_val != NULL) {
82                                                 free(ret_val);
83                                                 ret_val = NULL;
84                                         }
85                                 }
86                         }
87                         else {
88                                 *err_flg        = ENOMEM;
89                         }
90                 }
91         }
92         return ret_val;
93 }
94
95 char *utf8_encode(char *src,
96                 int *err_flg)
97 {
98         const char      *charset;
99         char            *ret_val;
100
101         ret_val = NULL;
102         if (src != NULL) {
103                 if (is_utf8_locale() == true) {
104                         ret_val = strdup(src);
105                 }
106                 else {
107                         charset = get_locale_charset_alias();
108                         ret_val = str_encode(src,
109                                         charset,
110                                         LOCALE_CHARSET_UTF8,
111                                         err_flg);
112                 }
113         }
114         return ret_val;
115 }
116
117 int utf8_printf(char *fmt, ...)
118 {
119         int     ret_val;
120         va_list args;
121
122         va_start(args, fmt);
123         {
124                 ret_val = utf8_vprintf(fmt, args);
125         }
126         va_end(args);
127         return ret_val;
128 }