[TRANSLATION] Update Simplified Chinese translation and notice. (#1108)
[reactos.git] / base / system / diskpart / diskpart.c
1 /*
2 * PROJECT: ReactOS DiskPart
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/system/diskpart/diskpart.c
5 * PURPOSE: Manages all the partitions of the OS in an interactive way.
6 * PROGRAMMERS: Lee Schroeder
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include "diskpart.h"
12
13 /* FUNCTIONS ******************************************************************/
14
15 VOID
16 ShowHeader(VOID)
17 {
18 WCHAR szComputerName[MAX_STRING_SIZE];
19 DWORD comp_size = MAX_STRING_SIZE;
20
21 /* Get the name of the computer for us and change the value of comp_name */
22 GetComputerNameW(szComputerName, &comp_size);
23
24 /* TODO: Remove this section of code when program becomes stable enough for production use. */
25 ConPuts(StdOut, L"\n*WARNING*: This program is incomplete and may not work properly.\n");
26
27 /* Print the header information */
28 ConPuts(StdOut, L"\n");
29 ConResPuts(StdOut, IDS_APP_HEADER);
30 ConPuts(StdOut, L"\n");
31 ConResPuts(StdOut, IDS_APP_LICENSE);
32 ConResPrintf(StdOut, IDS_APP_CURR_COMPUTER, szComputerName);
33 }
34
35 /*
36 * RunScript(const char *filename):
37 * opens the file, reads the contents, convert the text into readable
38 * code for the computer, and then execute commands in order.
39 */
40 BOOL
41 RunScript(LPCWSTR filename)
42 {
43 FILE *script;
44 WCHAR tmp_string[MAX_STRING_SIZE];
45
46 /* Open the file for processing */
47 script = _wfopen(filename, L"r");
48 if (script == NULL)
49 {
50 /* if there was problems opening the file */
51 ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, filename);
52 return FALSE; /* if there is no script, exit the program */
53 }
54
55 /* Read and process the script */
56 while (fgetws(tmp_string, MAX_STRING_SIZE, script) != NULL)
57 {
58 if (InterpretScript(tmp_string) == FALSE)
59 {
60 fclose(script);
61 return FALSE;
62 }
63 }
64
65 /* Close the file */
66 fclose(script);
67
68 return TRUE;
69 }
70
71 /*
72 * wmain():
73 * Main entry point of the application.
74 */
75 int wmain(int argc, const LPWSTR argv[])
76 {
77 LPCWSTR script = NULL;
78 LPCWSTR tmpBuffer = NULL;
79 WCHAR appTitle[50];
80 int index, timeout;
81 int result = EXIT_SUCCESS;
82
83 /* Initialize the Console Standard Streams */
84 ConInitStdStreams();
85
86 /* Sets the title of the program so the user will have an easier time
87 determining the current program, especially if diskpart is running a
88 script */
89 K32LoadStringW(GetModuleHandle(NULL), IDS_APP_HEADER, appTitle, ARRAYSIZE(appTitle));
90 SetConsoleTitleW(appTitle);
91
92 /* Sets the timeout value to 0 just in case the user doesn't
93 specify a value */
94 timeout = 0;
95
96 CreatePartitionList();
97
98 /* If there are no command arguments, then go straight to the interpreter */
99 if (argc < 2)
100 {
101 ShowHeader();
102 InterpretMain();
103 }
104 /* If there are command arguments, then process them */
105 else
106 {
107 for (index = 1; index < argc; index++)
108 {
109 /* checks for flags */
110 if ((argv[index][0] == '/')||
111 (argv[index][0] == '-'))
112 {
113 tmpBuffer = argv[index] + 1;
114 }
115 else
116 {
117 /* If there is no flag, then return an error */
118 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, argv[index]);
119 result = EXIT_FAILURE;
120 goto done;
121 }
122
123 /* Checks for the /? flag first since the program
124 exits as soon as the usage list is shown. */
125 if (_wcsicmp(tmpBuffer, L"?") == 0)
126 {
127 ConResPuts(StdOut, IDS_APP_USAGE);
128 result = EXIT_SUCCESS;
129 goto done;
130 }
131 /* Checks for the script flag */
132 else if (_wcsicmp(tmpBuffer, L"s") == 0)
133 {
134 if ((index + 1) < argc)
135 {
136 index++;
137 script = argv[index];
138 }
139 }
140 /* Checks for the timeout flag */
141 else if (_wcsicmp(tmpBuffer, L"t") == 0)
142 {
143 if ((index + 1) < argc)
144 {
145 index++;
146 timeout = _wtoi(argv[index]);
147
148 /* If the number is a negative number, then
149 change it so that the time is executed properly. */
150 if (timeout < 0)
151 timeout = 0;
152 }
153 }
154 else
155 {
156 /* Assume that the flag doesn't exist. */
157 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, tmpBuffer);
158 result = EXIT_FAILURE;
159 goto done;
160 }
161 }
162
163 /* Shows the program information */
164 ShowHeader();
165
166 /* Now we process the filename if it exists */
167 if (script != NULL)
168 {
169 /* if the timeout is greater than 0, then assume
170 that the user specified a specific time. */
171 if (timeout > 0)
172 Sleep(timeout * 1000);
173
174 if (RunScript(script) == FALSE)
175 {
176 result = EXIT_FAILURE;
177 goto done;
178 }
179 }
180 else
181 {
182 /* Exit failure since the user wanted to run a script */
183 ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, script);
184 result = EXIT_FAILURE;
185 goto done;
186 }
187 }
188
189 /* Let the user know the program is exiting */
190 ConResPuts(StdOut, IDS_APP_LEAVING);
191
192 done:
193 DestroyPartitionList();
194
195 return result;
196 }