]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/Split/Split.c
updated WinNtSerialIoDxe driver not to create new child handle if RemainingDeviepath...
[mirror_edk2.git] / BaseTools / Source / C / Split / Split.c
CommitLineData
30fdf114
LG
1/** @file\r
2\r
3 Split a file into two pieces at the request offset.\r
4\r
5Copyright (c) 1999-2008 Intel Corporation. All rights reserved\r
6This program and the accompanying materials are licensed and made available\r
7under the terms and conditions of the BSD License which accompanies this\r
8distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16// GC_TODO: fix comment to start with /*++\r
17#include <stdio.h>\r
18#include <string.h>\r
19#include <stdlib.h>\r
20#ifdef __GNUC__\r
21#include <unistd.h>\r
22#endif\r
23#include <ctype.h>\r
24#include "ParseInf.h"\r
25#include "CommonLib.h"\r
26#include "EfiUtilityMsgs.h"\r
27//\r
28// Utility Name\r
29//\r
30#define UTILITY_NAME "Split"\r
31\r
32//\r
33// Utility version information\r
34//\r
35#define UTILITY_MAJOR_VERSION 0\r
36#define UTILITY_MINOR_VERSION 1\r
37\r
38void\r
39Version (\r
40 void\r
41 )\r
42/*++\r
43\r
44Routine Description:\r
45\r
46 Displays the standard utility information to SDTOUT\r
47\r
48Arguments:\r
49\r
50 None\r
51\r
52Returns:\r
53\r
54 None\r
55\r
56--*/\r
57{\r
58 printf ("%s v%d.%d -Utility to break a file into two pieces at the request offset.\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
59 printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");\r
60}\r
61\r
62void\r
63Usage (\r
64 void\r
65 )\r
66/*++\r
67\r
68Routine Description:\r
69\r
70 GC_TODO: Add function description\r
71\r
72Arguments:\r
73\r
74\r
75Returns:\r
76\r
77 GC_TODO: add return values\r
78\r
79--*/\r
80{\r
81 Version();\r
82 printf ("\nUsage: \n\\r
83 Split\n\\r
84 -f, --filename inputFile to split\n\\r
85 -s, --split VALUE the number of bytes in the first file\n\\r
86 [-p, --prefix OutputDir]\n\\r
87 [-o, --firstfile Filename1]\n\\r
88 [-t, --secondfile Filename2]\n\\r
89 [-v, --verbose]\n\\r
90 [--version]\n\\r
91 [-q, --quiet disable all messages except fatal errors]\n\\r
92 [-d, --debug[#]\n\\r
93 [-h, --help]\n");\r
94}\r
95\r
96EFI_STATUS\r
97GetSplitValue (\r
98 IN CONST CHAR8* SplitValueString,\r
99 OUT UINT64 *ReturnValue\r
100)\r
101{\r
102 UINT64 len = strlen(SplitValueString);\r
103 UINT64 base = 1;\r
104 UINT64 index = 0;\r
105 UINT64 number = 0;\r
106 CHAR8 lastCHAR = 0;\r
107 EFI_STATUS Status = EFI_SUCCESS;\r
108\r
109 if (len == 0) {\r
110 return EFI_ABORTED;\r
111 }\r
112\r
113 Status = AsciiStringToUint64 (SplitValueString, FALSE, ReturnValue);\r
114 if (!EFI_ERROR (Status)) {\r
115 return Status;\r
116 }\r
117\r
118 if (SplitValueString[0] == '0' && (SplitValueString[1] == 'x' || SplitValueString[1] == 'X')) {\r
119 Status = AsciiStringToUint64 (SplitValueString, TRUE, ReturnValue);\r
120 if (!EFI_ERROR (Status)) {\r
121 return Status;\r
122 }\r
123 }\r
124\r
125 lastCHAR = (CHAR8)toupper(SplitValueString[len - 1]);\r
126\r
127 if (lastCHAR != 'K' && lastCHAR != 'M' && lastCHAR != 'G') {\r
128 return STATUS_ERROR;\r
129 }\r
130\r
131 for (;index < len - 1; ++index) {\r
132 if (!isdigit(SplitValueString[index])) {\r
133 return EFI_ABORTED;\r
134 }\r
135 }\r
136\r
137 number = atol (SplitValueString);\r
138 if (lastCHAR == 'K')\r
139 base = 1024;\r
140 else if (lastCHAR == 'M')\r
141 base = 1024*1024;\r
142 else\r
143 base = 1024*1024*1024;\r
144\r
145 *ReturnValue = number*base;\r
146\r
147 return EFI_SUCCESS;\r
148}\r
149\r
150EFI_STATUS\r
151CountVerboseLevel (\r
152 IN CONST CHAR8* VerboseLevelString,\r
153 IN CONST UINT64 Length,\r
154 OUT UINT64 *ReturnValue\r
155)\r
156{\r
157 UINT64 i = 0;\r
158 for (;i < Length; ++i) {\r
159 if (VerboseLevelString[i] != 'v' && VerboseLevelString[i] != 'V') {\r
160 return EFI_ABORTED;\r
161 }\r
162 ++(*ReturnValue);\r
163 }\r
164\r
165 return EFI_SUCCESS;\r
166}\r
167\r
168EFI_STATUS\r
169CreateDir (\r
170 IN OUT CHAR8** FullFileName\r
171)\r
172{\r
173 CHAR8* temp = *FullFileName;\r
174 CHAR8* start = temp;\r
175 UINT64 index = 0;\r
176\r
177 for (;index < strlen(temp); ++index) {\r
178 if (temp[index] == '\\' || temp[index] == '/') {\r
179 temp[index] = 0;\r
180 if (chdir(start)) {\r
181 if (mkdir(start, S_IRWXU | S_IRWXG | S_IRWXO) != 0) {\r
182 return EFI_ABORTED;\r
183 }\r
184 chdir(start);\r
185 }\r
186 start = temp + index + 1;\r
187 temp[index] = '/';\r
188 }\r
189 }\r
190\r
191 return EFI_SUCCESS;\r
192}\r
193\r
194int\r
195main (\r
196 int argc,\r
197 char*argv[]\r
198 )\r
199/*++\r
200\r
201Routine Description:\r
202\r
203 GC_TODO: Add function description\r
204\r
205Arguments:\r
206\r
207 argc - GC_TODO: add argument description\r
208 ] - GC_TODO: add argument description\r
209\r
210Returns:\r
211\r
212 GC_TODO: add return values\r
213\r
214--*/\r
215{\r
216 EFI_STATUS Status = EFI_SUCCESS;\r
217 FILE *In;\r
218 CHAR8 *InputFileName = NULL;\r
219 CHAR8 *OutputDir = NULL;\r
220 CHAR8 *OutFileName1 = NULL;\r
221 CHAR8 *OutFileName2 = NULL;\r
222 UINT64 SplitValue = -1;\r
223 FILE *Out1;\r
224 FILE *Out2;\r
225 CHAR8 *OutName1 = NULL;\r
226 CHAR8 *OutName2 = NULL;\r
227 CHAR8 *CurrentDir = NULL;\r
228 UINT64 Index;\r
229 CHAR8 CharC;\r
230 BOOLEAN QuietFlag = TRUE;\r
231 UINT64 DebugLevel = 0;\r
232 UINT64 VerboseLevel = 0;\r
233\r
234 SetUtilityName(UTILITY_NAME);\r
235 if (argc == 1) {\r
236 Usage();\r
237 return STATUS_ERROR;\r
238 }\r
239\r
240 argc --;\r
241 argv ++;\r
242\r
243 if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
244 Usage();\r
245 return STATUS_SUCCESS;\r
246 }\r
247\r
248 if (stricmp (argv[0], "--version") == 0) {\r
249 Version();\r
250 return STATUS_SUCCESS;\r
251 }\r
252\r
253 while (argc > 0) {\r
254 if ((stricmp (argv[0], "-p") == 0) || (stricmp (argv[0], "--prefix") == 0)) {\r
255 OutputDir = argv[1];\r
256 if (OutputDir == NULL) {\r
257 Warning (NULL, 0, 0, "NO output directory specified.", NULL);\r
258 return STATUS_ERROR;\r
259 }\r
260 argc -= 2;\r
261 argv += 2;\r
262 continue;\r
263 }\r
264\r
265 if ((stricmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--filename") == 0)) {\r
266 InputFileName = argv[1];\r
267 if (InputFileName == NULL) {\r
268 Error (NULL, 0, 0x1001, "NO Input file specified.", NULL);\r
269 return STATUS_ERROR;\r
270 }\r
271 argc -= 2;\r
272 argv += 2;\r
273 continue;\r
274 }\r
275\r
276 if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--split") == 0)) {\r
277 Status = GetSplitValue(argv[1], &SplitValue);\r
278 if (EFI_ERROR (Status)) {\r
279 Error (NULL, 0, 0x1003, "Input split value is not one valid integer.", NULL);\r
280 return STATUS_ERROR;\r
281 }\r
282 argc -= 2;\r
283 argv += 2;\r
284 continue;\r
285 }\r
286\r
287 if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--firstfile") == 0)) {\r
288 OutFileName1 = argv[1];\r
289 if (OutFileName1 == NULL) {\r
290 Warning (NULL, 0, 0, NULL, "No output file1 specified.");\r
291 }\r
292 argc -= 2;\r
293 argv += 2;\r
294 continue;\r
295 }\r
296\r
297 if ((stricmp (argv[0], "-t") == 0) || (stricmp (argv[0], "--secondfile") == 0)) {\r
298 OutFileName2 = argv[1];\r
299 if (OutFileName2 == NULL) {\r
300 Warning (NULL, 0, 0, NULL, "No output file2 specified.");\r
301 }\r
302 argc -= 2;\r
303 argv += 2;\r
304 continue;\r
305 }\r
306\r
307 if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
308 QuietFlag = TRUE;\r
309 argc --;\r
310 argv ++;\r
311 continue;\r
312 }\r
313\r
314 if ((strlen(argv[0]) >= 2 && argv[0][0] == '-' && (argv[0][1] == 'v' || argv[0][1] == 'V')) || (stricmp (argv[0], "--verbose") == 0)) {\r
315 VerboseLevel = 1;\r
316 if (strlen(argv[0]) > 2) {\r
317 Status = CountVerboseLevel (&argv[0][2], strlen(argv[0]) - 2, &VerboseLevel);\r
318 if (EFI_ERROR (Status)) {\r
319 Error (NULL, 0, 0x1003, NULL, "%s is invaild paramter!", argv[0]);\r
320 return STATUS_ERROR;\r
321 }\r
322 }\r
323\r
324 argc --;\r
325 argv ++;\r
326 continue;\r
327 }\r
328\r
329 if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) {\r
330 Status = AsciiStringToUint64 (argv[1], FALSE, &DebugLevel);\r
331 if (EFI_ERROR (Status)) {\r
332 Error (NULL, 0, 0x1003, "Input debug level is not one valid integrator.", NULL);\r
333 return STATUS_ERROR;\r
334 }\r
335 argc -= 2;\r
336 argv += 2;\r
337 continue;\r
338 }\r
339 //\r
340 // Don't recognize the paramter.\r
341 //\r
342 Error (NULL, 0, 0x1003, NULL, "%s is invaild paramter!", argv[0]);\r
343 return STATUS_ERROR;\r
344 }\r
345\r
346 if (InputFileName == NULL) {\r
347 Error (NULL, 0, 0x1001, "NO Input file specified.", NULL);\r
348 return STATUS_ERROR;\r
349 }\r
350\r
351 In = fopen (InputFileName, "rb");\r
352 if (In == NULL) {\r
353 // ("Unable to open file \"%s\"\n", InputFileName);\r
354 Error (InputFileName, 0, 1, "File open failure", NULL);\r
355 return STATUS_ERROR;\r
356 }\r
357\r
358 if (OutFileName1 == NULL) {\r
359 OutName1 = (CHAR8*)malloc(strlen(InputFileName) + 16);\r
360 if (OutName1 == NULL) {\r
361 Warning (NULL, 0, 0, NULL, "Memory Allocation Fail.");\r
362 return STATUS_ERROR;\r
363 }\r
364 strcpy (OutName1, InputFileName);\r
365 strcat (OutName1, "1");\r
366 OutFileName1 = OutName1;\r
367\r
368 }\r
369 if (OutFileName2 == NULL) {\r
370 OutName2 = (CHAR8*)malloc(strlen(InputFileName) + 16);\r
371 if (OutName2 == NULL) {\r
372 Warning (NULL, 0, 0, NULL, "Memory Allocation Fail.");\r
373 return STATUS_ERROR;\r
374 }\r
375 strcpy (OutName2, InputFileName);\r
376 strcat (OutName2, "2");\r
377 OutFileName2 = OutName2;\r
378\r
379 }\r
380\r
381 if (OutputDir != NULL) {\r
382 //OutputDirSpecified = TRUE;\r
383 if (chdir(OutputDir) != 0) {\r
384 Warning (NULL, 0, 0, NULL, "Change dir to OutputDir Fail.");\r
385 return STATUS_ERROR;\r
386 }\r
387 }\r
388\r
389 CurrentDir = (CHAR8*)getcwd((CHAR8*)0, 0);\r
390 if (EFI_ERROR(CreateDir(&OutFileName1))) {\r
391 Error (OutFileName1, 0, 5, "Create Dir for File1 Fail.", NULL);\r
392 return STATUS_ERROR;\r
393 }\r
394 chdir(CurrentDir);\r
395\r
396 if (EFI_ERROR(CreateDir(&OutFileName2))) {\r
397 Error (OutFileName2, 0, 5, "Create Dir for File2 Fail.", NULL);\r
398 return STATUS_ERROR;\r
399 }\r
400 chdir(CurrentDir);\r
401 free(CurrentDir);\r
402\r
403 Out1 = fopen (OutFileName1, "wb");\r
404 if (Out1 == NULL) {\r
405 // ("Unable to open file \"%s\"\n", OutFileName1);\r
406 Error (OutFileName1, 0, 1, "File open failure", NULL);\r
407 return STATUS_ERROR;\r
408 }\r
409\r
410 Out2 = fopen (OutFileName2, "wb");\r
411 if (Out2 == NULL) {\r
412 // ("Unable to open file \"%s\"\n", OutFileName2);\r
413 Error (OutFileName2, 0, 1, "File open failure", NULL);\r
414 return STATUS_ERROR;\r
415 }\r
416\r
417 for (Index = 0; Index < SplitValue; Index++) {\r
418 CharC = (CHAR8) fgetc (In);\r
419 if (feof (In)) {\r
420 break;\r
421 }\r
422\r
423 fputc (CharC, Out1);\r
424 }\r
425\r
426 for (;;) {\r
427 CharC = (CHAR8) fgetc (In);\r
428 if (feof (In)) {\r
429 break;\r
430 }\r
431\r
432 fputc (CharC, Out2);\r
433 }\r
434\r
435 if (OutName1 != NULL) {\r
436 free(OutName1);\r
437 }\r
438 if (OutName2 != NULL) {\r
439 free(OutName2);\r
440 }\r
441 fclose (In);\r
442 fclose (Out1);\r
443 fclose (Out2);\r
444\r
445 return STATUS_SUCCESS;\r
446}\r