Skip to content
Snippets Groups Projects
Select Git revision
  • f3d702a5f936046290fc5a9a1300245fe70dd783
  • main default
2 results

dsh_cli.c

Blame
  • dsh_cli.c 3.26 KiB
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #include "dshlib.h"
    
    /*
     * Implement your main function by building a loop that prompts the
     * user for input.  Use the SH_PROMPT constant from dshlib.h and then
     * use fgets to accept user input.  Since we want fgets to also handle
     * end of file so we can run this headless for testing we need to check
     * the return code of fgets.  I have provided an example below of how
     * to do this assuming you are storing user input inside of the cmd_buff
     * variable.
     *
     *      while(1){
     *        printf("%s", SH_PROMPT);
     *        if (fgets(cmd_buff, ARG_MAX, stdin) == NULL){
     *           printf("\n");
     *           break;
     *        }
     *        //remove the trailing \n from cmd_buff
     *        cmd_buff[strcspn(cmd_buff,"\n")] = '\0';
     *
     *        //IMPLEMENT THE REST OF THE REQUIREMENTS
     *      }
     *
     *   Also, use the constants in the dshlib.h in this code.
     *      SH_CMD_MAX              maximum buffer size for user input
     *      EXIT_CMD                constant that terminates the dsh program
     *      SH_PROMPT               the shell prompt
     *      OK                      the command was parsed properly
     *      WARN_NO_CMDS            the user command was empty
     *      ERR_TOO_MANY_COMMANDS   too many pipes used
     *
     *   Expected output:
     *
     *      CMD_OK_HEADER      if the command parses properly. You will
     *                         follow this by the command details
     *
     *      CMD_WARN_NO_CMD    if the user entered a blank command
     *      CMD_ERR_PIPE_LIMIT if the user entered too many commands using
     *                         the pipe feature, e.g., cmd1 | cmd2 | ... |
     *
     *  See the provided test cases for output expectations.
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "dshlib.h"
    
    int main() {
    	char cmd_buff[SH_CMD_MAX]; //Makes memory
    	int rc = 0;
    	command_list_t clist;
    
    	while (1) {
    		printf("%s", SH_PROMPT);
    		if (fgets(cmd_buff, SH_CMD_MAX, stdin) == NULL) {
    			printf("\n");
    			break;
    		}
    
    		// Remove the trailing newline character
    		cmd_buff[strcspn(cmd_buff, "\n")] = '\0';
    
    		char *trimmed_cmd = cmd_buff;
    		while (*trimmed_cmd == ' ') {
    			trimmed_cmd++;
    		}//Trimming line
    
    		if (*trimmed_cmd == '\0') {
                printf(CMD_WARN_NO_CMD);
                continue;
        }
    
    
    		// Check for empty input
    		if (strlen(cmd_buff) == 0) {
    			printf(CMD_WARN_NO_CMD);
    			continue;
    		}
    
    		// Check for exit command
    		if (strcmp(cmd_buff, EXIT_CMD) == 0) {
    			break;
    		}
    
    		rc = build_cmd_list(cmd_buff, &clist);
    
    		// Handle the result of build_cmd_list
    		switch (rc) {
    			case OK:
    					printf(CMD_OK_HEADER, clist.num);
    					for (int i = 0; i < clist.num; i++) {
    
                        if (clist.commands[i].args) {
                            printf("<%d> %s [%s]\n", i + 1, clist.commands[i].exe, clist.commands[i].args);
                    } else {
                            printf("<%d> %s\n", i + 1, clist.commands[i].exe);
                            }
                        }
    
                    break;
    
    			case ERR_TOO_MANY_COMMANDS:
    					printf(CMD_ERR_PIPE_LIMIT, CMD_MAX);
    					break;
    
    			case ERR_CMD_OR_ARGS_TOO_BIG: //They'res no thing for bigg arg or command
    					printf("error: command or arguments too big\n");
    					break;
    
    			default:
    					printf("error: unknown error\n"); //Random bugs incase
    					break;
    		}
    	}
    
    	return 0;
    }