strstr.c (2198B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "plstr.h" 7 #include <string.h> 8 9 PR_IMPLEMENT(char*) 10 PL_strstr(const char* big, const char* little) { 11 if (((const char*)0 == big) || ((const char*)0 == little)) { 12 return (char*)0; 13 } 14 if (((char)0 == *big) || ((char)0 == *little)) { 15 return (char*)0; 16 } 17 18 return strstr(big, little); 19 } 20 21 PR_IMPLEMENT(char*) 22 PL_strrstr(const char* big, const char* little) { 23 const char* p; 24 size_t ll; 25 size_t bl; 26 27 if (((const char*)0 == big) || ((const char*)0 == little)) { 28 return (char*)0; 29 } 30 if (((char)0 == *big) || ((char)0 == *little)) { 31 return (char*)0; 32 } 33 34 ll = strlen(little); 35 bl = strlen(big); 36 if (bl < ll) { 37 return (char*)0; 38 } 39 p = &big[bl - ll]; 40 41 for (; p >= big; p--) 42 if (*little == *p) 43 if (0 == strncmp(p, little, ll)) { 44 return (char*)p; 45 } 46 47 return (char*)0; 48 } 49 50 PR_IMPLEMENT(char*) 51 PL_strnstr(const char* big, const char* little, PRUint32 max) { 52 size_t ll; 53 54 if (((const char*)0 == big) || ((const char*)0 == little)) { 55 return (char*)0; 56 } 57 if (((char)0 == *big) || ((char)0 == *little)) { 58 return (char*)0; 59 } 60 61 ll = strlen(little); 62 if (ll > (size_t)max) { 63 return (char*)0; 64 } 65 max -= (PRUint32)ll; 66 max++; 67 68 for (; max && *big; big++, max--) 69 if (*little == *big) 70 if (0 == strncmp(big, little, ll)) { 71 return (char*)big; 72 } 73 74 return (char*)0; 75 } 76 77 PR_IMPLEMENT(char*) 78 PL_strnrstr(const char* big, const char* little, PRUint32 max) { 79 const char* p; 80 size_t ll; 81 82 if (((const char*)0 == big) || ((const char*)0 == little)) { 83 return (char*)0; 84 } 85 if (((char)0 == *big) || ((char)0 == *little)) { 86 return (char*)0; 87 } 88 89 ll = strlen(little); 90 91 for (p = big; max && *p; p++, max--); 92 93 p -= ll; 94 if (p < big) { 95 return (char*)0; 96 } 97 98 for (; p >= big; p--) 99 if (*little == *p) 100 if (0 == strncmp(p, little, ll)) { 101 return (char*)p; 102 } 103 104 return (char*)0; 105 }