-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.c
108 lines (91 loc) · 1.74 KB
/
parser.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
104
105
106
107
108
#include "shell.h"
/**
* rm_newline - Removes the new line from User's input
* @line: the line inputted by user
*
* Return: input without newline
*/
char *rm_newline(char *line)
{
char *temp = line;
temp = strtok(temp, "\n");
return (temp);
}
/**
* parse_input - parses the line entered by the user
* @line: the given input
*
* Return: an array of tokens present in @line
*/
char **parse_input(char *line)
{
char **tokens;
char *tok, *temp;
int i;
if (!line)
return (NULL);
tokens = malloc(sizeof(char *) * _strlen(line));
if (!tokens)
{
perror("Gsh");
return (NULL);
}
line = rm_newline(line);
temp = _strdup(line);
tok = strtok(temp, " ");
for (i = 0; tok; i++)
{
tokens[i] = _strdup(tok);
tok = strtok(NULL, " ");
}
tokens[i] = NULL;
free(temp);
return (tokens);
}
/**
* build_path - build the path to a command
* @token: the given command
* @value: the path to build for @token
*
* Return: @value/@token - the path of command
*/
char *build_path(char *token, char *value)
{
char *cmd;
size_t len;
len = _strlen(value) + _strlen(token) + 2;
cmd = malloc(sizeof(char) * len);
if (!cmd)
return (NULL);
memset(cmd, 0, len);
cmd = _strcat(cmd, value);
cmd = _strcat(cmd, "/");
cmd = _strcat(cmd, token);
return (cmd);
}
/**
* check_cmd_path - check if command is in path
* @cmd: an array of command strings
*
* Return: 0 if found, else 1
*/
int check_cmd_path(char **cmd)
{
char *path, *value, *cmd_path;
struct stat buf;
path = _getenv("PATH");
value = strtok(path, ":");
while (value)
{
cmd_path = build_path(*cmd, value);
if (stat(cmd_path, &buf) == 0)
{
*cmd = _strdup(cmd_path);
free(cmd_path);
return (0);
}
free(cmd_path);
value = strtok(NULL, ":");
}
return (1);
}