-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.c
102 lines (87 loc) · 2.32 KB
/
util.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
#include "state.h"
#include "util.h"
/*
* hashtable 구현을 위한 hash function
*/
size_t hash_string (char *str, int hash_size){
int32_t hash = 2829;
int32_t c;
size_t res;
while((c = *str++)){
hash = (hash * 615) + c;
}
res = (size_t)hash % hash_size;
return res;
}
/*
* 문자열 str 이 0으로 변환될수있는지 확인한다.
* ex, is_zero_str("0000") => return true
* ex, is_zero_str("A00") => return false
*/
bool is_zero_str(char* str){
assert(str);
int len = (int)strlen(str);
int i;
for(i=0;i<len;i++)
if(str[i] != '0')
return false;
return true;
}
/*
* 문자열 str 이 16 진수인지 확인한다.
* ex, is_valid_hex("00F1") => return true
* ex2, is_valid_hex("FZ") => return false
*/
bool is_valid_hex(char* str){
assert(str);
int l = (int)strlen(str), i;
for(i=0;i<l;i++) {
if ('0' <= str[i] &&
str[i] <= '9')
continue;
if('A' <= str[i] &&
str[i] <= 'F')
continue;
if('a' <= str[i] &&
str[i] <= 'f')
continue;
return false;
}
return true;
}
/*
* 문자열 str 이 [0 ~ max_size-1] 범위의 적절한 주소값인지 확인한다.
* ex, is_zero_str("00F", 100) => return true
* ex, is_zero_str("FG", 100000) => return false
*/
bool is_valid_address(char *str, int max_size) {
assert(str);
int target = (int)strtol(str, NULL, 16);
if(target < 0) return false; // 0 보다 큰지 검증
if(target == 0 && !is_zero_str(str)) return false; // 올바른 hex 값인지 검증
if(target >= max_size) return false; // 범위 내에 있는지 검증
if(!is_valid_hex(str)) return false; // 올바른 hex 값인지 검증
return true;
}
/*
* 문자열에서 . 이전의 문자열 을 찾아서 리턴한다.
* 예를들어 before_dot(2_5.asm) 은 2_5가 리턴된다.
*/
char *before_dot(char *name, int size) {
char *pre;
char* dot;
pre = malloc(sizeof(char)*size);
strncpy(pre, name, size);
dot = strrchr (pre,'.');
if(dot == NULL){
return NULL;
}
*dot = '\0';
return pre;
}
char *concat_n(char *name, char *name2, int max_size) {
char* res;
res = malloc(sizeof(char)*max_size);
snprintf (res, max_size, "%s%s", name, name2);
return res;
}