|
|
/*************************************************************************
* * * ITUTILS.CPP * * * * Copyright (C) Microsoft Corporation 1997 * * All Rights reserved. * * * ************************************************************************** * * * Module Intent * * Provide a place to put miscellaneous utility routines. * * * ************************************************************************** * * * Current Owner: InfoTech Team * * * *************************************************************************/ #include <mvopsys.h>
#ifdef _DEBUG
static char s_aszModule[] = __FILE__; /* For error report */ #endif
#include <mem.h>
#include <orkin.h>
#include <iterror.h>
#ifdef __cplusplus
extern "C" { #endif
/*************************************************************************
* @doc INTERNAL * * @func HRESULT FAR PASCAL | ReallocBufferHmem | * This function will reallocate or allocate anew a buffer of * requested size. * * @parm HGLOBAL | *phmemBuf | * Pointer to buffer handle; buffer handle can be NULL if * a new buffer needs to be allocated. New buffer handle * is returned through this param. * * @parm DWORD | *pcbBufCur | * Current size of existing buffer, if any. Should be * 0 if *phmemBuf == 0. New size is returned through * this param. * * @parm DWORD | cbBufNew | * Current size of existing buffer, if any. Should be * 0 if *phmemBuf == 0. * * @rvalue E_POINTER | phmemBuf or pcbBufCur was NULL * @rvalue E_OUTOFMEMORY | Ran out of memory (re)allocating the buffer. *************************************************************************/ HRESULT FAR PASCAL ReallocBufferHmem(HGLOBAL *phmemBuf, DWORD *pcbBufCur, DWORD cbBufNew) { HRESULT hr = S_OK;
if (phmemBuf == NULL || pcbBufCur == NULL) return (E_POINTER);
// Need to make sure we have a buffer big enough to hold what the caller
// needs to store.
if (cbBufNew > *pcbBufCur) { HGLOBAL hmemNew;
if (*phmemBuf == NULL) hmemNew = _GLOBALALLOC(GMEM_MOVEABLE, cbBufNew); else hmemNew = _GLOBALREALLOC(*phmemBuf, cbBufNew, GMEM_MOVEABLE);
if (hmemNew != NULL) { // Do reassignment just in case the new hmem is different
// than the old or if we just allocated a buffer for the
// first time.
*phmemBuf = hmemNew; *pcbBufCur = cbBufNew; } else // A pre-existing *phmemBuf is still valid;
// we'll free it in Close().
hr = E_OUTOFMEMORY; }
return (hr); }
/*************************************************************************
* @doc INTERNAL * * @func void FAR PASCAL | SetGrfFlag | * Sets or clears a bit flag in a group of flags. * * @parm DWORD | *pgrf | * Pointer to the group of flags. * * @parm DWORD | fGrfFlag | * Flag to set or clear. * * @parm BOOL | fSet | * TRUE to set fGrfFlag; FALSE to clear fGrfFlag. *************************************************************************/ void FAR PASCAL SetGrfFlag(DWORD *pgrf, DWORD fGrfFlag, BOOL fSet) { if (pgrf == NULL) return; *pgrf &= (~fGrfFlag); if (fSet) *pgrf |= fGrfFlag; }
/*
Memory Maps a give file for Read-Only, sequential access Return a pointer to the memory mapped address space and sets pdwFileSize to the size of the file if it is not NULL. */ LPSTR MapSequentialReadFile(LPCSTR szFilename, LPDWORD pdwFileSize) { LPSTR pMemory; HANDLE hInput, hMemMap;
if (NULL == szFilename) return NULL;
// Open input file
hInput = CreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (INVALID_HANDLE_VALUE == hInput) return NULL;
// Get the file size for the user
if (pdwFileSize) *pdwFileSize = GetFileSize(hInput, NULL);
// Create file mapping object
hMemMap = CreateFileMapping(hInput, NULL, PAGE_READONLY, 0, 0, NULL); CloseHandle(hInput); // Done with this handle
if (NULL == hMemMap) return NULL;
// Link the object to memory space
pMemory =(LPSTR)MapViewOfFile(hMemMap, FILE_MAP_READ, 0, 0, 0); CloseHandle(hMemMap); // Done with this handle
return pMemory; } /* MapSequentialReadFile */
// This routine was extracted from the C runtime, simplified, and renamed.
/***
*int _wcsicmp(dst, src) - compare wide-character strings, ignore case * *Purpose: * _wcsicmp perform a case-insensitive wchar_t string comparision. * *Entry: * wchar_t *dst, *src - strings to compare * *Return: * <0 if dst < src * 0 if dst = src * >0 if dst > src * This range of return values may differ from other *cmp/*coll functions.
* *Exceptions: * *******************************************************************************/
int __cdecl _it_wcsicmp ( const wchar_t * dst, const wchar_t * src ) { wchar_t f,l;
do { f = ((*dst <= L'Z') && (*dst >= L'A')) ? *dst + L'a' - L'A' : *dst; l = ((*src <= L'Z') && (*src >= L'A')) ? *src + L'a' - L'A' : *src; dst++; src++; } while ( (f) && (f == l) );
return (int)(f - l); }
#ifdef __cplusplus
} #endif
|