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