3 Copyright (c) 1999-2007 Intel Corporation. All rights reserved
\r
4 This program and the accompanying materials are licensed and made available
\r
5 under the terms and conditions of the BSD License which accompanies this
\r
6 distribution. The full text of the license may be found at
\r
7 http://opensource.org/licenses/bsd-license.php
\r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
\r
14 // GC_TODO: fix comment to start with /*++
\r
18 #include "CommonLib.h"
\r
19 #include "EfiUtilityMsgs.h"
\r
23 #define UTILITY_NAME "Split"
\r
26 // Utility version information
\r
28 #define UTILITY_MAJOR_VERSION 0
\r
29 #define UTILITY_MINOR_VERSION 1
\r
37 Routine Description:
\r
39 Displays the standard utility information to SDTOUT
\r
51 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
52 printf ("Copyright (c) 1999-2007 Intel Corporation. All rights reserved.\n");
\r
61 Routine Description:
\r
63 GC_TODO: Add function description
\r
70 GC_TODO: add return values
\r
75 printf ("\nUsage: \n\
\r
77 -f, --filename inputFile to split\n\
\r
78 -s, --split VALUE the number of bytes in the first file\n\
\r
79 [-p, --prefix OutputDir]\n\
\r
80 [-o, --firstfile Filename1]\n\
\r
81 [-t, --secondfile Filename2]\n\
\r
84 [-q, --quiet disable all messages except fatal errors]\n\
\r
91 IN CONST CHAR8* SplitValueString,
\r
92 OUT UINT64 *ReturnValue
\r
95 UINT64 len = strlen(SplitValueString);
\r
100 EFI_STATUS Status = EFI_SUCCESS;
\r
103 return EFI_ABORTED;
\r
106 Status = AsciiStringToUint64 (SplitValueString, FALSE, ReturnValue);
\r
107 if (!EFI_ERROR (Status)) {
\r
111 if (SplitValueString[0] == '0' && (SplitValueString[1] == 'x' || SplitValueString[1] == 'X')) {
\r
112 Status = AsciiStringToUint64 (SplitValueString, TRUE, ReturnValue);
\r
113 if (!EFI_ERROR (Status)) {
\r
118 lastCHAR = (CHAR8)toupper(SplitValueString[len - 1]);
\r
120 if (lastCHAR != 'K' && lastCHAR != 'M' && lastCHAR != 'G') {
\r
121 return STATUS_ERROR;
\r
124 for (;index < len - 1; ++index) {
\r
125 if (!isdigit(SplitValueString[index])) {
\r
126 return EFI_ABORTED;
\r
130 number = atol (SplitValueString);
\r
131 if (lastCHAR == 'K')
\r
133 else if (lastCHAR == 'M')
\r
136 base = 1024*1024*1024;
\r
138 *ReturnValue = number*base;
\r
140 return EFI_SUCCESS;
\r
144 CountVerboseLevel (
\r
145 IN CONST CHAR8* VerboseLevelString,
\r
146 IN CONST UINT64 Length,
\r
147 OUT UINT64 *ReturnValue
\r
151 for (;i < Length; ++i) {
\r
152 if (VerboseLevelString[i] != 'v' && VerboseLevelString[i] != 'V') {
\r
153 return EFI_ABORTED;
\r
158 return EFI_SUCCESS;
\r
163 IN OUT CHAR8** FullFileName
\r
166 CHAR8* temp = *FullFileName;
\r
167 CHAR8* start = temp;
\r
170 for (;index < strlen(temp); ++index) {
\r
171 if (temp[index] == '\\' || temp[index] == '/') {
\r
173 if (chdir(start)) {
\r
174 if (mkdir(start, S_IRWXU | S_IRWXG | S_IRWXO) != 0) {
\r
175 return EFI_ABORTED;
\r
179 start = temp + index + 1;
\r
184 return EFI_SUCCESS;
\r
194 Routine Description:
\r
196 GC_TODO: Add function description
\r
200 argc - GC_TODO: add argument description
\r
201 ] - GC_TODO: add argument description
\r
205 GC_TODO: add return values
\r
209 EFI_STATUS Status = EFI_SUCCESS;
\r
211 CHAR8 *InputFileName = NULL;
\r
212 CHAR8 *OutputDir = NULL;
\r
213 CHAR8 *OutFileName1 = NULL;
\r
214 CHAR8 *OutFileName2 = NULL;
\r
215 UINT64 SplitValue = -1;
\r
218 CHAR8 *OutName1 = NULL;
\r
219 CHAR8 *OutName2 = NULL;
\r
220 CHAR8 *CurrentDir = NULL;
\r
222 BOOLEAN OutputDirSpecified = FALSE;
\r
224 BOOLEAN QuietFlag = TRUE;
\r
225 UINT64 DebugLevel = 0;
\r
226 UINT64 VerboseLevel = 0;
\r
228 SetUtilityName(UTILITY_NAME);
\r
231 return STATUS_ERROR;
\r
237 if ((stricmp (argv[0], "-h") == 0) || (stricmp (argv[0], "--help") == 0)) {
\r
239 return STATUS_SUCCESS;
\r
242 if (stricmp (argv[0], "--version") == 0) {
\r
244 return STATUS_SUCCESS;
\r
248 if ((stricmp (argv[0], "-p") == 0) || (stricmp (argv[0], "--prefix") == 0)) {
\r
249 OutputDir = argv[1];
\r
250 if (OutputDir == NULL) {
\r
251 Warning (NULL, 0, 0, "NO output directory specified.", NULL);
\r
252 return STATUS_ERROR;
\r
259 if ((stricmp (argv[0], "-f") == 0) || (stricmp (argv[0], "--filename") == 0)) {
\r
260 InputFileName = argv[1];
\r
261 if (InputFileName == NULL) {
\r
262 Error (NULL, 0, 0, "NO Input file specified.", NULL);
\r
263 return STATUS_ERROR;
\r
270 if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--split") == 0)) {
\r
271 Status = GetSplitValue(argv[1], &SplitValue);
\r
272 if (EFI_ERROR (Status)) {
\r
273 Error (NULL, 0, 0, "Input split value is not one valid integer.", NULL);
\r
274 return STATUS_ERROR;
\r
281 if ((stricmp (argv[0], "-o") == 0) || (stricmp (argv[0], "--firstfile") == 0)) {
\r
282 OutFileName1 = argv[1];
\r
283 if (OutFileName1 == NULL) {
\r
284 Warning (NULL, 0, 0, NULL, "No output file1 specified.");
\r
291 if ((stricmp (argv[0], "-t") == 0) || (stricmp (argv[0], "--secondfile") == 0)) {
\r
292 OutFileName2 = argv[1];
\r
293 if (OutFileName2 == NULL) {
\r
294 Warning (NULL, 0, 0, NULL, "No output file2 specified.");
\r
301 if ((stricmp (argv[0], "-q") == 0) || (stricmp (argv[0], "--quiet") == 0)) {
\r
308 if ((strlen(argv[0]) >= 2 && argv[0][0] == '-' && (argv[0][1] == 'v' || argv[0][1] == 'V')) || (stricmp (argv[0], "--verbose") == 0)) {
\r
310 if (strlen(argv[0]) > 2) {
\r
311 Status = CountVerboseLevel (&argv[0][2], strlen(argv[0]) - 2, &VerboseLevel);
\r
312 if (EFI_ERROR (Status)) {
\r
313 Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);
\r
314 return STATUS_ERROR;
\r
323 if ((stricmp (argv[0], "-d") == 0) || (stricmp (argv[0], "--debug") == 0)) {
\r
324 Status = AsciiStringToUint64 (argv[1], FALSE, &DebugLevel);
\r
325 if (EFI_ERROR (Status)) {
\r
326 Error (NULL, 0, 0, "Input debug level is not one valid integrator.", NULL);
\r
327 return STATUS_ERROR;
\r
334 // Don't recognize the paramter.
\r
336 Error (NULL, 0, 0, NULL, "%s is invaild paramter!", argv[0]);
\r
337 return STATUS_ERROR;
\r
340 if (InputFileName == NULL) {
\r
341 Error (NULL, 0, 0, "NO Input file specified.", NULL);
\r
342 return STATUS_ERROR;
\r
345 In = fopen (InputFileName, "rb");
\r
347 printf ("Unable to open file \"%s\"\n", InputFileName);
\r
348 return STATUS_ERROR;
\r
351 if (OutFileName1 == NULL) {
\r
352 OutName1 = (CHAR8*)malloc(strlen(InputFileName) + 16);
\r
353 if (OutName1 == NULL) {
\r
354 Warning (NULL, 0, 0, NULL, "Memory Allocation Fail.");
\r
355 return STATUS_ERROR;
\r
357 strcpy (OutName1, InputFileName);
\r
358 strcat (OutName1, "1");
\r
359 OutFileName1 = OutName1;
\r
362 if (OutFileName2 == NULL) {
\r
363 OutName2 = (CHAR8*)malloc(strlen(InputFileName) + 16);
\r
364 if (OutName2 == NULL) {
\r
365 Warning (NULL, 0, 0, NULL, "Memory Allocation Fail.");
\r
366 return STATUS_ERROR;
\r
368 strcpy (OutName2, InputFileName);
\r
369 strcat (OutName2, "2");
\r
370 OutFileName2 = OutName2;
\r
374 if (OutputDir != NULL) {
\r
375 //OutputDirSpecified = TRUE;
\r
376 if (chdir(OutputDir) != 0) {
\r
377 Warning (NULL, 0, 0, NULL, "Change dir to OutputDir Fail.");
\r
378 return STATUS_ERROR;
\r
382 CurrentDir = (CHAR8*)getcwd((CHAR8*)0, 0);
\r
383 if (EFI_ERROR(CreateDir(&OutFileName1))) {
\r
384 Error (NULL, 0, 0, "Create Dir for File1 Fail.", NULL);
\r
385 return STATUS_ERROR;
\r
389 if (EFI_ERROR(CreateDir(&OutFileName2))) {
\r
390 Error (NULL, 0, 0, "Create Dir for File2 Fail.", NULL);
\r
391 return STATUS_ERROR;
\r
396 Out1 = fopen (OutFileName1, "wb");
\r
397 if (Out1 == NULL) {
\r
398 printf ("Unable to open file \"%s\"\n", OutFileName1);
\r
399 return STATUS_ERROR;
\r
402 Out2 = fopen (OutFileName2, "wb");
\r
403 if (Out2 == NULL) {
\r
404 printf ("Unable to open file \"%s\"\n", OutFileName2);
\r
405 return STATUS_ERROR;
\r
408 for (Index = 0; Index < SplitValue; Index++) {
\r
409 CharC = (CHAR8) fgetc (In);
\r
414 fputc (CharC, Out1);
\r
418 CharC = (CHAR8) fgetc (In);
\r
423 fputc (CharC, Out2);
\r
426 if (OutName1 != NULL) {
\r
429 if (OutName2 != NULL) {
\r
436 return STATUS_SUCCESS;
\r