]> git.sur5r.net Git - openldap/blob - libraries/libldap/utf-8.c
Initial UTF-8 routines.
[openldap] / libraries / libldap / utf-8.c
1 /* $OpenLDAP$ */
2 /*
3  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
4  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
5  */
6
7 /*
8  * Basic UTF-8 routines
9  *
10  * These routines are not optimized.
11  */
12
13 #include "portable.h"
14
15 #include <stdio.h>
16
17 #include <ac/stdlib.h>
18
19 #include <ac/socket.h>
20 #include <ac/string.h>
21 #include <ac/time.h>
22
23 #include "ldap-int.h"
24 #include "ldap_defaults.h"
25
26 #define UTF8_ISASCII(u) ( !((u) & ~0x7f) )
27
28 ber_len_t ldap_utf8_bytes( const char * p )
29 {
30         ber_len_t bytes;
31
32         for( bytes=0; p[bytes] ; bytes++ ) {
33                 /* EMPTY */ ;
34         }
35
36         return bytes;
37 }
38
39 ber_len_t ldap_utf8_chars( const char * p )
40 {
41         /* could be optimized */
42         int chars=0;
43         int i=0;
44         unsigned char *u;
45
46         for( i=0; u[i]; i++) {
47                 if ( u[i] & 0xC0 != 0x80 ) chars++;
48         }
49
50         return i;
51 }
52
53 int ldap_utf8_charlen( const char * p )
54 {
55         unsigned c;
56
57         if ((c & 0xFE ) == 0xFC) {
58                 return 6;
59         }
60         if ((c & 0xFC ) == 0xF8) {
61                 return 5;
62         }
63         if ((c & 0xF8 ) == 0xF0) {
64                 return 4;
65         }
66         if ((c & 0xF0 ) == 0xE0) {
67                 return 3;
68         }
69         if ((c & 0xE0 ) == 0xC0) {
70                 return 2;
71         }
72         if ((c & 0x80 ) == 0x80) {
73                 /* INVALID */
74                 return 0;
75         }
76
77         return 1;
78 }
79
80 char* ldap_utf8_next( char * p )
81 {
82         int len = ldap_utf8_charlen( p );
83
84         return len ? &p[len] : NULL;
85 }
86
87 char* ldap_utf8_prev( char * p )
88 {
89         int i;
90         unsigned char *u = p;
91
92         for( i = -1; i >= -6 ; i-- ) {
93                 if ( u[i] & 0xC0 != 0x80 ) return &p[i];
94         }
95
96         return NULL;
97 }
98
99 int ldap_utf8_isascii( const char * p )
100 {
101         unsigned c = * (const unsigned char *) p;
102         return UTF8_ISASCII(c);
103 }
104
105 int ldap_utf8_isdigit( const char * p )
106 {
107         unsigned c = * (const unsigned char *) p;
108
109         if(!UTF8_ISASCII(c)) return 0;
110
111         return c >= '0' && c <= '9';
112 }
113
114 int ldap_utf8_isxdigit( const char * p )
115 {
116         unsigned c = * (const unsigned char *) p;
117
118         if(!UTF8_ISASCII(c)) return 0;
119
120         return ( c >= '0' && c <= '9' )
121                 || ( c >= 'A' && c <= 'F' )
122                 || ( c >= 'a' && c <= 'f' );
123 }
124
125 int ldap_utf8_isalpha( const char * p )
126 {
127         unsigned c = * (const unsigned char *) p;
128
129         if(!UTF8_ISASCII(c)) return 0;
130
131         return ( c >= 'A' && c <= 'Z' )
132                 || ( c >= 'a' && c <= 'z' );
133 }
134
135 int ldap_utf8_isalnum( const char * p )
136 {
137         unsigned c = * (const unsigned char *) p;
138
139         if(!UTF8_ISASCII(c)) return 0;
140
141         return ( c >= '0' && c <= '9' )
142                 || ( c >= 'A' && c <= 'Z' )
143                 || ( c >= 'a' && c <= 'z' );
144 }
145
146 int ldap_utf8_islower( const char * p )
147 {
148         unsigned c = * (const unsigned char *) p;
149
150         if(!UTF8_ISASCII(c)) return 0;
151
152         return ( c >= 'a' && c <= 'z' );
153 }
154
155 int ldap_utf8_isupper( const char * p )
156 {
157         unsigned c = * (const unsigned char *) p;
158
159         if(!UTF8_ISASCII(c)) return 0;
160
161         return ( c >= 'A' && c <= 'Z' );
162 }
163
164 int ldap_utf8_isspace( const char * p )
165 {
166         unsigned c = * (const unsigned char *) p;
167
168         if(!UTF8_ISASCII(c)) return 0;
169
170         switch(c) {
171         case ' ':
172         case '\t':
173         case '\n':
174         case '\r':
175         case '\v':
176         case '\f':
177                 return 1;
178         }
179
180         return 0;
181 }