modified BaseTools/Source/C/Common/CommonLib.c
authorjljusten <jljusten@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 30 Nov 2007 00:43:55 +0000 (00:43 +0000)
committerjljusten <jljusten@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 30 Nov 2007 00:43:55 +0000 (00:43 +0000)
modified   BaseTools/Source/C/Common/CommonLib.h
modified   BaseTools/Source/C/Common/GNUmakefile
modified   BaseTools/Source/C/Common/Makefile
added      BaseTools/Source/C/Common/OsPath.c
added      BaseTools/Source/C/Common/OsPath.h
  Moved function: DoesFileExist to OsPath.c and renamed to OsPathExists
  Added OsPath.c/OsPath.h for functions related to filename paths.

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@893 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/Common/CommonLib.c
Source/C/Common/CommonLib.h
Source/C/Common/GNUmakefile
Source/C/Common/Makefile
Source/C/Common/OsPath.c [new file with mode: 0644]
Source/C/Common/OsPath.h [new file with mode: 0644]

index 45f20f1..f50104c 100644 (file)
@@ -151,38 +151,6 @@ Returns:
 }\r
 \r
 \r
-BOOLEAN\r
-DoesFileExist (\r
-  IN CHAR8    *InputFileName\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Checks if a file exists\r
-\r
-Arguments:\r
-\r
-  InputFileName     The name of the file to check for existence\r
-\r
-Returns:\r
-\r
-  TRUE              The file exists\r
-  FALSE             The file does not exist\r
-\r
---*/\r
-{\r
-  FILE    *InputFile;\r
-  InputFile = fopen (InputFileName, "rb");\r
-  if (InputFile == NULL) {\r
-    return FALSE;\r
-  } else {\r
-    fclose (InputFile);\r
-    return TRUE;\r
-  }\r
-}\r
-\r
-\r
 EFI_STATUS\r
 GetFileImage (\r
   IN CHAR8    *InputFileName,\r
index 12f917f..9f43ce8 100644 (file)
@@ -64,12 +64,6 @@ CompareGuid (
   )\r
 ;\r
 \r
-BOOLEAN\r
-DoesFileExist (\r
-  IN CHAR8    *InputFileName\r
-  )\r
-;\r
-\r
 EFI_STATUS\r
 GetFileImage (\r
   IN CHAR8    *InputFileName,\r
index ee10066..ebaafbf 100644 (file)
@@ -15,6 +15,7 @@ OBJECTS = \
   FvLib.o \
   MemoryFile.o \
   MyAlloc.o \
+  OsPath.obj \
   ParseGuidedSectionTools.o \
   ParseInf.o \
   PeCoffLoaderEx.o \
index 7165999..839f4c9 100644 (file)
@@ -14,6 +14,7 @@ OBJECTS = \
   FvLib.obj \\r
   MemoryFile.obj \\r
   MyAlloc.obj \\r
+  OsPath.obj \\r
   ParseGuidedSectionTools.obj \\r
   ParseInf.obj \\r
   PeCoffLoaderEx.obj \\r
diff --git a/Source/C/Common/OsPath.c b/Source/C/Common/OsPath.c
new file mode 100644 (file)
index 0000000..0e3f105
--- /dev/null
@@ -0,0 +1,305 @@
+/*++\r
+\r
+Copyright (c) 2007, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  StringFuncs.c\r
+\r
+Abstract:\r
+\r
+  Header file for helper functions useful for accessing files.\r
+\r
+--*/\r
+\r
+#include <stdio.h>\r
+#include "OsPath.h"\r
+\r
+//\r
+// Functions implementations\r
+//\r
+\r
+#if 0\r
+  //\r
+  // BUGBUG: Not fully implemented yet.\r
+  //\r
+CHAR8*\r
+OsPathDirName (\r
+  IN CHAR8    *FilePath\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function returns the directory path which contains the particular path.\r
+  Some examples:\r
+    "a/b/c"  -> "a/b"\r
+    "a/b/c/" -> "a/b"\r
+    "a"      -> "."\r
+    "."      -> ".."\r
+    "/"      -> NULL\r
+\r
+  This function does not check for the existence of the file.\r
+\r
+  The caller must free the string returned.\r
+\r
+Arguments:\r
+\r
+  FilePath     Path name of file to get the parent directory for.\r
+\r
+Returns:\r
+\r
+  NULL if error\r
+\r
+--*/\r
+{\r
+  CHAR8 *Return;\r
+  CHAR8 *Pos;\r
+  CHAR8 Char;\r
+  UINTN Length;\r
+  INTN  Offset;\r
+\r
+  Length = strlen (FilePath);\r
+\r
+  if (Length == 0) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Check for the root directory case\r
+  //\r
+  if (\r
+    (Length == 3 && isalpha (FilePath[0]) && (strcmp(FilePath + 1, ":\\") == 0)) ||\r
+    (strcmp(FilePath, "/") == 0)\r
+    ) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // If the path ends with a path separator, then just append ".."\r
+  //\r
+  Char = FilePath[Length - 1];\r
+  if (Char == '/' || Char == '\\') {\r
+    return OsPathJoin (FilePath, "..");\r
+  }\r
+\r
+  //\r
+  // \r
+  //\r
+  for (Offset = Length; Offset > 0; Offset--) {\r
+    if ((Return[Offset] == '/') || (Return[Offset] == '\\')) {\r
+      Return[Offset] = '\0';\r
+      return Return;\r
+    }\r
+  }\r
+}\r
+#endif\r
+\r
+\r
+#if 0\r
+  //\r
+  // BUGBUG: Not fully implemented yet.\r
+  //\r
+VOID\r
+OsPathNormPathInPlace (\r
+  IN CHAR8    *Path\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function returns the directory path which contains the particular path.\r
+  Some examples:\r
+    "a/b/../c" -> "a/c"\r
+    "a/b//c"   -> "a/b/c"\r
+    "a/./b"    -> "a/b"\r
+\r
+  This function does not check for the existence of the file.\r
+\r
+Arguments:\r
+\r
+  Path     Path name of file to normalize\r
+\r
+Returns:\r
+\r
+  The string is altered in place.\r
+\r
+--*/\r
+{\r
+  CHAR8   *Pos;\r
+  INTN    Offset;\r
+  BOOLEAN TryAgain;\r
+  UINTN   Length;\r
+  UINTN   Remaining;\r
+  UINTN   SubLength;\r
+\r
+  do {\r
+    TryAgain = FALSE;\r
+    Length = strlen (Path);\r
+\r
+    for (Offset = 0; Offset < Length; Offset++) {\r
+      Remaining = Length - Offset;\r
+\r
+      //\r
+      // Collapse '//' -> '/'\r
+      //\r
+      if (\r
+          (Remaining >= 2) &&\r
+          ((Offset > 0) || (Path[0] != '\\')) &&\r
+          IsDirSep (Path[Offset]) && IsDirSep (Path[Offset + 1])\r
+         ) {\r
+        memmove (&Path[Offset], &Path[Offset + 1], Remaining);\r
+        TryAgain = TRUE;\r
+        break;\r
+      }\r
+\r
+      //\r
+      // Collapse '/./' -> '/'\r
+      //\r
+      if ((Remaining >= 3) && IsDirSep (Path[Offset]) &&\r
+           (Path[Offset + 1] == '.') && IsDirSep (Path[Offset + 2])\r
+         ) {\r
+        memmove (&Path[Offset], &Path[Offset + 1], Remaining);\r
+        TryAgain = TRUE;\r
+        break;\r
+      }\r
+\r
+      //\r
+      // Collapse 'a/../b' -> 'b'\r
+      //\r
+      // BUGBUG: Not implemented yet\r
+\r
+    }\r
+\r
+  } while (TryAgain);\r
+\r
+  Return = CloneString (FilePath);\r
+  if (Return == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  Length = strlen (Return);\r
+\r
+  //\r
+  // Check for the root directory case\r
+  //\r
+  if (\r
+    (Length == 3 && isalpha (Return[0]) && (strcmp(Return + 1, ":\\") == 0)) ||\r
+    (strcmp(Return, "/") == 0)\r
+    ) {\r
+    free (Return);\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // \r
+  //\r
+  for (Offset = Length; Offset > 0; Offset--) {\r
+    if ((Return[Offset] == '/') || (Return[Offset] == '\\')) {\r
+      Return[Offset] = '\0';\r
+      return Return;\r
+    }\r
+  }\r
+}\r
+#endif\r
+\r
+\r
+CHAR8*\r
+OsPathPeerFilePath (\r
+  IN CHAR8    *OldPath,\r
+  IN CHAR8    *Peer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function replaces the final portion of a path with an alternative\r
+  'peer' filename.  For example:\r
+    "a/b/../c", "peer" -> "a/b/../peer"\r
+    "a/b/", "peer"     -> "a/b/peer"\r
+    "/a", "peer"       -> "/peer"\r
+    "a", "peer"        -> "peer"\r
+\r
+  This function does not check for the existence of the file.\r
+\r
+Arguments:\r
+\r
+  OldPath     Path name of replace the final segment\r
+  Peer        The new path name to concatinate to become the peer path\r
+\r
+Returns:\r
+\r
+  A CHAR8* string, which must be freed by the caller\r
+\r
+--*/\r
+{\r
+  CHAR8 *Result;\r
+  CHAR8 *Ptr;\r
+  INTN    Offset;\r
+\r
+  Result = malloc (strlen (OldPath) + strlen (Peer) + 1);\r
+  if (Result == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  strcpy (Result, OldPath);\r
+\r
+  //\r
+  // Search for the last '/' or '\' in the string.  If found, replace\r
+  // everything following it with Peer\r
+  //\r
+  for (Offset = strlen (Result); Offset >= 0; Offset--) {\r
+    if ((Result[Offset] == '/') || (Result[Offset] == '\\')) {\r
+      Result[Offset + 1] = '\0';\r
+      strcat (Result, Peer);\r
+      return Result;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Neither a '/' nor a '\' was found.  Therefore, we simply return Peer.\r
+  //\r
+  strcpy (Result, Peer);\r
+  return Result;\r
+}\r
+\r
+\r
+BOOLEAN\r
+OsPathExists (\r
+  IN CHAR8    *InputFileName\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Checks if a file exists\r
+\r
+Arguments:\r
+\r
+  InputFileName     The name of the file to check for existence\r
+\r
+Returns:\r
+\r
+  TRUE              The file exists\r
+  FALSE             The file does not exist\r
+\r
+--*/\r
+{\r
+  FILE    *InputFile;\r
+  InputFile = fopen (InputFileName, "rb");\r
+  if (InputFile == NULL) {\r
+    return FALSE;\r
+  } else {\r
+    fclose (InputFile);\r
+    return TRUE;\r
+  }\r
+}\r
+\r
+\r
diff --git a/Source/C/Common/OsPath.h b/Source/C/Common/OsPath.h
new file mode 100644 (file)
index 0000000..894c57c
--- /dev/null
@@ -0,0 +1,145 @@
+/*++\r
+\r
+Copyright (c) 2007, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  OsPath.h\r
+\r
+Abstract:\r
+\r
+  Header file for helper functions useful for parsing INF files.\r
+\r
+--*/\r
+\r
+#ifndef _EFI_OS_PATH_H\r
+#define _EFI_OS_PATH_H\r
+\r
+#include <Common/UefiBaseTypes.h>\r
+\r
+//\r
+// Functions declarations\r
+//\r
+\r
+CHAR8*\r
+OsPathDirName (\r
+  IN CHAR8    *FilePath\r
+  )\r
+;\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function returns the directory path which contains the particular path.\r
+  Some examples:\r
+    "a/b/c"  -> "a/b"\r
+    "a/b/c/" -> "a/b"\r
+    "a"      -> "."\r
+    "."      -> ".."\r
+    "/"      -> NULL\r
+\r
+  This function does not check for the existence of the file.\r
+\r
+  The caller must free the string returned.\r
+\r
+Arguments:\r
+\r
+  FilePath     Path name of file to get the parent directory for.\r
+\r
+Returns:\r
+\r
+  NULL if error\r
+\r
+--*/\r
+\r
+\r
+VOID\r
+OsPathNormPathInPlace (\r
+  IN CHAR8    *Path\r
+  )\r
+;\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function returns the directory path which contains the particular path.\r
+  Some examples:\r
+    "a/b/../c" -> "a/c"\r
+    "a/b//c"   -> "a/b/c"\r
+    "a/./b"    -> "a/b"\r
+\r
+  This function does not check for the existence of the file.\r
+\r
+Arguments:\r
+\r
+  Path     Path name of file to normalize\r
+\r
+Returns:\r
+\r
+  The string is altered in place.\r
+\r
+--*/\r
+\r
+\r
+CHAR8*\r
+OsPathPeerFilePath (\r
+  IN CHAR8    *OldPath,\r
+  IN CHAR8    *Peer\r
+  )\r
+;\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function replaces the final portion of a path with an alternative\r
+  'peer' filename.  For example:\r
+    "a/b/../c", "peer" -> "a/b/../peer"\r
+    "a/b/", "peer"     -> "a/b/peer"\r
+    "/a", "peer"       -> "/peer"\r
+    "a", "peer"        -> "peer"\r
+\r
+  This function does not check for the existence of the file.\r
+\r
+Arguments:\r
+\r
+  OldPath     Path name of replace the final segment\r
+  Peer        The new path name to concatinate to become the peer path\r
+\r
+Returns:\r
+\r
+  A CHAR8* string, which must be freed by the caller\r
+\r
+--*/\r
+\r
+\r
+BOOLEAN\r
+OsPathExists (\r
+  IN CHAR8    *InputFileName\r
+  )\r
+;\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Checks if a file exists\r
+\r
+Arguments:\r
+\r
+  InputFileName     The name of the file to check for existence\r
+\r
+Returns:\r
+\r
+  TRUE              The file exists\r
+  FALSE             The file does not exist\r
+\r
+--*/\r
+\r
+\r
+#endif\r