Subversion Repositories filter_foundry

Rev

Rev 62 | Rev 192 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 toby 1
/*
18 toby 2
    This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
171 dmarschall 3
    Copyright (C) 2003-2019 Toby Thain, toby@telegraphics.com.au
2 toby 4
 
5
    This program is free software; you can redistribute it and/or modify
171 dmarschall 6
    it under the terms of the GNU General Public License as published by
2 toby 7
    the Free Software Foundation; either version 2 of the License, or
8
    (at your option) any later version.
9
 
10
    This program is distributed in the hope that it will be useful,
11
    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
    GNU General Public License for more details.
14
 
171 dmarschall 15
    You should have received a copy of the GNU General Public License
2 toby 16
    along with this program; if not, write to the Free Software
17
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18
*/
19
 
20
#include <stdio.h>
21
#include <string.h>
22
 
23
#include "symtab.h"
24
 
25
unsigned long djb2(char *str);
26
 
171 dmarschall 27
/* following constant (need not) be prime. for a list of prime numbers,
2 toby 28
   see http://www.utm.edu/research/primes/lists/small/1000.txt */
29
#define TABLE_SIZE 128 // if you're anticipating many symbols, increase this value!
30
#define HASH(s) (djb2(s) % TABLE_SIZE)
31
 
32
struct sym_rec *hash_table[TABLE_SIZE];
33
extern struct sym_rec predefs[];
34
 
171 dmarschall 35
// hash function recommended by Ozan Yigit
2 toby 36
// http://www.cs.yorku.ca/~oz/hash.html
37
// "this algorithm (k=33) was first reported by dan bernstein"
38
unsigned long djb2(char *str){
39
        unsigned long hash = 5381;
40
        int c;
41
 
23 toby 42
        while( (c = *str++) )
2 toby 43
                hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
44
 
45
        return hash;
46
}
47
 
48
void init_symtab(struct sym_rec *pre){
49
        struct sym_rec *p;
50
        int i;
51
 
52
        for(i=TABLE_SIZE;i--;)
53
                hash_table[i] = 0;
54
        for(p=pre;p->name;p++){
55
                if(lookup(p->name))
56
                        printf("!!!! duplicate predefined symbol: %s\n",p->name);
57
                insert(p);
58
        }
59
}
60
 
61
void dump_symbols(){
62
        struct sym_rec *p;
63
        int i,occ,maxchain,chain;
64
 
65
        puts("\nsymbol table:");
66
        for(i=occ=maxchain=0;i<TABLE_SIZE;i++)
67
                if(hash_table[i]){
68
                        ++occ;
69
                        for(p=hash_table[i],chain=0;p;p=p->next){
70
                                puts(p->name);
71
                                ++chain;
72
                        }
73
                        if(chain>maxchain)
74
                                maxchain = chain;
75
                }
76
        printf("# hash stats: occupancy=%d/%d (%.1f%%) longest chain=%d\n",
62 toby 77
                   occ,TABLE_SIZE,(100.*occ)/TABLE_SIZE,maxchain);
2 toby 78
}
79
 
80
 
81
struct sym_rec *lookup(char *s){
82
        struct sym_rec *p;
83
        int idx = HASH(s);
171 dmarschall 84
//      printf("# lookup \"%s\" hash=%5d\n",s,idx);
2 toby 85
        for(p=hash_table[idx];p;p=p->next)
86
                if(!strcmp(s,p->name))
87
                        return p;
88
        return 0; /* not found */
89
}
90
void insert(struct sym_rec *p){
91
        int idx = HASH(p->name);
92
        p->next = hash_table[idx];
93
        hash_table[idx] = p;
94
        /* DPRINTF("# insert symbol [%5d] \"%s\"\n",idx,p->name);*/
95
}