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 }