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 *)
PL_strstr(const char * big,const char * little)10 PL_strstr(const char *big, const char *little)
11 {
12 if( ((const char *)0 == big) || ((const char *)0 == little) ) {
13 return (char *)0;
14 }
15 if( ((char)0 == *big) || ((char)0 == *little) ) {
16 return (char *)0;
17 }
18
19 return strstr(big, little);
20 }
21
22 PR_IMPLEMENT(char *)
PL_strrstr(const char * big,const char * little)23 PL_strrstr(const char *big, const char *little)
24 {
25 const char *p;
26 size_t ll;
27 size_t bl;
28
29 if( ((const char *)0 == big) || ((const char *)0 == little) ) {
30 return (char *)0;
31 }
32 if( ((char)0 == *big) || ((char)0 == *little) ) {
33 return (char *)0;
34 }
35
36 ll = strlen(little);
37 bl = strlen(big);
38 if( bl < ll ) {
39 return (char *)0;
40 }
41 p = &big[ bl - ll ];
42
43 for( ; p >= big; p-- )
44 if( *little == *p )
45 if( 0 == strncmp(p, little, ll) ) {
46 return (char *)p;
47 }
48
49 return (char *)0;
50 }
51
52 PR_IMPLEMENT(char *)
PL_strnstr(const char * big,const char * little,PRUint32 max)53 PL_strnstr(const char *big, const char *little, PRUint32 max)
54 {
55 size_t ll;
56
57 if( ((const char *)0 == big) || ((const char *)0 == little) ) {
58 return (char *)0;
59 }
60 if( ((char)0 == *big) || ((char)0 == *little) ) {
61 return (char *)0;
62 }
63
64 ll = strlen(little);
65 if( ll > (size_t)max ) {
66 return (char *)0;
67 }
68 max -= (PRUint32)ll;
69 max++;
70
71 for( ; max && *big; big++, max-- )
72 if( *little == *big )
73 if( 0 == strncmp(big, little, ll) ) {
74 return (char *)big;
75 }
76
77 return (char *)0;
78 }
79
80 PR_IMPLEMENT(char *)
PL_strnrstr(const char * big,const char * little,PRUint32 max)81 PL_strnrstr(const char *big, const char *little, PRUint32 max)
82 {
83 const char *p;
84 size_t ll;
85
86 if( ((const char *)0 == big) || ((const char *)0 == little) ) {
87 return (char *)0;
88 }
89 if( ((char)0 == *big) || ((char)0 == *little) ) {
90 return (char *)0;
91 }
92
93 ll = strlen(little);
94
95 for( p = big; max && *p; p++, max-- )
96 ;
97
98 p -= ll;
99 if( p < big ) {
100 return (char *)0;
101 }
102
103 for( ; p >= big; p-- )
104 if( *little == *p )
105 if( 0 == strncmp(p, little, ll) ) {
106 return (char *)p;
107 }
108
109 return (char *)0;
110 }
111