376 lines
8.1 KiB
C++
376 lines
8.1 KiB
C++
|
|
||
|
/*******************************************************************************
|
||
|
|
||
|
Copyright (c) 1995-96 Microsoft Corporation
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
{Insert General Comment Here}
|
||
|
|
||
|
*******************************************************************************/
|
||
|
#define WIN32_LEAN_AND_MEAN
|
||
|
#include <windows.h>
|
||
|
#include <malloc.h>
|
||
|
#include <tchar.h>
|
||
|
#include <ctype.h>
|
||
|
#include "crt.h"
|
||
|
//#pragma function( strcpy, strlen, strcat )
|
||
|
// *** Flag these as don't use ***//
|
||
|
int vsprintf( char *buffer, const char *format, va_list argptr )
|
||
|
{
|
||
|
#ifdef _DEBUG
|
||
|
OutputDebugString(_T("Don't use vsprintf(), use wsprintf if possible\n"));
|
||
|
#endif
|
||
|
return strlen(buffer);
|
||
|
}
|
||
|
|
||
|
// *** Memory functions *** //
|
||
|
extern "C" void * __cdecl malloc( size_t size )
|
||
|
{
|
||
|
return GlobalAlloc(GMEM_FIXED,size);
|
||
|
}
|
||
|
|
||
|
extern "C" void __cdecl free( void * p )
|
||
|
{
|
||
|
GlobalFree(GlobalHandle(p));
|
||
|
}
|
||
|
|
||
|
extern "C" void * __cdecl realloc( void * pv, size_t newsize )
|
||
|
{
|
||
|
return GlobalLock(GlobalReAlloc(GlobalHandle(pv),newsize, NULL));
|
||
|
}
|
||
|
|
||
|
void __cdecl operator delete( void * p )
|
||
|
{
|
||
|
if (p) free(p);
|
||
|
}
|
||
|
|
||
|
void * __cdecl operator new( unsigned int cb )
|
||
|
{
|
||
|
return malloc(cb);
|
||
|
}
|
||
|
|
||
|
// *** String functions *** //
|
||
|
|
||
|
extern "C" size_t _cdecl wcslen( const wchar_t *string )
|
||
|
{
|
||
|
const wchar_t *s1 = string;
|
||
|
while( *string )
|
||
|
{
|
||
|
string++;
|
||
|
}
|
||
|
return string - s1;
|
||
|
}
|
||
|
|
||
|
extern "C" wchar_t * _cdecl wcscpy( wchar_t *strDestination, const wchar_t *strSource )
|
||
|
{
|
||
|
wchar_t *pRet = strDestination;
|
||
|
while( *strDestination++ = *strSource++ )
|
||
|
;
|
||
|
return pRet;
|
||
|
}
|
||
|
|
||
|
extern "C" wchar_t * _cdecl wcsncpy( wchar_t *strDest, const wchar_t *strSource, size_t count )
|
||
|
{
|
||
|
if( count < 0 ) return NULL;
|
||
|
|
||
|
wchar_t *pRet = strDest;
|
||
|
DWORD i = wcslen(strSource);
|
||
|
if( i <= count )
|
||
|
{
|
||
|
while( *strDest++ = *strSource++ )
|
||
|
;
|
||
|
while( i++ < count )
|
||
|
*strDest++ = L'\0';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
while( count-- )
|
||
|
*strDest++ = *strSource++;
|
||
|
}
|
||
|
return pRet;
|
||
|
}
|
||
|
|
||
|
extern "C" int __cdecl wcsncmp ( const wchar_t * first, const wchar_t * last, size_t count )
|
||
|
{
|
||
|
if (!count)
|
||
|
return(0);
|
||
|
|
||
|
while (--count && *first && *first == *last)
|
||
|
{
|
||
|
first++;
|
||
|
last++;
|
||
|
}
|
||
|
|
||
|
return((int)(*first - *last));
|
||
|
}
|
||
|
|
||
|
extern "C" int __cdecl wcscmp ( const wchar_t * first, const wchar_t * last )
|
||
|
{
|
||
|
while (*first && *first == *last)
|
||
|
{
|
||
|
first++;
|
||
|
last++;
|
||
|
}
|
||
|
|
||
|
return((int)(*first - *last));
|
||
|
}
|
||
|
|
||
|
extern "C" wchar_t * __cdecl wcsrchr ( const wchar_t * string, wchar_t ch )
|
||
|
{
|
||
|
const wchar_t * p = NULL;
|
||
|
while (TRUE)
|
||
|
{
|
||
|
if (*string == ch)
|
||
|
{
|
||
|
p = string;
|
||
|
}
|
||
|
if (*string == NULL)
|
||
|
{
|
||
|
return (wchar_t *)p;
|
||
|
}
|
||
|
string++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extern "C" wchar_t * __cdecl wcschr ( const wchar_t * string, wchar_t ch )
|
||
|
{
|
||
|
while (*string && *string != (wchar_t)ch)
|
||
|
string++;
|
||
|
|
||
|
if (*string == (wchar_t)ch)
|
||
|
return((wchar_t *)string);
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
extern "C" wchar_t * __cdecl wcsstr ( const wchar_t * wcs1, const wchar_t * wcs2 )
|
||
|
{
|
||
|
wchar_t *cp = (wchar_t *) wcs1;
|
||
|
wchar_t *s1, *s2;
|
||
|
|
||
|
while (*cp)
|
||
|
{
|
||
|
s1 = cp;
|
||
|
s2 = (wchar_t *) wcs2;
|
||
|
|
||
|
while ( *s1 && *s2 && !(*s1-*s2) )
|
||
|
s1++, s2++;
|
||
|
|
||
|
if (!*s2)
|
||
|
return(cp);
|
||
|
|
||
|
cp++;
|
||
|
}
|
||
|
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
extern "C" wchar_t * __cdecl wcscat ( wchar_t * dst, const wchar_t * src )
|
||
|
{
|
||
|
wchar_t * cp = dst;
|
||
|
|
||
|
while( *cp )
|
||
|
cp++; /* find end of dst */
|
||
|
|
||
|
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
|
||
|
|
||
|
return( dst ); /* return dst */
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
// miscellaneous
|
||
|
extern "C" int __cdecl _purecall()
|
||
|
{
|
||
|
DebugBreak();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
extern "C" char * __cdecl _ultoa ( unsigned long val, char *buf, int radix )
|
||
|
{
|
||
|
xtoa(val, buf, radix, 0);
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
extern "C" wchar_t * __cdecl _ultow ( unsigned long val, wchar_t *buf, int radix )
|
||
|
{
|
||
|
char astring[40];
|
||
|
|
||
|
_ultoa (val, astring, radix);
|
||
|
MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED, astring, -1, buf, 40);
|
||
|
return (buf);
|
||
|
}
|
||
|
|
||
|
extern "C" static void __cdecl xtoa ( unsigned long val, char *buf, unsigned radix, int is_neg )
|
||
|
{
|
||
|
char *p; /* pointer to traverse string */
|
||
|
char *firstdig; /* pointer to first digit */
|
||
|
char temp; /* temp char */
|
||
|
unsigned digval; /* value of digit */
|
||
|
|
||
|
p = buf;
|
||
|
|
||
|
if (is_neg) {
|
||
|
/* negative, so output '-' and negate */
|
||
|
*p++ = '-';
|
||
|
val = (unsigned long)(-(long)val);
|
||
|
}
|
||
|
|
||
|
firstdig = p; /* save pointer to first digit */
|
||
|
|
||
|
do {
|
||
|
digval = (unsigned) (val % radix);
|
||
|
val /= radix; /* get next digit */
|
||
|
|
||
|
/* convert to ascii and store */
|
||
|
if (digval > 9)
|
||
|
*p++ = (char) (digval - 10 + 'a'); /* a letter */
|
||
|
else
|
||
|
*p++ = (char) (digval + '0'); /* a digit */
|
||
|
} while (val > 0);
|
||
|
|
||
|
/* We now have the digit of the number in the buffer, but in reverse
|
||
|
order. Thus we reverse them now. */
|
||
|
|
||
|
*p-- = '\0'; /* terminate string; p points to last digit */
|
||
|
|
||
|
do {
|
||
|
temp = *p;
|
||
|
*p = *firstdig;
|
||
|
*firstdig = temp; /* swap *p and *firstdig */
|
||
|
--p;
|
||
|
++firstdig; /* advance to next two digits */
|
||
|
} while (firstdig < p); /* repeat until halfway */
|
||
|
}
|
||
|
|
||
|
|
||
|
extern "C" int __cdecl isspace(int c)
|
||
|
{
|
||
|
if( c == ' ' || (c >= 0x09 && c <= 0x0d) )
|
||
|
return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
extern "C" int __cdecl isdigit(int c)
|
||
|
{
|
||
|
if( c >= '0' && c <= '9' ) return 1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
extern "C" long __cdecl atol( const char *nptr )
|
||
|
{
|
||
|
int c; /* current char */
|
||
|
long total; /* current total */
|
||
|
int sign; /* if '-', then negative, otherwise positive */
|
||
|
|
||
|
/* skip whitespace */
|
||
|
while ( isspace((int)(unsigned char)*nptr) )
|
||
|
++nptr;
|
||
|
|
||
|
c = (int)(unsigned char)*nptr++;
|
||
|
sign = c; /* save sign indication */
|
||
|
if (c == '-' || c == '+')
|
||
|
c = (int)(unsigned char)*nptr++; /* skip sign */
|
||
|
|
||
|
total = 0;
|
||
|
|
||
|
while (isdigit(c)) {
|
||
|
total = 10 * total + (c - '0'); /* accumulate digit */
|
||
|
c = (int)(unsigned char)*nptr++; /* get next char */
|
||
|
}
|
||
|
|
||
|
if (sign == '-')
|
||
|
return -total;
|
||
|
else
|
||
|
return total; /* return result, negated if necessary */
|
||
|
}
|
||
|
|
||
|
|
||
|
extern "C" long __cdecl _wtol( const wchar_t *nptr )
|
||
|
{
|
||
|
char astring[20];
|
||
|
WideCharToMultiByte (CP_ACP, 0, nptr, -1, astring, 20, NULL, NULL);
|
||
|
return (atol(astring));
|
||
|
}
|
||
|
|
||
|
extern "C" int __cdecl wprintf( const wchar_t *format, ... )
|
||
|
{
|
||
|
return 0; // no characters printed
|
||
|
}
|
||
|
|
||
|
extern "C" void * __cdecl calloc( size_t num, size_t size )
|
||
|
{
|
||
|
long nBytes = num*size;
|
||
|
void *pRet = malloc( nBytes );
|
||
|
if( pRet )
|
||
|
{
|
||
|
ZeroMemory( pRet, nBytes );
|
||
|
}
|
||
|
return pRet;
|
||
|
}
|
||
|
|
||
|
extern "C" wchar_t * __cdecl _wcsdup( const wchar_t *strSource )
|
||
|
{
|
||
|
wchar_t *pRet = NULL;
|
||
|
|
||
|
if( strSource )
|
||
|
{
|
||
|
int nLen = wcslen( strSource );
|
||
|
pRet = (wchar_t*)malloc( (nLen+1) * sizeof(WCHAR) );
|
||
|
if( pRet )
|
||
|
{
|
||
|
wcscpy( pRet, strSource );
|
||
|
}
|
||
|
}
|
||
|
return pRet;
|
||
|
|
||
|
}
|
||
|
|
||
|
extern "C" char * __cdecl strncpy ( char * dest, const char * source, size_t count )
|
||
|
{
|
||
|
char *start = dest;
|
||
|
|
||
|
while (count && (*dest++ = *source++)) /* copy string */
|
||
|
count--;
|
||
|
|
||
|
if (count) /* pad out with zeroes */
|
||
|
while (--count)
|
||
|
*dest++ = '\0';
|
||
|
|
||
|
return(start);
|
||
|
}
|
||
|
|
||
|
|
||
|
extern "C" char * __cdecl strcpy(char * dst, const char * src)
|
||
|
{
|
||
|
char * cp = dst;
|
||
|
|
||
|
while( *cp++ = *src++ )
|
||
|
; /* Copy src over dst */
|
||
|
|
||
|
return( dst );
|
||
|
}
|
||
|
|
||
|
extern "C" char * __cdecl strcat ( char * dst, const char * src )
|
||
|
{
|
||
|
char * cp = dst;
|
||
|
|
||
|
while( *cp )
|
||
|
cp++; /* find end of dst */
|
||
|
|
||
|
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
|
||
|
|
||
|
return( dst ); /* return dst */
|
||
|
}
|
||
|
|
||
|
extern "C" size_t __cdecl strlen ( const char * str )
|
||
|
{
|
||
|
const char *eos = str;
|
||
|
|
||
|
while( *eos++ ) ;
|
||
|
|
||
|
return( (int)(eos - str - 1) );
|
||
|
}
|