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