diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lsh_main_func.c | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/src/lsh_main_func.c b/src/lsh_main_func.c index 9864b20..74e7881 100644 --- a/src/lsh_main_func.c +++ b/src/lsh_main_func.c @@ -117,7 +117,7 @@ char * strtok_quotes(char *token){ } char *return_char=parse_args_last_p; - bool in_quote=false; + char in_quote=' '; if(parse_args_last_p != NULL){ int ch_i=0; @@ -125,36 +125,39 @@ char * strtok_quotes(char *token){ if (parse_args_last_p[ch_i] == '\0') break; - if (in_quote==false&parse_args_last_p[ch_i]=='"'){ + if (in_quote==' ' && (parse_args_last_p[ch_i]=='"' || parse_args_last_p[ch_i]=='\'')){ bool pass_check=true; if(ch_i>0 && parse_args_last_p[ch_i-1]=='\\') pass_check=false; if(pass_check==true){ - parse_args_last_p[ch_i]='\0'; + in_quote=parse_args_last_p[ch_i]; if (parse_args_last_p[ch_i+1] == '\0') break; - return_char = &return_char[1]; + if(ch_i==0){ + parse_args_last_p[0]='\0'; + parse_args_last_p=&parse_args_last_p[1]; + return_char=&return_char[1]; + } ch_i++; - in_quote=true; } } - if(in_quote==true){ - if (parse_args_last_p[ch_i]=='"'){ + if(in_quote!=' '){ + if (parse_args_last_p[ch_i]==in_quote){ bool pass_check=true; if(ch_i>0 && parse_args_last_p[ch_i-1]=='\\') pass_check=false; if(pass_check==true){ - if(parse_args_last_p[ch_i+1]=='\0') + in_quote=' '; + if(parse_args_last_p[ch_i+1]=='\0'){ parse_args_last_p[ch_i]='\0'; - else if(parse_args_last_p[ch_i+1]==' '){ + } else if(parse_args_last_p[ch_i+1]==' '){ parse_args_last_p[ch_i]='\0'; parse_args_last_p = &parse_args_last_p[ch_i+2]; return return_char; } - in_quote=false; } } } else { @@ -171,6 +174,36 @@ char * strtok_quotes(char *token){ return return_char; } +char *pop_quotes(char *token){ + int ch_i=0; + char *right=(char*)malloc(sizeof(char)*strlen(token)+1); + char *ret_token=(char*)malloc(sizeof(char)*strlen(token)+1); + strcpy(ret_token,token); + + while(ch_i<strlen(ret_token)){ + if(ret_token[ch_i]=='\0'){ + free(right); + free(token); + return ret_token; + } + while(ret_token[ch_i]=='"' || ret_token[ch_i]=='\''){ + if(ret_token[ch_i-1]=='\\'){ + strcpy(right,&ret_token[ch_i]); + ret_token[ch_i-1]='\0'; + strcat(ret_token,right); + break; + } + strcpy(right,&ret_token[ch_i+1]); + ret_token[ch_i]='\0'; + strcat(ret_token,right); + } + ch_i++; + } + free(right); + free(token); + return ret_token; +} + #define LSH_TOK_BUFSIZE 64 char **lsh_split_line(char *line) { @@ -186,6 +219,7 @@ char **lsh_split_line(char *line) token = strtok_quotes(line); while (token != NULL) { token = handle_vars(token); + token = pop_quotes(token); tokens[position] = token; position++; |
