add: paring
This commit is contained in:
parent
dc32c7d993
commit
bf662fbbc6
9
src/cmd/cmd.c
Normal file
9
src/cmd/cmd.c
Normal file
@ -0,0 +1,9 @@
|
||||
#include "./cmd.h"
|
||||
|
||||
void cmd_del(void *ptr)
|
||||
{
|
||||
cmd* content = ptr;
|
||||
|
||||
tab_free((void**)content->args);
|
||||
free(content->executable);
|
||||
}
|
@ -1,5 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "../../lib/bozolib/bozolib.h"
|
||||
|
||||
typedef struct s_cmd
|
||||
{
|
||||
char *executable;
|
||||
@ -8,3 +13,7 @@ typedef struct s_cmd
|
||||
int fd_out;
|
||||
int pid;
|
||||
} cmd;
|
||||
|
||||
void cmd_del(void* ptr);
|
||||
|
||||
lst** cmds_init(size_t len);
|
||||
|
34
src/cmd/cmds.c
Normal file
34
src/cmd/cmds.c
Normal file
@ -0,0 +1,34 @@
|
||||
#include "./cmd.h"
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
lst** cmds_init(size_t len)
|
||||
{
|
||||
lst** root;
|
||||
lst* current;
|
||||
cmd* content;
|
||||
|
||||
root = calloc(sizeof(lst*), 1);
|
||||
if (root == NULL)
|
||||
return (NULL);
|
||||
for (size_t i = 0; i < len; i++)
|
||||
{
|
||||
current = malloc(sizeof(lst));
|
||||
if (current == NULL)
|
||||
{
|
||||
lst_clear(root, &free);
|
||||
free(root);
|
||||
return (NULL);
|
||||
}
|
||||
lst_addback(root, current);
|
||||
content = malloc(sizeof(cmd));
|
||||
if (content == NULL)
|
||||
{
|
||||
lst_clear(root, &free);
|
||||
free(root);
|
||||
return (NULL);
|
||||
}
|
||||
current->content = content;
|
||||
}
|
||||
return (root);
|
||||
}
|
@ -79,25 +79,29 @@ int execute(cmd* input, lst** env)
|
||||
return exitcode;
|
||||
}
|
||||
|
||||
int command_list_exec(cmd** cmds, lst** env)
|
||||
int cmds_list_exec(lst** cmds, lst** env)
|
||||
{
|
||||
lst* current = *cmds;
|
||||
cmd* content;
|
||||
int fds[2];
|
||||
for (int i=0; cmds[i] != NULL; i++)
|
||||
while (current != NULL)
|
||||
{
|
||||
content = current->content;
|
||||
if (pipe(fds) < 0)
|
||||
return 1;
|
||||
if (i < len((void**)cmds)-1)
|
||||
if (current->next != NULL)
|
||||
{
|
||||
cmds[i]->fd_out = fds[1];
|
||||
cmds[i+1]->fd_in = fds[0];
|
||||
content->fd_out = fds[1];
|
||||
((cmd*)current->next->content)->fd_in = fds[0];
|
||||
}
|
||||
if (builtin_execute(cmds[i], env) == 1)
|
||||
execute(cmds[i], env);
|
||||
if (builtin_execute(content, env) == 1)
|
||||
execute(content, env);
|
||||
current = current->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
char* get_executable_path(char* executable, lst** env)
|
||||
char* get_executable_path(const char* executable, lst** env)
|
||||
{
|
||||
int size_path_str;
|
||||
char * path_file;
|
||||
|
@ -1,7 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
int command_list_exec(cmd** cmds, lst** env);
|
||||
#include "../cmd/cmd.h"
|
||||
#include "../../lib/bozolib/bozolib.h"
|
||||
|
||||
int cmds_list_exec(lst** cmds, lst** env);
|
||||
int execute(cmd* input, lst** env);
|
||||
int builtin_execute(cmd* input, lst** env);
|
||||
int piper(cmd** cmds, lst** env);
|
||||
char* get_executable_path(char* executable, lst** env);
|
||||
char* get_executable_path(const char* executable, lst** env);
|
||||
|
25
src/main.c
25
src/main.c
@ -1,13 +1,23 @@
|
||||
#include "./env/env.h"
|
||||
#include "./input/input.h"
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include "cmd/cmd.h"
|
||||
#include "./exec/exec.h"
|
||||
#include "./parsing/parsing.h"
|
||||
|
||||
void cmds_list_destroyer(lst*** cmds_list)
|
||||
{
|
||||
for (size_t i = 0; cmds_list[i] != NULL; i++)
|
||||
lst_clear(cmds_list[i], &cmd_del);
|
||||
free(cmds_list);
|
||||
}
|
||||
|
||||
int main(int ac, char **av, char **env_str)
|
||||
{
|
||||
char *line;
|
||||
lst** env;
|
||||
lst*** cmds_list;
|
||||
|
||||
(void) av;
|
||||
(void) ac;
|
||||
@ -17,7 +27,22 @@ int main(int ac, char **av, char **env_str)
|
||||
line = get_user_input(env);
|
||||
while (line != NULL)
|
||||
{
|
||||
cmds_list = parsing(line, env);
|
||||
free(line);
|
||||
if (cmds_list == NULL)
|
||||
{
|
||||
lst_clear(env, &env_del);
|
||||
return 1;
|
||||
}
|
||||
for (size_t i = 0; cmds_list[i] != NULL; i++)
|
||||
{
|
||||
if (cmds_list_exec(cmds_list[i], env))
|
||||
{
|
||||
lst_clear(env, &env_del);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
cmds_list_destroyer(cmds_list);
|
||||
line = get_user_input(env);
|
||||
}
|
||||
lst_clear(env, &env_del);
|
||||
|
79
src/parsing/parsing.c
Normal file
79
src/parsing/parsing.c
Normal file
@ -0,0 +1,79 @@
|
||||
#include "../cmd/cmd.h"
|
||||
#include "../utils/utils.h"
|
||||
#include "../exec/exec.h"
|
||||
#include "../../lib/bozolib/bozolib.h"
|
||||
#include <stddef.h>
|
||||
|
||||
char* parsing_executable(const char* executable, lst** env)
|
||||
{
|
||||
if (strchr("./", executable[0]))
|
||||
return strdup(executable);
|
||||
return (get_executable_path(executable, env));
|
||||
}
|
||||
|
||||
int parsing_cmd(char *str, cmd* command, lst** env)
|
||||
{
|
||||
// if (get_redirections(str, command))
|
||||
// return 1;
|
||||
// remove_redirections(str);
|
||||
command->args = split_quoted_charset(str, "\t ");
|
||||
if (command->args == NULL)
|
||||
return 1;
|
||||
for (size_t i = 0; command->args[i]; i++)
|
||||
quote_remover(command->args[i]);
|
||||
command->executable = parsing_executable(command->args[0], env);
|
||||
return 0;
|
||||
}
|
||||
|
||||
lst **parsing_pipe(const char *str, lst** env)
|
||||
{
|
||||
char** cmds_str;
|
||||
lst** cmds;
|
||||
lst* current;
|
||||
|
||||
cmds_str = split_quoted_charset(str, "|");
|
||||
if (cmds_str == NULL)
|
||||
return (NULL);
|
||||
cmds = cmds_init(tablen((const void**)cmds_str));
|
||||
if (cmds == NULL)
|
||||
{
|
||||
tab_free((void**)cmds_str);
|
||||
return (NULL);
|
||||
}
|
||||
current = *cmds;
|
||||
for (size_t i = 0; cmds_str[i] != NULL; i++)
|
||||
{
|
||||
parsing_cmd(cmds_str[i], current->content, env);
|
||||
current = current->next;
|
||||
}
|
||||
return (cmds);
|
||||
}
|
||||
|
||||
lst*** parsing(const char *line, lst** env)
|
||||
{
|
||||
char** line_commas;
|
||||
lst*** tab;
|
||||
|
||||
line_commas = split_quoted_charset(line, ";");
|
||||
if (line_commas == NULL)
|
||||
return (NULL);
|
||||
tab = malloc(sizeof(lst**) * (tablen((const void**) line_commas) + 1));
|
||||
if (tab == NULL)
|
||||
{
|
||||
tab_free((void **) line_commas);
|
||||
return (NULL);
|
||||
}
|
||||
size_t i;
|
||||
for (i = 0; line_commas[i] != NULL; i++)
|
||||
{
|
||||
tab[i] = parsing_pipe(line_commas[i], env);
|
||||
if (tab[i] == NULL)
|
||||
{
|
||||
tab_free((void**) line_commas);
|
||||
return (NULL);
|
||||
}
|
||||
}
|
||||
tab[i] = NULL;
|
||||
return (tab);
|
||||
}
|
||||
|
4
src/parsing/parsing.h
Normal file
4
src/parsing/parsing.h
Normal file
@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
#include "../../lib/bozolib/bozolib.h"
|
||||
|
||||
lst*** parsing(const char* str, lst** env);
|
3
src/redirection/redirection.c
Normal file
3
src/redirection/redirection.c
Normal file
@ -0,0 +1,3 @@
|
||||
#include "../../lib/bozolib/bozolib.h"
|
||||
|
||||
|
38
src/utils/quote_remover.c
Normal file
38
src/utils/quote_remover.c
Normal file
@ -0,0 +1,38 @@
|
||||
#include "utils.h"
|
||||
|
||||
static void remove_quote_and_reset(char *str, ssize_t *start, ssize_t *stop)
|
||||
{
|
||||
str_shift(str + *start, -1);
|
||||
str_shift(str + *stop - 1, -1);
|
||||
*start = -1;
|
||||
*stop = -1;
|
||||
}
|
||||
|
||||
void quote_remover(char *str)
|
||||
{
|
||||
size_t i;
|
||||
ssize_t start;
|
||||
ssize_t stop;
|
||||
|
||||
start = -1;
|
||||
stop = -1;
|
||||
i = 0;
|
||||
while (str[i] != '\0')
|
||||
{
|
||||
if ((str[i] == '\"' || str[i] == '\''))
|
||||
{
|
||||
if (start == -1)
|
||||
start = i;
|
||||
else if (str[i] == str[start])
|
||||
stop = i;
|
||||
}
|
||||
if (stop != -1)
|
||||
{
|
||||
remove_quote_and_reset(str, &start, &stop);
|
||||
i = i - 1;
|
||||
}
|
||||
else
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "../../lib/bozolib/bozolib.h"
|
||||
|
||||
int is_in_quote(const char *str, size_t pos);
|
||||
void quote_remover(char *str);
|
||||
char **split_quoted_charset(const char *str, const char *charset);
|
||||
|
Loading…
Reference in New Issue
Block a user