]> git.dkaiser.de - 42/minishell.git/commitdiff
some testcases and changes
authorChristopher Uhlig <chuhlig@1-E-11.42heilbronn.de>
Mon, 22 Jul 2024 12:33:24 +0000 (14:33 +0200)
committerChristopher Uhlig <chuhlig@1-E-11.42heilbronn.de>
Mon, 22 Jul 2024 12:33:24 +0000 (14:33 +0200)
src/tokenizer.c

index 086d4b0253b80bbf776b3d64ff1fbf6a7bb11028..ddc33da0390d8f1b29ac4b90ed3cb4c34c684a09 100644 (file)
@@ -6,23 +6,32 @@
 /*   By: chuhlig <chuhlig@student.42.fr>            +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/28 20:55:50 by chuhlig           #+#    #+#             */
-/*   Updated: 2024/06/28 21:58:38 by chuhlig          ###   ########.fr       */
+/*   Updated: 2024/07/22 14:18:02 by chuhlig          ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
 #include "minishell.h"
 #include "token.h"
 
-char   *ft_strncpy(char *dst, char *src, size_t n)
+// char        *ft_strncpy(char *dst, const char *src, size_t n)
+// {
+//     char    *start;
+
+//     start = dst;
+//     while (n-- > 0 && *src)
+//             *dst++ = *src++;
+//     while (n-- > 0)
+//             *dst++ = '\0';
+//     return (start);
+// }
+char *ft_strncpy(char *s1, char *s2, int n)
 {
-       char *start;
-
-       start = dst;
-       while (n-- > 0 && *src)
-               *dst++ = *src++;
-       if (n > 0)
-               ft_memset(dst, '\0', n);
-       return (start);
+       int i = -1;
+
+       while (++i < n && s2[i])
+               s1[i] = s2[i];
+       s1[i] = '\0';
+       return (s1);
 }
 
 void   print_token(t_token *token)
@@ -39,37 +48,36 @@ void        print_token(t_token *token)
        {
                printf("PIPE_TOKEN\n");
        }
+       else if (token->type == NEWLINE_TOKEN)
+       {
+               printf("NEWLINE_TOKEN\n");
+       }
 }
 
-
-
+//s[i] should be right bc i wanna start at specific pos
 void   conditional_print(char *string, int start_of_string, int i, int offset, t_token **token_list)
 {
-       char    *trimmed_line;
        char    *line;
        int             len;
 
-       len = i + offset - start_of_string;
+       len = i + offset - start_of_string + 1;
        if (len > 0)
        {
-               line = (char *)malloc(len + 1);
+               line = (char *)malloc(len);
                if (!line)
                {
                        exit(EXIT_FAILURE);
                }
                ft_strncpy(line, string + start_of_string, len);
                line[len] = '\0';
-               trimmed_line = line;
-               while (*trimmed_line == ' ' || *trimmed_line == '\t')
+               while (*line == ' ' || *line == '\t' || *line == '\0')
+                       line++;
+               if (*line != '\0')
                {
-                       trimmed_line++;
-               }
-               if (*trimmed_line != '\0')
-               {
-                       *token_list = new_str_token(trimmed_line, *token_list, NULL);
+                       *token_list = new_str_token(line, *token_list, NULL);
                        print_token(*token_list);
                }
-               free(line);
+               // free(line);
        }
 }
 
@@ -77,82 +85,335 @@ void       tokenizer(char *s, t_token **token_list)
 {
        char    *quotes;
        char    quote_check;
-       char    c;
+       // char c;
        int             start_of_string;
        int             ignore_space;
-       int             flag;
        int             i;
-       int             skip;
 
        quotes = "\"\'";
        quote_check = '\0';
        start_of_string = 0;
        ignore_space = 0;
-       flag = 0;
        i = 0;
-       skip = 0;
-       while (s[i])
+       if (!s || !*s)
+               return ;
+       while (s[i] && s)
        {
-               c = s[i];
-               if (skip)
-               {
-                       skip = 0;
-                       i++;
-                       continue ;
-               }
-               if (!ignore_space && (c == '|' || c == ';' || c == '<' || c == '>'))
+               // c = s[i];
+               // if (!ignore_space && (c == '|' || c == '\n' || c == '<' || c == '>'))
+               if (!ignore_space && (s[i] == '|' || s[i] == '\n' || s[i] == '<' || s[i] == '>'))
                {
                        conditional_print(s, start_of_string, i, 0, token_list);
-                       if ((c == '<' || c == '>') && s[i + 1] == c)
+                       // if ((c == '<' || c == '>') && s[i + 1] == c)
+                       if ((s[i] == '<' || s[i] == '>') && s[i + 1] == s[i])
                        {
-                               if (c == '<')
-                               {
-                                       *token_list = new_redir_token(INPUT_FILE,
+                               // if (c == '<')
+                               if (s[i] == '<')
+                                       *token_list = new_redir_token(INPUT_LIMITER,
                                                        *token_list, NULL);
-                                       print_token(*token_list);
-                               }
                                else
-                               {
                                        *token_list = new_redir_token(OUTPUT_APPEND,
                                                        *token_list, NULL);
-                                       print_token(*token_list);
-                               }
+                               print_token(*token_list);
                                i++;
                        }
                        else
                        {
-                               if (c == '<')
-                               {
+                               // if (c == '<')
+                               if (s[i] == '<')
                                        *token_list = new_redir_token(INPUT_FILE,
                                                        *token_list, NULL);
-                               }
+                               // else if (c == '|')
+                               else if (s[i] == '|')
+                                       *token_list = new_token(PIPE_TOKEN, *token_list, NULL);
+                               // else if (c == '\n')
+                               else if (s[i] == '\n')
+                                       *token_list = new_token(NEWLINE_TOKEN, *token_list, NULL);
                                else
-                               {
                                        *token_list = new_redir_token(OUTPUT_OVERRIDE,
                                                        *token_list, NULL);
-                               }
                                print_token(*token_list);
+                               // i++;
                        }
                        start_of_string = i + 1;
                }
-               else if (ignore_space && c == quote_check)
+               // else if (ignore_space && c == quote_check)
+               // mew update for the sting part 18.07
+               else if (ignore_space && s[i] == quote_check)
                {
                        quote_check = '\0';
                        ignore_space = 0;
                }
-               else if (!ignore_space && ft_strchr(quotes, c))
+               // else if (!ignore_space && ft_strchr(quotes, c))
+               else if (!ignore_space && ft_strchr(quotes, s[i]))
                {
-                       quote_check = c;
+                       quote_check = s[i];
                        ignore_space = 1;
                }
-               else if ((!ignore_space && (s[i] != ' ' || s[i] != '\t')) || s[i + 1] == '\0')
+               // else if ((!ignore_space && (c == '\0' || c == ' ' || c == '\t')) || i == ft_strlen(s) - 1)
+               if ((!ignore_space && (s[i] == '\0' || s[i] == ' ' || s[i] == '\t')) || i == ft_strlen(s) - 1)
                {
-                       if (s[i + 1])
-                               conditional_print(s, start_of_string, i, 1, token_list);
-                       else
-                               conditional_print(s, start_of_string, i, 0, token_list);
+                       if (s[i + 1] == '\0')
+                               i++;
+                       conditional_print(s, start_of_string, i, 0, token_list);
                        start_of_string = i + 1;
                }
+               // else if (!ignore_space && ft_strchr(quotes, c))
+               // else if (!ignore_space)
+               // {
+               //      if(ft_strchr(quotes, s[i]))
+               //      {
+               //              quote_check = s[i];
+               //              ignore_space = 1;
+               //      }
+               //      else if (s[i] == '\0' || s[i] == ' ' || s[i] == '\t' || i == ft_strlen(s) - 1)
+               //      {
+               //              if (s[i + 1] == '\0')
+               //                      i++;
+               //              conditional_print(s, start_of_string, i, 0, token_list);
+               //              start_of_string = i + 1;
+               //      }
+               // }
+               // else if (ignore_space && (s[i] == quote_check || s[i + 1] == '\0'))// secon part out of while loop?
+               // {
+               //      quote_check = '\0';
+               //      ignore_space = 0;
+               //      conditional_print(s, start_of_string, i, 0, token_list);
+               //      start_of_string = i + 1;
+               // }
                i++;
        }
-}
\ No newline at end of file
+}
+
+///s[i] != ' '
+//mazbe remove c
+// why handle space?
+//readline delete mazbe?
+
+// errors today if i change the con print cond removing *line == '\0'
+// ./minishell 
+// Minishell $ test
+// Minishell $ idk
+// Minishell $ why you idiot a re doing nothing
+// zsh: segmentation fault  ./minishell
+// chuhlig@1-E-9 minishell % ./minishell
+// Minishell $ a
+// Minishell $ aaa
+// Minishell $ aaaaaaaaaaaaaa
+// Minishell $ aa aa
+// zsh: segmentation fault  ./minishell
+
+// also some space reconizing is wrong
+//also the part with cond &s[i] or just s seem f up
+//tested different strncpy still errors
+// removed anoying brackets to short it
+//added pipe and  \n token
+// string still not works fine mazybe readline and input understanding
+
+// error with extra condition:
+// ./minishell
+// Minishell $ test
+// STRING_TOKEN: �
+// =================================================================
+// ==66482==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000002835 at pc 0x00010bb02c68 bp 0x7ffee41034b0 sp 0x7ffee41034a8
+// READ of size 1 at 0x602000002835 thread T0
+//     #0 0x10bb02c67 in tokenizer tokenizer.c:91
+//     #1 0x10bb00c66 in repl repl.c:30
+//     #2 0x10bb00684 in main main.c:19
+//     #3 0x7fff733a7cc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8)
+
+// 0x602000002835 is located 0 bytes to the right of 5-byte region [0x602000002830,0x602000002835)
+// allocated by thread T0 here:
+//     #0 0x10bba517d in wrap_malloc+0x9d (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x4917d)
+//     #1 0x10bb38c44 in xmalloc+0x8 (libreadline.8.dylib:x86_64+0x25c44)
+//     #2 0x10bb16096 in readline_internal_teardown+0xfa (libreadline.8.dylib:x86_64+0x3096)
+//     #3 0x10bb15bb4 in readline+0x5b (libreadline.8.dylib:x86_64+0x2bb4)
+//     #4 0x10bb00ba3 in repl repl.c:25
+//     #5 0x10bb00684 in main main.c:19
+//     #6 0x7fff733a7cc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8)
+
+// SUMMARY: AddressSanitizer: heap-buffer-overflow tokenizer.c:91 in tokenizer
+// Shadow bytes around the buggy address:
+//   0x1c04000004b0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
+//   0x1c04000004c0: fa fa fd fa fa fa fd fa fa fa fd fd fa fa fd fd
+//   0x1c04000004d0: fa fa fd fd fa fa fd fd fa fa fd fd fa fa fd fd
+//   0x1c04000004e0: fa fa fd fd fa fa fd fd fa fa fd fd fa fa fd fd
+//   0x1c04000004f0: fa fa fd fd fa fa fd fd fa fa fd fd fa fa fd fd
+// =>0x1c0400000500: fa fa 00 00 fa fa[05]fa fa fa 00 04 fa fa 05 fa
+//   0x1c0400000510: fa fa 05 fa fa fa fa fa fa fa fa fa fa fa fa fa
+//   0x1c0400000520: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+//   0x1c0400000530: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+//   0x1c0400000540: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+//   0x1c0400000550: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
+// Shadow byte legend (one shadow byte represents 8 application bytes):
+//   Addressable:           00
+//   Partially addressable: 01 02 03 04 05 06 07 
+//   Heap left redzone:       fa
+//   Freed heap region:       fd
+//   Stack left redzone:      f1
+//   Stack mid redzone:       f2
+//   Stack right redzone:     f3
+//   Stack after return:      f5
+//   Stack use after scope:   f8
+//   Global redzone:          f9
+//   Global init order:       f6
+//   Poisoned by user:        f7
+//   Container overflow:      fc
+//   Array cookie:            ac
+//   Intra object redzone:    bb
+//   ASan internal:           fe
+//   Left alloca redzone:     ca
+//   Right alloca redzone:    cb
+//   Shadow gap:              cc
+// ==66482==ABORTING
+
+// othere error currently
+//  test
+// STRING_TOKEN: 
+// minishell(86892,0x111ae2dc0) malloc: *** error for object 0x7fedf3200014: pointer being freed was not allocated
+// minishell(86892,0x111ae2dc0) malloc: *** set a breakpoint in malloc_error_break to debug
+// zsh: abort      ./minishell
+// chuhlig@1-E-9 minishell % ./minishell
+// Minishell $ "test"
+// Minishell $ "testtest"
+// Minishell $ "test           test"
+// Minishell $ te
+// STRING_TOKEN: `
+// minishell(86928,0x114a76dc0) malloc: *** error for object 0x7fcaa8d04f27: pointer being freed was not allocated
+// minishell(86928,0x114a76dc0) malloc: *** set a breakpoint in malloc_error_break to debug
+// zsh: abort      ./minishell
+// chuhlig@1-E-9 minishell % ./minishell
+// Minishell $ a
+// STRING_TOKEN: 
+// Minishell $ a
+// zsh: segmentation fault  ./minishell
+// chuhlig@1-E-9 minishell % ./minishell
+// Minishell $ a
+// STRING_TOKEN: ^
+// minishell(86958,0x11c50adc0) malloc: *** error for object 0x7fb24a800011: pointer being freed was not allocated
+// minishell(86958,0x11c50adc0) malloc: *** set a breakpoint in malloc_error_break to debug
+// zsh: abort      ./minishell
+// chuhlig@1-E-9 minishell % ./minishell
+// Minishell $ a
+// zsh: segmentation fault  ./minishell
+
+///do i need to update after cont print i?
+// end quote not works atm and have to check the lenth
+// how to handle not in quote text command
+// space generell need to be fixed
+
+/// 1425 2207
+// Minishell $ test test "ters"
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters"
+// Minishell $ test test "ters
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters
+// Minishell $ test test "ters " "a
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters " 
+// STRING_TOKEN: "a
+// Minishell $ |||| <><> <><> <<< >>>> |||
+// STRING_TOKEN: |
+// PIPE_TOKEN
+// STRING_TOKEN: |
+// PIPE_TOKEN
+// STRING_TOKEN: |
+// PIPE_TOKEN
+// STRING_TOKEN: |
+// PIPE_TOKEN
+// STRING_TOKEN: 
+// STRING_TOKEN: <
+// REDIR_TOKEN: 0
+// STRING_TOKEN: >
+// REDIR_TOKEN: 2
+// STRING_TOKEN: <
+// REDIR_TOKEN: 0
+// STRING_TOKEN: >
+// REDIR_TOKEN: 2
+// STRING_TOKEN: ^
+// STRING_TOKEN: <
+// REDIR_TOKEN: 0
+// STRING_TOKEN: >
+// REDIR_TOKEN: 2
+// STRING_TOKEN: <
+// REDIR_TOKEN: 0
+// STRING_TOKEN: >
+// REDIR_TOKEN: 2
+// STRING_TOKEN: ^
+// STRING_TOKEN: <
+// REDIR_TOKEN: 1
+// STRING_TOKEN: <
+// REDIR_TOKEN: 0
+// STRING_TOKEN: �
+// STRING_TOKEN: >
+// REDIR_TOKEN: 3
+// STRING_TOKEN: >
+// REDIR_TOKEN: 3
+// STRING_TOKEN: 
+// STRING_TOKEN: |
+// PIPE_TOKEN
+// STRING_TOKEN: |
+// PIPE_TOKEN
+// STRING_TOKEN: |
+// PIPE_TOKEN
+// STRING_TOKEN: 
+// Minishell $ test test "ters " "a asddddsa asdss
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters " 
+// STRING_TOKEN: "a asddddsa asdss
+// Minishell $ test test "ters " "a asddddsa asdss ' test
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters " 
+// STRING_TOKEN: "a asddddsa asdss ' test
+// Minishell $ test test "ters " "a asddddsa asdss ' test"
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters " 
+// STRING_TOKEN: "a asddddsa asdss ' test"
+// Minishell $ test test "ters " "a asddddsa asdss ' test
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters " 
+// STRING_TOKEN: "a asddddsa asdss ' test
+// Minishell $ test test "ters " "a asddddsa asdss ' te'
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters " 
+// STRING_TOKEN: "a asddddsa asdss ' te'
+// Minishell $ test test "ters " "a asddddsa asdss ' te'" 'tes
+// STRING_TOKEN: test 
+// STRING_TOKEN: test 
+// STRING_TOKEN: "ters " 
+// STRING_TOKEN: "a asddddsa asdss ' te'" 
+// STRING_TOKEN: 'tes
+// Minishell $   
+// STRING_TOKEN: �
+// STRING_TOKEN: ��D�
+// minishell(95695,0x10c1addc0) malloc: *** error for object 0x7f844c004407: pointer being freed was not allocated
+// minishell(95695,0x10c1addc0) malloc: *** set a breakpoint in malloc_error_break to debug
+// zsh: abort      ./minishell
+// chuhlig@1-E-11 minishell % ./minishell
+// Minishell $   
+// STRING_TOKEN: �
+// STRING_TOKEN: �
+// minishell(95853,0x118e33dc0) malloc: *** error for object 0x7fe72b405977: pointer being freed was not allocated
+// minishell(95853,0x118e33dc0) malloc: *** set a breakpoint in malloc_error_break to debug
+// zsh: abort      ./minishell
+// chuhlig@1-E-11 minishell %   test
+// chuhlig@1-E-11 minishell %   pwd 
+// /Users/chuhlig/Desktop/minishell
+// chuhlig@1-E-11 minishell % ./minishell
+// Minishell $  test
+// STRING_TOKEN: 
+// STRING_TOKEN: test
+// Minishell $   test
+// STRING_TOKEN: `
+// STRING_TOKEN: 
+// STRING_TOKEN: test
+// Minishell $ 
\ No newline at end of file