Fixing alias with spaces before command

This commit is contained in:
Anonymus Raccoon
2020-05-23 21:58:53 +02:00
parent b28472127d
commit f52e8e9d2a
3 changed files with 8 additions and 132 deletions
+1 -2
View File
@@ -7,7 +7,6 @@
SRC = src/shell.c \
src/prompt.c \
src/alias.c \
src/execute.c \
src/glob.c \
src/redirections/redirection_manager.c \
@@ -60,7 +59,7 @@ TESTS = tests/tenv.c \
tests/targc.c \
tests/texecute.c \
tests/tcd.c \
tests/tsource.c \
tests/tsource.c \
tests/techo.c
COVERAGE = -lcriterion --coverage
-53
View File
@@ -1,53 +0,0 @@
/*
** EPITECH PROJECT, 2020
** alias.c
** File description:
** alias
*/
#include "shell.h"
#include "builtin.h"
#include "utility.h"
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
char *get_alias_command(char *cmd, alias_t *alias)
{
alias_t *tmp = NULL;
tmp = alias;
for (; tmp; tmp = tmp->next) {
if (!strcmp(cmd, alias->alias)) {
cmd = strdup(alias->command);
tmp = alias;
}
}
return (cmd);
}
char *add_separator(char *cmd, int *return_values, int index)
{
int pos = 0;
char *new_cmd = NULL;
if (!cmd)
return (NULL);
new_cmd = calloc(strlen(cmd) + 3, sizeof(char));
if (!new_cmd)
return (NULL);
for (int i = 0; cmd[i]; i++)
new_cmd[i] = cmd[pos++];
if (return_values[index + 1] != -2) {
new_cmd[pos] = ';';
if (return_values[index + 1] == 1) {
new_cmd[pos++] = '|';
new_cmd[pos++] = '|';
} else if (return_values[index + 1] == 0) {
new_cmd[pos++] = '&';
new_cmd[pos++] = '&';
}
}
return (new_cmd);
}
+7 -77
View File
@@ -19,91 +19,21 @@
char *strdup(const char *);
const parser_map parsers[] = {
{'\'', &parse_quotes},
{'"', &parse_double_quotes},
{'\0', NULL}
};
bool is_character_valid(char c)
int count_trailing_spaces(char *cmd)
{
static bool is_valid = false;
int i = 0;
if (is_valid) {
is_valid = false;
return (true);
}
if (c == '\\') {
is_valid = true;
}
return (c >= 33 && c <= 126);
}
int call_parsers(char *cmd, int index, char **data, env_t *env)
{
int new_index = 0;
for (int i = 0; parsers[i].key; i++) {
if (cmd[index] != parsers[i].key)
continue;
new_index = parsers[i].parser(&cmd[index], data, env);
if (!(*data))
return (-1);
return (new_index);
}
return (0);
}
int manage_specials_parsers(char *cmd, char **buffer, int *inc, env_t *env)
{
int new_index = 0;
char *data = NULL;
new_index = call_parsers(cmd, 0, &data, env);
if (new_index == -1)
return (-1);
if (new_index > 0) {
(*inc)--;
*buffer = add_to_buffer(*buffer, &cmd[(*inc) * -1], (*inc), env);
*buffer = add_to_buffer(*buffer, data, strlen(data), NULL);
free(data);
(*inc) = 0;
if (!(*buffer))
return (-1);
return (new_index);
}
return (0);
}
int parser_loop(char *cmd, char **buffer, char **ptr, void **pack)
{
int *i = pack[0];
int *inc = pack[1];
int *new_index = pack[2];
env_t *env = pack[3];
if (is_character_valid(cmd[*i])) {
(*new_index) = manage_specials_parsers(&cmd[(*i)], buffer, inc, env);
if ((*new_index) == -1)
return (-1);
(*i) += (*new_index);
if (*new_index)
(*ptr) = cmd + (*i) + 1;
return (1);
}
if (*inc == 1 && !(*new_index)) {
(*ptr) = cmd + (*i) + 1;
(*inc) = 0;
return (1);
}
return (0);
for (i = 0; cmd[i]; i++)
if (cmd[i] != ' ' && cmd[i] != '\t')
break;
return (i);
}
char **parse_input(char *cmd, env_t *env, wordexp_t *parser)
{
int bin_len;
cmd = strdup(cmd);
cmd = strdup(cmd + count_trailing_spaces(cmd));
for (bin_len = 0; cmd[bin_len]; bin_len++) {
if (cmd[bin_len] == ' ' || cmd[bin_len] == '\t')
break;