mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
238 lines
5.1 KiB
C
238 lines
5.1 KiB
C
/*
|
|
* PROJECT: ReactOS Applications
|
|
* LICENSE: LGPL - See COPYING in the top level directory
|
|
* FILE: base/applications/msconfig_new/stringutils.c
|
|
* PURPOSE: ANSI & UNICODE String Utility Functions
|
|
* COPYRIGHT: Copyright 2011-2012 Hermes BELUSCA - MAITO <hermes.belusca@sfr.fr>
|
|
*/
|
|
|
|
#include "precomp.h"
|
|
#include "utils.h"
|
|
#include "stringutils.h"
|
|
|
|
//
|
|
// String formatting
|
|
//
|
|
LPTSTR FormatStringV(LPCTSTR str, va_list args)
|
|
{
|
|
LPTSTR lpszString;
|
|
size_t strLenPlusNull;
|
|
|
|
if (!str) return NULL;
|
|
|
|
strLenPlusNull = _vsctprintf(str, args) + 1;
|
|
|
|
lpszString = (LPTSTR)MemAlloc(0, strLenPlusNull * sizeof(TCHAR));
|
|
if (!lpszString) return NULL;
|
|
|
|
StringCchVPrintf(lpszString, strLenPlusNull, str, args);
|
|
|
|
return lpszString;
|
|
}
|
|
|
|
LPTSTR FormatString(LPCTSTR str, ...)
|
|
{
|
|
LPTSTR lpszString;
|
|
va_list args;
|
|
|
|
va_start(args, str);
|
|
lpszString = FormatStringV(str, args);
|
|
va_end(args);
|
|
|
|
return lpszString;
|
|
}
|
|
|
|
//
|
|
// String handling (ANSI <-> Unicode UTF16)
|
|
//
|
|
LPSTR UnicodeToAnsi(LPCWSTR strW)
|
|
{
|
|
LPSTR strA;
|
|
int iNeededChars;
|
|
|
|
if (!strW) return NULL;
|
|
|
|
iNeededChars = WideCharToMultiByte(CP_ACP,
|
|
WC_COMPOSITECHECK /* | WC_NO_BEST_FIT_CHARS */,
|
|
strW, -1, NULL, 0, NULL, NULL);
|
|
|
|
strA = (LPSTR)MemAlloc(0, iNeededChars * sizeof(CHAR));
|
|
if (!strA) return NULL;
|
|
|
|
WideCharToMultiByte(CP_ACP,
|
|
WC_COMPOSITECHECK /* | WC_NO_BEST_FIT_CHARS */,
|
|
strW, -1, strA, iNeededChars, NULL, NULL);
|
|
|
|
return strA;
|
|
}
|
|
|
|
LPWSTR AnsiToUnicode(LPCSTR strA)
|
|
{
|
|
LPWSTR strW;
|
|
int iNeededChars;
|
|
|
|
if (!strA) return NULL;
|
|
|
|
iNeededChars = MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
strA, -1, NULL, 0);
|
|
|
|
strW = (LPWSTR)MemAlloc(0, iNeededChars * sizeof(WCHAR));
|
|
if (!strW) return NULL;
|
|
|
|
MultiByteToWideChar(CP_ACP,
|
|
MB_PRECOMPOSED,
|
|
strA, -1, strW, iNeededChars);
|
|
|
|
return strW;
|
|
}
|
|
|
|
LPSTR DuplicateStringA(LPCSTR str)
|
|
{
|
|
LPSTR dupStr;
|
|
size_t strSizePlusNull;
|
|
|
|
if (!str) return NULL;
|
|
|
|
strSizePlusNull = strlen(str) + 1;
|
|
|
|
dupStr = (LPSTR)MemAlloc(0, strSizePlusNull * sizeof(CHAR));
|
|
if (!dupStr) return NULL;
|
|
|
|
StringCchCopyA(dupStr, strSizePlusNull, str);
|
|
|
|
return dupStr;
|
|
}
|
|
|
|
LPWSTR DuplicateStringW(LPCWSTR str)
|
|
{
|
|
LPWSTR dupStr;
|
|
size_t strSizePlusNull;
|
|
|
|
if (!str) return NULL;
|
|
|
|
strSizePlusNull = wcslen(str) + 1;
|
|
|
|
dupStr = (LPWSTR)MemAlloc(0, strSizePlusNull * sizeof(WCHAR));
|
|
if (!dupStr) return NULL;
|
|
|
|
StringCchCopyW(dupStr, strSizePlusNull, str);
|
|
|
|
return dupStr;
|
|
}
|
|
|
|
LPSTR DuplicateStringAEx(LPCSTR str, size_t numOfChars)
|
|
{
|
|
LPSTR dupStr;
|
|
size_t strSize;
|
|
|
|
if (!str) return NULL;
|
|
|
|
strSize = min(strlen(str), numOfChars);
|
|
|
|
dupStr = (LPSTR)MemAlloc(0, (strSize + 1) * sizeof(CHAR));
|
|
if (!dupStr) return NULL;
|
|
|
|
StringCchCopyNA(dupStr, strSize + 1, str, strSize);
|
|
dupStr[strSize] = '\0';
|
|
|
|
return dupStr;
|
|
}
|
|
|
|
LPWSTR DuplicateStringWEx(LPCWSTR str, size_t numOfChars)
|
|
{
|
|
LPWSTR dupStr;
|
|
size_t strSize;
|
|
|
|
if (!str) return NULL;
|
|
|
|
strSize = min(wcslen(str), numOfChars);
|
|
|
|
dupStr = (LPWSTR)MemAlloc(0, (strSize + 1) * sizeof(WCHAR));
|
|
if (!dupStr) return NULL;
|
|
|
|
StringCchCopyNW(dupStr, strSize + 1, str, strSize);
|
|
dupStr[strSize] = L'\0';
|
|
|
|
return dupStr;
|
|
}
|
|
|
|
//
|
|
// String search functions
|
|
//
|
|
/***
|
|
*wchar_t *wcsstr(string1, string2) - search for string2 in string1
|
|
* (wide strings)
|
|
*
|
|
*Purpose:
|
|
* finds the first occurrence of string2 in string1 (wide strings)
|
|
*
|
|
*Entry:
|
|
* wchar_t *string1 - string to search in
|
|
* wchar_t *string2 - string to search for
|
|
*
|
|
*Exit:
|
|
* returns a pointer to the first occurrence of string2 in
|
|
* string1, or NULL if string2 does not occur in string1
|
|
*
|
|
*Uses:
|
|
*
|
|
*Exceptions:
|
|
*
|
|
*******************************************************************************/
|
|
LPTSTR FindSubStrI(LPCTSTR str, LPCTSTR strSearch)
|
|
{
|
|
LPTSTR cp = (LPTSTR)str;
|
|
LPTSTR s1, s2;
|
|
|
|
if (!*strSearch)
|
|
return (LPTSTR)str;
|
|
|
|
while (*cp)
|
|
{
|
|
s1 = cp;
|
|
s2 = (LPTSTR)strSearch;
|
|
|
|
while (*s1 && *s2 && (_totupper(*s1) == _totupper(*s2)))
|
|
++s1, ++s2;
|
|
|
|
if (!*s2)
|
|
return cp;
|
|
|
|
++cp;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*************************************************************************
|
|
* AppendPathSeparator
|
|
*
|
|
* Append a backslash ('\') to a path if one doesn't exist.
|
|
*
|
|
* PARAMS
|
|
* lpszPath [I/O] The path to append a backslash to.
|
|
*
|
|
* RETURNS
|
|
* Success: The position of the last backslash in the path.
|
|
* Failure: NULL, if lpszPath is NULL or the path is too large.
|
|
*/
|
|
LPTSTR AppendPathSeparator(LPTSTR lpszPath)
|
|
{
|
|
size_t iLen = 0;
|
|
|
|
if (!lpszPath || (iLen = _tcslen(lpszPath)) >= MAX_PATH)
|
|
return NULL;
|
|
|
|
if (iLen >= 1)
|
|
{
|
|
lpszPath += iLen - 1;
|
|
if (*lpszPath++ != _T('\\'))
|
|
{
|
|
*lpszPath++ = _T('\\');
|
|
*lpszPath = _T('\0');
|
|
}
|
|
}
|
|
|
|
return lpszPath;
|
|
}
|