mirror of
https://github.com/zoriya/ash.git
synced 2026-06-07 20:20:40 +00:00
Fixing alias with spaces before command
This commit is contained in:
@@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
SRC = src/shell.c \
|
SRC = src/shell.c \
|
||||||
src/prompt.c \
|
src/prompt.c \
|
||||||
src/alias.c \
|
|
||||||
src/execute.c \
|
src/execute.c \
|
||||||
src/glob.c \
|
src/glob.c \
|
||||||
src/redirections/redirection_manager.c \
|
src/redirections/redirection_manager.c \
|
||||||
@@ -60,7 +59,7 @@ TESTS = tests/tenv.c \
|
|||||||
tests/targc.c \
|
tests/targc.c \
|
||||||
tests/texecute.c \
|
tests/texecute.c \
|
||||||
tests/tcd.c \
|
tests/tcd.c \
|
||||||
tests/tsource.c \
|
tests/tsource.c \
|
||||||
tests/techo.c
|
tests/techo.c
|
||||||
|
|
||||||
COVERAGE = -lcriterion --coverage
|
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 *);
|
char *strdup(const char *);
|
||||||
|
|
||||||
const parser_map parsers[] = {
|
int count_trailing_spaces(char *cmd)
|
||||||
{'\'', &parse_quotes},
|
|
||||||
{'"', &parse_double_quotes},
|
|
||||||
{'\0', NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
bool is_character_valid(char c)
|
|
||||||
{
|
{
|
||||||
static bool is_valid = false;
|
int i = 0;
|
||||||
|
|
||||||
if (is_valid) {
|
for (i = 0; cmd[i]; i++)
|
||||||
is_valid = false;
|
if (cmd[i] != ' ' && cmd[i] != '\t')
|
||||||
return (true);
|
break;
|
||||||
}
|
return (i);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char **parse_input(char *cmd, env_t *env, wordexp_t *parser)
|
char **parse_input(char *cmd, env_t *env, wordexp_t *parser)
|
||||||
{
|
{
|
||||||
int bin_len;
|
int bin_len;
|
||||||
|
|
||||||
cmd = strdup(cmd);
|
cmd = strdup(cmd + count_trailing_spaces(cmd));
|
||||||
for (bin_len = 0; cmd[bin_len]; bin_len++) {
|
for (bin_len = 0; cmd[bin_len]; bin_len++) {
|
||||||
if (cmd[bin_len] == ' ' || cmd[bin_len] == '\t')
|
if (cmd[bin_len] == ' ' || cmd[bin_len] == '\t')
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user