chiark / gitweb /
*** empty log message ***
[sympathy.git] / src / utf8.c
1 /*
2  * utf8.c:
3  *
4  * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
5  * All rights reserved.
6  *
7  */
8
9 static char rcsid[] = "$Id$";
10
11 /*
12  * $Log$
13  * Revision 1.3  2008/02/23 11:48:37  james
14  * *** empty log message ***
15  *
16  * Revision 1.2  2008/02/22 23:39:27  james
17  * *** empty log message ***
18  *
19  * Revision 1.1  2008/02/22 19:12:05  james
20  * *** empty log message ***
21  *
22  */
23
24 #include "project.h"
25
26
27 void
28 utf8_flush (Context * c)
29 {
30   UTF8 *u = c->u;
31   int i;
32
33   switch (u->utf_ptr)
34     {
35     case 1:
36       log_f (c->l, "%s:%d invalid utf-8 sequence: \\%03o",
37              __FILE__, __LINE__, u->utf_buf[0]);
38       break;
39     case 2:
40       log_f (c->l, "%s:%d invalid utf-8 sequence: \\%03o \\%03o",
41              __FILE__, __LINE__, u->utf_buf[0], u->utf_buf[1]);
42       break;
43     case 3:
44       log_f (c->l, "%s:%d invalid utf-8 sequence: \\%03o \\%03o \\%03o",
45              __FILE__, __LINE__, u->utf_buf[0], u->utf_buf[1], u->utf_buf[2]);
46       break;
47     case 4:
48       log_f (c->l,
49              "%s:%d invalid utf-8 sequence: \\%03o \\%03o \\%03o \\%03o",
50              __FILE__, __LINE__,
51              u->utf_buf[0], u->utf_buf[1], u->utf_buf[2], u->utf_buf[3]);
52       break;
53     }
54
55   for (i = 0; i < u->utf_ptr; ++i)
56     vt102_parse_char (c, u->utf_buf[i]);
57
58   u->utf_ptr = 0;
59   u->in_utf8 = 0;
60 }
61
62 void
63 utf8_parse (Context * c, int ch)
64 {
65   UTF8 *u = c->u;
66
67   if (ch == SYM_CHAR_RESET)
68     {
69       u->in_utf8 = 0;
70       vt102_parse_char (c, ch);
71       return;
72     }
73
74   if (!u->in_utf8)
75     {
76       /*FIXME: for the moment we bodge utf8 support */
77       if (ch == 0xb9)
78         {                       /*CSI, not a valid utf8 start char */
79           vt102_parse_char (c, ch);
80         }
81       else if ((ch & 0xe0) == 0xc0)
82         {                       /*Start of two byte unicode sequence */
83           u->in_utf8 = 1;
84           u->utf_ptr = 0;
85           u->utf_buf[u->utf_ptr++] = ch;
86           u->ch = (ch & 0x1f) << 6;
87           u->sh = 0;
88         }
89       else if ((ch & 0xf0) == 0xe0)
90         {                       /*Start of three byte unicode sequence */
91           u->in_utf8 = 2;
92           u->utf_ptr = 0;
93           u->utf_buf[u->utf_ptr++] = ch;
94           u->ch = (ch & 0x0f) << 12;
95           u->sh = 6;
96         }
97       else if ((ch & 0xf8) == 0xf0)
98         {
99           u->in_utf8 = 3;
100           u->utf_ptr = 0;
101           u->utf_buf[u->utf_ptr++] = ch;
102           u->ch = (ch & 0x07) << 18;
103           u->sh = 12;
104         }
105       else
106         {
107           vt102_parse_char (c, ch);
108         }
109     }
110   else
111     {
112       if ((ch & 0xc0) != 0x80)
113         {
114           utf8_flush (c);
115           vt102_parse_char (c, ch);
116         }
117       else
118         {
119           u->utf_buf[u->utf_ptr++] = ch;
120           u->ch |= (ch & 0x3f) << u->sh;
121           u->sh -= 6;
122           u->in_utf8--;
123
124           if (!u->in_utf8)
125             vt102_parse_char (c, ch);
126         }
127     }
128 }
129
130
131
132 UTF8 *
133 utf8_new (void)
134 {
135   UTF8 *ret;
136
137   ret = (UTF8 *) malloc (sizeof (UTF8));
138
139   ret->in_utf8 = 0;
140
141 }