Repository navigation
Expand file tree
/
Copy pathparser.c
More file actions
120 lines (89 loc) · 2.63 KB
/
Copy pathparser.c
File metadata and controls
120 lines (89 loc) · 2.63 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "parser.h"
#include <stdio.h>
#include <string.h>
int parse_command(char *buffer, Command *cmd) {
char *p = buffer;
int arg_count = 0;
cmd->right_argv = NULL;
cmd->input_file = NULL;
cmd->output_file = NULL;
cmd->append_mode = 0;
while (*p != '\0') {
while (*p == ' ' || *p == '\t') {
p++;
}
if (*p == '\0') {
break;
}
if (arg_count < MAX_ARGS - 1) {
cmd->argv[arg_count++] = p;
}
while (*p != '\0' && *p != ' ' && *p != '\t') {
p++;
}
if (*p != '\0') {
*p = '\0';
p++;
}
}
cmd->argv[arg_count] = NULL;
if (arg_count == 0)
return 0;
for (int i = 0; i < arg_count; i++) {
if (strcmp(cmd->argv[i], ">") == 0) {
if (i == 0) {
fprintf(stderr, "shall: expected command before >\n");
return -1;
}
if (i + 1 >= arg_count) {
fprintf(stderr, "shall: expected filename after >\n");
return -1;
}
cmd->output_file = cmd->argv[i + 1];
cmd->append_mode = 0;
cmd->argv[i] = NULL;
i++;
}
else if (strcmp(cmd->argv[i], ">>") == 0) {
if (i == 0) {
fprintf(stderr, "shall: expected command before >>\n");
return -1;
}
if (i + 1 >= arg_count) {
fprintf(stderr, "shall: expected filename after >>\n");
return -1;
}
cmd->output_file = cmd->argv[i + 1];
cmd->append_mode = 1;
cmd->argv[i] = NULL;
i++;
}
else if (strcmp(cmd->argv[i], "<") == 0) {
if (i == 0) {
fprintf(stderr, "shall: expected command before <\n");
return -1;
}
if (i + 1 >= arg_count) {
fprintf(stderr, "shall: expected filename after <\n");
return -1;
}
cmd->input_file = cmd->argv[i + 1];
cmd->argv[i] = NULL;
i++;
}
else if (strcmp(cmd->argv[i], "|") == 0) {
if (i == 0) {
fprintf(stderr, "shall: expected command before |\n");
return -1;
}
if (i + 1 >= arg_count) {
fprintf(stderr, "shall: expected command after |\n");
return -1;
}
cmd->right_argv = &cmd->argv[i + 1];
cmd->argv[i] = NULL;
break;
}
}
return 1;
}