-
Notifications
You must be signed in to change notification settings - Fork 1
/
tables.c
103 lines (85 loc) · 2.81 KB
/
tables.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/******************************************************************************
* IFJ21
* tables.c
*
* Authors: Vojtěch Dvořák (xdvora3o)
* Purpose: Functions, that contain static variables with defined keywords,...
*
* Last change: 7. 12. 2021
*****************************************************************************/
/**
* @file tables.c
* @brief Functions, that contain static variables with defined keywords,...
*
* @authors Vojtěch Dvořák (xdvora3o)
*/
#include "tables.h"
/**
* @brief Contains static array of allowed keywords in IFJ21
* (sorted by ASCII - alphabetically, same sorting as in dictionary)
* @return Pointer to keyword with index from argument
*/
char * get_keyword(unsigned int index) {
static char * keyword_table[KEYWORD_TABLE_SIZE] =
{
"do", "else", "end", "function",
"global", "if", "integer", "local",
"nil", "number", "require", "return",
"string", "then", "while"
};
return keyword_table[index];
}
/**
* @brief Contains static array of allowed operators in IFJ21
* (sorted by ASCII value)
* @return Pointer to operator with index from argument
*/
char * get_operator(unsigned int index) {
static char * operator_table[OPERATOR_TABLE_SIZE] =
{
"#", "%", "*", "+", "-", "..",
"/", "//", "<", "<=", "=",
"==", ">", ">=", "^", "~="
};
return operator_table[index];
}
/**
* @brief Contains static array of allowed separators in IFJ21
* (sorted by ASCII value)
* @return Pointer to separator with index from argument
*/
char * get_separator(unsigned int index) {
static char * separator_table[SEPARATOR_TABLE_SIZE] =
{
"(", ")", ",", ":"
};
return separator_table[index];
}
/**
* @brief Tries to find string in table (Implemented as binary search)
* @param str string to be found
* @param table_func pointer to function, that contains static array
* @return pointer to found string in static array or NULL
*/
char * match(char * str, char * (*table_func)(unsigned int), size_t tab_size) {
int middle = tab_size / 2;
int left_b = 0, right_b = tab_size - 1;
char * found = NULL;
do {
char * cur_str = table_func(middle);
int cmp_result = str_cmp(str, cur_str);
if(cmp_result == 0) {
found = cur_str;
break;
}
else if(cmp_result < 0) {
right_b = middle - 1;
}
else {
left_b = middle + 1;
}
middle = (right_b - left_b) / 2 + left_b;
} while(left_b <= right_b);
return found;
}
/*** End of tables.c ***/