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