Oris482 / Minishell

Create own shell(such as bash): by_jaesjeon, minsuki2
1 stars 1 forks source link

FEAT : 이진트리 탐색 구현 #11

Open Giromi opened 2 years ago

Giromi commented 2 years ago

트리에 사용할 구조체

enum e_tree_type { TREE_AND = 30, : [left, right] - [ 다양, 다양(&&, || X) ] TREE_OR, : [left, right] - [ 다양, 다양(&&, || X) ] TREE_PIPE, : [left, right] - [ (CMD, PIPE), CMD ] TREE_CMD, : [left, right] - [ REDI, (SIMPLE_CMD, SUBSHELL) ] TREE_REDI, : [left, right] - [ X ] TREE_SIMPLE_CMD, : [left, right] - [ X ] TREE_SUBSHELL : [left, right] - [ 다양, X] }

typedef struct s_tree { int type; t_lx_token token_data; struct s_tree parent_tree; struct s_tree left struct s_tree right; } t_tree;

트리 구현

Giromi commented 2 years ago

ㅠㅠ

image
Giromi commented 2 years ago

ㅋㅋㅋ heap buffer over flow 해결함...

minishell$> echo && ls | what || helokjf || here is || < a < dfdf < fdf > dfdf hohif | < t*.o what | *.c && what
------------------------------------------------------------------------------------------------------------------

 [echo] → [&&] → [ls] → [|] → [what] → [||] → [helokjf] → [||] → [here] → [is] → [||] → [<] → [a] → [<] → [dfdf] → [<] → [fdf] → [>] → [dfdf] → [hohif] → [|] → [<] → [terminal_setting.o] → [what] → [|] → [origin_str_utils2.c] → [origin_str_utils.c] → [error_utils.c] → [terminal_setting.c] → [linked_list_utils.c] → [origin_putfd_utils.c] → [custom_str_utils.c] → [debug_print_tree.c] → [minishell_utils.c] → [minishell.c] → [&&] → [what] → [(null)]

 [(null)] ← [what] ← [&&] ← [minishell.c] ← [minishell_utils.c] ← [debug_print_tree.c] ← [custom_str_utils.c] ← [origin_putfd_utils.c] ← [linked_list_utils.c] ← [terminal_setting.c] ← [error_utils.c] ← [origin_str_utils.c] ← [origin_str_utils2.c] ← [|] ← [what] ← [terminal_setting.o] ← [<] ← [|] ← [hohif] ← [dfdf] ← [>] ← [fdf] ← [<] ← [dfdf] ← [<] ← [a] ← [<] ← [||] ← [is] ← [here] ← [||] ← [helokjf] ← [||] ← [what] ← [|] ← [ls] ← [&&] ← [echo]

                                                                      &&
                                                                      / \
                                                                     /   \
                                                                   ||    CMD
                                                                   / \     \
                                                                  /   \   what
                                                                 /     \
                                                                /       \
                                                               /         \
                                                              /           \
                                                             /             \
                                                            /               \
                                                           /                 \
                                                          /                   \
                                                         /                     \
                                                        /                       \
                                                       /                         \
                                                     ||                          |
                                                     / \                         / \
                                                    /   \                       /   \
                                                   /     \                     /     \
                                                 ||      CMD                  /       \
                                                 / \       \                 /         \
                                                /   \   here is             /           \
                                               /     \                     /             \
                                             &&      CMD                  /               \
                                             / \       \                 /                 \
                                            /   \   helokjf             /                   \
                                           /     \                     /                     \
                                          /       \                   /                       \
                                        CMD       |                  /                         \
                                          \       / \               /                           \
                                         echo    /   \             /                             \
                                                /     \           /                               \
                                              CMD     CMD        /                                 \
                                                \       \       /                                   \
                                                ls     what    /                                     \
                                                              /                                       \
                                                             /                                         \
                                                            /                                           \
                                                           /                                             \
                                                          /                                               \
                                                         /                                                 \
                                                        /                                                   \
                                                       /                                                     \
                                                      /                                                       \
                                                     /                                                         \
                                                    /                                                           \
                                                   /                                                             \
                                                  /                                                               \
                                                 /                                                                 \
                                                /                                                                   \
                                               /                                                                     \
                                              /                                                                       \
                                             /                                                                         \
                                            /                                                                           \
                                           /                                                                             \
                                          /                                                                               \
                                         /                                                                                 \
                                        /                                                                                   \
                                       /                                                                                     \
                                      /                                                                                       \
                                     /                                                                                         \
                                    /                                                                                           \
                                   |                                                                                            CMD
                                  / \                                                                                             \
                                 /   \   origin_str_utils2.c origin_str_utils.c error_utils.c terminal_setting.c linked_list_utils.c origin_putfd_utils.c custom_str_utils.c debug_print_tree.c minishell_utils.c minishell.c
                                /     \
                               /       \
                              /         \
                             /           \
                            /             \
                           /               \
                          /                 \
                         /                   \
                        /                     \
                       /                       \
                      /                         \
                     /                           \
                   CMD                           CMD
                   / \                           / \
                  /   \                         /   \
                 /     \                       /     \
                /       \                     /       \
               /         \                   /         \
              /           \                 /           \
             /             \               /             \
            /               \   < terminal_setting.o    what
