776203fda673d0ddde689cfc85c93376955510f4
[dragonfly.git] / lib / libc / citrus / citrus_bcs.c
1 /*      $NetBSD: src/lib/libc/citrus/citrus_bcs.c,v 1.4 2004/01/02 21:49:35 itojun Exp $        */
2 /*      $DragonFly: src/lib/libc/citrus/citrus_bcs.c,v 1.1 2005/03/11 23:33:53 joerg 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 int
38 _citrus_bcs_strcasecmp(const char * __restrict str1,
39                        const char * __restrict str2)
40 {
41         int c1 = 1, c2 = 1;
42
43         while (c1 && c2 && c1 == c2) {
44                 c1 = _bcs_toupper(*str1++);
45                 c2 = _bcs_toupper(*str2++);
46         }
47
48         return ((c1 == c2) ? 0 : ((c1 > c2) ? 1 : -1));
49 }
50
51 int
52 _citrus_bcs_strncasecmp(const char * __restrict str1,
53                         const char * __restrict str2, size_t sz)
54 {
55         int c1 = 1, c2 = 1;
56
57         while (c1 && c2 && c1 == c2 && sz != 0) {
58                 c1 = _bcs_toupper(*str1++);
59                 c2 = _bcs_toupper(*str2++);
60                 sz--;
61         }
62
63         return ((c1 == c2) ? 0 : ((c1 > c2) ? 1 : -1));
64 }
65
66 const char *
67 _citrus_bcs_skip_ws(const char *p)
68 {
69
70         while (*p && _bcs_isspace(*p))
71                 p++;
72
73         return (p);
74 }
75
76 const char *
77 _citrus_bcs_skip_nonws(const char *p)
78 {
79
80         while (*p && !_bcs_isspace(*p))
81                 p++;
82
83         return (p);
84 }
85
86 const char *
87 _citrus_bcs_skip_ws_len(const char * __restrict p, size_t * __restrict len)
88 {
89
90         while (*p && *len > 0 && _bcs_isspace(*p)) {
91                 p++;
92                 (*len)--;
93         }
94
95         return (p);
96 }
97
98 const char *
99 _citrus_bcs_skip_nonws_len(const char * __restrict p, size_t * __restrict len)
100 {
101
102         while (*p && *len > 0 && !_bcs_isspace(*p)) {
103                 p++;
104                 (*len)--;
105         }
106
107         return (p);
108 }
109
110 void
111 _citrus_bcs_trunc_rws_len(const char * __restrict p, size_t * __restrict len)
112 {
113
114         while (*len > 0 && _bcs_isspace(p[*len - 1]))
115                 (*len)--;
116 }
117
118 void
119 _citrus_bcs_convert_to_lower(char *s)
120 {
121         while (*s) {
122                 *s = _bcs_tolower(*s);
123                 s++;
124         }
125 }
126
127 void _citrus_bcs_convert_to_upper(char *s)
128 {
129         while (*s) {
130                 *s = _bcs_toupper(*s);
131                 s++;
132         }
133 }