1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/nsprpub/lib/libc/src/strcase.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,170 @@ 1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "plstr.h" 1.10 +#include <string.h> 1.11 + 1.12 +static const unsigned char uc[] = 1.13 +{ 1.14 + '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007', 1.15 + '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017', 1.16 + '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027', 1.17 + '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037', 1.18 + ' ', '!', '"', '#', '$', '%', '&', '\'', 1.19 + '(', ')', '*', '+', ',', '-', '.', '/', 1.20 + '0', '1', '2', '3', '4', '5', '6', '7', 1.21 + '8', '9', ':', ';', '<', '=', '>', '?', 1.22 + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 1.23 + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 1.24 + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 1.25 + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', 1.26 + '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 1.27 + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 1.28 + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 1.29 + 'X', 'Y', 'Z', '{', '|', '}', '~', '\177', 1.30 + 0200, 0201, 0202, 0203, 0204, 0205, 0206, 0207, 1.31 + 0210, 0211, 0212, 0213, 0214, 0215, 0216, 0217, 1.32 + 0220, 0221, 0222, 0223, 0224, 0225, 0226, 0227, 1.33 + 0230, 0231, 0232, 0233, 0234, 0235, 0236, 0237, 1.34 + 0240, 0241, 0242, 0243, 0244, 0245, 0246, 0247, 1.35 + 0250, 0251, 0252, 0253, 0254, 0255, 0256, 0257, 1.36 + 0260, 0261, 0262, 0263, 0264, 0265, 0266, 0267, 1.37 + 0270, 0271, 0272, 0273, 0274, 0275, 0276, 0277, 1.38 + 0300, 0301, 0302, 0303, 0304, 0305, 0306, 0307, 1.39 + 0310, 0311, 0312, 0313, 0314, 0315, 0316, 0317, 1.40 + 0320, 0321, 0322, 0323, 0324, 0325, 0326, 0327, 1.41 + 0330, 0331, 0332, 0333, 0334, 0335, 0336, 0337, 1.42 + 0340, 0341, 0342, 0343, 0344, 0345, 0346, 0347, 1.43 + 0350, 0351, 0352, 0353, 0354, 0355, 0356, 0357, 1.44 + 0360, 0361, 0362, 0363, 0364, 0365, 0366, 0367, 1.45 + 0370, 0371, 0372, 0373, 0374, 0375, 0376, 0377 1.46 +}; 1.47 + 1.48 +PR_IMPLEMENT(PRIntn) 1.49 +PL_strcasecmp(const char *a, const char *b) 1.50 +{ 1.51 + const unsigned char *ua = (const unsigned char *)a; 1.52 + const unsigned char *ub = (const unsigned char *)b; 1.53 + 1.54 + if( ((const char *)0 == a) || (const char *)0 == b ) 1.55 + return (PRIntn)(a-b); 1.56 + 1.57 + while( (uc[*ua] == uc[*ub]) && ('\0' != *a) ) 1.58 + { 1.59 + a++; 1.60 + ua++; 1.61 + ub++; 1.62 + } 1.63 + 1.64 + return (PRIntn)(uc[*ua] - uc[*ub]); 1.65 +} 1.66 + 1.67 +PR_IMPLEMENT(PRIntn) 1.68 +PL_strncasecmp(const char *a, const char *b, PRUint32 max) 1.69 +{ 1.70 + const unsigned char *ua = (const unsigned char *)a; 1.71 + const unsigned char *ub = (const unsigned char *)b; 1.72 + 1.73 + if( ((const char *)0 == a) || (const char *)0 == b ) 1.74 + return (PRIntn)(a-b); 1.75 + 1.76 + while( max && (uc[*ua] == uc[*ub]) && ('\0' != *a) ) 1.77 + { 1.78 + a++; 1.79 + ua++; 1.80 + ub++; 1.81 + max--; 1.82 + } 1.83 + 1.84 + if( 0 == max ) return (PRIntn)0; 1.85 + 1.86 + return (PRIntn)(uc[*ua] - uc[*ub]); 1.87 +} 1.88 + 1.89 +PR_IMPLEMENT(char *) 1.90 +PL_strcasestr(const char *big, const char *little) 1.91 +{ 1.92 + PRUint32 ll; 1.93 + 1.94 + if( ((const char *)0 == big) || ((const char *)0 == little) ) return (char *)0; 1.95 + if( ((char)0 == *big) || ((char)0 == *little) ) return (char *)0; 1.96 + 1.97 + ll = strlen(little); 1.98 + 1.99 + for( ; *big; big++ ) 1.100 + /* obvious improvement available here */ 1.101 + if( 0 == PL_strncasecmp(big, little, ll) ) 1.102 + return (char *)big; 1.103 + 1.104 + return (char *)0; 1.105 +} 1.106 + 1.107 +PR_IMPLEMENT(char *) 1.108 +PL_strcaserstr(const char *big, const char *little) 1.109 +{ 1.110 + const char *p; 1.111 + PRUint32 bl, ll; 1.112 + 1.113 + if( ((const char *)0 == big) || ((const char *)0 == little) ) return (char *)0; 1.114 + if( ((char)0 == *big) || ((char)0 == *little) ) return (char *)0; 1.115 + 1.116 + bl = strlen(big); 1.117 + ll = strlen(little); 1.118 + if( bl < ll ) return (char *)0; 1.119 + p = &big[ bl - ll ]; 1.120 + 1.121 + for( ; p >= big; p-- ) 1.122 + /* obvious improvement available here */ 1.123 + if( 0 == PL_strncasecmp(p, little, ll) ) 1.124 + return (char *)p; 1.125 + 1.126 + return (char *)0; 1.127 +} 1.128 + 1.129 +PR_IMPLEMENT(char *) 1.130 +PL_strncasestr(const char *big, const char *little, PRUint32 max) 1.131 +{ 1.132 + PRUint32 ll; 1.133 + 1.134 + if( ((const char *)0 == big) || ((const char *)0 == little) ) return (char *)0; 1.135 + if( ((char)0 == *big) || ((char)0 == *little) ) return (char *)0; 1.136 + 1.137 + ll = strlen(little); 1.138 + if( ll > max ) return (char *)0; 1.139 + max -= ll; 1.140 + max++; 1.141 + 1.142 + for( ; max && *big; big++, max-- ) 1.143 + /* obvious improvement available here */ 1.144 + if( 0 == PL_strncasecmp(big, little, ll) ) 1.145 + return (char *)big; 1.146 + 1.147 + return (char *)0; 1.148 +} 1.149 + 1.150 +PR_IMPLEMENT(char *) 1.151 +PL_strncaserstr(const char *big, const char *little, PRUint32 max) 1.152 +{ 1.153 + const char *p; 1.154 + PRUint32 ll; 1.155 + 1.156 + if( ((const char *)0 == big) || ((const char *)0 == little) ) return (char *)0; 1.157 + if( ((char)0 == *big) || ((char)0 == *little) ) return (char *)0; 1.158 + 1.159 + ll = strlen(little); 1.160 + 1.161 + for( p = big; max && *p; p++, max-- ) 1.162 + ; 1.163 + 1.164 + p -= ll; 1.165 + if( p < big ) return (char *)0; 1.166 + 1.167 + for( ; p >= big; p-- ) 1.168 + /* obvious improvement available here */ 1.169 + if( 0 == PL_strncasecmp(p, little, ll) ) 1.170 + return (char *)p; 1.171 + 1.172 + return (char *)0; 1.173 +}