Include "cos-print.h".
[chise/concord.git] / print.c
1 /* Copyright (C) 2013 MORIOKA Tomohiko
2    This file is part of the CONCORD Library.
3
4    The CONCORD Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The CONCORD Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the CONCORD Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 #include <stdlib.h>
20 #include "cos-print.h"
21
22 int
23 cos_encode_char_as_utf8 (int cid, unsigned char *dest, size_t size)
24 {
25   int i = 0;
26
27   if (cid <= 0x7F)
28     {
29       if (size >= 2)
30         {
31           dest[i++] = cid;
32           dest[i] = '\0';
33           return i;
34         }
35       else
36         return -1;
37     }
38   else if (cid <= 0x7FF)
39     {
40       if (size >= 3)
41         {
42           dest[i++] = (cid >> 6) | 0xC0;
43           dest[i++] = (cid & 0x3F) | 0x80;
44           dest[i] = '\0';
45           return i;
46         }
47       else
48         return -1;
49     }
50   else if (cid <= 0xFFFF)
51     {
52       if (size >= 4)
53         {
54           dest[i++] = (cid >> 12) | 0xE0;
55           dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
56           dest[i++]=  (cid        & 0x3F) | 0x80;
57           dest[i] = '\0';
58           return i;
59         }
60       else
61         return -1;
62     }
63   else if (cid <= 0x1FFFFF)
64     {
65       if (size >= 5)
66         {
67           dest[i++]=  (cid >> 18) | 0xF0;
68           dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
69           dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
70           dest[i++]=  (cid        & 0x3F) | 0x80;
71           dest[i] = '\0';
72           return i;
73         }
74       else
75         return -1;
76     }
77   else if (cid <= 0x3FFFFFF)
78     {
79       if (size >= 6)
80         {
81           dest[i++]=  (cid >> 24) | 0xF8;
82           dest[i++]= ((cid >> 18) & 0x3F) | 0x80;
83           dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
84           dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
85           dest[i++]=  (cid        & 0x3F) | 0x80;
86           dest[i] = '\0';
87           return i;
88         }
89       else
90         return -1;
91     }
92   else
93     {
94       if (size >= 7)
95         {
96           dest[i++]=  (cid >> 30) | 0xFC;
97           dest[i++]= ((cid >> 24) & 0x3F) | 0x80;
98           dest[i++]= ((cid >> 18) & 0x3F) | 0x80;
99           dest[i++]= ((cid >> 12) & 0x3F) | 0x80;
100           dest[i++]= ((cid >>  6) & 0x3F) | 0x80;
101           dest[i++]=  (cid        & 0x3F) | 0x80;
102           dest[i] = '\0';
103           return i;
104         }
105       else
106         return -1;
107     }
108 }