| My Project
   
    | 
#include <my_global.h>#include "mysql_version.h"#include "lex.h"#include <stdlib.h>#include <stdio.h>#include <string.h>#include <welcome_copyright_notice.h>| Classes | |
| struct | hash_lex_struct | 
| Functions | |
| hash_lex_struct * | get_hash_struct_by_len (hash_lex_struct **root_by_len, int len, int *max_len) | 
| void | insert_into_hash (hash_lex_struct *root, const char *name, int len_from_begin, int index, int function) | 
| void | insert_symbols () | 
| void | insert_sql_functions () | 
| void | calc_length () | 
| void | generate_find_structs () | 
| void | add_struct_to_map (hash_lex_struct *st) | 
| void | add_structs_to_map (hash_lex_struct *st, int len) | 
| void | set_links (hash_lex_struct *st, int len) | 
| void | print_hash_map (const char *name) | 
| void | print_find_structs () | 
| int | check_dup_symbols (SYMBOL *s1, SYMBOL *s2) | 
| int | check_duplicates () | 
| int | main (int argc, char **argv) | 
| Variables | |
| hash_lex_struct * | root_by_len = 0 | 
| int | max_len = 0 | 
| hash_lex_struct * | root_by_len2 = 0 | 
| int | max_len2 = 0 | 
| char * | hash_map = 0 | 
| int | size_hash_map = 0 | 
The idea of presented algorithm see in 
"The Art of Computer Programming" by Donald E. Knuth
Volume 3 "Sorting and searching"
(chapter 6.3 "Digital searching" - name and number of chapter 
   is back translation from Russian edition :))
as illustration of data structures, imagine next table:
static SYMBOL symbols[] = {
  { "ADD",              SYM(ADD),0,0},
  { "AND",              SYM(AND),0,0},
  { "DAY",              SYM(DAY_SYM),0,0},
};
for this structure, presented program generate next searching-structure:
+-----------+-+-+-+
|       len |1|2|3|
+-----------+-+-+-+
|first_char |0|0|a|
|last_char  |0|0|d|
|link       |0|0|+|
                 |
                 V
       +----------+-+-+-+--+
       |    1 char|a|b|c|d |
       +----------+-+-+-+--+
       |first_char|d|0|0|0 |
       |last_char |n|0|0|-1|
       |link      |+|0|0|+ |
                   |     |
                   |     V
                   |  symbols[2] ( "DAY" )
                   V
+----------+--+-+-+-+-+-+-+-+-+-+--+
|    2 char|d |e|f|j|h|i|j|k|l|m|n |
+----------+--+-+-+-+-+-+-+-+-+-+--+
|first_char|0 |0|0|0|0|0|0|0|0|0|0 |
|last_char |-1|0|0|0|0|0|0|0|0|0|-1|
|link      |+ |0|0|0|0|0|0|0|0|0|+ |
            |                    |
            V                    V
         symbols[0] ( "ADD" )  symbols[1] ( "AND" )
for optimization, link is the 16-bit index in 'symbols' or 'sql_functions'
or search-array..
So, we can read full search-structure as 32-bit word
use instead to_upper_lex, special array (substitute chars) without skip codes..
try use reverse order of comparing..
 1.7.6.1
 1.7.6.1