xref: /reactos/base/system/diskpart/interpreter.c (revision d2c667c6)
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