FreeBASIC  0.91.0
utf_convfrom_char.c
Go to the documentation of this file.
1 /* ascii to UTF conversion */
2 
3 #include "fb.h"
4 
5 static char *hToUTF8( const char *src, ssize_t chars, char *dst, ssize_t *bytes )
6 {
7  if( chars > 0 )
8  {
9  if( dst == NULL )
10  {
11  dst = malloc( chars * 2 );
12  if( dst == NULL )
13  return NULL;
14  }
15 
16  fb_hCharToUTF8( src, chars, dst, bytes );
17  }
18  else
19  *bytes = 0;
20 
21  return dst;
22 }
23 
24 static char *hToUTF16( const char *src, ssize_t chars, char *dst, ssize_t *bytes )
25 {
26  UTF_16 *p;
27 
28  /* !!!FIXME!!! only litle-endian supported */
29 
30  *bytes = chars * sizeof( UTF_16 );
31 
32  if( chars > 0 )
33  {
34  if( dst == NULL )
35  {
36  dst = malloc( chars * sizeof( UTF_16 ) );
37  if( dst == NULL )
38  return NULL;
39  }
40  }
41 
42  p = (UTF_16 *)dst;
43  while( chars > 0 )
44  {
45  *p++ = (unsigned char)*src++;
46  --chars;
47  }
48 
49  return dst;
50 }
51 
52 static char *hToUTF32( const char *src, ssize_t chars, char *dst, ssize_t *bytes )
53 {
54  UTF_32 *p;
55 
56  /* !!!FIXME!!! only litle-endian supported */
57 
58  *bytes = chars * sizeof( UTF_32 );
59 
60  if( chars > 0 )
61  {
62  if( dst == NULL )
63  {
64  dst = malloc( chars * sizeof( UTF_32 ) );
65  if( dst == NULL )
66  return NULL;
67  }
68  }
69 
70  p = (UTF_32 *)dst;
71  while( chars > 0 )
72  {
73  *p++ = (unsigned char)*src++;
74  --chars;
75  }
76 
77  return dst;
78 }
79 
80 char *fb_CharToUTF
81  (
82  FB_FILE_ENCOD encod,
83  const char *src,
84  ssize_t chars,
85  char *dst,
86  ssize_t *bytes
87  )
88 {
89  switch( encod )
90  {
91  case FB_FILE_ENCOD_UTF8:
92  return hToUTF8( src, chars, dst, bytes );
93 
95  return hToUTF16( src, chars, dst, bytes );
96 
98  return hToUTF32( src, chars, dst, bytes );
99 
100  default:
101  return NULL;
102  }
103 }