1/*************************************************
2*      Perl-Compatible Regular Expressions       *
3*************************************************/
4
5/* PCRE is a library of functions to support regular expressions whose syntax
6and semantics are as close as possible to those of the Perl 5 language.
7
8                       Written by Philip Hazel
9     Original API code Copyright (c) 1997-2012 University of Cambridge
10         New API code Copyright (c) 2016 University of Cambridge
11
12-----------------------------------------------------------------------------
13Redistribution and use in source and binary forms, with or without
14modification, are permitted provided that the following conditions are met:
15
16    * Redistributions of source code must retain the above copyright notice,
17      this list of conditions and the following disclaimer.
18
19    * Redistributions in binary form must reproduce the above copyright
20      notice, this list of conditions and the following disclaimer in the
21      documentation and/or other materials provided with the distribution.
22
23    * Neither the name of the University of Cambridge nor the names of its
24      contributors may be used to endorse or promote products derived from
25      this software without specific prior written permission.
26
27THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37POSSIBILITY OF SUCH DAMAGE.
38-----------------------------------------------------------------------------
39*/
40
41/* This module contains internal functions for comparing and finding the length
42of strings. These are used instead of strcmp() etc because the standard
43functions work only on 8-bit data. */
44
45
46#ifdef HAVE_CONFIG_H
47#include "config.h"
48#endif
49
50#include "pcre2_internal.h"
51
52
53/*************************************************
54*    Compare two zero-terminated PCRE2 strings   *
55*************************************************/
56
57/*
58Arguments:
59  str1        first string
60  str2        second string
61
62Returns:      0, 1, or -1
63*/
64
65int
66PRIV(strcmp)(PCRE2_SPTR str1, PCRE2_SPTR str2)
67{
68PCRE2_UCHAR c1, c2;
69while (*str1 != '\0' || *str2 != '\0')
70  {
71  c1 = *str1++;
72  c2 = *str2++;
73  if (c1 != c2) return ((c1 > c2) << 1) - 1;
74  }
75return 0;
76}
77
78
79/*************************************************
80*  Compare zero-terminated PCRE2 & 8-bit strings *
81*************************************************/
82
83/* As the 8-bit string is almost always a literal, its type is specified as
84const char *.
85
86Arguments:
87  str1        first string
88  str2        second string
89
90Returns:      0, 1, or -1
91*/
92
93int
94PRIV(strcmp_c8)(PCRE2_SPTR str1, const char *str2)
95{
96PCRE2_UCHAR c1, c2;
97while (*str1 != '\0' || *str2 != '\0')
98  {
99  c1 = *str1++;
100  c2 = *str2++;
101  if (c1 != c2) return ((c1 > c2) << 1) - 1;
102  }
103return 0;
104}
105
106
107/*************************************************
108*    Compare two PCRE2 strings, given a length   *
109*************************************************/
110
111/*
112Arguments:
113  str1        first string
114  str2        second string
115  len         the length
116
117Returns:      0, 1, or -1
118*/
119
120int
121PRIV(strncmp)(PCRE2_SPTR str1, PCRE2_SPTR str2, size_t len)
122{
123PCRE2_UCHAR c1, c2;
124for (; len > 0; len--)
125  {
126  c1 = *str1++;
127  c2 = *str2++;
128  if (c1 != c2) return ((c1 > c2) << 1) - 1;
129  }
130return 0;
131}
132
133
134/*************************************************
135* Compare PCRE2 string to 8-bit string by length *
136*************************************************/
137
138/* As the 8-bit string is almost always a literal, its type is specified as
139const char *.
140
141Arguments:
142  str1        first string
143  str2        second string
144  len         the length
145
146Returns:      0, 1, or -1
147*/
148
149int
150PRIV(strncmp_c8)(PCRE2_SPTR str1, const char *str2, size_t len)
151{
152PCRE2_UCHAR c1, c2;
153for (; len > 0; len--)
154  {
155  c1 = *str1++;
156  c2 = *str2++;
157  if (c1 != c2) return ((c1 > c2) << 1) - 1;
158  }
159return 0;
160}
161
162
163/*************************************************
164*        Find the length of a PCRE2 string       *
165*************************************************/
166
167/*
168Argument:    the string
169Returns:     the length
170*/
171
172PCRE2_SIZE
173PRIV(strlen)(PCRE2_SPTR str)
174{
175PCRE2_SIZE c = 0;
176while (*str++ != 0) c++;
177return c;
178}
179
180
181/*************************************************
182* Copy 8-bit 0-terminated string to PCRE2 string *
183*************************************************/
184
185/* Arguments:
186  str1     buffer to receive the string
187  str2     8-bit string to be copied
188
189Returns:   the number of code units used (excluding trailing zero)
190*/
191
192PCRE2_SIZE
193PRIV(strcpy_c8)(PCRE2_UCHAR *str1, const char *str2)
194{
195PCRE2_UCHAR *t = str1;
196while (*str2 != 0) *t++ = *str2++;
197*t = 0;
198return t - str1;
199}
200
201/* End of pcre2_string_utils.c */
202