wordsplit: handle single word with spaces before or after

This commit is contained in:
Khaïs COLIN 2025-02-14 13:30:18 +01:00
parent fc985ea046
commit 8defbf4d13
Signed by: logistic-bot
SSH key fingerprint: SHA256:RlpiqKeXpcPFZZ4y9Ou4xi2M8OhRJovIwDlbCaMsuAo
9 changed files with 154 additions and 16 deletions

View file

@ -6,7 +6,7 @@
/* By: jguelen <marvin@42.fr> +#+ +:+ +#+ */ /* By: jguelen <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/10/17 16:06:09 by jguelen #+# #+# */ /* Created: 2024/10/17 16:06:09 by jguelen #+# #+# */
/* Updated: 2025/02/20 14:44:53 by khais ### ########.fr */ /* Updated: 2025/02/20 14:48:28 by khais ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -130,6 +130,8 @@ size_t ft_strlcat(char *dst, const char *src, size_t size);
int ft_toupper(int c); int ft_toupper(int c);
int ft_tolower(int c); int ft_tolower(int c);
char *ft_strchr(const char *s, int c); char *ft_strchr(const char *s, int c);
size_t ft_strchridx(const char *s, char c);
size_t ft_strnchridx(const char *s, char c);
char *ft_strrchr(const char *s, int c); char *ft_strrchr(const char *s, int c);
int ft_strcmp(const char *s1, const char *s2); int ft_strcmp(const char *s1, const char *s2);
int ft_strncmp(const char *s1, const char *s2, size_t n); int ft_strncmp(const char *s1, const char *s2, size_t n);

View file

@ -4,14 +4,57 @@ ifeq ($(CFLAGS),)
CFLAGS = -Wall -Wextra -Werror -g CFLAGS = -Wall -Wextra -Werror -g
endif endif
NAME = libft.a NAME = libft.a
SOURCES = free2.c \ SOURCES = \
ft_atoi.c ft_itoa.c ft_putendl_fd.c ft_strlcat.c ft_substr.c \ free2.c \
ft_bzero.c ft_putnbr_fd.c ft_strlcpy.c ft_tolower.c ft_calloc.c \ ft_atoi.c \
ft_memchr.c ft_putstr_fd.c ft_strlen.c ft_toupper.c ft_isalnum.c \ ft_bzero.c \
ft_memcmp.c ft_split.c ft_strmapi.c ft_isalpha.c ft_memcpy.c ft_strchr.c \ ft_calloc.c \
ft_strcmp.c ft_strncmp.c ft_isascii.c ft_memmove.c ft_strdup.c ft_strnstr.c \ ft_isalnum.c \
ft_isdigit.c ft_memset.c ft_striteri.c ft_strrchr.c ft_isprint.c \ ft_isalpha.c \
ft_putchar_fd.c ft_strjoin.c ft_strtrim.c ft_min_max.c ft_strjoin_sepc.c ft_isascii.c \
ft_isdigit.c \
ft_isprint.c \
ft_itoa.c \
ft_lstadd_back_bonus.c \
ft_lstadd_front_bonus.c \
ft_lstclear_bonus.c \
ft_lstdelone_bonus.c \
ft_lstiter_bonus.c \
ft_lstlast_bonus.c \
ft_lstmap_bonus.c \
ft_lstnew_bonus.c \
ft_lstsize_bonus.c \
ft_memchr.c \
ft_memcmp.c \
ft_memcpy.c \
ft_memmove.c \
ft_memset.c \
ft_min_max.c \
ft_putchar_fd.c \
ft_putendl_fd.c \
ft_putnbr_fd.c \
ft_putstr_fd.c \
ft_split.c \
ft_strchr.c \
ft_strchridx.c \
ft_strcmp.c \
ft_strdup.c \
ft_striteri.c \
ft_strjoin.c \
ft_strjoin_sepc.c \
ft_strlcat.c \
ft_strlcpy.c \
ft_strlen.c \
ft_strmapi.c \
ft_strnchridx.c \
ft_strncmp.c \
ft_strnstr.c \
ft_strrchr.c \
ft_strtrim.c \
ft_substr.c \
ft_tolower.c \
ft_toupper.c \
BONUSSOURCES = ft_lstnew_bonus.c ft_lstadd_back_bonus.c ft_lstsize_bonus.c \ BONUSSOURCES = ft_lstnew_bonus.c ft_lstadd_back_bonus.c ft_lstsize_bonus.c \
ft_lstadd_front_bonus.c ft_lstclear_bonus.c ft_lstdelone_bonus.c \ ft_lstadd_front_bonus.c ft_lstclear_bonus.c ft_lstdelone_bonus.c \
ft_lstiter_bonus.c ft_lstlast_bonus.c ft_lstmap_bonus.c ft_lstiter_bonus.c ft_lstlast_bonus.c ft_lstmap_bonus.c

View file

@ -0,0 +1,29 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_strchridx.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/14 14:02:34 by khais #+# #+# */
/* Updated: 2025/02/14 15:12:01 by khais ### ########.fr */
/* */
/* ************************************************************************** */
#include <stddef.h>
/*
** return the index of the character c in the string s, or 0 if s is null, or
** length of s if c is not found.
*/
size_t ft_strchridx(const char *s, char c)
{
size_t i;
if (s == NULL)
return (0);
i = 0;
while (s[i] != c && s[i] != '\0')
i++;
return (i);
}

