105 lines
2.0 KiB
C++
105 lines
2.0 KiB
C++
|
#include <Windows.h>
|
||
|
|
||
|
#if defined(_MSC_VER) && _MSC_VER+0 >= 1400
|
||
|
#if defined(_MSC_FULL_VER) && _MSC_FULL_VER+0 >= 140050727
|
||
|
#include <intrin.h>
|
||
|
#else
|
||
|
EXTERN_C void __stosb(BYTE*,BYTE,size_t);
|
||
|
#endif
|
||
|
#pragma intrinsic(__stosb)
|
||
|
#define CRTINTRINSIC_memset(p,c,s) __stosb((BYTE*)(p),(BYTE)(c),(s))
|
||
|
#endif
|
||
|
|
||
|
extern "C" void* __cdecl memset(void *p, int c, size_t z)
|
||
|
{
|
||
|
#ifdef CRTINTRINSIC_memset
|
||
|
CRTINTRINSIC_memset(p, c, z);
|
||
|
#else
|
||
|
BYTE *pb = reinterpret_cast<BYTE*>(p);
|
||
|
for(size_t i=0; i<z; ++i, ++pb)
|
||
|
(*pb) = c;
|
||
|
#endif
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
extern "C" const char* __cdecl strstr(const char *str, const char *target)
|
||
|
{
|
||
|
if (!*target) return (char*)str;
|
||
|
char *p1 = (char*)str, *p2 = (char*)target;
|
||
|
char *p1Adv = (char*)str;
|
||
|
while (*++p2)
|
||
|
p1Adv++;
|
||
|
while (*p1Adv)
|
||
|
{
|
||
|
char *p1Begin = p1;
|
||
|
p2 = (char*)target;
|
||
|
while (*p1 && *p2 && *p1 == *p2)
|
||
|
{
|
||
|
p1++;
|
||
|
p2++;
|
||
|
}
|
||
|
if (!*p2)
|
||
|
return p1Begin;
|
||
|
p1 = p1Begin + 1;
|
||
|
p1Adv++;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
extern "C" const wchar_t* __cdecl wcsstr(const wchar_t *str, const wchar_t *target)
|
||
|
{
|
||
|
if (!*target) return (wchar_t*)str;
|
||
|
wchar_t *p1 = (wchar_t*)str, *p2 = (wchar_t*)target;
|
||
|
wchar_t *p1Adv = (wchar_t*)str;
|
||
|
while (*++p2)
|
||
|
p1Adv++;
|
||
|
while (*p1Adv)
|
||
|
{
|
||
|
wchar_t *p1Begin = p1;
|
||
|
p2 = (wchar_t*)target;
|
||
|
while (*p1 && *p2 && *p1 == *p2)
|
||
|
{
|
||
|
p1++;
|
||
|
p2++;
|
||
|
}
|
||
|
if (!*p2)
|
||
|
return p1Begin;
|
||
|
p1 = p1Begin + 1;
|
||
|
p1Adv++;
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
extern "C" const char* __cdecl strchr(const char* s, int ch)
|
||
|
{
|
||
|
while(*s && *s != ch)
|
||
|
++s;
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
extern "C" const wchar_t* __cdecl wcschr(const wchar_t* s, wchar_t ch)
|
||
|
{
|
||
|
while(*s && *s != ch)
|
||
|
++s;
|
||
|
return s;
|
||
|
}
|
||
|
|
||
|
extern "C" const char* __cdecl strrchr(const char* s, int c)
|
||
|
{
|
||
|
char *rtnval = 0;
|
||
|
do {
|
||
|
if (*s == c)
|
||
|
rtnval = (char*) s;
|
||
|
} while (*s++);
|
||
|
return rtnval;
|
||
|
}
|
||
|
|
||
|
extern "C" const wchar_t* __cdecl wcsrchr(const wchar_t* s, wchar_t c)
|
||
|
{
|
||
|
wchar_t *rtnval = 0;
|
||
|
do {
|
||
|
if (*s == c)
|
||
|
rtnval = (wchar_t*) s;
|
||
|
} while (*s++);
|
||
|
return rtnval;
|
||
|
}
|