-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexit.c
158 lines (152 loc) · 3.64 KB
/
exit.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include "shell.h"
/**
* implementExit - Implements the exit built-in
*
* @token: A pointer to the first argument in the line
* @lineCopy: A pointer to a copy of the line
*
* Return: An array of pointers to strings
*/
char **implementExit(char *token, char *lineCopy)
{
char *status, **tokens;
status = strtok(NULL, DELIM);
if (status != NULL && myCustomAtoi(status) > 0)
{
tokens = positiveStatusHandler(status, lineCopy, token);
return (tokens);
}
if (status != NULL && myCustomAtoi(status) < 0)
{
tokens = negativeStatusHandler(status, lineCopy, token);
return (tokens);
}
if (status != NULL && myCustomAtoi(status) == 0)
{
tokens = stringStatusHandler(status, lineCopy, token);
return (tokens);
}
tokens = malloc(sizeof(char *) * 2);
if (tokens == NULL)
{
free(lineCopy);
perror("Error: Failed to allocate memory.\n");
return (NULL);
}
tokens[0] = myCustomStrdup(token);
tokens[1] = NULL;
free(lineCopy);
return (tokens);
}
/**
* findExitStatus - Finds the exit status when exit built-in is used
*
* @tokens: An array of command line strings
* @line: A pointer to the command line
* @argv: An array of command line arguments
*
* Return: The exit status
*/
int findExitStatus(char **tokens, char *line, char **argv)
{
int status;
if (tokens[1] != NULL && myCustomAtoi(tokens[1]) > 0)
{
status = myCustomAtoi(tokens[1]);
free(line);
/* freeTokens(tokens); */
return (status);
}
if (tokens[1] != NULL && myCustomAtoi(tokens[1]) < 0)
{
free(line);
negativeExitError(argv[0], tokens[1]);
/* freeTokens(tokens); */
return (2);
}
if (tokens[1] != NULL && myCustomAtoi(tokens[1]) == 0)
{
free(line);
stringExitError(argv[0], tokens[1]);
/* freeTokens(tokens); */
}
return (2);
}
/**
* positiveStatusHandler - Handles exit with a positive number
*
* @status: A pointer to the status string
* @lineCopy: A pointer to a copy of the command line
* @token: A pointer to the "exit" string
*
* Return: An array of strings containing "exit" and a status,
* or NULL
*/
char **positiveStatusHandler(char *status, char *lineCopy, char *token)
{
char **tokens;
tokens = malloc(sizeof(char *) * 3);
if (tokens == NULL)
{
free(lineCopy);
perror("Error: Failed to allocate memory.\n");
return (NULL);
}
tokens[0] = myCustomStrdup(token);
tokens[1] = myCustomStrdup(status);
tokens[2] = NULL;
free(lineCopy);
return (tokens);
}
/**
* negativeStatusHandler - Handles exit with a negative number
*
* @status: A pointer to the status string
* @lineCopy: A pointer to a copy of the command line
* @token: A pointer to the "exit" string
*
* Return: An array of strings containing "exit" and a status,
* or NULL
*/
char **negativeStatusHandler(char *status, char *lineCopy, char *token)
{
char **tokens;
tokens = malloc(sizeof(char *) * 3);
if (tokens == NULL)
{
free(lineCopy);
perror("Error: Failed to allocate memory.\n");
return (NULL);
}
tokens[0] = myCustomStrdup(token);
tokens[1] = myCustomStrdup(status);
tokens[2] = NULL;
free(lineCopy);
return (tokens);
}
/**
* stringStatusHandler - Handles exit with a string
*
* @status: A pointer to the status string
* @lineCopy: A pointer to a copy of the command line
* @token: A pointer to the "exit" string
*
* Return: An array of strings containing "exit" and a status,
* or NULL
*/
char **stringStatusHandler(char *status, char *lineCopy, char *token)
{
char **tokens;
tokens = malloc(sizeof(char *) * 3);
if (tokens == NULL)
{
free(lineCopy);
perror("Error: Failed to allocate memory.\n");
return (NULL);
}
tokens[0] = myCustomStrdup(token);
tokens[1] = myCustomStrdup(status);
tokens[2] = NULL;
free(lineCopy);
return (tokens);
}