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 envokes 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"exit", NULL, IDS_NONE, IDS_HELP_CMD_DESC_EXIT}, 33 {L"expand", expand_main, IDS_HELP_CMD_EXPAND, IDS_HELP_CMD_DESC_EXPAND}, 34 {L"extend", extend_main, IDS_HELP_CMD_EXTEND, IDS_HELP_CMD_DESC_EXTEND}, 35 {L"filesystems", filesystems_main, IDS_HELP_CMD_FILESYSTEMS, IDS_HELP_CMD_DESC_FS}, 36 {L"format", format_main, IDS_HELP_CMD_FORMAT, IDS_HELP_CMD_DESC_FORMAT}, 37 {L"gpt", gpt_main, IDS_HELP_CMD_GPT, IDS_HELP_CMD_DESC_GPT}, 38 {L"help", help_main, IDS_HELP_CMD_HELP, IDS_HELP_CMD_DESC_HELP}, 39 {L"import", import_main, IDS_HELP_CMD_IMPORT, IDS_HELP_CMD_DESC_IMPORT}, 40 {L"inactive", inactive_main, IDS_HELP_CMD_INACTIVE, IDS_HELP_CMD_DESC_INACTIVE}, 41 {L"list", list_main, IDS_HELP_CMD_LIST, IDS_HELP_CMD_DESC_LIST}, 42 {L"merge", merge_main, IDS_HELP_CMD_MERGE, IDS_HELP_CMD_DESC_MERGE}, 43 {L"offline", offline_main, IDS_HELP_CMD_OFFLINE, IDS_HELP_CMD_DESC_OFFLINE}, 44 {L"online", online_main, IDS_HELP_CMD_ONLINE, IDS_HELP_CMD_DESC_ONLINE}, 45 {L"recover", recover_main, IDS_HELP_CMD_RECOVER, IDS_HELP_CMD_DESC_RECOVER}, 46 {L"rem", NULL, IDS_NONE, IDS_HELP_CMD_DESC_REM}, 47 {L"remove", remove_main, IDS_HELP_CMD_REMOVE, IDS_HELP_CMD_DESC_REMOVE}, 48 {L"repair", repair_main, IDS_HELP_CMD_REPAIR, IDS_HELP_CMD_DESC_REPAIR}, 49 {L"rescan", rescan_main, IDS_HELP_CMD_RESCAN, IDS_HELP_CMD_DESC_RESCAN}, 50 {L"retain", retain_main, IDS_HELP_CMD_RETAIN, IDS_HELP_CMD_DESC_RETAIN}, 51 {L"san", san_main, IDS_HELP_CMD_SAN, IDS_HELP_CMD_DESC_SAN}, 52 {L"select", select_main, IDS_HELP_CMD_SELECT, IDS_HELP_CMD_DESC_SELECT}, 53 {L"setid", setid_main, IDS_HELP_CMD_SETID, IDS_HELP_CMD_DESC_SETID}, 54 {L"shrink", shrink_main, IDS_HELP_CMD_SHRINK, IDS_HELP_CMD_DESC_SHRINK}, 55 {L"uniqueid", uniqueid_main, IDS_HELP_CMD_UNIQUEID, IDS_HELP_CMD_DESC_UNIQUEID}, 56 {NULL, NULL, IDS_NONE, IDS_NONE} 57 }; 58 59 60 /* FUNCTIONS *****************************************************************/ 61 62 /* 63 * InterpretCmd(char *cmd_line, char *arg_line): 64 * compares the command name to a list of available commands, and 65 * determines which function to envoke. 66 */ 67 BOOL 68 InterpretCmd(int argc, LPWSTR *argv) 69 { 70 PCOMMAND cmdptr; 71 72 /* Scan internal command table */ 73 for (cmdptr = cmds; cmdptr->name; cmdptr++) 74 { 75 /* First, determine if the user wants to exit 76 or to use a comment */ 77 if(wcsicmp(argv[0], L"exit") == 0) 78 return FALSE; 79 80 if(wcsicmp(argv[0], L"rem") == 0) 81 return TRUE; 82 83 if (wcsicmp(argv[0], cmdptr->name) == 0) 84 return cmdptr->func(argc, argv); 85 } 86 87 help_cmdlist(); 88 89 return TRUE; 90 } 91 92 93 /* 94 * InterpretScript(char *line): 95 * The main function used for when reading commands from scripts. 96 */ 97 BOOL 98 InterpretScript(LPWSTR input_line) 99 { 100 LPWSTR args_vector[MAX_ARGS_COUNT]; 101 INT args_count = 0; 102 BOOL bWhiteSpace = TRUE; 103 LPWSTR ptr; 104 105 memset(args_vector, 0, sizeof(args_vector)); 106 107 ptr = input_line; 108 while (*ptr != 0) 109 { 110 if (iswspace(*ptr) || *ptr == L'\n') 111 { 112 *ptr = 0; 113 bWhiteSpace = TRUE; 114 } 115 else 116 { 117 if ((bWhiteSpace == TRUE) && (args_count < MAX_ARGS_COUNT)) 118 { 119 args_vector[args_count] = ptr; 120 args_count++; 121 } 122 123 bWhiteSpace = FALSE; 124 } 125 126 ptr++; 127 } 128 129 /* sends the string to find the command */ 130 return InterpretCmd(args_count, args_vector); 131 } 132 133 134 /* 135 * InterpretMain(): 136 * Contents for the main program loop as it reads each line, and then 137 * it sends the string to interpret_line, where it determines what 138 * command to use. 139 */ 140 VOID 141 InterpretMain(VOID) 142 { 143 WCHAR input_line[MAX_STRING_SIZE]; 144 LPWSTR args_vector[MAX_ARGS_COUNT]; 145 INT args_count = 0; 146 BOOL bWhiteSpace = TRUE; 147 BOOL bRun = TRUE; 148 LPWSTR ptr; 149 150 while (bRun == TRUE) 151 { 152 args_count = 0; 153 memset(args_vector, 0, sizeof(args_vector)); 154 155 /* shown just before the input where the user places commands */ 156 PrintResourceString(IDS_APP_PROMPT); 157 158 /* gets input from the user. */ 159 fgetws(input_line, MAX_STRING_SIZE, stdin); 160 161 ptr = input_line; 162 while (*ptr != 0) 163 { 164 if (iswspace(*ptr) || *ptr == L'\n') 165 { 166 *ptr = 0; 167 bWhiteSpace = TRUE; 168 } 169 else 170 { 171 if ((bWhiteSpace == TRUE) && (args_count < MAX_ARGS_COUNT)) 172 { 173 args_vector[args_count] = ptr; 174 args_count++; 175 } 176 bWhiteSpace = FALSE; 177 } 178 ptr++; 179 } 180 181 /* sends the string to find the command */ 182 bRun = InterpretCmd(args_count, args_vector); 183 } 184 } 185