View file

@ -0,0 +1,31 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_strnchridx.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/14 14:16:32 by khais #+# #+# */
/* Updated: 2025/02/14 15:12:19 by khais ### ########.fr */
/* */
/* ************************************************************************** */
#include <stddef.h>
/*
** return the index of the first character that is not c in the string s, or 0
** if not found or s is null.
*/
size_t ft_strnchridx(const char *s, char c)
{
size_t i;
if (s == NULL)
return (0);
i = 0;
while (s[i] == c && s[i] != '\0')
i++;
if (s[i] == '\0')
return (0);
return (i);
}

View file

@ -6,7 +6,7 @@
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */ /* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/13 17:20:36 by khais #+# #+# */ /* Created: 2025/02/13 17:20:36 by khais #+# #+# */
/* Updated: 2025/02/13 17:23:11 by khais ### ########.fr */ /* Updated: 2025/02/14 15:23:44 by khais ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -31,3 +31,14 @@ t_worddesc *worddesc_create(char *word)
retvalue->word = word; retvalue->word = word;
return (retvalue); return (retvalue);
} }
/*
** free all memory associated with this worddesc
*/
void worddesc_destroy(t_worddesc *worddesc)
{
if (worddesc == NULL)
return ;
free(worddesc->word);
free(worddesc);
}

View file

@ -6,7 +6,7 @@
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */ /* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/13 15:47:58 by khais #+# #+# */ /* Created: 2025/02/13 15:47:58 by khais #+# #+# */
/* Updated: 2025/02/13 17:20:25 by khais ### ########.fr */ /* Updated: 2025/02/14 13:57:10 by khais ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -29,5 +29,6 @@ typedef struct s_worddesc
} t_worddesc; } t_worddesc;
t_worddesc *worddesc_create(char *word); t_worddesc *worddesc_create(char *word);
void worddesc_destroy(t_worddesc *worddesc);
#endif #endif

View file

@ -6,7 +6,7 @@
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */ /* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/13 17:07:01 by khais #+# #+# */ /* Created: 2025/02/13 17:07:01 by khais #+# #+# */
/* Updated: 2025/02/14 13:29:16 by khais ### ########.fr */ /* Updated: 2025/02/14 13:56:45 by khais ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -37,6 +37,9 @@ t_wordlist *wordlist_create(t_worddesc *word)
*/ */
void wordlist_destroy(t_wordlist *wordlist) void wordlist_destroy(t_wordlist *wordlist)
{ {
if (wordlist == NULL)
return ;
worddesc_destroy(wordlist->word);
free(wordlist); free(wordlist);
} }

View file

@ -6,12 +6,12 @@
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */ /* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/13 17:02:32 by khais #+# #+# */ /* Created: 2025/02/13 17:02:32 by khais #+# #+# */
/* Updated: 2025/02/14 13:28:38 by khais ### ########.fr */ /* Updated: 2025/02/14 14:19:30 by khais ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "wordsplit.h" #include "wordsplit.h"
#include <stdlib.h> #include "libft.h"
/* /*
** split a string into words, respecting quotes etc. ** split a string into words, respecting quotes etc.
@ -21,5 +21,12 @@
*/ */
t_wordlist *minishell_wordsplit(char *original) t_wordlist *minishell_wordsplit(char *original)
{ {
return (wordlist_create(worddesc_create(original))); size_t start;
size_t length;
char *outstr;
start = ft_strnchridx(original, ' ');
length = ft_strchridx(original + start, ' ');
outstr = ft_substr(original, start, length);
return (wordlist_create(worddesc_create(outstr)));
} }

View file

@ -6,7 +6,7 @@
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */ /* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/02/13 15:17:56 by khais #+# #+# */ /* Created: 2025/02/13 15:17:56 by khais #+# #+# */
/* Updated: 2025/02/13 17:24:33 by khais ### ########.fr */ /* Updated: 2025/02/14 13:35:26 by khais ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -28,6 +28,16 @@ void test_wordsplit_singleword(void)
wordlist_destroy(words); wordlist_destroy(words);
} }
void test_wordsplit_singleword_with_spaces(void)
{
t_wordlist *words;
words = minishell_wordsplit(" echo ");
assert_strequal("echo", wordlist_get(words, 0)->word);
assert(NULL == wordlist_get(words, 1));
wordlist_destroy(words);
}
void test_wordsplit_basic(void) void test_wordsplit_basic(void)
{ {
t_wordlist *words; t_wordlist *words;
@ -45,5 +55,6 @@ void test_wordsplit_basic(void)
int main(void) { int main(void) {
test_wordsplit_singleword(); test_wordsplit_singleword();
test_wordsplit_singleword_with_spaces();
return (0); return (0);
} }