summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-09-03 17:18:41 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-09-03 17:18:41 +0200
commit869498a720e3c54b206f346dea6bf9b7995a7778 (patch)
tree92f1baffbb318fd8d86a1e82942d0992530f9c87
parenthow tf do i use tok (diff)
download42-minishell-869498a720e3c54b206f346dea6bf9b7995a7778.tar.gz
42-minishell-869498a720e3c54b206f346dea6bf9b7995a7778.tar.bz2
42-minishell-869498a720e3c54b206f346dea6bf9b7995a7778.tar.xz
42-minishell-869498a720e3c54b206f346dea6bf9b7995a7778.tar.zst
42-minishell-869498a720e3c54b206f346dea6bf9b7995a7778.zip
Genius in progress
-rw-r--r--src/p_args.c37
-rw-r--r--src/p_args_next.c44
-rw-r--r--src/p_args_next.h5
3 files changed, 59 insertions, 27 deletions
diff --git a/src/p_args.c b/src/p_args.c
index 6a15cb8..572b965 100644
--- a/src/p_args.c
+++ b/src/p_args.c
@@ -15,6 +15,7 @@
#include <stdlib.h>
#include "d_define.h"
+#include "p_args.h"
#include "p_args_next.h"
/* ================= */
@@ -60,12 +61,13 @@ static char
}
static uint16_t
- p_count_args(char *ptr, uint16_t argc)
+ p_count_args(const char *head, char *ptr, uint16_t argc, size_t start[])
{
if (*ptr == C_NULL)
return (argc);
while (*ptr != C_NULL && ft_iswhitespace(*ptr) == TRUE)
ptr++;
+ start[argc] = ptr - head;
if (*ptr != C_SQUOTE && *ptr != C_DQUOTE && *ptr != C_NULL)
{
while (*ptr != C_NULL && ft_iswhitespace(*ptr) == FALSE)
@@ -74,7 +76,7 @@ static uint16_t
if ((*ptr == C_SQUOTE || *ptr == C_DQUOTE) && *(ptr - 1) != '\\')
{
ptr++;
- return (p_count_args(ptr, argc));
+ return (p_count_args(head, ptr, argc, start));
}
}
}
@@ -82,42 +84,44 @@ static uint16_t
{
ptr = p_skip_delim(ptr, *ptr);
if (ft_iswhitespace(*ptr) == FALSE)
- return (p_count_args(ptr, argc));
+ return (p_count_args(head, ptr, argc, start));
}
else if (*ptr == C_NULL)
return (argc);
- return (p_count_args(ptr, argc + 1));
+ return (p_count_args(head, ptr, argc + 1, start));
/* TODO: quotes parse error */
}
static void
- p_del_alloced_words(char *words[], uint16_t to_del, uint16_t i)
+ p_del_alloced_words(char *words[], uint16_t to_del)
{
- while (i > to_del)
+ uint16_t i;
+
+ i = 0;
+ while (i < to_del)
{
ft_memdel((void*)&words[i]);
- i--;
+ i++;
}
}
static char
**p_split_words_no_rdr(const char word[])
{
- char **words;
- char *ptr;
- uint16_t argc;
- uint16_t to_del;
+ char **words;
+ char *ptr;
+ size_t start[512];
+ uint16_t argc;
+ uint16_t to_del;
ptr = (char*)word;
- argc = p_count_args(ptr, 0);
- ft_printf("%hu\n", argc);
- exit(0);
+ argc = p_count_args(word, ptr, 0, start);
if ((words = (char**)malloc((argc + 1) * sizeof(char*))) == NULL)
return (NULL);
words[argc] = NULL;
- if ((to_del = p_dup_words(words, word, argc)) != 0)
+ if ((to_del = p_dup_words(words, word, argc, start)) != argc)
{
- p_del_alloced_words(words, to_del, argc);
+ p_del_alloced_words(words, to_del);
return (NULL);
}
return (words);
@@ -135,6 +139,7 @@ char
if ((words = p_split_words_no_rdr(word)) == NULL)
return (NULL);
p_print(words);
+ exit(0);
return (words);
}
p_print(words);
diff --git a/src/p_args_next.c b/src/p_args_next.c
index d371ba0..5967963 100644
--- a/src/p_args_next.c
+++ b/src/p_args_next.c
@@ -13,24 +13,48 @@
#include <libft.h>
#include <stdint.h>
-static char
- p_give_me_an_arg(const char word[])
+#include "p_args.h"
+
+static size_t
+ p_arg_len(const char word[], const size_t start)
{
- char str[4096];
+ size_t end;
- str[0] = '\0';
- return (str);
+ (void)word;
+ end = start;
+ return (end);
+}
+
+static char
+ *p_give_me_an_arg(char tmp[],
+ const char word[],
+ const uint16_t i,
+ const size_t start[])
+{
+ tmp[0] = '\0';
+ ft_strlcpy(tmp,
+ word + start[i],
+ (p_arg_len(word, start[i]) - start[i]) + 1);
+ /* TODO: remove quotes */
+ return (tmp);
}
uint16_t
- p_dup_words(char *words[], const char word[], uint16_t i)
+ p_dup_words(char *words[],
+ const char word[],
+ const uint16_t argc,
+ const size_t start[])
{
- while (i > 0)
+ char tmp[4096];
+ uint16_t i;
+
+ i = 0;
+ while (i < argc)
{
- if ((words[i] = ft_strdup(p_give_me_an_arg(word))) == NULL)
+ if ((words[i] = ft_strdup(p_give_me_an_arg(tmp, word, i, start))) == NULL)
return (i);
- i--;
+ i++;
}
- return (0);
+ return (i);
}
diff --git a/src/p_args_next.h b/src/p_args_next.h
index 46998b7..e918254 100644
--- a/src/p_args_next.h
+++ b/src/p_args_next.h
@@ -15,6 +15,9 @@
#include <stdint.h>
-uint16_t p_dup_words(char *words[], const char word[], uint16_t i);
+uint16_t p_dup_words(char *words[],
+ const char word[],
+ const uint16_t argc,
+ const size_t start[]);
#endif