summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJozanLeClerc <bousset.rudy@gmail.com>2020-09-09 18:29:25 +0200
committerJozanLeClerc <bousset.rudy@gmail.com>2020-09-09 18:29:25 +0200
commit42aa32df3f63d4dd1213b0683ab7110d788defef (patch)
tree80deb6980df13c903d3ed113abca0c33aa73d828
parentPretty bav (diff)
download42-minishell-42aa32df3f63d4dd1213b0683ab7110d788defef.tar.gz
42-minishell-42aa32df3f63d4dd1213b0683ab7110d788defef.tar.bz2
42-minishell-42aa32df3f63d4dd1213b0683ab7110d788defef.tar.xz
42-minishell-42aa32df3f63d4dd1213b0683ab7110d788defef.tar.zst
42-minishell-42aa32df3f63d4dd1213b0683ab7110d788defef.zip
The more memory the better LOL
-rw-r--r--src/m_loop.c1
-rw-r--r--src/p_lblock.c6
-rw-r--r--src/p_split.c194
-rw-r--r--src/p_split.h9
4 files changed, 41 insertions, 169 deletions
diff --git a/src/m_loop.c b/src/m_loop.c
index 5641686..50357eb 100644
--- a/src/m_loop.c
+++ b/src/m_loop.c
@@ -44,6 +44,7 @@ static void
if ((msh->com = s_com_new(ptr->lblock, msh)) == NULL)
break ;
e_line(msh);
+ s_com_destroy(&msh->com);
}
else if (msh->pipes != NULL)
s_lpipes_clear(&msh->pipes);
diff --git a/src/p_lblock.c b/src/p_lblock.c
index 856a546..377757d 100644
--- a/src/p_lblock.c
+++ b/src/p_lblock.c
@@ -133,13 +133,13 @@ int8_t
i = 0;
nextif = 0;
- if ((words = p_split_line(line)) == NULL)
+ if ((words = p_split_line((char*)line)) == NULL)
return (-1);
while (words[i] != NULL)
{
- if (words[i][ft_strlen(words[i]) - 1] == ';')
+ if (words[i][ft_strlen(words[i]) - 1] == '0')
nextif = 0;
- else if (words[i][ft_strlen(words[i]) - 1] == '&')
+ else if (words[i][ft_strlen(words[i]) - 1] == '1')
nextif = 1;
else
nextif = 2;
diff --git a/src/p_split.c b/src/p_split.c
index d39a4cb..dc26c04 100644
--- a/src/p_split.c
+++ b/src/p_split.c
@@ -16,151 +16,15 @@
#include "f_fail.h"
#include "d_define.h"
+#include "p_split.h"
#include "s_struct.h"
#include "u_parse.h"
#include "u_utils.h"
-/* static size_t */
-/* p_count_semi_words(const char line[]) */
-/* { */
-/* size_t count; */
-/* size_t i; */
-
-/* count = 0; */
-/* i = 0; */
-/* while (line[i] != '\0') */
-/* { */
-/* if (line[i] == ';' && line[i + 1] != ';' && line[i + 1] != '\0' && */
-/* u_is_not_escaped(line, line + i) == TRUE) */
-/* count += 1; */
-/* i++; */
-/* } */
-/* return (count); */
-/* } */
-
-/* static size_t */
-/* p_count_and_or_words(const char line[], const char c) */
-/* { */
-/* size_t count; */
-/* size_t i; */
-
-/* count = 0; */
-/* i = 0; */
-/* while (line[i] != '\0') */
-/* { */
-/* if (line[i] == c && line[i + 1] == c && */
-/* line[i + 2] != c && line[i + 2] != '\0') */
-/* count += 1; */
-/* i++; */
-/* } */
-/* return (count); */
-/* } */
-
-/* static char */
-/* *p_get_first_occur(const char *line_ptr) */
-/* { */
-/* char *ptr[3]; */
-/* size_t len[3]; */
-
-/* ptr[0] = ft_strnstr(line_ptr, ";", ft_strlen(line_ptr) + 1); */
-/* ptr[1] = ft_strnstr(line_ptr, "&&", ft_strlen(line_ptr) + 1); */
-/* ptr[2] = ft_strnstr(line_ptr, "||", ft_strlen(line_ptr) + 1); */
-/* len[0] = ft_strlen(ptr[0]); */
-/* len[1] = ft_strlen(ptr[1]); */
-/* len[2] = ft_strlen(ptr[2]); */
-/* if (len[0] > len[1] && len[0] > len[2]) */
-/* return (ptr[0]); */
-/* else if (len[1] > len[0] && len[1] > len[2]) */
-/* return (ptr[1]); */
-/* else if (len[2] > len[0] && len[2] > len[1]) */
-/* return (ptr[2]); */
-/* return ((char*)line_ptr); */
-/* } */
-
-/* static char */
-/* **p_split_destroy(char **words, */
-/* size_t i) */
-/* { */
-/* while (i > 0) */
-/* { */
-/* ft_memdel((void*)&words[i]); */
-/* } */
-/* ft_memdel((void*)&words); */
-/* return (NULL); */
-/* } */
-
-/* static char */
-/* **p_split_to_stuff(const char line[], */
-/* const size_t count) */
-/* { */
-/* char **words; */
-/* char *line_ptr; */
-/* char *need_ptr; */
-/* size_t i; */
-/* char c; */
-
-/* if ((words = (char**)malloc((count + 1) * sizeof(char*))) == NULL) */
-/* return (NULL); */
-/* line_ptr = (char*)line; */
-/* i = 0; */
-/* while (i < count) */
-/* { */
-/* need_ptr = p_get_first_occur(line_ptr); */
-/* c = need_ptr[0]; */
-/* need_ptr += (c == ';') ? (1) : (0); */
-/* need_ptr += (c == '&') ? (2) : (0); */
-/* need_ptr += (c == '|') ? (2) : (0); */
-/* if (need_ptr - line_ptr == 0) */
-/* { */
-/* if ((words[i] = (char*)malloc(((ft_strlen(line_ptr) + 2) * */
-/* sizeof(char)))) == NULL) */
-/* return (p_split_destroy(words, i)); */
-/* ft_memcpy(words[i], line_ptr, ft_strlen(line_ptr)); */
-/* words[i][ft_strlen(line_ptr)] = ';'; */
-/* words[i][ft_strlen(line_ptr) + 1] = '\0'; */
-/* } */
-/* else */
-/* { */
-/* if ((words[i] = (char*)malloc(((need_ptr - line_ptr) + 1) * */
-/* sizeof(char))) == NULL) */
-/* return (p_split_destroy(words, i)); */
-/* ft_memcpy(words[i], line_ptr, (need_ptr - line_ptr) - 1); */
-/* words[i][(need_ptr - line_ptr) - ((c == ';') ? (1) : (2))] = c; */
-/* words[i][(need_ptr - line_ptr) - ((c == ';') ? (0) : (1))] = '\0'; */
-/* line_ptr = need_ptr; */
-/* } */
-/* i++; */
-/* } */
-/* words[i] = NULL; */
-/* return (words); */
-/* } */
-
-/* char */
-/* **p_split_line(const char line[]) */
-/* { */
-/* char **words; */
-/* size_t count; */
-
-/* count = p_count_semi_words(line); */
-/* count += p_count_and_or_words(line, '&'); */
-/* count += p_count_and_or_words(line, '|'); */
-/* count += 1; */
-/* if ((words = p_split_to_stuff(line, count)) == NULL) */
-/* return (NULL); */
-/* return (words); */
-/* } */
-
-typedef struct s_split
-{
- size_t pos[ARG_MAX / 2];
- int8_t nextif[ARG_MAX / 2];
- uint32_t count;
-} t_split;
-
static void
p_meet_splitter(char *ptr,
const char line[],
- t_split *sp,
+ t_split_block *sp,
t_quote_mode mode)
{
if (mode == Q_NONE && *ptr == C_SEMIC && *(ptr + 1) != C_SEMIC &&
@@ -186,16 +50,15 @@ static void
}
}
-static t_split
- p_fill_sp(const char line[])
+static void
+ p_fill_sp(t_split_block *sp, const char line[])
{
- t_split sp;
char *ptr;
t_quote_mode mode;
- sp.pos[0] = 0;
- sp.nextif[0] = 0;
- sp.count = 0;
+ sp->pos[0] = 0;
+ sp->nextif[0] = 0;
+ sp->count = 0;
mode = Q_NONE;
ptr = (char*)line;
while (*ptr != C_NUL)
@@ -205,13 +68,12 @@ static t_split
else if (*ptr == C_DQUOTE)
mode = u_meet_dquote(line, ptr, mode);
else if (*ptr == C_SEMIC || *ptr == C_AMP || *ptr == C_PIPE)
- p_meet_splitter(ptr, line, &sp, mode);
+ p_meet_splitter(ptr, line, sp, mode);
ptr++;
}
- sp.pos[sp.count] = ptr - line;
- sp.nextif[sp.count] = 0;
- sp.count += 1;
- return (sp);
+ sp->pos[sp->count] = ptr - line;
+ sp->nextif[sp->count] = 0;
+ sp->count += 1;
}
static void
@@ -229,28 +91,30 @@ static void
}
static char
- **p_get_words(const char line[], const t_split sp)
+ **p_get_words(const char line[], const t_split_block *sp)
{
char **words;
- size_t i;
+ int64_t i;
size_t oldpos;
int8_t oldif;
- if ((words = (char**)malloc((sp.count + 1) * sizeof(char*))) == NULL)
+ if ((words = (char**)malloc((sp->count + 1) * sizeof(char*))) == NULL)
return (NULL);
oldpos = 0;
oldif = -1;
- i = 0;
- while (i < sp.count)
+ i = -1;
+ while (++i < sp->count)
{
- if ((words[i] =
- (char*)malloc(((sp.pos[i] - oldpos) + 1) * sizeof(char))) == NULL)
+ if ((words[i] = (char*)malloc(((sp->pos[i] - oldpos) + 2) *
+ sizeof(char))) == NULL)
return ((char**)p_del_split(words, i));
- ft_strlcpy(words[i], line + oldpos + ((oldif > 0) ? (2) : (oldif) + 1), sp.pos[i] - oldpos);
- ft_printf("[%s]\n", words[i]);
- oldpos = sp.pos[i];
- oldif = sp.nextif[i];
- i++;
+ ft_strlcpy(words[i], line + oldpos + ((oldif > 0) ? (2) : (oldif) + 1),
+ sp->pos[i] - oldpos + 1 - ((oldif > 0) ? (2) : (1)) +
+ ((oldif < 0) ? (1) : (0)));
+ words[i][ft_strlen(words[i]) + 1] = C_NUL;
+ words[i][ft_strlen(words[i])] = sp->nextif[i] + 0x30;
+ oldpos = sp->pos[i];
+ oldif = sp->nextif[i];
}
words[i] = NULL;
return (words);
@@ -259,12 +123,12 @@ static char
char
**p_split_line(char line[])
{
- t_split sp;
- char **words;
+ t_split_block sp;
+ char **words;
words = NULL;
- sp = p_fill_sp(line);
- if ((words = p_get_words(line, sp)) == NULL)
+ p_fill_sp(&sp, line);
+ if ((words = p_get_words(line, &sp)) == NULL)
{
ft_memdel((void*)&line);
return (NULL);
diff --git a/src/p_split.h b/src/p_split.h
index 648e01c..00da660 100644
--- a/src/p_split.h
+++ b/src/p_split.h
@@ -13,6 +13,13 @@
#ifndef P_SPLIT_H
#define P_SPLIT_H
-char **p_split_line(const char line[]);
+typedef struct s_split_block
+{
+ size_t pos[ARG_MAX / 2];
+ int8_t nextif[ARG_MAX / 2];
+ uint32_t count;
+} t_split_block;
+
+char **p_split_line(char line[]);
#endif