Merge branch 'vendor/FILE'
[dragonfly.git] / lib / libc / citrus / citrus_bcs.c
1 /* $NetBSD: citrus_bcs.c,v 1.5 2005/05/14 17:55:42 tshiozak Exp $ */
2 /* $DragonFly: src/lib/libc/citrus/citrus_bcs.c,v 1.3 2008/04/10 10:21:01 hasso Exp $ */
3
4 /*-
5  * Copyright (c)2003 Citrus Project,
6  * All rights reserved.
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  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29
30 #include <sys/types.h>
31 #include <assert.h>
32 #include <stdlib.h>
33
34 #include "citrus_namespace.h"
35 #include "citrus_bcs.h"
36
37 /*
38  * case insensitive comparison between two C strings.
39  */
40 int
41 _citrus_bcs_strcasecmp(const char * __restrict str1,
42                        const char * __restrict str2)
43 {
44         int c1 = 1, c2 = 1;
45
46         while (c1 && c2 && c1 == c2) {
47                 c1 = _bcs_toupper(*str1++);
48                 c2 = _bcs_toupper(*str2++);
49         }
50
51         return ((c1 == c2) ? 0 : ((c1 > c2) ? 1 : -1));
52 }
53
54 /*
55  * case insensitive comparison between two C strings with limitation of length.
56  */
57 int
58 _citrus_bcs_strncasecmp(const char * __restrict str1,
59                         const char * __restrict str2, size_t sz)
60 {
61         int c1 = 1, c2 = 1;
62
63         while (c1 && c2 && c1 == c2 && sz != 0) {
64                 c1 = _bcs_toupper(*str1++);
65                 c2 = _bcs_toupper(*str2++);
66                 sz--;
67         }
68
69         return ((c1 == c2) ? 0 : ((c1 > c2) ? 1 : -1));
70 }
71
72 /*
73  * skip white space characters.
74  */
75 const char *
76 _citrus_bcs_skip_ws(const char *p)
77 {
78
79         while (*p && _bcs_isspace(*p))
80                 p++;
81
82         return (p);
83 }
84
85 /*
86  * skip non white space characters.
87  */
88 const char *
89 _citrus_bcs_skip_nonws(const char *p)
90 {
91
92         while (*p && !_bcs_isspace(*p))
93                 p++;
94
95         return (p);
96 }
97
98 /*
99  * skip white space characters with limitation of length.
100  */
101 const char *
102 _citrus_bcs_skip_ws_len(const char * __restrict p, size_t * __restrict len)
103 {
104
105         while (*p && *len > 0 && _bcs_isspace(*p)) {
106                 p++;
107                 (*len)--;
108         }
109
110         return (p);
111 }
112
113 /*
114  * skip non white space characters with limitation of length.
115  */
116 const char *
117 _citrus_bcs_skip_nonws_len(const char * __restrict p, size_t * __restrict len)
118 {
119
120         while (*p && *len > 0 && !_bcs_isspace(*p)) {
121                 p++;
122                 (*len)--;
123         }
124
125         return (p);
126 }
127
128 /*
129  * truncate trailing white space characters.
130  */
131 void
132 _citrus_bcs_trunc_rws_len(const char * __restrict p, size_t * __restrict len)
133 {
134
135         while (*len > 0 && _bcs_isspace(p[*len - 1]))
136                 (*len)--;
137 }
138
139 /*
140  * destructive transliterate to lowercase.
141  */
142 void
143 _citrus_bcs_convert_to_lower(char *s)
144 {
145         while (*s) {
146                 *s = _bcs_tolower(*s);
147                 s++;
148         }
149 }
150
151 /*
152  * destructive transliterate to uppercase.
153  */
154 void
155 _citrus_bcs_convert_to_upper(char *s)
156 {
157         while (*s) {
158                 *s = _bcs_toupper(*s);
159                 s++;
160         }
161 }