1 #include "qcc.h"
2 #include "hash.h"
3
4
hash(char * string)5 unsigned int hash (char *string)
6 {
7 unsigned int index = 0;
8 int count;
9
10 for (count = 0; string[count] != '\0' && count < 15; count++)
11 index = (index << 1) ^ string[count];
12
13 return index & (HSIZE1 - 1);
14 }
15
16 struct hash_element *htable[HSIZE1];
17 int optable[OPTABLESIZE];
18
19 int stats[HSIZE1];
20
21 void
inithash()22 inithash()
23 {
24 int i=0;
25 int index=0;
26
27 for (i=0; i<HSIZE1; i++)
28 {
29 htable[i] = NULL;
30 stats[i] = 0;
31 }
32
33 // JPG - added optable
34 for (i = 0 ; i < OPTABLESIZE ; i++)
35 optable[i] = 0;
36 for (i = 0 ; pr_opcodes[i].name ; i++)
37 {
38 if (pr_opcodes[i].priority > 0)
39 {
40 if (STRCMP(pr_opcodes[i].name, pr_opcodes[i-1].name))
41 {
42 index = (pr_opcodes[i].name[0] + pr_opcodes[i].name[1]) & (OPTABLESIZE - 1);
43 if (optable[index])
44 {
45 Sys_Error("optable conflict between %s and %s!\n", pr_opcodes[optable[index]].name, pr_opcodes[i].name);
46 }
47 optable[index] = i;
48 }
49 }
50 }
51 }
52
HashImmediate(void)53 void HashImmediate (void)
54 {
55 char tmpchar[40];
56 if (pr_immediate_type == &type_string)
57 pr_immediate_index = hash(pr_immediate_string);
58 else if (pr_immediate_type == &type_float)
59 {
60 sprintf(tmpchar, "%d", pr_immediate._int);
61 pr_immediate_index = hash(tmpchar);
62 }
63 else if (pr_immediate_type == &type_int)
64 {
65 sprintf(tmpchar, "%d", pr_immediate._int);
66 pr_immediate_index = hash(tmpchar);
67 }
68 else if (pr_immediate_type == &type_vector)
69 {
70 char tmpchar[80];
71 sprintf(tmpchar, "%.4f,%.4f,%.4f", pr_immediate.vector[0], pr_immediate.vector[1], pr_immediate.vector[2]);
72 pr_immediate_index = hash(tmpchar);
73 }
74 else
75 PR_ParseError ("invalid immediate type %s", typenames[pr_immediate_type->type]);
76 }