gramamr for
This commit is contained in:
parent
7a849b360a
commit
2fbea4837d
8 changed files with 54 additions and 11 deletions
|
|
@ -126,6 +126,7 @@ enum e_sym
|
||||||
END_COMMAND,
|
END_COMMAND,
|
||||||
CONDITION,
|
CONDITION,
|
||||||
COMPLETE_CONDITION,
|
COMPLETE_CONDITION,
|
||||||
|
FOR_WORDLIST,
|
||||||
ALL = 200,
|
ALL = 200,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -49,11 +49,15 @@ int get_reserved_words(t_list **alst)
|
||||||
token->type = TK_UNTIL;
|
token->type = TK_UNTIL;
|
||||||
else if (ft_strncmp(token->data, "case", 4) == 0)
|
else if (ft_strncmp(token->data, "case", 4) == 0)
|
||||||
token->type = TK_CASE;
|
token->type = TK_CASE;
|
||||||
|
else if (ft_strncmp(token->data, "for", 3) == 0)
|
||||||
|
token->type = TK_FOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ante_token && ante_token->type == TK_CASE
|
if (ante_token && (ante_token->type == TK_CASE || ante_token->type == TK_FOR)
|
||||||
&& ft_strncmp(token->data, "in", 2) == 0)
|
&& ft_strncmp(token->data, "in", 2) == 0)
|
||||||
token->type = TK_IN;
|
token->type = TK_IN;
|
||||||
|
if (previous_token && previous_token->type == TK_FOR && token->type == TK_WORD)
|
||||||
|
token->type = TK_NAME;
|
||||||
ante_token = previous_token;
|
ante_token = previous_token;
|
||||||
previous_token = token;
|
previous_token = token;
|
||||||
temp = temp->next;
|
temp = temp->next;
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ int insert_newline(t_list **alst)
|
||||||
{
|
{
|
||||||
t_token *token;
|
t_token *token;
|
||||||
|
|
||||||
|
DG("insert newline");
|
||||||
token = token_init();
|
token = token_init();
|
||||||
token->type = TK_NEWLINE;
|
token->type = TK_NEWLINE;
|
||||||
ft_lsteadd(alst, ft_lstnew(token, sizeof(*token)));
|
ft_lsteadd(alst, ft_lstnew(token, sizeof(*token)));
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@ int handle_instruction(int fd)
|
||||||
DG("START: state=%i", parser.state);
|
DG("START: state=%i", parser.state);
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
DG("get input");
|
|
||||||
if ((ret = readline(fd, get_lexer_stack(lexer), &str)))
|
if ((ret = readline(fd, get_lexer_stack(lexer), &str)))
|
||||||
{
|
{
|
||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
|
|
@ -48,7 +47,7 @@ int handle_instruction(int fd)
|
||||||
if (get_lexer_stack(lexer))
|
if (get_lexer_stack(lexer))
|
||||||
continue ;
|
continue ;
|
||||||
lexer.state = DEFAULT;
|
lexer.state = DEFAULT;
|
||||||
// token_print(token);
|
token_print(token);
|
||||||
if (get_reserved_words(&token))
|
if (get_reserved_words(&token))
|
||||||
return (1);
|
return (1);
|
||||||
if (insert_newline(&token))
|
if (insert_newline(&token))
|
||||||
|
|
@ -57,6 +56,8 @@ int handle_instruction(int fd)
|
||||||
continue ;
|
continue ;
|
||||||
if (parser.state == SUCCESS)
|
if (parser.state == SUCCESS)
|
||||||
break ;
|
break ;
|
||||||
|
else if (parser.state == ERROR && !SH_IS_INTERACTIVE(data_singleton()->opts))
|
||||||
|
return (error_syntax(&token));
|
||||||
else if (parser.state == ERROR)
|
else if (parser.state == ERROR)
|
||||||
error_syntax(&token);
|
error_syntax(&token);
|
||||||
token = NULL;
|
token = NULL;
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,9 @@ t_aggrematch g_aggrematch[] =
|
||||||
{
|
{
|
||||||
{TK_WORD, CMD_SUFFIX, CMD_SUFFIX, 0},
|
{TK_WORD, CMD_SUFFIX, CMD_SUFFIX, 0},
|
||||||
{TK_WORD, TK_PIPE, PATTERN, 0},
|
{TK_WORD, TK_PIPE, PATTERN, 0},
|
||||||
{TK_WORD, WORDLIST, WORDLIST, 0},
|
{TK_WORD, TK_IN, FOR_WORDLIST, TK_IN},
|
||||||
|
{TK_WORD, FOR_WORDLIST, FOR_WORDLIST, FOR_WORDLIST},
|
||||||
|
{TK_SEMI, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
|
||||||
{TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0},
|
{TK_ASSIGNEMENT_WORD, CMD_PREFIX,CMD_PREFIX, 0},
|
||||||
{TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR},
|
{TK_PIPE, CMD_SUPERIOR, SIMPLE_COMMAND, CMD_SUPERIOR},
|
||||||
{TK_FI, ELSE_PART, IF_CLAUSE, TK_IF},
|
{TK_FI, ELSE_PART, IF_CLAUSE, TK_IF},
|
||||||
|
|
@ -57,6 +59,8 @@ t_aggrematch g_aggrematch[] =
|
||||||
{LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
|
{LINEBREAK, COMPOUND_LIST, COMPOUND_LIST, COMPOUND_LIST},
|
||||||
{LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK},
|
{LINEBREAK, COMPLETE_COMMANDS, PROGRAM, LINEBREAK},
|
||||||
{NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME},
|
{NEWLINE_LIST, CMD_NAME, CMD_SUPERIOR, CMD_NAME},
|
||||||
|
{NEWLINE_LIST, SEQUENTIAL_SEP, SEQUENTIAL_SEP, SEQUENTIAL_SEP},
|
||||||
|
{NEWLINE_LIST, TK_DO, TK_DO, TK_DO},
|
||||||
{NEWLINE_LIST, TK_DO, TK_DO, TK_DO},
|
{NEWLINE_LIST, TK_DO, TK_DO, TK_DO},
|
||||||
{NEWLINE_LIST, TK_IN, TK_IN, TK_IN},
|
{NEWLINE_LIST, TK_IN, TK_IN, TK_IN},
|
||||||
{NEWLINE_LIST, TK_THEN, TK_THEN, TK_THEN},
|
{NEWLINE_LIST, TK_THEN, TK_THEN, TK_THEN},
|
||||||
|
|
@ -68,13 +72,13 @@ t_aggrematch g_aggrematch[] =
|
||||||
{NEWLINE_LIST, NEWLINE_LIST, NEWLINE_LIST, NEWLINE},
|
{NEWLINE_LIST, NEWLINE_LIST, NEWLINE_LIST, NEWLINE},
|
||||||
{NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0},
|
{NEWLINE_LIST, NAME, SEQUENTIAL_SEP, 0},
|
||||||
{NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0},
|
{NEWLINE_LIST, IN, SEQUENTIAL_SEP, 0},
|
||||||
{NEWLINE_LIST, WORDLIST, SEQUENTIAL_SEP, 0},
|
|
||||||
{NEWLINE_LIST, TERM, SEPARATOR, 0},
|
{NEWLINE_LIST, TERM, SEPARATOR, 0},
|
||||||
{NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0},
|
{NEWLINE_LIST, COMPOUND_LIST, SEPARATOR, 0},
|
||||||
{NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION},
|
{NEWLINE_LIST, COMPLETE_CONDITION, COMPLETE_CONDITION, COMPLETE_CONDITION},
|
||||||
{NEWLINE_LIST, CONDITION, CONDITION, CONDITION},
|
{NEWLINE_LIST, CONDITION, CONDITION, CONDITION},
|
||||||
{NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0},
|
{NEWLINE_LIST, COMPLETE_COMMANDS, LINEBREAK, 0},
|
||||||
{NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK},
|
{NEWLINE_LIST, LINEBREAK, PROGRAM, LINEBREAK},
|
||||||
|
{NEWLINE_LIST, FOR_WORDLIST, SEQUENTIAL_SEP, 0},
|
||||||
|
|
||||||
//to check
|
//to check
|
||||||
{IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER},
|
{IO_HERE, TK_IO_NUMBER, IO_REDIRECT, TK_IO_NUMBER},
|
||||||
|
|
@ -135,6 +139,7 @@ t_aggrematch g_aggrematch[] =
|
||||||
{CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0},
|
{CMD_NAME, AND_OR_MAJOR, CMD_SUPERIOR, 0},
|
||||||
{SIMPLE_COMMAND, ALL, COMMAND, 0},
|
{SIMPLE_COMMAND, ALL, COMMAND, 0},
|
||||||
{DO_GROUP, NAME, FOR_CLAUSE, TK_FOR},
|
{DO_GROUP, NAME, FOR_CLAUSE, TK_FOR},
|
||||||
|
{DO_GROUP, IN, FOR_CLAUSE, TK_FOR},
|
||||||
{DO_GROUP, SEQUENTIAL_SEP, FOR_CLAUSE, TK_FOR},
|
{DO_GROUP, SEQUENTIAL_SEP, FOR_CLAUSE, TK_FOR},
|
||||||
{DO_GROUP, CMD_SUPERIOR, LOOP, CMD_SUPERIOR},
|
{DO_GROUP, CMD_SUPERIOR, LOOP, CMD_SUPERIOR},
|
||||||
{DO_GROUP, COMPOUND_LIST, LOOP, COMPOUND_LIST},
|
{DO_GROUP, COMPOUND_LIST, LOOP, COMPOUND_LIST},
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ t_stackmatch g_stackmatch[] =
|
||||||
{TK_WORD, WORDLIST},
|
{TK_WORD, WORDLIST},
|
||||||
{TK_WORD, LINEBREAK},
|
{TK_WORD, LINEBREAK},
|
||||||
{TK_WORD, COMPLETE_COMMANDS},
|
{TK_WORD, COMPLETE_COMMANDS},
|
||||||
|
{TK_WORD, TK_IN},
|
||||||
|
{TK_WORD, FOR_WORDLIST},
|
||||||
{TK_ASSIGNEMENT_WORD, CMD_PREFIX},
|
{TK_ASSIGNEMENT_WORD, CMD_PREFIX},
|
||||||
{TK_IO_NUMBER, REDIRECT_LIST},
|
{TK_IO_NUMBER, REDIRECT_LIST},
|
||||||
{TK_IO_NUMBER, CMD_SUFFIX},
|
{TK_IO_NUMBER, CMD_SUFFIX},
|
||||||
|
|
@ -226,13 +228,13 @@ t_stackmatch g_stackmatch[] =
|
||||||
{TK_CASE, SEPARATOR_OP},
|
{TK_CASE, SEPARATOR_OP},
|
||||||
{TK_CASE, PIPE_SEMI_SEQUENCE},
|
{TK_CASE, PIPE_SEMI_SEQUENCE},
|
||||||
{TK_IN, TK_WORD},
|
{TK_IN, TK_WORD},
|
||||||
|
{TK_IN, NAME},
|
||||||
{TK_ESAC, CASE_LIST},
|
{TK_ESAC, CASE_LIST},
|
||||||
{TK_ESAC, CASE_LIST_NS},
|
{TK_ESAC, CASE_LIST_NS},
|
||||||
{TK_ESAC, LINEBREAK},
|
{TK_ESAC, LINEBREAK},
|
||||||
{TK_WHILE, LINEBREAK},
|
{TK_WHILE, LINEBREAK},
|
||||||
{TK_WHILE, COMPLETE_COMMANDS},
|
{TK_WHILE, COMPLETE_COMMANDS},
|
||||||
{TK_WHILE, TK_BANG},
|
{TK_WHILE, TK_BANG},
|
||||||
{TK_WHILE, TK_BANG},
|
|
||||||
{TK_WHILE, SEPARATOR_OP},
|
{TK_WHILE, SEPARATOR_OP},
|
||||||
{TK_WHILE, NEWLINE_LIST},
|
{TK_WHILE, NEWLINE_LIST},
|
||||||
{TK_WHILE, PIPE_SEMI_SEQUENCE},
|
{TK_WHILE, PIPE_SEMI_SEQUENCE},
|
||||||
|
|
@ -264,10 +266,16 @@ t_stackmatch g_stackmatch[] =
|
||||||
{TK_FOR, SEPARATOR_OP},
|
{TK_FOR, SEPARATOR_OP},
|
||||||
{TK_FOR, NEWLINE_LIST},
|
{TK_FOR, NEWLINE_LIST},
|
||||||
{TK_FOR, PIPE_SEMI_SEQUENCE},
|
{TK_FOR, PIPE_SEMI_SEQUENCE},
|
||||||
|
{TK_FOR, TK_DO},
|
||||||
|
{TK_FOR, TK_WHILE},
|
||||||
|
{TK_FOR, COMPOUND_LIST},
|
||||||
|
{TK_FOR, TK_IF},
|
||||||
|
{TK_FOR, TK_ELIF},
|
||||||
|
{TK_FOR, TK_THEN},
|
||||||
|
{TK_FOR, COMPLETE_CONDITION},
|
||||||
{TK_LBRACE, LINEBREAK},
|
{TK_LBRACE, LINEBREAK},
|
||||||
{TK_LBRACE, COMPLETE_COMMANDS},
|
{TK_LBRACE, COMPLETE_COMMANDS},
|
||||||
{TK_LBRACE, TK_BANG},
|
{TK_LBRACE, TK_BANG},
|
||||||
{TK_LBRACE, TK_BANG},
|
|
||||||
{TK_LBRACE, SEPARATOR_OP},
|
{TK_LBRACE, SEPARATOR_OP},
|
||||||
{TK_LBRACE, NEWLINE_LIST},
|
{TK_LBRACE, NEWLINE_LIST},
|
||||||
{TK_LBRACE, PIPE_SEMI_SEQUENCE},
|
{TK_LBRACE, PIPE_SEMI_SEQUENCE},
|
||||||
|
|
@ -285,6 +293,7 @@ t_stackmatch g_stackmatch[] =
|
||||||
{TK_SEMI, TERM},
|
{TK_SEMI, TERM},
|
||||||
{TK_SEMI, CMD_NAME},
|
{TK_SEMI, CMD_NAME},
|
||||||
{TK_SEMI, PROGRAM},
|
{TK_SEMI, PROGRAM},
|
||||||
|
{TK_SEMI, FOR_WORDLIST},
|
||||||
{TK_AMP, LIST},
|
{TK_AMP, LIST},
|
||||||
{TK_AMP, TERM},
|
{TK_AMP, TERM},
|
||||||
{TK_PIPE, PATTERN},
|
{TK_PIPE, PATTERN},
|
||||||
|
|
@ -345,6 +354,8 @@ t_stackmatch g_stackmatch[] =
|
||||||
{LINEBREAK, COMPOUND_LIST},
|
{LINEBREAK, COMPOUND_LIST},
|
||||||
{LINEBREAK, PROGRAM},
|
{LINEBREAK, PROGRAM},
|
||||||
{NEWLINE_LIST, TK_DO},
|
{NEWLINE_LIST, TK_DO},
|
||||||
|
{NEWLINE_LIST, SEQUENTIAL_SEP},
|
||||||
|
{NEWLINE_LIST, FOR_WORDLIST},
|
||||||
{NEWLINE_LIST, TK_IN},
|
{NEWLINE_LIST, TK_IN},
|
||||||
{NEWLINE_LIST, TK_WHILE},
|
{NEWLINE_LIST, TK_WHILE},
|
||||||
{NEWLINE_LIST, TK_UNTIL},
|
{NEWLINE_LIST, TK_UNTIL},
|
||||||
|
|
@ -536,7 +547,6 @@ t_stackmatch g_stackmatch[] =
|
||||||
{WHILE_CLAUSE, LINEBREAK},
|
{WHILE_CLAUSE, LINEBREAK},
|
||||||
{WHILE_CLAUSE, COMPLETE_COMMANDS},
|
{WHILE_CLAUSE, COMPLETE_COMMANDS},
|
||||||
{WHILE_CLAUSE, TK_BANG},
|
{WHILE_CLAUSE, TK_BANG},
|
||||||
{WHILE_CLAUSE, TK_BANG},
|
|
||||||
{WHILE_CLAUSE, SEPARATOR_OP},
|
{WHILE_CLAUSE, SEPARATOR_OP},
|
||||||
{WHILE_CLAUSE, NEWLINE_LIST},
|
{WHILE_CLAUSE, NEWLINE_LIST},
|
||||||
{WHILE_CLAUSE, PIPE_SEMI_SEQUENCE},
|
{WHILE_CLAUSE, PIPE_SEMI_SEQUENCE},
|
||||||
|
|
@ -554,7 +564,6 @@ t_stackmatch g_stackmatch[] =
|
||||||
{IF_CLAUSE, LINEBREAK},
|
{IF_CLAUSE, LINEBREAK},
|
||||||
{IF_CLAUSE, COMPLETE_COMMANDS},
|
{IF_CLAUSE, COMPLETE_COMMANDS},
|
||||||
{IF_CLAUSE, TK_BANG},
|
{IF_CLAUSE, TK_BANG},
|
||||||
{IF_CLAUSE, TK_BANG},
|
|
||||||
{IF_CLAUSE, SEPARATOR_OP},
|
{IF_CLAUSE, SEPARATOR_OP},
|
||||||
{IF_CLAUSE, NEWLINE_LIST},
|
{IF_CLAUSE, NEWLINE_LIST},
|
||||||
{IF_CLAUSE, PIPE_SEMI_SEQUENCE},
|
{IF_CLAUSE, PIPE_SEMI_SEQUENCE},
|
||||||
|
|
@ -589,6 +598,7 @@ t_stackmatch g_stackmatch[] =
|
||||||
{WORDLIST, IN},
|
{WORDLIST, IN},
|
||||||
{IN, LINEBREAK},
|
{IN, LINEBREAK},
|
||||||
{NAME, TK_FOR},
|
{NAME, TK_FOR},
|
||||||
|
{FOR_WORDLIST, NAME},
|
||||||
{FOR_CLAUSE, LINEBREAK},
|
{FOR_CLAUSE, LINEBREAK},
|
||||||
{FOR_CLAUSE, COMPLETE_COMMANDS},
|
{FOR_CLAUSE, COMPLETE_COMMANDS},
|
||||||
{FOR_CLAUSE, TK_BANG},
|
{FOR_CLAUSE, TK_BANG},
|
||||||
|
|
@ -596,6 +606,15 @@ t_stackmatch g_stackmatch[] =
|
||||||
{FOR_CLAUSE, SEPARATOR_OP},
|
{FOR_CLAUSE, SEPARATOR_OP},
|
||||||
{FOR_CLAUSE, NEWLINE_LIST},
|
{FOR_CLAUSE, NEWLINE_LIST},
|
||||||
{FOR_CLAUSE, PIPE_SEMI_SEQUENCE},
|
{FOR_CLAUSE, PIPE_SEMI_SEQUENCE},
|
||||||
|
{FOR_CLAUSE, TK_DO},
|
||||||
|
{FOR_CLAUSE, TK_WHILE},
|
||||||
|
{FOR_CLAUSE, TK_UNTIL},
|
||||||
|
{FOR_CLAUSE, TK_IF},
|
||||||
|
{FOR_CLAUSE, TK_ELIF},
|
||||||
|
{FOR_CLAUSE, TK_THEN},
|
||||||
|
{FOR_CLAUSE, TK_ELSE},
|
||||||
|
{FOR_CLAUSE, COMPOUND_LIST},
|
||||||
|
{FOR_CLAUSE, COMPLETE_CONDITION},
|
||||||
{TERM, LINEBREAK},
|
{TERM, LINEBREAK},
|
||||||
{TERM, COMPLETE_COMMANDS},
|
{TERM, COMPLETE_COMMANDS},
|
||||||
{COMPOUND_LIST, TK_DO},
|
{COMPOUND_LIST, TK_DO},
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,6 @@ t_prodmatch g_prodmatch[] =
|
||||||
{TK_WORD, TK_BANG, CMD_NAME},
|
{TK_WORD, TK_BANG, CMD_NAME},
|
||||||
{TK_WORD, PIPE_SEMI_SEQUENCE, CMD_NAME},
|
{TK_WORD, PIPE_SEMI_SEQUENCE, CMD_NAME},
|
||||||
{TK_WORD, SEPARATOR_OP, CMD_NAME},
|
{TK_WORD, SEPARATOR_OP, CMD_NAME},
|
||||||
{TK_WORD, TK_IN, PATTERN},
|
|
||||||
{TK_WORD, CASE_LIST, PATTERN},
|
{TK_WORD, CASE_LIST, PATTERN},
|
||||||
{TK_WORD, TK_PAREN_OPEN, PATTERN},
|
{TK_WORD, TK_PAREN_OPEN, PATTERN},
|
||||||
{TK_WORD, COMPLETE_COMMANDS, CMD_NAME},
|
{TK_WORD, COMPLETE_COMMANDS, CMD_NAME},
|
||||||
|
|
@ -73,6 +72,9 @@ t_prodmatch g_prodmatch[] =
|
||||||
{TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST},
|
{TK_NEWLINE, COMPOUND_LIST, NEWLINE_LIST},
|
||||||
{TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST},
|
{TK_NEWLINE, COMPLETE_CONDITION, NEWLINE_LIST},
|
||||||
{TK_NEWLINE, CONDITION, NEWLINE_LIST},
|
{TK_NEWLINE, CONDITION, NEWLINE_LIST},
|
||||||
|
{TK_NEWLINE, FOR_WORDLIST, NEWLINE_LIST},
|
||||||
|
{TK_NEWLINE, SEQUENTIAL_SEP, NEWLINE_LIST},
|
||||||
|
{TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP},
|
||||||
{TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP},
|
{TK_SEMI, CMD_SUPERIOR, SEPARATOR_OP},
|
||||||
{TK_SEMI, TERM, SEPARATOR_OP},
|
{TK_SEMI, TERM, SEPARATOR_OP},
|
||||||
{TK_SEMI, LIST, SEPARATOR_OP},
|
{TK_SEMI, LIST, SEPARATOR_OP},
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,16 @@
|
||||||
|
|
||||||
char *read_state(t_sym current)
|
char *read_state(t_sym current)
|
||||||
{
|
{
|
||||||
|
if (current == FOR_WORDLIST)
|
||||||
|
return ("FOR_WORDLIST");
|
||||||
|
if (current == FOR_CLAUSE)
|
||||||
|
return ("FOR_CLAUSE");
|
||||||
|
if (current == TK_NAME)
|
||||||
|
return ("TK_NAME");
|
||||||
|
if (current == TK_FOR)
|
||||||
|
return ("FOR");
|
||||||
|
if (current == NAME)
|
||||||
|
return ("NAME");
|
||||||
if (current == 0)
|
if (current == 0)
|
||||||
return ("NULL");
|
return ("NULL");
|
||||||
if (current == PATTERN)
|
if (current == PATTERN)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue