REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdeModulePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
		
			
				
	
	
		
			215 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Helper functions for mangling file names in UDF/ECMA-167 file systems.
 | 
						|
 | 
						|
  Copyright (C) 2014-2017 Paulo Alcantara <pcacjr@zytor.com>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
**/
 | 
						|
 | 
						|
#include "Udf.h"
 | 
						|
 | 
						|
/**
 | 
						|
  Trim the leading and trailing spaces for a give Unicode string.
 | 
						|
 | 
						|
  @param[in]  String              The Unicode string to trim.
 | 
						|
 | 
						|
  @return  A pointer to the trimmed string.
 | 
						|
 | 
						|
**/
 | 
						|
CHAR16 *
 | 
						|
TrimString (
 | 
						|
  IN CHAR16  *String
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16  *TempString;
 | 
						|
 | 
						|
  for ( ; *String != L'\0' && *String == L' '; String++) {
 | 
						|
  }
 | 
						|
 | 
						|
  TempString = String + StrLen (String) - 1;
 | 
						|
  while ((TempString >= String) && (*TempString == L' ')) {
 | 
						|
    TempString--;
 | 
						|
  }
 | 
						|
 | 
						|
  *(TempString + 1) = L'\0';
 | 
						|
 | 
						|
  return String;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Replace the content of a Unicode string with the content of another Unicode
 | 
						|
  string.
 | 
						|
 | 
						|
  @param[in]  Destination         A pointer to a Unicode string.
 | 
						|
  @param[in]  Source              A pointer to a Unicode string.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ReplaceLeft (
 | 
						|
  IN CHAR16        *Destination,
 | 
						|
  IN CONST CHAR16  *Source
 | 
						|
  )
 | 
						|
{
 | 
						|
  CONST CHAR16  *EndString;
 | 
						|
 | 
						|
  EndString = Source + StrLen (Source);
 | 
						|
  while (Source <= EndString) {
 | 
						|
    *Destination++ = *Source++;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Remove one or more consecutive backslashes starting from the second character
 | 
						|
  of a given Unicode string.
 | 
						|
 | 
						|
  @param[in]  String              A pointer to a Unicode string.
 | 
						|
 | 
						|
  @return  A pointer to the modified string.
 | 
						|
 | 
						|
**/
 | 
						|
CHAR16 *
 | 
						|
ExcludeTrailingBackslashes (
 | 
						|
  IN CHAR16  *String
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16  *TempString;
 | 
						|
 | 
						|
  switch (*(String + 1)) {
 | 
						|
    case L'\\':
 | 
						|
      break;
 | 
						|
    case L'\0':
 | 
						|
    default:
 | 
						|
      String++;
 | 
						|
      goto Exit;
 | 
						|
  }
 | 
						|
 | 
						|
  TempString = String;
 | 
						|
  while (*TempString != L'\0' && *TempString == L'\\') {
 | 
						|
    TempString++;
 | 
						|
  }
 | 
						|
 | 
						|
  if (TempString - 1 > String) {
 | 
						|
    ReplaceLeft (String + 1, TempString);
 | 
						|
  }
 | 
						|
 | 
						|
  String++;
 | 
						|
 | 
						|
Exit:
 | 
						|
  return String;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Mangle a filename by cutting off trailing whitespaces, "\\", "." and "..".
 | 
						|
 | 
						|
  @param[in] FileName Filename.
 | 
						|
 | 
						|
  @retval The mangled Filename.
 | 
						|
 | 
						|
**/
 | 
						|
CHAR16 *
 | 
						|
MangleFileName (
 | 
						|
  IN CHAR16  *FileName
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16  *FileNameSavedPointer;
 | 
						|
  CHAR16  *TempFileName;
 | 
						|
  UINTN   BackslashesNo;
 | 
						|
 | 
						|
  if ((FileName == NULL) || (*FileName == L'\0')) {
 | 
						|
    FileName = NULL;
 | 
						|
    goto Exit;
 | 
						|
  }
 | 
						|
 | 
						|
  FileName = TrimString (FileName);
 | 
						|
  if (*FileName == L'\0') {
 | 
						|
    goto Exit;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((StrLen (FileName) > 1) && (FileName[StrLen (FileName) - 1] == L'\\')) {
 | 
						|
    FileName[StrLen (FileName) - 1] = L'\0';
 | 
						|
  }
 | 
						|
 | 
						|
  FileNameSavedPointer = FileName;
 | 
						|
 | 
						|
  if (FileName[0] == L'.') {
 | 
						|
    if (FileName[1] == L'.') {
 | 
						|
      if (FileName[2] == L'\0') {
 | 
						|
        goto Exit;
 | 
						|
      } else {
 | 
						|
        FileName += 2;
 | 
						|
      }
 | 
						|
    } else if (FileName[1] == L'\0') {
 | 
						|
      goto Exit;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  while (*FileName != L'\0') {
 | 
						|
    if (*FileName == L'\\') {
 | 
						|
      FileName = ExcludeTrailingBackslashes (FileName);
 | 
						|
    } else if (*FileName == L'.') {
 | 
						|
      switch (*(FileName + 1)) {
 | 
						|
        case L'\0':
 | 
						|
          *FileName = L'\0';
 | 
						|
          break;
 | 
						|
        case L'\\':
 | 
						|
          TempFileName = FileName + 1;
 | 
						|
          TempFileName = ExcludeTrailingBackslashes (TempFileName);
 | 
						|
          ReplaceLeft (FileName, TempFileName);
 | 
						|
          break;
 | 
						|
        case '.':
 | 
						|
          if ((*(FileName - 1) != L'\\') && ((*(FileName + 2) != L'\\') ||
 | 
						|
                                             (*(FileName + 2) != L'\0')))
 | 
						|
          {
 | 
						|
            FileName++;
 | 
						|
            continue;
 | 
						|
          }
 | 
						|
 | 
						|
          BackslashesNo = 0;
 | 
						|
          TempFileName  = FileName - 1;
 | 
						|
          while (TempFileName >= FileNameSavedPointer) {
 | 
						|
            if (*TempFileName == L'\\') {
 | 
						|
              if (++BackslashesNo == 2) {
 | 
						|
                break;
 | 
						|
              }
 | 
						|
            }
 | 
						|
 | 
						|
            TempFileName--;
 | 
						|
          }
 | 
						|
 | 
						|
          TempFileName++;
 | 
						|
 | 
						|
          if ((*TempFileName == L'.') && (*(TempFileName + 1) == L'.')) {
 | 
						|
            FileName += 2;
 | 
						|
          } else {
 | 
						|
            if (*(FileName + 2) != L'\0') {
 | 
						|
              ReplaceLeft (TempFileName, FileName + 3);
 | 
						|
              if (*(TempFileName - 1) == L'\\') {
 | 
						|
                FileName = TempFileName;
 | 
						|
                ExcludeTrailingBackslashes (TempFileName - 1);
 | 
						|
                TempFileName = FileName;
 | 
						|
              }
 | 
						|
            } else {
 | 
						|
              *TempFileName = L'\0';
 | 
						|
            }
 | 
						|
 | 
						|
            FileName = TempFileName;
 | 
						|
          }
 | 
						|
 | 
						|
          break;
 | 
						|
        default:
 | 
						|
          FileName++;
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      FileName++;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  FileName = FileNameSavedPointer;
 | 
						|
  if ((StrLen (FileName) > 1) && (FileName[StrLen (FileName) - 1] == L'\\')) {
 | 
						|
    FileName[StrLen (FileName) - 1] = L'\0';
 | 
						|
  }
 | 
						|
 | 
						|
Exit:
 | 
						|
  return FileName;
 | 
						|
}
 |