diff options
Diffstat (limited to 'src/lsh_main_func.c')
| -rw-r--r-- | src/lsh_main_func.c | 133 |
1 files changed, 28 insertions, 105 deletions
diff --git a/src/lsh_main_func.c b/src/lsh_main_func.c index 5f46183..1604073 100644 --- a/src/lsh_main_func.c +++ b/src/lsh_main_func.c @@ -8,6 +8,7 @@ #include <unistd.h> #include <stdbool.h> +#include "main.h" #include "helper_functions.c" #define LSH_RL_BUFSIZE 1024 @@ -43,74 +44,8 @@ char *lsh_read_line(void) } } -char *handle_vars(char *token){ - char *ret_token=(char*)malloce(sizeof(char)*strlen(token)+1); - strcpy(ret_token,token); - - if (token[0]=='~'){ - token++; - if(!getenv("HOME")){ - fprintf(stderr,"lsh: you aint got no home. da hell\n"); - free(ret_token); - ret_token=(char*)malloce(sizeof(char)*strlen(token)+1); - strcpy(ret_token,token); - return ret_token; - } - free(ret_token); - ret_token=(char*)malloce(sizeof(char)*strlen(token)+strlen(getenv("HOME"))+1); - strcpy(ret_token,getenv("HOME")); - strcat(ret_token,token); - } - - char *tmp_token=(char*)malloce(sizeof(char)*strlen(ret_token)+1); - strcpy(tmp_token,ret_token); - int i=0; - while (tmp_token[i]!='\0'){ - if(tmp_token[i]=='$'){ - char sep[2]=" \0"; - int j=0; while(tmp_token[i+j]){ - j++; - if(tmp_token[i+j]==' ') break; - if(tmp_token[i+j]=='$'){ - sep[0]='$'; - break; - } - } - - char *varname=(char*)malloce(sizeof(char)*j+1); - varname[j]='\0'; - strncpy(varname,&tmp_token[i+1],j); - varname[j-1]='\0'; - - char *env = getenv(varname); - if(!env) env=""; - - free(ret_token); - int tmp_len=strlen(tmp_token); - ret_token=(char*)malloce(sizeof(char)*(strlen(tmp_token)-strlen(varname))+strlen(env)+1); - tmp_token[i]='\0'; - tmp_token[i+j]='\0'; - - strcpy(ret_token,tmp_token); - strcat(ret_token,env); - strcat(ret_token,sep); - if(i+j+1 < tmp_len){ - strcat(ret_token,&tmp_token[i+j+1]); - } - - free(tmp_token); - tmp_token=(char*)malloce(sizeof(char)*strlen(ret_token)+1); - strcpy(tmp_token,ret_token); - - free(varname); - } - i++; - } - free(tmp_token); - return ret_token; -} - -char * strtok_quotes(char *token){ +char * strtok_cmd(char *token, cmd_t *type){ + *type=Stdout; static char* parse_args_last_p; if(token != NULL){ parse_args_last_p=token; @@ -137,43 +72,31 @@ char * strtok_quotes(char *token){ in_quote=parse_args_last_p[ch_i]; if (parse_args_last_p[ch_i+1] == '\0') break; - if(ch_i==0){ - parse_args_last_p[0]='\0'; - parse_args_last_p=&parse_args_last_p[1]; - return_char=&return_char[1]; - } else { - pop(return_char,ch_i); - } ch_i++; } } - if(in_quote!=' '){ + 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 (pass_check) 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]==' '){ - parse_args_last_p[ch_i]='\0'; - parse_args_last_p = &parse_args_last_p[ch_i+2]; - pop(return_char,ch_i); - return return_char; - } - pop(return_char,ch_i); - } - } - } else { - if (parse_args_last_p[ch_i] == ' '){ - parse_args_last_p[ch_i] = '\0'; - parse_args_last_p = &parse_args_last_p[ch_i+1]; - return return_char; } + } else if(parse_args_last_p[ch_i]==';'){ + if(parse_args_last_p[ch_i]=='\0') + break; + parse_args_last_p[ch_i]='\0'; + if(parse_args_last_p[ch_i+1]=='\0') + break; + parse_args_last_p=&parse_args_last_p[ch_i+1]; + while(parse_args_last_p[0]==' ' || parse_args_last_p[0]=='\t') + parse_args_last_p=&parse_args_last_p[1]; + return return_char; } + ch_i++; } parse_args_last_p=NULL; @@ -181,30 +104,30 @@ char * strtok_quotes(char *token){ return return_char; } -#define LSH_TOK_BUFSIZE 64 -char **lsh_split_line(char *line) +CMD **lsh_split_command(char *line) { - int bufsize = LSH_TOK_BUFSIZE, position = 0; - char **tokens = malloce(bufsize * sizeof(char*)); + int bufsize = sizeof(CMD*), position = 0; + CMD **tokens = malloce(bufsize); char *token; + cmd_t cmd_type; - token = strtok_quotes(line); + token = strtok_cmd(line,&cmd_type); while (token != NULL) { - token = handle_vars(token); - tokens[position] = token; + tokens[position] = malloce(sizeof(CMD)); + tokens[position]->cmd = token; + tokens[position]->type = cmd_type; position++; - - if (position >= bufsize) { - bufsize += LSH_TOK_BUFSIZE; - tokens = realloc(tokens, bufsize * sizeof(char*)); + if (position * bufsize >= bufsize) { + bufsize += sizeof(CMD*); + tokens = realloc(tokens, bufsize); if (!tokens) { fprintf(stderr, "lsh: allocation error\n"); exit(EXIT_FAILURE); } } - token = strtok_quotes(NULL); + token = strtok_cmd(NULL,&cmd_type); } tokens[position] = NULL; return tokens; |
