+int string_to_positive_integer(char *string) {
+ int error = 0;
+ int result = 0;
+
+ if(*string) {
+ for(char *s = string; *s; s++) {
+ if(*s >= '0' && *s <= '9') {
+ result = result * 10 + int(*s - '0');
+ } else error = 1;
+ }
+ } else error = 1;
+
+ if(error) {
+ cerr << "Value `" << string << "' is not a positive integer." << endl;
+ exit(1);
+ }
+
+ return result;
+}
+
+void error_feedback() {
+ if(error_flash) {
+ flash();
+ } else {
+ beep();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+// A quick and dirty hash table
+
+// The table itself stores index of the strings in a char
+// **table. When a string is added, if it was already in the table,
+// the new index replaces the previous one.
+
+int *new_hash_table(int hash_table_size) {
+ int *result;
+ result = new int[hash_table_size];
+ for(int k = 0; k < hash_table_size; k++) {
+ result[k] = -1;
+ }
+ return result;
+}
+
+// Adds new_string in the table, associated to new_index. If this
+// string was not already in the table, returns -1. Otherwise, returns
+// the previous index it had.
+
+int test_and_add(char *new_string, int new_index,
+ char **strings, int *hash_table, int hash_table_size) {
+
+ unsigned int code = 0;
+
+ // This is my recipe. I checked, it seems to work (as long as
+ // hash_table_size is not a multiple of 387433 that should be okay)
+
+ for(int k = 0; new_string[k]; k++) {
+ code = code * 387433 + (unsigned int) (new_string[k]);
+ }
+
+ code = code % hash_table_size;
+
+ while(hash_table[code] >= 0) {
+ // There is a string with that code
+ if(strcmp(new_string, strings[hash_table[code]]) == 0) {
+ // It is the same string, we keep a copy of the stored index
+ int result = hash_table[code];
+ // Put the new one
+ hash_table[code] = new_index;
+ // And return the previous one
+ return result;
+ }
+ // This collision was not the same string, let's move to the next
+ // in the table
+ code = (code + 1) % hash_table_size;
+ }
+
+ // This string was not already in there, store the index in the
+ // table and return -1
+ hash_table[code] = new_index;
+ return -1;
+}
+