xref: /dragonfly/lib/libc/locale/gbk.c (revision d5f516c3)
1 /*-
2  * Copyright (c) 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Paul Borman at Krystal Technologies.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *	This product includes software developed by the University of
19  *	California, Berkeley and its contributors.
20  * 4. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  * $DragonFly: src/lib/libc/locale/Attic/gbk.c,v 1.2 2003/12/02 14:56:28 eirikn Exp $
36  */
37 
38 #include <sys/cdefs.h>
39 
40 #include <rune.h>
41 #include <stdlib.h>
42 #include <sys/types.h>
43 
44 rune_t  _GBK_sgetrune(const char *, size_t, char const **);
45 int     _GBK_sputrune(rune_t, char *, size_t, char **);
46 
47 int
48 _GBK_init(rl)
49 	_RuneLocale *rl;
50 {
51 	rl->sgetrune = _GBK_sgetrune;
52 	rl->sputrune = _GBK_sputrune;
53 	_CurrentRuneLocale = rl;
54 	__mb_cur_max = 2;
55 	return (0);
56 }
57 
58 static inline int
59 _gbk_check(c)
60 	u_int c;
61 {
62 	c &= 0xff;
63 	return ((c >= 0x80 && c <= 0xfe) ? 2 : 1);
64 }
65 
66 rune_t
67 _GBK_sgetrune(string, n, result)
68 	const char *string;
69 	size_t n;
70 	char const **result;
71 {
72 	rune_t rune = 0;
73 	int len;
74 
75 	if (n < 1 || (len = _gbk_check(*string)) > n) {
76 		if (result)
77 			*result = string;
78 		return (_INVALID_RUNE);
79 	}
80 	while (--len >= 0)
81 		rune = (rune << 8) | ((u_int)(*string++) & 0xff);
82 	if (result)
83 		*result = string;
84 	return rune;
85 }
86 
87 int
88 _GBK_sputrune(c, string, n, result)
89 	rune_t c;
90 	char *string, **result;
91 	size_t n;
92 {
93 	if (c & 0x8000) {
94 		if (n >= 2) {
95 			string[0] = (c >> 8) & 0xff;
96 			string[1] = c & 0xff;
97 			if (result)
98 				*result = string + 2;
99 			return (2);
100 		}
101 	}
102 	else {
103 		if (n >= 1) {
104 			*string = c & 0xff;
105 			if (result)
106 				*result = string + 1;
107 			return (1);
108 		}
109 	}
110 	if (result)
111 		*result = string;
112 	return (0);
113 
114 }
115 
116