aboutsummaryrefslogtreecommitdiff
path: root/src/lsh_main_func.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lsh_main_func.c')
-rw-r--r--src/lsh_main_func.c133
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;