aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoriceyrazor <iceyrazor@mailfence.com>2026-02-18 20:53:04 -0600
committericeyrazor <iceyrazor@mailfence.com>2026-02-18 20:53:04 -0600
commit022a202e31157859bc0fac25479a4782514e50a9 (patch)
tree9738fc77951004c98841f2a4fe4255d784d32c53 /src
parentc3df6bc56e3b7162b68e773be2d717ea0d5cba64 (diff)
quotes
- now parsing single quotes - quotes are now removed from string - fully handling escape quotes (i think)
Diffstat (limited to 'src')
-rw-r--r--src/lsh_main_func.c54
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++;