summaryrefslogtreecommitdiff
path: root/src/regex/regex_test_random.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2013-06-20 08:55:56 +0000
committerChristian Grothoff <christian@grothoff.org>2013-06-20 08:55:56 +0000
commit5f7a6c8f6816a826a2dd93eadc5039733f7db606 (patch)
tree3c22c8ff3436cc3140dfb1b24813ed4362330879 /src/regex/regex_test_random.c
parent21a2b4f95b4488645ba5a6254fcb8919c4915f73 (diff)
downloadgnunet-5f7a6c8f6816a826a2dd93eadc5039733f7db606.tar.gz
gnunet-5f7a6c8f6816a826a2dd93eadc5039733f7db606.zip
moving functions for testing and evaluation and experiments to the test library, minimizing the internal library, renaming files according to which library they belong to
Diffstat (limited to 'src/regex/regex_test_random.c')
-rw-r--r--src/regex/regex_test_random.c171
1 files changed, 171 insertions, 0 deletions
diff --git a/src/regex/regex_test_random.c b/src/regex/regex_test_random.c
new file mode 100644
index 000000000..00e4c21b3
--- /dev/null
+++ b/src/regex/regex_test_random.c
@@ -0,0 +1,171 @@
1/*
2 This file is part of GNUnet
3 (C) 2012 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20/**
21 * @file src/regex/regex_test_random.c
22 * @brief functions for creating random regular expressions and strings
23 * @author Maximilian Szengel
24 */
25#include "platform.h"
26#include "regex_test_lib.h"
27#include "gnunet_crypto_lib.h"
28#include "regex_internal.h"
29
30
31/**
32 * Get a (pseudo) random valid literal for building a regular expression.
33 *
34 * @return random valid literal
35 */
36static char
37get_random_literal ()
38{
39 uint32_t ridx;
40
41 ridx =
42 GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
43 (uint32_t) strlen (ALLOWED_LITERALS));
44
45 return ALLOWED_LITERALS[ridx];
46}
47
48
49/**
50 * Generate a (pseudo) random regular expression of length 'rx_length', as well
51 * as a (optional) string that will be matched by the generated regex. The
52 * returned regex needs to be freed.
53 *
54 * @param rx_length length of the random regex.
55 * @param matching_str (optional) pointer to a string that will contain a string
56 * that will be matched by the generated regex, if
57 * 'matching_str' pointer was not NULL. Make sure you
58 * allocated at least rx_length+1 bytes for this sting.
59 *
60 * @return NULL if 'rx_length' is 0, a random regex of length 'rx_length', which
61 * needs to be freed, otherwise.
62 */
63char *
64REGEX_ITERNAL_generate_random_regex (size_t rx_length, char *matching_str)
65{
66 char *rx;
67 char *rx_p;
68 char *matching_strp;
69 unsigned int i;
70 unsigned int char_op_switch;
71 unsigned int last_was_op;
72 int rx_op;
73 char current_char;
74
75 if (0 == rx_length)
76 return NULL;
77
78 if (NULL != matching_str)
79 matching_strp = matching_str;
80 else
81 matching_strp = NULL;
82
83 rx = GNUNET_malloc (rx_length + 1);
84 rx_p = rx;
85 current_char = 0;
86 last_was_op = 1;
87
88 for (i = 0; i < rx_length; i++)
89 {
90 char_op_switch = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 2);
91
92 if (0 == char_op_switch && !last_was_op)
93 {
94 last_was_op = 1;
95 rx_op = GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, 4);
96
97 switch (rx_op)
98 {
99 case 0:
100 current_char = '+';
101 break;
102 case 1:
103 current_char = '*';
104 break;
105 case 2:
106 current_char = '?';
107 break;
108 case 3:
109 if (i < rx_length - 1) /* '|' cannot be at the end */
110 current_char = '|';
111 else
112 current_char = get_random_literal ();
113 break;
114 }
115 }
116 else
117 {
118 current_char = get_random_literal ();
119 last_was_op = 0;
120 }
121
122 if (NULL != matching_strp &&
123 (current_char != '+' && current_char != '*' && current_char != '?' &&
124 current_char != '|'))
125 {
126 *matching_strp = current_char;
127 matching_strp++;
128 }
129
130 *rx_p = current_char;
131 rx_p++;
132 }
133 *rx_p = '\0';
134 if (NULL != matching_strp)
135 *matching_strp = '\0';
136
137 return rx;
138}
139
140
141/**
142 * Generate a random string of maximum length 'max_len' that only contains literals allowed
143 * in a regular expression. The string might be 0 chars long but is garantueed
144 * to be shorter or equal to 'max_len'.
145 *
146 * @param max_len maximum length of the string that should be generated.
147 *
148 * @return random string that needs to be freed.
149 */
150char *
151REGEX_ITERNAL_generate_random_string (size_t max_len)
152{
153 unsigned int i;
154 char *str;
155 size_t len;
156
157 if (1 > max_len)
158 return GNUNET_strdup ("");
159
160 len = (size_t) GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, max_len);
161 str = GNUNET_malloc (len + 1);
162
163 for (i = 0; i < len; i++)
164 {
165 str[i] = get_random_literal ();
166 }
167
168 str[i] = '\0';
169
170 return str;
171}