2025-04-27 07:49:33 -04:00

294 lines
4.6 KiB
C

/*****************************************************************************
S T R T O K
Name: strtok.c
Date: 21-Jan-1994
Creator: Unknown
Description:
This file contains functions for string manipulations.
History:
21-Jan-1994 John Fu, cleanup and reformat
*****************************************************************************/
#include <windows.h>
#include "clipbook.h"
#include "strtok.h"
static LPCSTR lpchAlphaDelimiters;
static LPCWSTR lpwchAlphaDelimiters;
/*
* IsInAlphaA
*/
BOOL IsInAlphaA(
char ch)
{
LPCSTR lpchDel = lpchAlphaDelimiters;
if (ch)
{
while (*lpchDel)
{
if (ch == *lpchDel++)
{
return TRUE;
}
}
}
else
{
return TRUE;
}
return FALSE;
}
/*
* IsInAlphaW
*/
BOOL IsInAlphaW(
WCHAR ch)
{
LPCWSTR lpchDel = lpwchAlphaDelimiters;
if (ch)
{
while (*lpchDel)
{
if (ch == *lpchDel++)
{
return TRUE;
}
}
}
else
{
return TRUE;
}
return FALSE;
}
/*
* strtokA
*/
LPSTR strtokA(
LPSTR lpchStart,
LPCSTR lpchDelimiters)
{
static LPSTR lpchEnd;
// PINFO("sTRTOK\r\n");
if (NULL == lpchStart)
{
if (lpchEnd)
{
lpchStart = lpchEnd + 1;
}
else
{
return NULL;
}
}
// PINFO("sTRING: %s\r\n", lpchStart);
lpchAlphaDelimiters = lpchDelimiters;
if (*lpchStart)
{
while (IsInAlphaA(*lpchStart))
{
lpchStart++;
}
// PINFO("Token: %s\r\n", lpchStart);
lpchEnd = lpchStart;
while (*lpchEnd && !IsInAlphaA(*lpchEnd))
{
lpchEnd++;
}
if (*lpchEnd)
{
// PINFO("Found tab\r\n");
*lpchEnd = '\0';
}
else
{
// PINFO("Found null\r\n");
lpchEnd = NULL;
}
}
else
{
lpchEnd = NULL;
return NULL;
}
// PINFO("Returning %s\r\n", lpchStart);
return lpchStart;
}
/*
* strtokW
*/
LPWSTR strtokW(
LPWSTR lpchStart,
LPCWSTR lpchDelimiters)
{
static LPWSTR lpchEnd;
if (NULL == lpchStart)
{
if (lpchEnd)
{
lpchStart = lpchEnd + 1;
}
else
{
return NULL;
}
}
lpwchAlphaDelimiters = lpchDelimiters;
if (*lpchStart)
{
while (IsInAlphaW(*lpchStart))
{
lpchStart++;
}
lpchEnd = lpchStart;
while (*lpchEnd && !IsInAlphaW(*lpchEnd))
{
lpchEnd++;
}
if (*lpchEnd)
{
*lpchEnd = '\0';
}
else
{
lpchEnd = NULL;
}
}
else
{
lpchEnd = NULL;
return NULL;
}
return lpchStart;
}
/*
* ltoa
*
* Purpose: Look, it's ltoa, OK? GO READ K&R.
*
* Parameters: GO READ K&R, YOU SCUM!
*
* Returns: READ K&R! READ K&R! READ K&R! Oh, okay... Returns ptch.
*/
TCHAR *_ltoa(
long l,
TCHAR *ptch,
unsigned uRadix)
{
TCHAR rgtchDigits[]=TEXT("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
if (uRadix < 37)
{
unsigned long ul;
if (10 == uRadix && l < 0)
{
*ptch++ = TEXT('-');
ul = (unsigned long)(l = -l); // l==0x8000000000000....
}
else
{
ul = (unsigned long)l;
}
// For non-decimal numbers, print all digits.
if (10 != uRadix)
{
l = ((~0L)>>1);
}
while (l > 0)
{
l /= uRadix;
ptch++;
}
*ptch-- = TEXT('\0');
do
{
*ptch-- = rgtchDigits[ul % uRadix];
ul /= uRadix;
} while (ul > 0);
}
else
{
*ptch = TEXT('\0');
}
return(ptch);
}