windows-nt/Source/XPSP1/NT/printscan/fax/util/string.c
2020-09-26 16:20:57 +08:00

516 lines
8.3 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
string.c
Abstract:
This file implements string functions for fax.
Author:
Wesley Witt (wesw) 23-Jan-1995
Environment:
User Mode
--*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include "faxutil.h"
LPTSTR
StringDup(
LPCTSTR String
)
{
LPTSTR NewString;
if (!String) {
return NULL;
}
NewString = (LPTSTR) MemAlloc( (_tcslen( String ) + 1) * sizeof(TCHAR) );
if (!NewString) {
return NULL;
}
_tcscpy( NewString, String );
return NewString;
}
VOID
FreeString(
LPVOID String
)
{
MemFree( String );
}
LPWSTR
AnsiStringToUnicodeString(
LPCSTR AnsiString
)
{
DWORD Count;
LPWSTR UnicodeString;
//
// first see how big the buffer needs to be
//
Count = MultiByteToWideChar(
CP_ACP,
MB_PRECOMPOSED,
AnsiString,
-1,
NULL,
0
);
//
// i guess the input string is empty
//
if (!Count) {
return NULL;
}
//
// allocate a buffer for the unicode string
//
Count += 1;
UnicodeString = (LPWSTR) MemAlloc( Count * sizeof(UNICODE_NULL) );
if (!UnicodeString) {
return NULL;
}
//
// convert the string
//
Count = MultiByteToWideChar(
CP_ACP,
MB_PRECOMPOSED,
AnsiString,
-1,
UnicodeString,
Count
);
//
// the conversion failed
//
if (!Count) {
MemFree( UnicodeString );
return NULL;
}
return UnicodeString;
}
LPSTR
UnicodeStringToAnsiString(
LPCWSTR UnicodeString
)
{
DWORD Count;
LPSTR AnsiString;
//
// first see how big the buffer needs to be
//
Count = WideCharToMultiByte(
CP_ACP,
0,
UnicodeString,
-1,
NULL,
0,
NULL,
NULL
);
//
// i guess the input string is empty
//
if (!Count) {
return NULL;
}
//
// allocate a buffer for the unicode string
//
Count += 1;
AnsiString = (LPSTR) MemAlloc( Count );
if (!AnsiString) {
return NULL;
}
//
// convert the string
//
Count = WideCharToMultiByte(
CP_ACP,
0,
UnicodeString,
-1,
AnsiString,
Count,
NULL,
NULL
);
//
// the conversion failed
//
if (!Count) {
MemFree( AnsiString );
return NULL;
}
return AnsiString;
}
VOID
MakeDirectory(
LPCTSTR Dir
)
/*++
Routine Description:
Attempt to create all of the directories in the given path.
Arguments:
Dir - Directory path to create
Return Value:
TRUE for success, FALSE on error
--*/
{
LPTSTR p, NewDir;
NewDir = p = ExpandEnvironmentString( Dir );
__try {
if (*p != '\\') p += 2;
while( *++p ) {
while(*p && *p != TEXT('\\')) p++;
if (!*p) {
CreateDirectory( NewDir, NULL );
return;
}
*p = 0;
CreateDirectory( NewDir, NULL );
*p = TEXT('\\');
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
}
MemFree( NewDir );
}
VOID
HideDirectory(
LPTSTR Dir
)
/*++
Routine Description:
Hide the specified directory
Arguments:
Dir - Directory path to hide
Return Value:
none.
--*/
{
DWORD attrib;
//
// make sure it exists
//
if (!Dir) {
return;
}
MakeDirectory( Dir );
attrib = GetFileAttributes(Dir);
if (attrib == 0xFFFFFFFF) {
return;
}
attrib |= FILE_ATTRIBUTE_HIDDEN;
SetFileAttributes( Dir, attrib );
return;
}
VOID
DeleteDirectory(
LPTSTR Dir
)
/*++
Routine Description:
Attempt to create all of the directories in the given path.
Arguments:
Dir - Directory path to create
Return Value:
TRUE for success, FALSE on error
--*/
{
LPTSTR p;
__try {
while (TRUE) {
if (!RemoveDirectory( Dir )) {
return;
}
p = Dir + _tcslen( Dir ) - 1;
while (*p != TEXT('\\') && p != Dir) p--;
if (p == Dir) return;
*p = 0;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
}
}
int
FormatElapsedTimeStr(
FILETIME *ElapsedTime,
LPTSTR TimeStr,
DWORD StringSize
)
/*++
Routine Description:
Convert ElapsedTime to a string.
Arguments:
ElaspedTime - the elapsed time
TimeStr - buffer to store the string into
StringSize - size of the buffer in bytes
Return Value:
The return value of GetTimeFormat()
--*/
{
SYSTEMTIME SystemTime;
FileTimeToSystemTime( ElapsedTime, &SystemTime );
return GetTimeFormat(
LOCALE_SYSTEM_DEFAULT,
LOCALE_NOUSEROVERRIDE | TIME_FORCE24HOURFORMAT | TIME_NOTIMEMARKER,
&SystemTime,
NULL,
TimeStr,
StringSize
);
}
LPTSTR
ExpandEnvironmentString(
LPCTSTR EnvString
)
{
DWORD Size;
LPTSTR String;
Size = ExpandEnvironmentStrings( EnvString, NULL, 0 );
if (Size == 0) {
return NULL;
}
Size += 1;
String = (LPTSTR) MemAlloc( Size * sizeof(TCHAR) );
if (String == NULL) {
return NULL;
}
if (ExpandEnvironmentStrings( EnvString, String, Size ) == 0) {
MemFree( String );
return NULL;
}
return String;
}
LPTSTR
GetEnvVariable(
LPCTSTR EnvString
)
{
DWORD Size;
LPTSTR EnvVar;
Size = GetEnvironmentVariable( EnvString, NULL, 0 );
if (!Size) {
return NULL;
}
EnvVar = (LPTSTR) MemAlloc( Size * sizeof(TCHAR) );
if (EnvVar == NULL) {
return NULL;
}
Size = GetEnvironmentVariable( EnvString, EnvVar, Size );
if (!Size) {
MemFree( EnvVar );
return NULL;
}
return EnvVar;
}
LPTSTR
ConcatenatePaths(
LPTSTR BasePath,
LPCTSTR AppendPath
)
{
DWORD len;
len = _tcslen(BasePath);
if (BasePath[len-1] != (TCHAR) TEXT('\\')) {
_tcscat(BasePath, TEXT("\\") );
}
_tcscat(BasePath, AppendPath);
return BasePath;
}
int MyLoadString(
HINSTANCE hInstance,
UINT uID,
LPTSTR lpBuffer,
int nBufferMax,
LANGID LangID
)
{
HRSRC hFindRes; // Handle from FindResourceEx
HANDLE hLoadRes; // Handle from LoadResource
LPWSTR pSearch; // Pointer to search for correct string
int cch = 0; // Count of characters
#ifndef UNICODE
LPWSTR pString; // Pointer to temporary string
#endif
//
// String Tables are broken up into segments of 16 strings each. Find the segment containing the string we want.
//
if ((!(hFindRes = FindResourceEx(hInstance, RT_STRING, (LPTSTR) ((LONG) (((USHORT) uID >> 4) + 1)), (WORD) LangID)))) {
//
// Could not find resource. Return 0.
//
return (cch);
}
//
// Load the resource.
//
hLoadRes = LoadResource(hInstance, hFindRes);
//
// Lock the resource.
//
if (pSearch = (LPWSTR) LockResource(hLoadRes)) {
//
// Move past the other strings in this segment. (16 strings in a segment -> & 0x0F)
//
uID &= 0x0F;
//
// Find the correct string in this segment.
//
while (TRUE) {
cch = *((WORD *) pSearch++);
if (uID-- == 0) {
break;
}
pSearch += cch;
}
//
// Store the found pointer in the given pointer.
//
if (nBufferMax < cch) {
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return 0;
}
#ifndef UNICODE
pString = MemAlloc(sizeof(WCHAR) * nBufferMax);
ZeroMemory(pString, sizeof(WCHAR) * nBufferMax);
CopyMemory(pString, pSearch, sizeof(WCHAR) * cch);
WideCharToMultiByte(CP_THREAD_ACP, 0, pString, -1, lpBuffer, (cch + 1), NULL, NULL);
MemFree(pString);
#else
ZeroMemory(lpBuffer, sizeof(WCHAR) * nBufferMax);
CopyMemory(lpBuffer, pSearch, sizeof(WCHAR) * cch);
#endif
}
//
// Return the number of characters in the string.
//
return (cch);
}