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 } 134