]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/C/Split/Split.c
BaseTools: Change source files to DOS format.
[mirror_edk2.git] / BaseTools / Source / C / Split / Split.c
... / ...
CommitLineData
1/** @file\r
2\r
3 Split a file into two pieces at the request offset.\r
4\r
5Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>\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#else\r
23#include <direct.h>\r
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
37#define UTILITY_MAJOR_VERSION 1\r
38#define UTILITY_MINOR_VERSION 0\r
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
60 printf ("%s Version %d.%d Build %s\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);\r
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
83 printf ("Copyright (c) 1999-2016 Intel Corporation. All rights reserved.\n");\r
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
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
106 UINT64 len = strlen(SplitValueString);\r
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
113 if (len == 0) {\r
114 return EFI_ABORTED;\r
115 }\r
116\r
117 Status = AsciiStringToUint64 (SplitValueString, FALSE, ReturnValue);\r
118 if (!EFI_ERROR (Status)) {\r
119 return Status;\r
120 }\r
121\r
122 if (SplitValueString[0] == '0' && (SplitValueString[1] == 'x' || SplitValueString[1] == 'X')) {\r
123 Status = AsciiStringToUint64 (SplitValueString, TRUE, ReturnValue);\r
124 if (!EFI_ERROR (Status)) {\r
125 return Status;\r
126 }\r
127 }\r
128\r
129 lastCHAR = (CHAR8)toupper((int)SplitValueString[len - 1]);\r
130\r
131 if (lastCHAR != 'K' && lastCHAR != 'M' && lastCHAR != 'G') {\r
132 return STATUS_ERROR;\r
133 }\r
134\r
135 for (;index < len - 1; ++index) {\r
136 if (!isdigit((int)SplitValueString[index])) {\r
137 return EFI_ABORTED;\r
138 }\r
139 }\r
140\r
141 number = atol (SplitValueString);\r
142 if (lastCHAR == 'K')\r
143 base = 1024;\r
144 else if (lastCHAR == 'M')\r
145 base = 1024*1024;\r
146 else\r
147 base = 1024*1024*1024;\r
148\r
149 *ReturnValue = number*base;\r
150\r
151 return EFI_SUCCESS;\r
152}\r
153\r
154EFI_STATUS\r
155CountVerboseLevel (\r
156 IN CONST CHAR8* VerboseLevelString,\r
157 IN CONST UINT64 Length,\r
158 OUT UINT64 *ReturnValue\r
159)\r
160{\r
161 UINT64 i = 0;\r
162 for (;i < Length; ++i) {\r
163 if (VerboseLevelString[i] != 'v' && VerboseLevelString[i] != 'V') {\r
164 return EFI_ABORTED;\r
165 }\r
166 ++(*ReturnValue);\r
167 }\r
168\r
169 return EFI_SUCCESS;\r
170}\r
171\r
172EFI_STATUS\r
173CreateDir (\r
174 IN OUT CHAR8** FullFileName\r
175)\r
176{\r
177 CHAR8* temp = *FullFileName;\r
178 CHAR8* start = temp;\r
179 CHAR8 tempchar;\r
180 UINT64 index = 0;\r
181\r
182 for (;index < strlen(temp); ++index) {\r
183 if (temp[index] == '\\' || temp[index] == '/') {\r
184 if (temp[index + 1] != '\0') {\r
185 tempchar = temp[index + 1];\r
186 temp[index + 1] = 0;\r
187 if (chdir(start)) {\r
188 if (mkdir(start, S_IRWXU | S_IRWXG | S_IRWXO) != 0) {\r
189 return EFI_ABORTED;\r
190 }\r
191 chdir(start);\r
192 }\r
193 start = temp + index + 1;\r
194 temp[index] = '/';\r
195 temp[index + 1] = tempchar;\r
196 }\r
197 }\r
198 }\r
199\r
200 return EFI_SUCCESS;\r
201}\r
202\r
203int\r
204main (\r
205 int argc,\r
206 char*argv[]\r
207 )\r
208/*++\r
209\r
210Routine Description:\r
211\r
212 GC_TODO: Add function description\r
213\r
214Arguments:\r
215\r
216 argc - GC_TODO: add argument description\r
217 ] - GC_TODO: add argument description\r
218\r
219Returns:\r
220\r
221 GC_TODO: add return values\r
222\r
223--*/\r
224{\r
225 EFI_STATUS Status = EFI_SUCCESS;\r
226 FILE *In;\r
227 CHAR8 *InputFileName = NULL;\r
228 CHAR8 *OutputDir = NULL;\r
229 CHAR8 *OutFileName1 = NULL;\r
230 CHAR8 *OutFileName2 = NULL;\r
231 UINT64 SplitValue = (UINT64) -1;\r
232 FILE *Out1;\r
233 FILE *Out2;\r
234 CHAR8 *OutName1 = NULL;\r
235 CHAR8 *OutName2 = NULL;\r
236 CHAR8 *CurrentDir = NULL;\r
237 UINT64 Index;\r
238 CHAR8 CharC;\r
239 UINT64 DebugLevel = 0;\r
240 UINT64 VerboseLevel = 0;\r
241\r
242 SetUtilityName(UTILITY_NAME);\r
243 if (argc == 1) {\r
244 Usage();\r
245 return STATUS_ERROR;\r
246 }\r
247\r
248 argc --;\r
249 argv ++;\r
250\r
251 if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {\r
252 Usage();\r
253 return STATUS_SUCCESS;\r
254 }\r
255\r
256 if (stricmp (argv[0], "--version") == 0) {\r
257 Version();\r
258 return STATUS_SUCCESS;\r
259 }\r
260\r
261 while (argc > 0) {\r
262 if ((stricmp (argv[0], "-p") == 0) || (stricmp (argv[0], "--prefix") == 0)) {\r
263 OutputDir = argv[1];\r
264 if (OutputDir == NULL) {\r
265 Warning (NULL, 0, 0, "NO output directory specified.", NULL);\r
266 return STATUS_ERROR;\r
267 }\r
268 argc -= 2;\r
269 argv += 2;\r
270 continue;\r
271 }\r
272\r
273 if ((stricmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--filename") == 0)) {\r
274 InputFileName = argv[1];\r
275 if (InputFileName == NULL) {\r
276 Error (NULL, 0, 0x1001, "NO Input file specified.", NULL);\r
277 return STATUS_ERROR;\r
278 }\r
279 argc -= 2;\r
280 argv += 2;\r
281 continue;\r
282 }\r
283\r
284 if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--split") == 0)) {\r
285 Status = GetSplitValue(argv[1], &SplitValue);\r
286 if (EFI_ERROR (Status)) {\r
287 Error (NULL, 0, 0x1003, "Input split value is not one valid integer.", NULL);\r
288 return STATUS_ERROR;\r
289 }\r
290 argc -= 2;\r
291 argv += 2;\r
292 continue;\r
293 }\r
294\r
295 if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--firstfile") == 0)) {\r
296 OutFileName1 = argv[1];\r
297 if (OutFileName1 == NULL) {\r
298 Warning (NULL, 0, 0, NULL, "No output file1 specified.");\r
299 }\r
300 argc -= 2;\r
301 argv += 2;\r
302 continue;\r
303 }\r
304\r
305 if ((stricmp (argv[0], "-t") == 0) || (stricmp (argv[0], "--secondfile") == 0)) {\r
306 OutFileName2 = argv[1];\r
307 if (OutFileName2 == NULL) {\r
308 Warning (NULL, 0, 0, NULL, "No output file2 specified.");\r
309 }\r
310 argc -= 2;\r
311 argv += 2;\r
312 continue;\r
313 }\r
314\r
315 if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {\r
316 argc --;\r
317 argv ++;\r
318 continue;\r
319 }\r
320\r
321 if ((strlen(argv[0]) >= 2 && argv[0][0] == '-' && (argv[0][1] == 'v' || argv[0][1] == 'V')) || (stricmp (argv[0], "--verbose") == 0)) {\r
322 VerboseLevel = 1;\r
323 if (strlen(argv[0]) > 2) {\r
324 Status = CountVerboseLevel (&argv[0][2], strlen(argv[0]) - 2, &VerboseLevel);\r
325 if (EFI_ERROR (Status)) {\r
326 Error (NULL, 0, 0x1003, NULL, "%s is invaild paramter!", argv[0]);\r
327 return STATUS_ERROR;\r
328 }\r
329 }\r
330\r
331 argc --;\r
332 argv ++;\r
333 continue;\r
334 }\r
335\r
336 if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) {\r
337 Status = AsciiStringToUint64 (argv[1], FALSE, &DebugLevel);\r
338 if (EFI_ERROR (Status)) {\r
339 Error (NULL, 0, 0x1003, "Input debug level is not one valid integrator.", NULL);\r
340 return STATUS_ERROR;\r
341 }\r
342 argc -= 2;\r
343 argv += 2;\r
344 continue;\r
345 }\r
346 //\r
347 // Don't recognize the paramter.\r
348 //\r
349 Error (NULL, 0, 0x1003, NULL, "%s is invaild paramter!", argv[0]);\r
350 return STATUS_ERROR;\r
351 }\r
352\r
353 if (InputFileName == NULL) {\r
354 Error (NULL, 0, 0x1001, "NO Input file specified.", NULL);\r
355 return STATUS_ERROR;\r
356 }\r
357\r
358 In = fopen (LongFilePath (InputFileName), "rb");\r
359 if (In == NULL) {\r
360 // ("Unable to open file \"%s\"\n", InputFileName);\r
361 Error (InputFileName, 0, 1, "File open failure", NULL);\r
362 return STATUS_ERROR;\r
363 }\r
364\r
365 if (OutFileName1 == NULL) {\r
366 OutName1 = (CHAR8*)malloc(strlen(InputFileName) + 16);\r
367 if (OutName1 == NULL) {\r
368 Warning (NULL, 0, 0, NULL, "Memory Allocation Fail.");\r
369 return STATUS_ERROR;\r
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
380 return STATUS_ERROR;\r
381 }\r
382 strcpy (OutName2, InputFileName);\r
383 strcat (OutName2, "2");\r
384 OutFileName2 = OutName2;\r
385\r
386 }\r
387\r
388 if (OutputDir != NULL) {\r
389 //OutputDirSpecified = TRUE;\r
390 if (chdir(OutputDir) != 0) {\r
391 Warning (NULL, 0, 0, NULL, "Change dir to OutputDir Fail.");\r
392 return STATUS_ERROR;\r
393 }\r
394 }\r
395\r
396 CurrentDir = (CHAR8*)getcwd((CHAR8*)0, 0);\r
397 if (EFI_ERROR(CreateDir(&OutFileName1))) {\r
398 Error (OutFileName1, 0, 5, "Create Dir for File1 Fail.", NULL);\r
399 return STATUS_ERROR;\r
400 }\r
401 chdir(CurrentDir);\r
402\r
403 if (EFI_ERROR(CreateDir(&OutFileName2))) {\r
404 Error (OutFileName2, 0, 5, "Create Dir for File2 Fail.", NULL);\r
405 return STATUS_ERROR;\r
406 }\r
407 chdir(CurrentDir);\r
408 free(CurrentDir);\r
409\r
410 Out1 = fopen (LongFilePath (OutFileName1), "wb");\r
411 if (Out1 == NULL) {\r
412 // ("Unable to open file \"%s\"\n", OutFileName1);\r
413 Error (OutFileName1, 0, 1, "File open failure", NULL);\r
414 return STATUS_ERROR;\r
415 }\r
416\r
417 Out2 = fopen (LongFilePath (OutFileName2), "wb");\r
418 if (Out2 == NULL) {\r
419 // ("Unable to open file \"%s\"\n", OutFileName2);\r
420 Error (OutFileName2, 0, 1, "File open failure", NULL);\r
421 return STATUS_ERROR;\r
422 }\r
423\r
424 for (Index = 0; Index < SplitValue; Index++) {\r
425 CharC = (CHAR8) fgetc (In);\r
426 if (feof (In)) {\r
427 break;\r
428 }\r
429\r
430 fputc (CharC, Out1);\r
431 }\r
432\r
433 for (;;) {\r
434 CharC = (CHAR8) fgetc (In);\r
435 if (feof (In)) {\r
436 break;\r
437 }\r
438\r
439 fputc (CharC, Out2);\r
440 }\r
441\r
442 if (OutName1 != NULL) {\r
443 free(OutName1);\r
444 }\r
445 if (OutName2 != NULL) {\r
446 free(OutName2);\r
447 }\r
448 fclose (In);\r
449 fclose (Out1);\r
450 fclose (Out2);\r
451\r
452 return STATUS_SUCCESS;\r
453}\r