summaryrefslogtreecommitdiffstats
path: root/plugins/uriparser/UriCompare.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/uriparser/UriCompare.c')
-rw-r--r--plugins/uriparser/UriCompare.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/plugins/uriparser/UriCompare.c b/plugins/uriparser/UriCompare.c
new file mode 100644
index 00000000..6896f64e
--- /dev/null
+++ b/plugins/uriparser/UriCompare.c
@@ -0,0 +1,168 @@
1/*
2 * uriparser - RFC 3986 URI parsing library
3 *
4 * Copyright (C) 2007, Weijia Song <songweijia@gmail.com>
5 * Copyright (C) 2007, Sebastian Pipping <webmaster@hartwork.org>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * * Redistributions of source code must retain the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer.
15 *
16 * * Redistributions in binary form must reproduce the above
17 * copyright notice, this list of conditions and the following
18 * disclaimer in the documentation and/or other materials
19 * provided with the distribution.
20 *
21 * * Neither the name of the <ORGANIZATION> nor the names of its
22 * contributors may be used to endorse or promote products
23 * derived from this software without specific prior written
24 * permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
29 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
30 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
31 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
32 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
33 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
35 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
37 * OF THE POSSIBILITY OF SUCH DAMAGE.
38 */
39
40/* What encodings are enabled? */
41#include <uriparser/UriDefsConfig.h>
42#if (!defined(URI_PASS_ANSI) && !defined(URI_PASS_UNICODE))
43/* Include SELF twice */
44# ifdef URI_ENABLE_ANSI
45# define URI_PASS_ANSI 1
46# include "UriCompare.c"
47# undef URI_PASS_ANSI
48# endif
49# ifdef URI_ENABLE_UNICODE
50# define URI_PASS_UNICODE 1
51# include "UriCompare.c"
52# undef URI_PASS_UNICODE
53# endif
54#else
55# ifdef URI_PASS_ANSI
56# include <uriparser/UriDefsAnsi.h>
57# else
58# include <uriparser/UriDefsUnicode.h>
59# include <wchar.h>
60# endif
61
62
63
64#ifndef URI_DOXYGEN
65# include <uriparser/Uri.h>
66# include <uriparser/UriIp4.h>
67# include "UriCommon.h"
68#endif
69
70
71
72UriBool URI_FUNC(EqualsUri)(const URI_TYPE(Uri) * a,
73 const URI_TYPE(Uri) * b) {
74 /* NOTE: Both NULL means equal! */
75 if ((a == NULL) || (b == NULL)) {
76 return ((a == NULL) && (b == NULL)) ? URI_TRUE : URI_FALSE;
77 }
78
79 /* scheme */
80 if (URI_FUNC(CompareRange)(&(a->scheme), &(b->scheme))) {
81 return URI_FALSE;
82 }
83
84 /* absolutePath */
85 if ((a->scheme.first == NULL)&& (a->absolutePath != b->absolutePath)) {
86 return URI_FALSE;
87 }
88
89 /* userInfo */
90 if (URI_FUNC(CompareRange)(&(a->userInfo), &(b->userInfo))) {
91 return URI_FALSE;
92 }
93
94 /* Host */
95 if (((a->hostData.ip4 == NULL) != (b->hostData.ip4 == NULL))
96 || ((a->hostData.ip6 == NULL) != (b->hostData.ip6 == NULL))
97 || ((a->hostData.ipFuture.first == NULL)
98 != (b->hostData.ipFuture.first == NULL))) {
99 return URI_FALSE;
100 }
101
102 if (a->hostData.ip4 != NULL) {
103 if (memcmp(a->hostData.ip4->data, b->hostData.ip4->data, 4)) {
104 return URI_FALSE;
105 }
106 }
107
108 if (a->hostData.ip6 != NULL) {
109 if (memcmp(a->hostData.ip6->data, b->hostData.ip6->data, 16)) {
110 return URI_FALSE;
111 }
112 }
113
114 if (a->hostData.ipFuture.first != NULL) {
115 if (URI_FUNC(CompareRange)(&(a->hostData.ipFuture), &(b->hostData.ipFuture))) {
116 return URI_FALSE;
117 }
118 }
119
120 if ((a->hostData.ip4 == NULL)
121 && (a->hostData.ip6 == NULL)
122 && (a->hostData.ipFuture.first == NULL)) {
123 if (URI_FUNC(CompareRange)(&(a->hostText), &(b->hostText))) {
124 return URI_FALSE;
125 }
126 }
127
128 /* portText */
129 if (URI_FUNC(CompareRange)(&(a->portText), &(b->portText))) {
130 return URI_FALSE;
131 }
132
133 /* Path */
134 if ((a->pathHead == NULL) != (b->pathHead == NULL)) {
135 return URI_FALSE;
136 }
137
138 if (a->pathHead != NULL) {
139 URI_TYPE(PathSegment) * walkA = a->pathHead;
140 URI_TYPE(PathSegment) * walkB = b->pathHead;
141 do {
142 if (URI_FUNC(CompareRange)(&(walkA->text), &(walkB->text))) {
143 return URI_FALSE;
144 }
145 if ((walkA->next == NULL) != (walkB->next == NULL)) {
146 return URI_FALSE;
147 }
148 walkA = walkA->next;
149 walkB = walkB->next;
150 } while (walkA != NULL);
151 }
152
153 /* query */
154 if (URI_FUNC(CompareRange)(&(a->query), &(b->query))) {
155 return URI_FALSE;
156 }
157
158 /* fragment */
159 if (URI_FUNC(CompareRange)(&(a->fragment), &(b->fragment))) {
160 return URI_FALSE;
161 }
162
163 return URI_TRUE; /* Equal*/
164}
165
166
167
168#endif