Zappy - Year end project 2
This is a project that Epitech asked us to create in order to allow us to reveiw the notions of the current year.
Loading...
Searching...
No Matches
command_parse.c
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2024
3** my_zappy
4** File description:
5** command_parse.c
6*/
7
8#include <stdlib.h>
9#include <string.h>
10#include <unistd.h>
11
12#include "utils.h"
13#include "command_parse.h"
14
21static int check_command_arg(int i, char **command)
22{
23 size_t len_command = get_array_len(command);
24
25 if (COMMAND_TABLE[i].arg_nb < len_command - 1)
26 return (EXIT_FAILURE);
27 return (EXIT_SUCCESS);
28}
29
35int check_command_exist(char **command)
36{
37 int r_val;
38
39 for (int i = 0; i < CLIENT_COMMAND_NB + GUI_COMMAND_NB; ++i) {
40 if (strcmp(command[0], COMMAND_TABLE[i].command) == 0) {
41 r_val = check_command_arg(i, command);
42 return (r_val);
43 }
44 }
45 return (EXIT_FAILURE);
46}
47
48char **parse_command(char *str)
49{
50 char **command = NULL;
51
53 if (command == NULL)
54 return (NULL);
55 if (check_command_exist(command) == EXIT_FAILURE) {
56 free_array(command);
57 return (NULL);
58 }
59 return (command);
60}
61
69static char ***parse_individual_command(char **buf)
70{
71 char ***commands;
72 size_t command_nb = get_array_len(buf);
73
74 commands = malloc(sizeof(char **) * (command_nb + 1));
75 if (commands == NULL) {
76 free_array(buf);
77 return (NULL);
78 }
79 for (size_t i = 0; i < command_nb; ++i) {
80 commands[i] = parse_command(buf[i]);
81 if (commands[i] == NULL) {
82 free_array_size_n(commands, i);
83 return (NULL);
84 }
85 }
86 commands[command_nb] = NULL;
87 return (commands);
88}
89
90static void *free_values(char **array, char *str)
91{
92 free(str);
93 free_array(array);
94 return (NULL);
95}
96
97char ***parse_buffer(uint8_t *buffer, ssize_t buf_size)
98{
99 char *str = malloc(sizeof(char) * (buf_size + 2));
100 char **buf;
101 char ***commands;
102
103 if (str == NULL)
104 return (NULL);
105 (void) memcpy(str, buffer, buf_size);
106 str[buf_size + 1] = '\0';
108 if (buf == NULL) {
109 return (free_values(buf, str));
110 }
111 commands = parse_individual_command(buf);
112 if (commands == NULL) {
113 return (free_values(buf, str));
114 }
115 free_values(buf, str);
116 return (commands);
117}
char *** parse_buffer(uint8_t *buffer, ssize_t buf_size)
Get all command in buffer (a command is delimited by COMMAND_SEPARATOR)
char ** parse_command(char *str)
Parse a command using COMMAND_DELIMITER as delimiter.
int check_command_exist(char **command)
Verify if command exist and if it is valid.
#define COMMAND_DELIMITER
Definition constants.h:51
#define GUI_COMMAND_NB
Definition constants.h:55
#define CLIENT_COMMAND_NB
Definition constants.h:54
#define COMMAND_SEPARATOR
Definition constants.h:52
void free_array(void *to_free)
! FREE !!
Definition free.c:13
size_t get_array_len(char **array)
! GETTER !!
Definition array_utils.c:13
void free_array_size_n(void *to_free, const size_t n)
Free any ** array up to n.
Definition free.c:26
char ** str_to_word_array(const char *str, const char delim)
Turn string to char **.
Definition array_utils.c:62