GNUnet  0.19.5
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 "platform.h"
27 #include <regex.h>
28 #include <time.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 
129 /* end of prof-regex.c */
struct GNUNET_HashCode key
The key used in the DHT.
static uint64_t proof
Definition: gnunet-scrypt.c:49
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_free(ptr)
Wrapper around free.
static unsigned int size
Size of the "table".
Definition: peer.c:68
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
int main(int argc, char *const *argv)
The main function of the regex performance test.
Definition: perf-regex.c:76
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 'a'.
void REGEX_INTERNAL_iterate_reachable_edges(struct REGEX_INTERNAL_Automaton *a, REGEX_INTERNAL_KeyIterator iterator, void *iterator_cls)
Iterate over all edges of automaton 'a' that are reachable from a state with a proof of at least GNUN...
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 'regex' of length 'len'.
void REGEX_INTERNAL_automaton_destroy(struct REGEX_INTERNAL_Automaton *a)
Free the memory allocated by constructing the REGEX_INTERNAL_Automaton.
library to parse regular expressions into dfa
char * REGEX_TEST_combine(char *const regexes[], unsigned int alphabet_size)
Combine an array of regexes into a single prefix-shared regex.
void REGEX_TEST_free_from_file(char **regexes)
Free all memory reserved for a set of regexes created by read_from_file.
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...
library to read regexes representing IP networks from a file.
A 512-bit hashcode.
Edge representation.
Automaton representation.