Merge pull request #75 from AnonymusRaccoon/if/for

If/for
This commit is contained in:
Octopus
2020-05-24 23:05:23 +02:00
committed by GitHub
6 changed files with 152 additions and 2 deletions

View File

@@ -26,6 +26,8 @@ SRC = src/shell.c \
src/builtin/builtin_alias.c \
src/builtin/builtin_unalias.c \
src/builtin/builtin_echo.c \
src/builtin/builtin_if.c \
src/builtin/builtin_if_two.c \
src/signal.c \
src/free_env.c \
src/utility/same_var.c \

View File

@@ -30,6 +30,7 @@ int builtin_alias(char **args, env_t *env);
int builtin_unalias(char **args, env_t *env);
int builtin_bindkey(char **argv, env_t *env);
int builtin_echo(char **args, env_t *env);
int builtin_if(char **argv, env_t *env);
int builtin_set(char **argv, env_t *env);
int builtin_unset(char **argv, env_t *env);
@@ -65,4 +66,9 @@ int add_alias_to_list(alias_t **list, alias_t *elem, char *alias);
void remove_alias(char *alias, alias_t **list);
//echo
int print_char(char *str, int i);
int print_char(char *str, int i);
//if
char *get_expr(char **argv);
int get_test_return_value(char **argv, env_t *env);
int get_max_cmd_len(char **argv);

96
src/builtin/builtin_if.c Normal file
View File

@@ -0,0 +1,96 @@
/*
** EPITECH PROJECT, 2020
** 42sh
** File description:
** if builtin
*/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "shell.h"
#include "builtin.h"
int matched_parenthesis(char **argv)
{
int left_p = 0;
int right_p = 0;
for (int i = 0; argv[i]; i++)
for (int j = 0; argv[i][j]; j++) {
left_p = argv[i][j] == '(' ? left_p + 1 : left_p;
right_p = argv[i][j] == ')' ? right_p + 1 : right_p;
}
if (left_p > right_p)
printf("Too many ('s.\n");
if (right_p > left_p)
printf("Too many )'s.\n");
if (left_p == right_p)
return (1);
return (0);
}
int get_max_cmd_len(char **argv)
{
int len = 0;
for (int i = 0; argv[i]; i++) {
if (i)
len++;
for (int j = 0; argv[i][j]; j++)
len++;
}
return (len);
}
int execute_one_liner(char **argv, env_t *env)
{
bool after_exp = false;
char *cmd = malloc(sizeof(char) * get_max_cmd_len(argv));
int counter = 0;
if (!cmd || get_test_return_value(argv, env))
return (0);
for (int i = 0; argv[i]; i++) {
for (int j = 0; argv[i][j]; j++) {
if (after_exp)
cmd[counter++] = argv[i][j];
if (argv[i][j] == ')')
after_exp = true;
}
if (after_exp && counter)
cmd[counter++] = ' ';
}
cmd[counter] = 0;
eval_raw_cmd(cmd, env);
free(cmd);
return (0);
}
int is_valid_if_cmd(char **argv)
{
int len = 0;
for (; argv[len]; len++);
if (len < 1) {
printf("if: Too few arguments\n");
return (0);
}
if (!matched_parenthesis(argv))
return (0);
if (argv[1][0] != '(') {
printf("if: Expression Syntax.\n");
return (0);
}
return (1);
}
int builtin_if(char **argv, env_t *env)
{
if (is_valid_if_cmd(argv)) {
execute_one_liner(argv, env);
env->vars = my_setenv(env->vars, "?", "0");
} else
env->vars = my_setenv(env->vars, "?", "1");
return (0);
}

View File

@@ -0,0 +1,46 @@
/*
** EPITECH PROJECT, 2020
** 42sh
** File description:
** builtin_if_two
*/
#include <string.h>
#include <stdlib.h>
#include "shell.h"
#include "builtin.h"
char *get_expr(char **argv)
{
bool in_expr = false;
char *res = malloc(sizeof(char) * get_max_cmd_len(argv) + 5);
int counter = 5;
if (!res) return (NULL);
strcpy(res, "test ");
for (int i = 0; argv[i]; i++) {
for (int j = 0; argv[i][j]; j++) {
if (argv[i][j] == ')')
in_expr = false;
if (in_expr)
res[counter++] = argv[i][j];
if (argv[i][j] == '(')
in_expr = true;
}
if (in_expr && counter)
res[counter++] = ' ';
}
res[counter] = 0;
return (res);
}
int get_test_return_value(char **argv, env_t *env)
{
int res = 0;
char *exp = get_expr(argv);
eval_raw_cmd(exp, env);
res = my_getenv(env->vars, "?") ? atoi(my_getenv(env->vars, "?")) : 1;
free(exp);
return (res);
}

View File

@@ -10,7 +10,6 @@
#include <string.h>
#include "utility.h"
char *my_getenv(char **env, char *name)
{
if (!env)

View File

@@ -29,6 +29,7 @@ const builtin builtins[] = {
{"unalias", &builtin_unalias},
{"bindkey", &builtin_bindkey},
{"echo", &builtin_echo},
{"if", &builtin_if},
{"set", &builtin_set},
{"unset", &builtin_unset},
{NULL, NULL}