1112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*************************************************
2112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*      Perl-Compatible Regular Expressions       *
3112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*************************************************/
4112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
5112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/* PCRE is a library of functions to support regular expressions whose syntax
6112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisand semantics are as close as possible to those of the Perl 5 language.
7112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
8112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis                       Written by Philip Hazel
9112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis     Original API code Copyright (c) 1997-2012 University of Cambridge
10112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis         New API code Copyright (c) 2016 University of Cambridge
11112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
12112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis-----------------------------------------------------------------------------
13112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisRedistribution and use in source and binary forms, with or without
14112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskismodification, are permitted provided that the following conditions are met:
15112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
16112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis    * Redistributions of source code must retain the above copyright notice,
17112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis      this list of conditions and the following disclaimer.
18112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
19112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis    * Redistributions in binary form must reproduce the above copyright
20112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis      notice, this list of conditions and the following disclaimer in the
21112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis      documentation and/or other materials provided with the distribution.
22112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
23112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis    * Neither the name of the University of Cambridge nor the names of its
24112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis      contributors may be used to endorse or promote products derived from
25112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis      this software without specific prior written permission.
26112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
27112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
28112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
31112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPOSSIBILITY OF SUCH DAMAGE.
38112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis-----------------------------------------------------------------------------
39112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*/
40112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
41112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/* This module contains internal functions for comparing and finding the length
42112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisof strings. These are used instead of strcmp() etc because the standard
43112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisfunctions work only on 8-bit data. */
44112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
45112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
46112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis#ifdef HAVE_CONFIG_H
47112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis#include "config.h"
48112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis#endif
49112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
50112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis#include "pcre2_internal.h"
51112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
52112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
53112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*************************************************
54112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*    Compare two zero-terminated PCRE2 strings   *
55112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*************************************************/
56112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
57112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*
58112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisArguments:
59112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str1        first string
60112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str2        second string
61112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
62112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisReturns:      0, 1, or -1
63112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*/
64112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
65112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisint
66112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPRIV(strcmp)(PCRE2_SPTR str1, PCRE2_SPTR str2)
67112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis{
68112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_UCHAR c1, c2;
69112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskiswhile (*str1 != '\0' || *str2 != '\0')
70112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  {
71112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c1 = *str1++;
72112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c2 = *str2++;
73112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  if (c1 != c2) return ((c1 > c2) << 1) - 1;
74112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  }
75112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisreturn 0;
76112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis}
77112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
78112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
79112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*************************************************
80112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*  Compare zero-terminated PCRE2 & 8-bit strings *
81112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*************************************************/
82112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
83112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/* As the 8-bit string is almost always a literal, its type is specified as
84112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisconst char *.
85112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
86112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisArguments:
87112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str1        first string
88112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str2        second string
89112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
90112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisReturns:      0, 1, or -1
91112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*/
92112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
93112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisint
94112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPRIV(strcmp_c8)(PCRE2_SPTR str1, const char *str2)
95112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis{
96112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_UCHAR c1, c2;
97112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskiswhile (*str1 != '\0' || *str2 != '\0')
98112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  {
99112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c1 = *str1++;
100112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c2 = *str2++;
101112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  if (c1 != c2) return ((c1 > c2) << 1) - 1;
102112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  }
103112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisreturn 0;
104112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis}
105112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
106112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
107112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*************************************************
108112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*    Compare two PCRE2 strings, given a length   *
109112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*************************************************/
110112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
111112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*
112112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisArguments:
113112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str1        first string
114112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str2        second string
115112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  len         the length
116112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
117112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisReturns:      0, 1, or -1
118112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*/
119112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
120112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisint
121112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPRIV(strncmp)(PCRE2_SPTR str1, PCRE2_SPTR str2, size_t len)
122112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis{
123112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_UCHAR c1, c2;
124112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisfor (; len > 0; len--)
125112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  {
126112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c1 = *str1++;
127112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c2 = *str2++;
128112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  if (c1 != c2) return ((c1 > c2) << 1) - 1;
129112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  }
130112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisreturn 0;
131112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis}
132112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
133112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
134112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*************************************************
135112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis* Compare PCRE2 string to 8-bit string by length *
136112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*************************************************/
137112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
138112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/* As the 8-bit string is almost always a literal, its type is specified as
139112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisconst char *.
140112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
141112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisArguments:
142112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str1        first string
143112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str2        second string
144112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  len         the length
145112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
146112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisReturns:      0, 1, or -1
147112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*/
148112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
149112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisint
150112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPRIV(strncmp_c8)(PCRE2_SPTR str1, const char *str2, size_t len)
151112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis{
152112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_UCHAR c1, c2;
153112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisfor (; len > 0; len--)
154112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  {
155112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c1 = *str1++;
156112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  c2 = *str2++;
157112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  if (c1 != c2) return ((c1 > c2) << 1) - 1;
158112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  }
159112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisreturn 0;
160112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis}
161112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
162112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
163112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*************************************************
164112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*        Find the length of a PCRE2 string       *
165112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*************************************************/
166112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
167112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*
168112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisArgument:    the string
169112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisReturns:     the length
170112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*/
171112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
172112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_SIZE
173112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPRIV(strlen)(PCRE2_SPTR str)
174112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis{
175112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_SIZE c = 0;
176112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskiswhile (*str++ != 0) c++;
177112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisreturn c;
178112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis}
179112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
180112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
181112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/*************************************************
182112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis* Copy 8-bit 0-terminated string to PCRE2 string *
183112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*************************************************/
184112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
185112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/* Arguments:
186112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str1     buffer to receive the string
187112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis  str2     8-bit string to be copied
188112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
189112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisReturns:   the number of code units used (excluding trailing zero)
190112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*/
191112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
192112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_SIZE
193112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPRIV(strcpy_c8)(PCRE2_UCHAR *str1, const char *str2)
194112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis{
195112c9cce7a03099c5620701c16edfd8042e91f0bJanis DanisevskisPCRE2_UCHAR *t = str1;
196112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskiswhile (*str2 != 0) *t++ = *str2++;
197112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis*t = 0;
198112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskisreturn t - str1;
199112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis}
200112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis
201112c9cce7a03099c5620701c16edfd8042e91f0bJanis Danisevskis/* End of pcre2_string_utils.c */
202