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