projects
/
selector.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' of ssh://fleuret@login.idiap.ch/homes/fleuret/public/git/selector
[selector.git]
/
selector.cc
diff --git
a/selector.cc
b/selector.cc
index
71768e7
..
9c863a4
100644
(file)
--- a/
selector.cc
+++ b/
selector.cc
@@
-87,6
+87,10
@@
void check_opt(int argc, char **argv, int n_opt, int n, const char *help) {
//////////////////////////////////////////////////////////////////////
// A quick and dirty hash table
//////////////////////////////////////////////////////////////////////
// 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];
int *new_hash_table(int hash_table_size) {
int *result;
result = new int[hash_table_size];
@@
-96,6
+100,10
@@
int *new_hash_table(int hash_table_size) {
return result;
}
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;
int test_and_add(char *new_string, int new_index,
char **strings, int *hash_table, int hash_table_size) {
unsigned int code = 0;
@@
-110,16
+118,23
@@
int test_and_add(char *new_string, int new_index,
code = code % hash_table_size;
while(hash_table[code] >= 0) {
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) {
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];
int result = hash_table[code];
+ // Put the new one
hash_table[code] = new_index;
hash_table[code] = new_index;
+ // And return the previous one
return result;
}
return result;
}
+ // This collision was not the same string, let's move to the next
+ // in the table
code = (code + 1) % hash_table_size;
}
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;
hash_table[code] = new_index;
-
return -1;
}
return -1;
}
@@
-622,8
+637,8
@@
int main(int argc, char **argv) {
lines[nb_lines] = new char[strlen(s) + 1];
strcpy(lines[nb_lines], s);
} else {
lines[nb_lines] = new char[strlen(s) + 1];
strcpy(lines[nb_lines], s);
} else {
- //
We do not allocate a new string but use the pointer to the
- // first occurence of it
+ //
The string was already in there, so we do not allocate a
+ //
new string but use the pointer to the
first occurence of it
lines[nb_lines] = lines[dup];
lines[dup] = 0;
}
lines[nb_lines] = lines[dup];
lines[dup] = 0;
}