Untitled
unknown
c_cpp
3 years ago
2.0 kB
2
Indexable
Never
#include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <unistd.h> #define MAX_INPUT_SIZE 1024 #define MAX_TOKEN_SIZE 64 #define MAX_NUM_TOKENS 64 /* Splits the string by space and returns the array of tokens * */ char **tokenize(char *line) { char **tokens = (char **)malloc(MAX_NUM_TOKENS * sizeof(char *)); char *token = (char *)malloc(MAX_TOKEN_SIZE * sizeof(char)); int i, tokenIndex = 0, tokenNo = 0; for(i =0; i < strlen(line); i++){ char readChar = line[i]; if (readChar == ' ' || readChar == '\n' || readChar == '\t'){ token[tokenIndex] = '\0'; if (tokenIndex != 0){ tokens[tokenNo] = (char*)malloc(MAX_TOKEN_SIZE*sizeof(char)); strcpy(tokens[tokenNo++], token); tokenIndex = 0; } } else { token[tokenIndex++] = readChar; } } free(token); tokens[tokenNo] = NULL ; return tokens; } int main(int argc, char* argv[]) { char line[MAX_INPUT_SIZE]; char **tokens; int i; while(1) { /* BEGIN: TAKING INPUT */ bzero(line, sizeof(line)); printf("$ "); scanf("%[^\n]", line); getchar(); printf("Command entered: %s (remove this debug output later)\n", line); /* END: TAKING INPUT */ line[strlen(line) - 1] = '\n'; //terminate with new line tokens = tokenize(line); if(strcmp(tokens[i], "exit") == 0){ break; } if(strcmp(tokens[0], "ls") == 0){ char *args[2]; args[0] = "/bin/ls"; args[1] = NULL; int rc = fork(); if(rc<0){printf("Fork failed");} else if(rc==0){ execv(args[0], args); exit(1); } else{ int w = wait(NULL); printf("Success!\n"); } break; } for(i = 0; tokens[i] != NULL; i++){ } for(i=0;tokens[i]!=NULL;i++){ printf("found token %s (remove this debug output later)\n", tokens[i]); } // Freeing the allocated memory for(i=0;tokens[i]!=NULL;i++){ free(tokens[i]); } free(tokens); } return 0; }