GNUnet  0.10.x
perf-regex.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2012 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your 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  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
20 
26 #include <regex.h>
27 #include <time.h>
28 #include "platform.h"
29 #include "regex_internal_lib.h"
30 #include "regex_test_lib.h"
31 
32 
44 static void
45 print_edge(void *cls,
46  const struct GNUNET_HashCode *key,
47  const char *proof,
48  int accepting,
49  unsigned int num_edges,
50  const struct REGEX_BLOCK_Edge *edges)
51 {
52  unsigned int i;
53 
54  printf("%s: %s, proof: `%s'\n",
55  GNUNET_h2s(key),
56  accepting ? "ACCEPTING" : "",
57  proof);
58  for (i = 0; i < num_edges; i++)
59  printf(" `%s': %s\n",
60  edges[i].label,
61  GNUNET_h2s(&edges[i].destination));
62 }
63 
64 
75 int
76 main(int argc, char *const *argv)
77 {
78  struct REGEX_INTERNAL_Automaton* dfa;
79  char **regexes;
80  char *buffer;
81  char *regex;
82  int compression;
83  unsigned int alphabet_size;
84  long size;
85 
86  GNUNET_log_setup("perf-regex", "DEBUG", NULL);
87  if (4 != argc)
88  {
89  fprintf(stderr,
90  "Usage: %s REGEX_FILE ALPHABET_SIZE COMPRESSION\n",
91  argv[0]);
92  return 1;
93  }
94  regexes = REGEX_TEST_read_from_file(argv[1]);
95  if (NULL == regexes)
96  {
97  fprintf(stderr,
98  "Failed to read regexes from `%s'\n",
99  argv[1]);
100  return 2;
101  }
102  alphabet_size = atoi(argv[2]);
103  compression = atoi(argv[3]);
104  printf("********* PERF-REGEX *********'\n");
105  printf("Using:\n file '%s'\n Alphabet size %u\n compression %d\n",
106  argv[1], alphabet_size, compression);
107  fflush(stdout);
108  buffer = REGEX_TEST_combine(regexes, alphabet_size);
109  GNUNET_asprintf(&regex, "GNUNET_REGEX_PROFILER_(%s)(0|1)*", buffer);
110  size = strlen(regex);
111 
112  fprintf(stderr,
113  "Combined regex (%ld bytes):\n%s\n",
114  size,
115  regex);
116  dfa = REGEX_INTERNAL_construct_dfa(regex, size, compression);
117  printf("********* ALL EDGES *********'\n");
119  printf("\n\n********* REACHABLE EDGES *********'\n");
122  GNUNET_free(buffer);
123  REGEX_TEST_free_from_file(regexes);
124  GNUNET_free(regex);
125  return 0;
126 }
127 
128 /* end of prof-regex.c */
int main(int argc, char *const *argv)
The main function of the regex performace test.
Definition: perf-regex.c:76
static void print_edge(void *cls, const struct GNUNET_HashCode *key, const char *proof, int accepting, unsigned int num_edges, const struct REGEX_BLOCK_Edge *edges)
Print information about the given node and its edges to stdout.
Definition: perf-regex.c:45
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
Automaton representation.
Edge representation.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
char * REGEX_TEST_combine(char *const regexes[], unsigned int alphabet_size)
Combine an array of regexes into a single prefix-shared regex.
library to parse regular expressions into dfa
static uint64_t proof
Definition: gnunet-scrypt.c:41
A 512-bit hashcode.
struct GNUNET_HashCode key
The key used in the DHT.
static unsigned int size
Size of the "table".
Definition: peer.c:66
void REGEX_INTERNAL_automaton_destroy(struct REGEX_INTERNAL_Automaton *a)
Free the memory allocated by constructing the REGEX_INTERNAL_Automaton data structure.
void REGEX_INTERNAL_iterate_all_edges(struct REGEX_INTERNAL_Automaton *a, REGEX_INTERNAL_KeyIterator iterator, void *iterator_cls)
Iterate over all edges starting from start state of automaton &#39;a&#39;.
library to read regexes representing IP networks from a file.
void REGEX_TEST_free_from_file(char **regexes)
Free all memory reserved for a set of regexes created by read_from_file.
struct REGEX_INTERNAL_Automaton * REGEX_INTERNAL_construct_dfa(const char *regex, const size_t len, unsigned int max_path_len)
Construct DFA for the given &#39;regex&#39; of length &#39;len&#39;.
char ** REGEX_TEST_read_from_file(const char *filename)
Read a set of regexes from a file, one per line and return them in an array suitable for REGEX_TEST_c...
void REGEX_INTERNAL_iterate_reachable_edges(struct REGEX_INTERNAL_Automaton *a, REGEX_INTERNAL_KeyIterator iterator, void *iterator_cls)
Iterate over all edges of automaton &#39;a&#39; that are reachable from a state with a proof of at least GNUN...
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
#define GNUNET_free(ptr)
Wrapper around free.