]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/C/Split/Split.c
NetworkPkg: Use the New Functions from HttpLib
[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
fbf23381 5Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>
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
fbf23381 37#define UTILITY_MAJOR_VERSION 1
38#define UTILITY_MINOR_VERSION 0
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
fbf23381 60 printf ("%s Version %d.%d Build %s\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);
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
fbf23381 83 printf ("Copyright (c) 1999-2016 Intel Corporation. All rights reserved.\n");
84 printf ("\n SplitFile creates two Binary files either in the same directory as the current working\n");
85 printf (" directory or in the specified directory.\n");
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
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
a709adfa 129 lastCHAR = (CHAR8)toupper((int)SplitValueString[len - 1]);\r
30fdf114
LG
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
a709adfa 136 if (!isdigit((int)SplitValueString[index])) {\r
30fdf114
LG
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
79192440 179 CHAR8 tempchar;\r
30fdf114
LG
180 UINT64 index = 0;\r
181\r
182 for (;index < strlen(temp); ++index) {\r
183 if (temp[index] == '\\' || temp[index] == '/') {\r
79192440
YZ
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
30fdf114 192 }\r
79192440
YZ
193 start = temp + index + 1;\r
194 temp[index] = '/';\r
195 temp[index + 1] = tempchar;\r
196 }\r
30fdf114 197 }\r
30fdf114
LG
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
fd171542 231 UINT64 SplitValue = (UINT64) -1;\r
30fdf114
LG
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
30fdf114
LG
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
30fdf114
LG
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
1be2ed90 358 In = fopen (LongFilePath (InputFileName), "rb");\r
30fdf114
LG
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
1be2ed90 410 Out1 = fopen (LongFilePath (OutFileName1), "wb");\r
30fdf114
LG
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
1be2ed90 417 Out2 = fopen (LongFilePath (OutFileName2), "wb");\r
30fdf114
LG
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