1 /* 2 * PROJECT: ReactOS DiskPart 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: base/system/diskpart/interpreter.c 5 * PURPOSE: Reads the user input and then invokes the selected 6 * command by the user. 7 * PROGRAMMERS: Lee Schroeder 8 */ 9 10 #include "diskpart.h" 11 12 BOOL exit_main(INT argc, LPWSTR *argv); 13 BOOL rem_main(INT argc, LPWSTR *argv); 14 15 16 COMMAND cmds[] = 17 { 18 {L"active", active_main, IDS_HELP_CMD_ACTIVE, IDS_HELP_CMD_DESC_ACTIVE}, 19 {L"add", add_main, IDS_HELP_CMD_ADD, IDS_HELP_CMD_DESC_ADD}, 20 {L"assign", assign_main, IDS_HELP_CMD_ASSIGN, IDS_HELP_CMD_DESC_ASSIGN}, 21 {L"attach", attach_main, IDS_HELP_CMD_ATTACH, IDS_HELP_CMD_DESC_ATTACH}, 22 {L"attributes", attributes_main, IDS_HELP_CMD_ATTRIBUTES, IDS_HELP_CMD_DESC_ATTRIBUTES}, 23 {L"automount", automount_main, IDS_HELP_CMD_AUTOMOUNT, IDS_HELP_CMD_DESC_AUTOMOUNT}, 24 {L"break", break_main, IDS_HELP_CMD_BREAK, IDS_HELP_CMD_DESC_BREAK}, 25 {L"clean", clean_main, IDS_HELP_CMD_CLEAN, IDS_HELP_CMD_DESC_CLEAN}, 26 {L"compact", compact_main, IDS_HELP_CMD_COMPACT, IDS_HELP_CMD_DESC_COMPACT}, 27 {L"convert", convert_main, IDS_HELP_CMD_CONVERT, IDS_HELP_CMD_DESC_CONVERT}, 28 {L"create", create_main, IDS_HELP_CMD_CREATE, IDS_HELP_CMD_DESC_CREATE}, 29 {L"delete", delete_main, IDS_HELP_CMD_DELETE, IDS_HELP_CMD_DESC_DELETE}, 30 {L"detail", detail_main, IDS_HELP_CMD_DETAIL, IDS_HELP_CMD_DESC_DETAIL}, 31 {L"detach", detach_main, IDS_HELP_CMD_DETACH, IDS_HELP_CMD_DESC_DETACH}, 32 {L"dump", dump_main, IDS_NONE, IDS_NONE}, 33 {L"exit", NULL, IDS_NONE, IDS_HELP_CMD_DESC_EXIT}, 34 {L"expand", expand_main, IDS_HELP_CMD_EXPAND, IDS_HELP_CMD_DESC_EXPAND}, 35 {L"extend", extend_main, IDS_HELP_CMD_EXTEND, IDS_HELP_CMD_DESC_EXTEND}, 36 {L"filesystems", filesystems_main, IDS_HELP_CMD_FILESYSTEMS, IDS_HELP_CMD_DESC_FS}, 37 {L"format", format_main, IDS_HELP_CMD_FORMAT, IDS_HELP_CMD_DESC_FORMAT}, 38 {L"gpt", gpt_main, IDS_HELP_CMD_GPT, IDS_HELP_CMD_DESC_GPT}, 39 {L"help", help_main, IDS_HELP_CMD_HELP, IDS_HELP_CMD_DESC_HELP}, 40 {L"import", import_main, IDS_HELP_CMD_IMPORT, IDS_HELP_CMD_DESC_IMPORT}, 41 {L"inactive", inactive_main, IDS_HELP_CMD_INACTIVE, IDS_HELP_CMD_DESC_INACTIVE}, 42 {L"list", list_main, IDS_HELP_CMD_LIST, IDS_HELP_CMD_DESC_LIST}, 43 {L"merge", merge_main, IDS_HELP_CMD_MERGE, IDS_HELP_CMD_DESC_MERGE}, 44 {L"offline", offline_main, IDS_HELP_CMD_OFFLINE, IDS_HELP_CMD_DESC_OFFLINE}, 45 {L"online", online_main, IDS_HELP_CMD_ONLINE, IDS_HELP_CMD_DESC_ONLINE}, 46 {L"recover", recover_main, IDS_HELP_CMD_RECOVER, IDS_HELP_CMD_DESC_RECOVER}, 47 {L"rem", NULL, IDS_NONE, IDS_HELP_CMD_DESC_REM}, 48 {L"remove", remove_main, IDS_HELP_CMD_REMOVE, IDS_HELP_CMD_DESC_REMOVE}, 49 {L"repair", repair_main, IDS_HELP_CMD_REPAIR, IDS_HELP_CMD_DESC_REPAIR}, 50 {L"rescan", rescan_main, IDS_HELP_CMD_RESCAN, IDS_HELP_CMD_DESC_RESCAN}, 51 {L"retain", retain_main, IDS_HELP_CMD_RETAIN, IDS_HELP_CMD_DESC_RETAIN}, 52 {L"san", san_main, IDS_HELP_CMD_SAN, IDS_HELP_CMD_DESC_SAN}, 53 {L"select", select_main, IDS_HELP_CMD_SELECT, IDS_HELP_CMD_DESC_SELECT}, 54 {L"setid", setid_main, IDS_HELP_CMD_SETID, IDS_HELP_CMD_DESC_SETID}, 55 {L"shrink", shrink_main, IDS_HELP_CMD_SHRINK, IDS_HELP_CMD_DESC_SHRINK}, 56 {L"uniqueid", uniqueid_main, IDS_HELP_CMD_UNIQUEID, IDS_HELP_CMD_DESC_UNIQUEID}, 57 {NULL, NULL, IDS_NONE, IDS_NONE} 58 }; 59 60 61 /* FUNCTIONS *****************************************************************/ 62 63 /* 64 * InterpretCmd(char *cmd_line, char *arg_line): 65 * compares the command name to a list of available commands, and 66 * determines which function to invoke. 67 */ 68 BOOL 69 InterpretCmd(int argc, LPWSTR *argv) 70 { 71 PCOMMAND cmdptr; 72 73 /* If no args provided */ 74 if (argc < 1) 75 return TRUE; 76 77 /* First, determine if the user wants to exit 78 or to use a comment */ 79 if(wcsicmp(argv[0], L"exit") == 0) 80 return FALSE; 81 82 if(wcsicmp(argv[0], L"rem") == 0) 83 return TRUE; 84 85 /* Scan internal command table */ 86 for (cmdptr = cmds; cmdptr->name; cmdptr++) 87 { 88 if (wcsicmp(argv[0], cmdptr->name) == 0) 89 return cmdptr->func(argc, argv); 90 } 91 92 help_cmdlist(); 93 94 return TRUE; 95 } 96 97 98 /* 99 * InterpretScript(char *line): 100 * The main function used for when reading commands from scripts. 101 */ 102 BOOL 103 InterpretScript(LPWSTR input_line) 104 { 105 LPWSTR args_vector[MAX_ARGS_COUNT]; 106 INT args_count = 0; 107 BOOL bWhiteSpace = TRUE; 108 LPWSTR ptr; 109 110 memset(args_vector, 0, sizeof(args_vector)); 111 112 ptr = input_line; 113 while (*ptr != 0) 114 { 115 if (iswspace(*ptr) || *ptr == L'\n') 116 { 117 *ptr = 0; 118 bWhiteSpace = TRUE; 119 } 120 else 121 { 122 if ((bWhiteSpace != FALSE) && (args_count < MAX_ARGS_COUNT)) 123 { 124 args_vector[args_count] = ptr; 125 args_count++; 126 } 127 128 bWhiteSpace = FALSE; 129 } 130 131 ptr++; 132 } 133 134 /* sends the string to find the command */ 135 return InterpretCmd(args_count, args_vector); 136 } 137 138 139 /* 140 * InterpretMain(): 141 * Contents for the main program loop as it reads each line, and then 142 * it sends the string to interpret_line, where it determines what 143 * command to use. 144 */ 145 VOID 146 InterpretMain(VOID) 147 { 148 WCHAR input_line[MAX_STRING_SIZE]; 149 LPWSTR args_vector[MAX_ARGS_COUNT]; 150 INT args_count = 0; 151 BOOL bWhiteSpace = TRUE; 152 BOOL bRun = TRUE; 153 LPWSTR ptr; 154 155 while (bRun != FALSE) 156 { 157 args_count = 0; 158 memset(args_vector, 0, sizeof(args_vector)); 159 160 /* Shown just before the input where the user places commands */ 161 ConResPuts(StdOut, IDS_APP_PROMPT); 162 163 /* Get input from the user. */ 164 fgetws(input_line, MAX_STRING_SIZE, stdin); 165 166 ptr = input_line; 167 while (*ptr != 0) 168 { 169 if (iswspace(*ptr) || *ptr == L'\n') 170 { 171 *ptr = 0; 172 bWhiteSpace = TRUE; 173 } 174 else 175 { 176 if ((bWhiteSpace != FALSE) && (args_count < MAX_ARGS_COUNT)) 177 { 178 args_vector[args_count] = ptr; 179 args_count++; 180 } 181 bWhiteSpace = FALSE; 182 } 183 ptr++; 184 } 185 186 /* Send the string to find the command */ 187 bRun = InterpretCmd(args_count, args_vector); 188 } 189 } 190