mirror of
https://github.com/zoriya/ash.git
synced 2026-06-04 03:06:03 +00:00
Fixing alias with spaces before command
This commit is contained in:
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user