-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfunctions.c
85 lines (62 loc) · 1.74 KB
/
functions.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
//
// Created by andrey.zavodov on 14.12.18.
//
#include "functions.h"
char* _parse_argument(char* argument, program_state state){
if (!argument){
return "";
}
if (argument[0] == '$'){
if (isnumber(argument + 1)){
long number = strtol(argument + 1, (char **)NULL, 10);
if (number < 0) {
return argument;
}
if (number == 0){
return state.RECORD;
}
if (number > state.NF){
return "";
}
return state.FIELDS[number - 1];
} else {
// TODO add processing user variables
return argument;
}
}
return argument;
}
int print(token** tok_ptr, program_state state){
(*tok_ptr) = (*tok_ptr)->next;
token* tok = *tok_ptr;
while (tok->token && strcmp(tok->token, "}") != 0 && !strstr(tok->separator, ";")) {
char* parsed_argument = _parse_argument(tok->token, state);
write(STDOUT_FILENO, parsed_argument, strlen(parsed_argument));
if (strstr(tok->separator, ",")){
write(STDOUT_FILENO, " ", strlen(" "));
}
(*tok_ptr) = (*tok_ptr)->next;
tok = *tok_ptr;
}
write(STDOUT_FILENO, &state.ORS, strlen(&state.ORS));
return 0;
}
int check_regex(char* record, char* pattern){
regex_t regex;
int reti = regcomp(®ex, pattern, 0);
if (reti) {
message("ERROR", "Could not compile regex.");
}
reti = regexec(®ex, record, 0, NULL, 0);
if (!reti) {
regfree(®ex);
return 1;
}
else if (reti == REG_NOMATCH) {
regfree(®ex);
return 0;
}
else {
message("ERROR", "Regex match failed");
}
}