/******************************************************************************* Copyright (c) 1995-96 Microsoft Corporation Abstract: {Insert General Comment Here} *******************************************************************************/ #define WIN32_LEAN_AND_MEAN #include #include #include #include #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) ); }