From: Francois Fleuret Date: Mon, 6 Apr 2009 07:25:18 +0000 (+0200) Subject: Merge branch 'master' of ssh://fleuret@login.idiap.ch/homes/fleuret/public/git/selector X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=selector.git;a=commitdiff_plain;h=da5be31b219ede348c3ac884768e39d6d169d7fd;hp=4793cb14370b37b6ec83779b3cd29009af968c4d Merge branch 'master' of ssh://fleuret@login.idiap.ch/homes/fleuret/public/git/selector --- diff --git a/Makefile b/Makefile index 23b62f4..d80b4cd 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ # along with selector. If not, see . # -BINARY_PATH = /usr/local/bin +BINARY_PATH = /usr/bin MAN_PATH = /usr/share/man/man1 LDFLAGS=-lcurses diff --git a/selector.cc b/selector.cc index 71768e7..9c863a4 100644 --- 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 +// 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]; @@ -96,6 +100,10 @@ int *new_hash_table(int hash_table_size) { 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; @@ -110,16 +118,23 @@ int test_and_add(char *new_string, int new_index, 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; } @@ -622,8 +637,8 @@ int main(int argc, char **argv) { 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; }