< a < dfdf < fdf > dfdf   hohif
Giromi commented 2 years ago

subshell은 아직 더 디버깅해야 할듯

Screen Shot 2022-09-07 at 11 22 23 PM

오류 케이스

minishell$> (here is || < a < dfdf < fdf) > dfdf fdfd
---------------------------------------------------------------

 [(] → [here] → [is] → [||] → [<] → [a] → [<] → [dfdf] → [<] → [fdf] → [)] → [>] → [dfdf] → [fdfd] → [(null)]

 [(null)] ← [fdfd] ← [dfdf] ← [>] ← [)] ← [fdf] ← [<] ← [dfdf] ← [<] ← [a] ← [<] ← [||] ← [is] ← [here] ← [(]

         CMD
         / \
        /   \
       /     \
      /       \
  > dfdf    ( fdfd
              /
            CMD
              \
here is || < a < dfdf < fdf )

잘된 케이스


------------------------------------------------------
minishell$> (here is || < a < dfdf < fdf sdf dsf sd) > dfd
           CMD
           / \
          /   \
         /     \
      > dfd   ( )
               /
             ||
             / \
            /   \
           /     \
          /       \
         /         \
        /           \
       /             \
     CMD             CMD
       \             / \
< a < dfdf < fdf    /   \
                   /     \
                  /       \
                 /         \
                /           \
               /             \
      < a < dfdf < fdf   sdf dsf sd

------------------------------------------------------
Giromi commented 2 years ago
< 탐색하기 >

recur_search_handle_tree(t_tree *root_node, int tree_type, void (* handler)(t_tree *))
{
    if (type == tree_type)
        handler 함수
    recursive_tree(cur->left);
    recursive_tree(cur->right);
}

< undefined tree 수정하기 handle 함수 >

void making_tree_node(t_tree *root, is_type)

// 1. make_tree(token_list); <- token_list : 제일 첫 토큰
// 2. root_tree 부터 left 우선 -> 재귀
2-1. AND, OR 찾기 (while cur_node != head_token)
2-1-1 찾음
     현재 노드 TYPE = UNDEFINED => 이 노드를 수정해야 합니다.
        1. TYPE 수정 (TREE_AND)
        2. right에 tree할당
            a. TYPE = UNDEFINED
        3. left tree 할당
            a. TYPE = AND || OR
            b. PARENT = 현재 트리
            c. token_data = 기존 token_data
        4. token_data = pop_node
        5. right->token_data = cut_back
        6. 다시 앞으로가면서 찾기 시작

 // B. 현재 노드 TYPE != UNDEFINED => left를 할당해야 합니다.
 //    b. left tree로 이동
 //    c. token_data = pop_node
 //    d. right에 tree할당(TYPE = UNDEFINED)
 //    e. right->token_data = cut_back
 //    f. 다시 앞으로가면서 찾기 시작

2-1-2 못찾음
2-1-2-1 현재 트리 TYPE != UNDEFINED -> left tree 할당 (TYPE = UNDEFINED) (PARENT = 현재 트리) left tree-left 현재 토큰 주소(첫 주소)
2-1-2-2 현재 트리 TYPE == UNDEFINED (아예 못찾음) ->  아무것도 안함

3-1. PIPE 찾기 
상동

4-1. CMD
4-1-1. REDI