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