[FIX] var interpreter

This commit is contained in:
tekClovis
2025-05-06 16:00:48 +02:00
parent 5725a97de2
commit e9015bb991
6 changed files with 52 additions and 30 deletions

View File

@@ -23,7 +23,6 @@ const tokens_list_t TOKENS_LIST[] = {
{ T_LEFT_PARENT, "(", 1, "T_LEFT_PARENT" },
{ T_RIGHT_PARENT, ")", 1, "T_RIGHT_PARENT" },
{ T_PREV_CMD, "!!", 2, "T_PREV_CMD" },
{ T_VAR, "$", 1, "T_VAR" },
{ T_APPEND, ">>", 2, "T_APPEND" },
{ T_REDIRECT, ">", 1, "T_REDIRECT" },
{ T_HEREDOC, "<<", 2, "T_HEREDOC" },

View File

@@ -55,6 +55,6 @@ int visit_loop(ef_t *ef, ast_t *node);
void handle_var_case(ast_t *node, exec_ctx_t *ctx, size_t *i, args_t *args);
bool handle_magic_quotes(ast_t *node, exec_ctx_t *ctx,
size_t *i, args_t *args);
bool handle_quotes(ast_t *node, size_t *i, exec_ctx_t *ctx, args_t *args);
bool handle_var(ast_t *node, size_t *i, exec_ctx_t *ctx, args_t *args);
char *get_values(exec_ctx_t *ctx, char *key);
#endif /* EXEC_H */

View File

@@ -14,6 +14,7 @@
#include "env.h"
#include "local.h"
#include "exec.h"
#include "u_str.h"
static
char *set_f_part(char *node_str)
@@ -29,13 +30,14 @@ char *set_f_part(char *node_str)
}
static
char *set_s_part(char *node_str, int len_f_part)
char *set_s_part(char *node_str, int len_f_part, ast_t *node, size_t *i)
{
int pointer_rank = len_f_part;
for (; node_str[pointer_rank] && !isblank(node_str[pointer_rank]);
pointer_rank++);
return &node_str[pointer_rank];
for (; pointer_rank < node->vector.tokens[*i].sz && node_str[pointer_rank]
&& !isblank(node_str[pointer_rank]); pointer_rank++);
return strndup(&node_str[pointer_rank],
node->vector.tokens[*i].sz - pointer_rank);
}
static
@@ -48,35 +50,51 @@ bool concat_and_free(char *var, char *f_part, char *s_part, args_t *args)
strcpy(args->args[args->sz], f_part);
strcat(args->args[args->sz], var);
strcat(args->args[args->sz], s_part);
free(s_part);
free(f_part);
return false;
}
static
bool concat_var(char *var, char *node_str, args_t *args)
bool concat_var(char *var, args_t *args, ast_t *node, size_t *i)
{
char *f_part = set_f_part(node_str);
char *f_part = set_f_part(node->vector.tokens[*i].str);
char *s_part = NULL;
args->args[args->sz] = var;
if (f_part == NULL)
return true;
s_part = set_s_part(node_str, strlen(f_part));
s_part = set_s_part(node->vector.tokens[*i].str, strlen(f_part), node, i);
if (s_part == NULL)
return free(f_part), true;
return concat_and_free(var, f_part, s_part, args);
}
bool handle_quotes(ast_t *node, size_t *i, exec_ctx_t *ctx, args_t *args)
char *get_key(ast_t *node, size_t *i)
{
char *key = strchr(node->vector.tokens[*i].str, '$');
size_t id = 0;
for (; node->vector.tokens[*i].str &&
id < node->vector.tokens[*i].sz; id++)
if (node->vector.tokens[*i].str[id] == '$'){
id++;
return strndup(&node->vector.tokens[*i].str[id],
node->vector.tokens[*i].sz - id);
}
return NULL;
}
bool handle_var(ast_t *node, size_t *i, exec_ctx_t *ctx, args_t *args)
{
char *key = get_key(node, i);
char *var = NULL;
int end_key = 0;
if (key == NULL){
args->args[args->sz] = strdup(node->vector.tokens[*i].str);
args->args[args->sz] = strndup(node->vector.tokens[*i].str,
node->vector.tokens[*i].sz);
return false;
}
key = strdup(&key[1]);
if (key == NULL)
return true;
for (; key[end_key] && !isblank(key[end_key]); end_key++);
@@ -85,6 +103,5 @@ bool handle_quotes(ast_t *node, size_t *i, exec_ctx_t *ctx, args_t *args)
free(key);
if (var == NULL)
return true;
args->args[args->sz] = var;
return concat_var(var, node->vector.tokens[*i].str, args);
return concat_var(var, args, node, i);
}

View File

@@ -30,14 +30,6 @@ char *get_values(exec_ctx_t *ctx, char *key)
return r_char;
}
static
char *handle_variable(ast_t *node, exec_ctx_t *ctx, size_t *i)
{
(*i)++;
node->vector.tokens[*i].str[node->vector.tokens[*i].sz] = '\0';
return get_values(ctx, node->vector.tokens[*i].str);
}
static
char *take_next_parenthese_arg(ast_t *node, size_t *in_str, size_t *i)
{
@@ -100,6 +92,7 @@ bool format_quotes(ast_t *node, char be_matched, size_t *i)
if (last_quote == NULL)
return (fprintf(stderr, "Unmatched \'%c\'.\n", be_matched), false);
node->vector.sz -= 2;
if (isblank(last_quote[1] || be_matched == '`')){
last_quote[0] = '\0';
return true;
@@ -129,7 +122,7 @@ bool check_quotes(ast_t *node, size_t *i, exec_ctx_t *ctx, args_t *args)
if (be_matched == '`')
return handle_magic_quotes(node, ctx, i, args);
if (be_matched == '\"')
return handle_quotes(node, i, ctx, args);
return handle_var(node, i, ctx, args);
args->args[args->sz] = strdup(node->vector.tokens[*i].str);
return false;
}
@@ -148,12 +141,7 @@ bool check_for_closable(ast_t *node, exec_ctx_t *ctx, size_t *i, args_t *args)
void handle_var_case(ast_t *node, exec_ctx_t *ctx, size_t *i, args_t *args)
{
if (node->vector.tokens[*i].type == T_VAR && *i + 1 < node->vector.sz){
args->args[args->sz] = handle_variable(node, ctx, i);
return;
}
if (check_for_closable(node, ctx, i, args))
return;
args->args[args->sz] = strndup(node->vector.tokens[*i].str,
node->vector.tokens[*i].sz);
handle_var(node, i, ctx, args);
}

17
ulib/str/u_strnchr.c Normal file
View File

@@ -0,0 +1,17 @@
/*
** EPITECH PROJECT, 2025
** 42sh
** File description:
** u_strnchr
*/
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
char *u_strnchr(char *str, char to_search, size_t n)
{
for (size_t i = 0; str[i] && i < n; i++)
if (str[i] == to_search)
return &str[i];
return NULL;
}

View File

@@ -37,5 +37,6 @@ void free_array(char **array);
void puterror(char const *prefix);
int my_array_len(char **tab);
char **arraydup(char **array);
char *u_strnchr(char *str, char to_search, size_t n);
#endif /* STRING_H */