/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* fieldsplit.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/03 15:48:52 by khais #+# #+# */ /* Updated: 2025/04/25 14:27:56 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "fieldsplit.h" #include "../../buffer/buffer.h" #include "../../parser/matchers/blank.h" #include "redirect_fieldsplit.h" #include static bool should_delimit(t_worddesc *original, size_t i) { if (is_blank(original->word[i]) && original->marker[i] == '$') return (true); return (false); } static void fieldsplit_delimit(t_buffer *word, t_buffer *marker, t_worddesc *original, t_wordlist **outlist) { t_worddesc *out; if (ft_strlen(word->buffer) > 0) { out = worddesc_create(word->buffer, original->flags, marker->buffer, WORD_TOKEN); (*outlist) = wordlist_push(*outlist, out); free(word); free(marker); } else { ft_buffer_free(word); ft_buffer_free(marker); } } t_wordlist *minishell_fieldsplit(t_worddesc *original, t_wordlist **outlist) { size_t i; t_buffer *word; t_buffer *marker; i = 0; word = ft_buffer_new(); marker = ft_buffer_new(); while (original->word[i] != '\0') { if (should_delimit(original, i)) { fieldsplit_delimit(word, marker, original, outlist); word = ft_buffer_new(); marker = ft_buffer_new(); while (should_delimit(original, i)) i++; } else { word = ft_buffer_pushchar(word, original->word[i]); marker = ft_buffer_pushchar(marker, original->marker[i++]); } } fieldsplit_delimit(word, marker, original, outlist); return (*outlist); } static t_wordlist *wordlist_fieldsplit(t_wordlist **original) { t_worddesc *current; t_wordlist *out; if (original == NULL || *original == NULL) return (NULL); out = NULL; current = wordlist_pop(original); while (current != NULL) { if (minishell_fieldsplit(current, &out) == NULL) { wordlist_destroy(out); return (NULL); } worddesc_destroy(current); current = wordlist_pop(original); } (*original) = out; return (*original); } t_simple_cmd *simple_cmd_fieldsplit(t_simple_cmd *cmd) { if (cmd == NULL) return (NULL); if (wordlist_fieldsplit(&cmd->words) == NULL) return (NULL); if (redirect_fieldsplit(cmd) == NULL) return (NULL); return (cmd); }