diff options
author | Christian Grothoff <christian@grothoff.org> | 2013-10-26 14:57:24 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2013-10-26 14:57:24 +0000 |
commit | 87b7d2bc3d9cc8c4da313e5dc60fa497d65eb0e2 (patch) | |
tree | 83bc7d72ac31fff436525d75d3ddb7b59ba04a7b /src/tun/regex.c | |
parent | 0c9ca79b2eb820c3266e9117f3ba9179cbdc2ff1 (diff) | |
download | gnunet-87b7d2bc3d9cc8c4da313e5dc60fa497d65eb0e2.tar.gz gnunet-87b7d2bc3d9cc8c4da313e5dc60fa497d65eb0e2.zip |
-faster port range generation, O(n) instead of O(n^2)
Diffstat (limited to 'src/tun/regex.c')
-rw-r--r-- | src/tun/regex.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/tun/regex.c b/src/tun/regex.c index 3d3ebd8ba..478132f4e 100644 --- a/src/tun/regex.c +++ b/src/tun/regex.c | |||
@@ -186,8 +186,9 @@ port_to_regex (const struct GNUNET_STRINGS_PortPolicy *pp) | |||
186 | { | 186 | { |
187 | char *reg; | 187 | char *reg; |
188 | char *ret; | 188 | char *ret; |
189 | char *tmp; | 189 | char *pos; |
190 | unsigned int i; | 190 | unsigned int i; |
191 | unsigned int cnt; | ||
191 | 192 | ||
192 | if ( (0 == pp->start_port) || | 193 | if ( (0 == pp->start_port) || |
193 | ( (1 == pp->start_port) && | 194 | ( (1 == pp->start_port) && |
@@ -202,27 +203,31 @@ port_to_regex (const struct GNUNET_STRINGS_PortPolicy *pp) | |||
202 | pp->start_port); | 203 | pp->start_port); |
203 | return ret; | 204 | return ret; |
204 | } | 205 | } |
205 | reg = NULL; | 206 | cnt = pp->end_port - pp->start_port + 1; |
207 | if (GNUNET_YES == pp->negate_portrange) | ||
208 | cnt = 0xFFFF - cnt; | ||
209 | reg = GNUNET_malloc (cnt * 5 + 1); | ||
210 | pos = reg; | ||
206 | for (i=1;i<=0xFFFF;i++) | 211 | for (i=1;i<=0xFFFF;i++) |
207 | { | 212 | { |
208 | if ( ( (i >= pp->start_port) && (i <= pp->end_port) ) ^ | 213 | if ( ( (i >= pp->start_port) && (i <= pp->end_port) ) ^ |
209 | (GNUNET_YES == pp->negate_portrange) ) | 214 | (GNUNET_YES == pp->negate_portrange) ) |
210 | { | 215 | { |
211 | if (NULL == reg) | 216 | if (pos == reg) |
212 | { | 217 | { |
213 | GNUNET_asprintf (&tmp, | 218 | GNUNET_snprintf (pos, |
219 | 5, | ||
214 | "%04X", | 220 | "%04X", |
215 | i); | 221 | i); |
216 | } | 222 | } |
217 | else | 223 | else |
218 | { | 224 | { |
219 | GNUNET_asprintf (&tmp, | 225 | GNUNET_snprintf (pos, |
220 | "%s|%04X", | 226 | 6, |
221 | reg, | 227 | "|%04X", |
222 | i); | 228 | i); |
223 | GNUNET_free (reg); | ||
224 | } | 229 | } |
225 | reg = tmp; | 230 | pos += strlen (pos); |
226 | } | 231 | } |
227 | } | 232 | } |
228 | GNUNET_asprintf (&ret, | 233 | GNUNET_asprintf (&ret, |