Skip to main content
  • Home
  • login
  • Browse the archive

    swh mirror partner logo
swh logo
SoftwareHeritage
Software
Heritage
Mirror
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Revision 11414f17d93ec04d2d056d5f3a87e964a7412431 authored by Matt Caswell on 23 May 2015, 20:51:21 UTC, committed by Matt Caswell on 25 May 2015, 16:52:27 UTC
Don't send an alert if we've just received one
If the record received is for a version that we don't support, previously we
were sending an alert back. However if the incoming record already looks
like an alert then probably we shouldn't do that. So suppress an outgoing
alert if it looks like we've got one incoming.

Reviewed-by: Kurt Roeckx <kurt@openssl.org>
1 parent 0a59e2d
  • Files
  • Changes
  • 9216ba2
  • /
  • MacOS
  • /
  • GetHTTPS.src
  • /
  • CPStringUtils.cpp
Raw File
Cook and download a directory from the Software Heritage Vault

You have requested the cooking of the directory with identifier None into a standard tar.gz archive.

Are you sure you want to continue ?

Download a directory from the Software Heritage Vault

You have requested the download of the directory with identifier None as a standard tar.gz archive.

Are you sure you want to continue ?

Cook and download a revision from the Software Heritage Vault

You have requested the cooking of the history heading to revision with identifier swh:1:rev:11414f17d93ec04d2d056d5f3a87e964a7412431 into a bare git archive.

Are you sure you want to continue ?

Download a revision from the Software Heritage Vault

You have requested the download of the history heading to revision with identifier swh:1:rev:11414f17d93ec04d2d056d5f3a87e964a7412431 as a bare git archive.

Are you sure you want to continue ?

Invalid Email !

The provided email is not well-formed.

Download link has expired

The requested archive is no longer available for download from the Software Heritage Vault.

Do you want to cook it again ?

Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • revision
  • content
revision badge
swh:1:rev:11414f17d93ec04d2d056d5f3a87e964a7412431
content badge Iframe embedding
swh:1:cnt:617aae2c70680da3069675f3e1122cd69522a4b4
CPStringUtils.cpp
/* ====================================================================
 * Copyright (c) 1998-1999 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
 
 
 
 #include "CPStringUtils.hpp"
#include "ErrorHandling.hpp"



#define kNumberFormatString			"\p########0.00#######;-########0.00#######"



//	Useful utility functions which could be optimized a whole lot


void CopyPStrToCStr(const unsigned char *thePStr,char *theCStr,const int maxCStrLength)
{
int		i,numPChars;


	if (thePStr != nil && theCStr != nil && maxCStrLength > 0)
	{
		numPChars = thePStr[0];
		
		for (i = 0;;i++)
		{
			if (i >= numPChars || i >= maxCStrLength - 1)
			{
				theCStr[i] = 0;
				
				break;
			}
			
			else
			{
				theCStr[i] = thePStr[i + 1];
			}
		}
	}
}


void CopyPStrToPStr(const unsigned char *theSrcPStr,unsigned char *theDstPStr,const int maxDstStrLength)
{
int		theMaxDstStrLength;

	
	theMaxDstStrLength = maxDstStrLength;
	
	
	if (theDstPStr != nil && theSrcPStr != nil && theMaxDstStrLength > 0)
	{
		if (theMaxDstStrLength > 255)
		{
			theMaxDstStrLength = 255;
		}
		
		
		if (theMaxDstStrLength - 1 < theSrcPStr[0])
		{
			BlockMove(theSrcPStr + 1,theDstPStr + 1,theMaxDstStrLength - 1);
			
			theDstPStr[0] = theMaxDstStrLength - 1;
		}
		
		else
		{
			BlockMove(theSrcPStr,theDstPStr,theSrcPStr[0] + 1);
		}
	}
}


void CopyCStrToCStr(const char *theSrcCStr,char *theDstCStr,const int maxDstStrLength)
{
int		i;


	if (theDstCStr != nil && theSrcCStr != nil && maxDstStrLength > 0)
	{
		for (i = 0;;i++)
		{
			if (theSrcCStr[i] == 0 || i >= maxDstStrLength - 1)
			{
				theDstCStr[i] = 0;
				
				break;
			}
			
			else
			{
				theDstCStr[i] = theSrcCStr[i];
			}
		}
	}
}



void CopyCSubstrToCStr(const char *theSrcCStr,const int maxCharsToCopy,char *theDstCStr,const int maxDstStrLength)
{
int		i;


	if (theDstCStr != nil && theSrcCStr != nil && maxDstStrLength > 0)
	{
		for (i = 0;;i++)
		{
			if (theSrcCStr[i] == 0 || i >= maxDstStrLength - 1 || i >= maxCharsToCopy)
			{
				theDstCStr[i] = 0;
				
				break;
			}
			
			else
			{
				theDstCStr[i] = theSrcCStr[i];
			}
		}
	}
}



void CopyCSubstrToPStr(const char *theSrcCStr,const int maxCharsToCopy,unsigned char *theDstPStr,const int maxDstStrLength)
{
int		i;
int		theMaxDstStrLength;

	
	theMaxDstStrLength = maxDstStrLength;

	if (theDstPStr != nil && theSrcCStr != nil && theMaxDstStrLength > 0)
	{
		if (theMaxDstStrLength > 255)
		{
			theMaxDstStrLength = 255;
		}
		
		
		for (i = 0;;i++)
		{
			if (theSrcCStr[i] == 0 || i >= theMaxDstStrLength - 1 || i >= maxCharsToCopy)
			{
				theDstPStr[0] = i;
				
				break;
			}
			
			else
			{
				theDstPStr[i + 1] = theSrcCStr[i];
			}
		}
	}
}



void CopyCStrToPStr(const char *theSrcCStr,unsigned char *theDstPStr,const int maxDstStrLength)
{
int		i;
int		theMaxDstStrLength;

	
	theMaxDstStrLength = maxDstStrLength;

	if (theDstPStr != nil && theSrcCStr != nil && theMaxDstStrLength > 0)
	{
		if (theMaxDstStrLength > 255)
		{
			theMaxDstStrLength = 255;
		}
		
		
		for (i = 0;;i++)
		{
			if (i >= theMaxDstStrLength - 1 || theSrcCStr[i] == 0)
			{
				theDstPStr[0] = i;
				
				break;
			}
			
			else
			{
				theDstPStr[i + 1] = theSrcCStr[i];
			}
		}
	}
}


void ConcatPStrToCStr(const unsigned char *thePStr,char *theCStr,const int maxCStrLength)
{
int		i,numPChars,cStrLength;


	if (thePStr != nil && theCStr != nil && maxCStrLength > 0)
	{
		for (cStrLength = 0;theCStr[cStrLength] != 0;cStrLength++)
		{
		
		}
		

		numPChars = thePStr[0];
		
		
		for (i = 0;;i++)
		{
			if (i >= numPChars || cStrLength >= maxCStrLength - 1)
			{
				theCStr[cStrLength++] = 0;
				
				break;
			}
			
			else
			{
				theCStr[cStrLength++] = thePStr[i + 1];
			}
		}
	}
}



void ConcatPStrToPStr(const unsigned char *theSrcPStr,unsigned char *theDstPStr,const int maxDstStrLength)
{
int		theMaxDstStrLength;

	
	theMaxDstStrLength = maxDstStrLength;
	
	if (theSrcPStr != nil && theDstPStr != nil && theMaxDstStrLength > 0)
	{
		if (theMaxDstStrLength > 255)
		{
			theMaxDstStrLength = 255;
		}
		
		
		if (theMaxDstStrLength - theDstPStr[0] - 1 < theSrcPStr[0])
		{
			BlockMove(theSrcPStr + 1,theDstPStr + theDstPStr[0] + 1,theMaxDstStrLength - 1 - theDstPStr[0]);
			
			theDstPStr[0] = theMaxDstStrLength - 1;
		}
		
		else
		{
			BlockMove(theSrcPStr + 1,theDstPStr + theDstPStr[0] + 1,theSrcPStr[0]);
			
			theDstPStr[0] += theSrcPStr[0];
		}
	}
}



void ConcatCStrToPStr(const char *theSrcCStr,unsigned char *theDstPStr,const int maxDstStrLength)
{
int		i,thePStrLength;
int		theMaxDstStrLength;

	
	theMaxDstStrLength = maxDstStrLength;

	if (theSrcCStr != nil && theDstPStr != nil && theMaxDstStrLength > 0)
	{
		if (theMaxDstStrLength > 255)
		{
			theMaxDstStrLength = 255;
		}
		
		
		thePStrLength = theDstPStr[0];
		
		for (i = 0;;i++)
		{
			if (theSrcCStr[i] == 0 || thePStrLength >= theMaxDstStrLength - 1)
			{
				theDstPStr[0] = thePStrLength;
				
				break;
			}
			
			else
			{
				theDstPStr[thePStrLength + 1] = theSrcCStr[i];
				
				thePStrLength++;
			}
		}
	}
}



void ConcatCStrToCStr(const char *theSrcCStr,char *theDstCStr,const int maxCStrLength)
{
int		cStrLength;


	if (theSrcCStr != nil && theDstCStr != nil && maxCStrLength > 0)
	{
		for (cStrLength = 0;theDstCStr[cStrLength] != 0;cStrLength++)
		{
		
		}
		

		for (;;)
		{
			if (*theSrcCStr == 0 || cStrLength >= maxCStrLength - 1)
			{
				theDstCStr[cStrLength++] = 0;
				
				break;
			}
			
			else
			{
				theDstCStr[cStrLength++] = *theSrcCStr++;
			}
		}
	}
}



void ConcatCharToCStr(const char theChar,char *theDstCStr,const int maxCStrLength)
{
int		cStrLength;


	if (theDstCStr != nil && maxCStrLength > 0)
	{
		cStrLength = CStrLength(theDstCStr);
		
		if (cStrLength < maxCStrLength - 1)
		{
			theDstCStr[cStrLength++] = theChar;
			theDstCStr[cStrLength++] = '\0';
		}
	}
}



void ConcatCharToPStr(const char theChar,unsigned char *theDstPStr,const int maxPStrLength)
{
int		pStrLength;


	if (theDstPStr != nil && maxPStrLength > 0)
	{
		pStrLength = PStrLength(theDstPStr);
		
		if (pStrLength < maxPStrLength - 1 && pStrLength < 255)
		{
			theDstPStr[pStrLength + 1] = theChar;
			theDstPStr[0] += 1;
		}
	}
}




int CompareCStrs(const char *theFirstCStr,const char *theSecondCStr,const Boolean ignoreCase)
{
int		returnValue;
char	firstChar,secondChar;

	
	returnValue = 0;
	
	
	if (theFirstCStr != nil && theSecondCStr != nil)
	{
		for (;;)
		{
			firstChar = *theFirstCStr;
			secondChar = *theSecondCStr;
			
			if (ignoreCase == true)
			{
				if (firstChar >= 'A' && firstChar <= 'Z')
				{
					firstChar = 'a' + (firstChar - 'A');
				}
				
				if (secondChar >= 'A' && secondChar <= 'Z')
				{
					secondChar = 'a' + (secondChar - 'A');
				}
			}
			
			
			if (firstChar == 0 && secondChar != 0)
			{
				returnValue = -1;
				
				break;
			}
			
			else if (firstChar != 0 && secondChar == 0)
			{
				returnValue = 1;
				
				break;
			}
			
			else if (firstChar == 0 && secondChar == 0)
			{
				returnValue = 0;
				
				break;
			}
			
			else if (firstChar < secondChar)
			{
				returnValue = -1;
				
				break;
			}
			
			else if (firstChar > secondChar)
			{
				returnValue = 1;
				
				break;
			}
			
			theFirstCStr++;
			theSecondCStr++;
		}
	}
	
	
	return(returnValue);
}



Boolean CStrsAreEqual(const char *theFirstCStr,const char *theSecondCStr,const Boolean ignoreCase)
{
	if (CompareCStrs(theFirstCStr,theSecondCStr,ignoreCase) == 0)
	{
		return true;
	}
	
	else
	{
		return false;
	}
}


Boolean PStrsAreEqual(const unsigned char *theFirstPStr,const unsigned char *theSecondPStr,const Boolean ignoreCase)
{
	if (ComparePStrs(theFirstPStr,theSecondPStr,ignoreCase) == 0)
	{
		return true;
	}
	
	else
	{
		return false;
	}
}



int ComparePStrs(const unsigned char *theFirstPStr,const unsigned char *theSecondPStr,const Boolean ignoreCase)
{
int		i,returnValue;
char	firstChar,secondChar;

	
	returnValue = 0;
	
	
	if (theFirstPStr != nil && theSecondPStr != nil)
	{
		for (i = 1;;i++)
		{
			firstChar = theFirstPStr[i];
			secondChar = theSecondPStr[i];

			if (ignoreCase == true)
			{
				if (firstChar >= 'A' && firstChar <= 'Z')
				{
					firstChar = 'a' + (firstChar - 'A');
				}
				
				if (secondChar >= 'A' && secondChar <= 'Z')
				{
					secondChar = 'a' + (secondChar - 'A');
				}
			}


			if (theFirstPStr[0] < i && theSecondPStr[0] >= i)
			{
				returnValue = -1;
				
				break;
			}
			
			else if (theFirstPStr[0] >= i && theSecondPStr[0] < i)
			{
				returnValue = 1;
				
				break;
			}
			
			else if (theFirstPStr[0] < i && theSecondPStr[0] < i)
			{
				returnValue = 0;
				
				break;
			}
			
			else if (firstChar < secondChar)
			{
				returnValue = -1;
				
				break;
			}
			
			else if (firstChar > secondChar)
			{
				returnValue = 1;
				
				break;
			}
		}
	}
	
	
	return(returnValue);
}



int CompareCStrToPStr(const char *theCStr,const unsigned char *thePStr,const Boolean ignoreCase)
{
int		returnValue;
char	tempString[256];

	
	returnValue = 0;
	
	if (theCStr != nil && thePStr != nil)
	{
		CopyPStrToCStr(thePStr,tempString,sizeof(tempString));
		
		returnValue = CompareCStrs(theCStr,tempString,ignoreCase);
	}
	
	
	return(returnValue);
}



void ConcatLongIntToCStr(const long theNum,char *theCStr,const int maxCStrLength,const int numDigits)
{
Str255 		theStr255;


	NumToString(theNum,theStr255);


	if (numDigits > 0)
	{
	int 	charsToInsert;
	
		
		charsToInsert = numDigits - PStrLength(theStr255);
		
		if (charsToInsert > 0)
		{
		char	tempString[256];
			
			CopyCStrToCStr("",tempString,sizeof(tempString));
			
			for (;charsToInsert > 0;charsToInsert--)
			{
				ConcatCStrToCStr("0",tempString,sizeof(tempString));
			}
			
			ConcatPStrToCStr(theStr255,tempString,sizeof(tempString));
			
			CopyCStrToPStr(tempString,theStr255,sizeof(theStr255));
		}
	}


	ConcatPStrToCStr(theStr255,theCStr,maxCStrLength);
}




void ConcatLongIntToPStr(const long theNum,unsigned char *thePStr,const int maxPStrLength,const int numDigits)
{
Str255 		theStr255;


	NumToString(theNum,theStr255);


	if (numDigits > 0)
	{
	int 	charsToInsert;
	
		
		charsToInsert = numDigits - PStrLength(theStr255);
		
		if (charsToInsert > 0)
		{
		char	tempString[256];
			
			CopyCStrToCStr("",tempString,sizeof(tempString));
			
			for (;charsToInsert > 0;charsToInsert--)
			{
				ConcatCStrToCStr("0",tempString,sizeof(tempString));
			}
			
			ConcatPStrToCStr(theStr255,tempString,sizeof(tempString));
			
			CopyCStrToPStr(tempString,theStr255,sizeof(theStr255));
		}
	}


	ConcatPStrToPStr(theStr255,thePStr,maxPStrLength);
}



void CopyCStrAndConcatLongIntToCStr(const char *theSrcCStr,const long theNum,char *theDstCStr,const int maxDstStrLength)
{
	CopyCStrToCStr(theSrcCStr,theDstCStr,maxDstStrLength);
	
	ConcatLongIntToCStr(theNum,theDstCStr,maxDstStrLength);
}



void CopyLongIntToCStr(const long theNum,char *theCStr,const int maxCStrLength,const int numDigits)
{
Str255 		theStr255;


	NumToString(theNum,theStr255);


	if (numDigits > 0)
	{
	int 	charsToInsert;
	
		
		charsToInsert = numDigits - PStrLength(theStr255);
		
		if (charsToInsert > 0)
		{
		char	tempString[256];
			
			CopyCStrToCStr("",tempString,sizeof(tempString));
			
			for (;charsToInsert > 0;charsToInsert--)
			{
				ConcatCStrToCStr("0",tempString,sizeof(tempString));
			}
			
			ConcatPStrToCStr(theStr255,tempString,sizeof(tempString));
			
			CopyCStrToPStr(tempString,theStr255,sizeof(theStr255));
		}
	}


	CopyPStrToCStr(theStr255,theCStr,maxCStrLength);
}





void CopyUnsignedLongIntToCStr(const unsigned long theNum,char *theCStr,const int maxCStrLength)
{
char			tempString[256];
int				srcCharIndex,dstCharIndex;
unsigned long	tempNum,quotient,remainder;

	
	if (theNum == 0)
	{
		CopyCStrToCStr("0",theCStr,maxCStrLength);
	}
	
	else
	{
		srcCharIndex = 0;
		
		tempNum = theNum;
		
		for (;;)
		{
			if (srcCharIndex >= sizeof(tempString) - 1 || tempNum == 0)
			{
				for (dstCharIndex = 0;;)
				{
					if (dstCharIndex >= maxCStrLength - 1 || srcCharIndex <= 0)
					{
						theCStr[dstCharIndex] = 0;
						
						break;
					}
					
					theCStr[dstCharIndex++] = tempString[--srcCharIndex];
				}
				
				break;
			}
			

			quotient = tempNum / 10;
			
			remainder = tempNum - (quotient * 10);
			
			tempString[srcCharIndex] = '0' + remainder;
			
			srcCharIndex++;
			
			tempNum = quotient;
		}
	}
}




void CopyLongIntToPStr(const long theNum,unsigned char *thePStr,const int maxPStrLength,const int numDigits)
{
char	tempString[256];


	CopyLongIntToCStr(theNum,tempString,sizeof(tempString),numDigits);
	
	CopyCStrToPStr(tempString,thePStr,maxPStrLength);
}



OSErr CopyLongIntToNewHandle(const long inTheLongInt,Handle *theHandle)
{
OSErr		errCode = noErr;
char		tempString[32];
	
	
	CopyLongIntToCStr(inTheLongInt,tempString,sizeof(tempString));
	
	errCode = CopyCStrToNewHandle(tempString,theHandle);

	return(errCode);
}


OSErr CopyLongIntToExistingHandle(const long inTheLongInt,Handle theHandle)
{
OSErr		errCode = noErr;
char		tempString[32];
	
	
	CopyLongIntToCStr(inTheLongInt,tempString,sizeof(tempString));
	
	errCode = CopyCStrToExistingHandle(tempString,theHandle);

	return(errCode);
}




OSErr CopyCStrToExistingHandle(const char *theCString,Handle theHandle)
{
OSErr	errCode = noErr;
long	stringLength;

	
	if (theCString == nil)
	{
		SetErrorMessageAndBail(("CopyCStrToExistingHandle: Bad parameter, theCString == nil"));
	}

	if (theHandle == nil)
	{
		SetErrorMessageAndBail(("CopyCStrToExistingHandle: Bad parameter, theHandle == nil"));
	}

	if (*theHandle == nil)
	{
		SetErrorMessageAndBail(("CopyCStrToExistingHandle: Bad parameter, *theHandle == nil"));
	}



	stringLength = CStrLength(theCString) + 1;
	
	SetHandleSize(theHandle,stringLength);
	
	if (GetHandleSize(theHandle) < stringLength)
	{
		SetErrorMessageAndLongIntAndBail("CopyCStrToExistingHandle: Can't set Handle size, MemError() = ",MemError());
	}
	
	
	::BlockMove(theCString,*theHandle,stringLength);
	

EXITPOINT:
	
	return(errCode);
}





OSErr CopyCStrToNewHandle(const char *theCString,Handle *theHandle)
{
OSErr	errCode = noErr;
long	stringLength;

	
	if (theCString == nil)
	{
		SetErrorMessageAndBail(("CopyCStrToNewHandle: Bad parameter, theCString == nil"));
	}

	if (theHandle == nil)
	{
		SetErrorMessageAndBail(("CopyCStrToNewHandle: Bad parameter, theHandle == nil"));
	}



	stringLength = CStrLength(theCString) + 1;
	
	*theHandle = NewHandle(stringLength);
	
	if (*theHandle == nil)
	{
		SetErrorMessageAndLongIntAndBail("CopyCStrToNewHandle: Can't allocate Handle, MemError() = ",MemError());
	}
	
	
	::BlockMove(theCString,**theHandle,stringLength);
	

EXITPOINT:
	
	return(errCode);
}



OSErr CopyPStrToNewHandle(const unsigned char *thePString,Handle *theHandle)
{
OSErr	errCode = noErr;
long	stringLength;

	
	if (thePString == nil)
	{
		SetErrorMessageAndBail(("CopyPStrToNewHandle: Bad parameter, thePString == nil"));
	}

	if (theHandle == nil)
	{
		SetErrorMessageAndBail(("CopyPStrToNewHandle: Bad parameter, theHandle == nil"));
	}



	stringLength = PStrLength(thePString) + 1;
	
	*theHandle = NewHandle(stringLength);
	
	if (*theHandle == nil)
	{
		SetErrorMessageAndLongIntAndBail("CopyPStrToNewHandle: Can't allocate Handle, MemError() = ",MemError());
	}
	
	
	if (stringLength > 1)
	{
		BlockMove(thePString + 1,**theHandle,stringLength - 1);
	}
	
	(**theHandle)[stringLength - 1] = 0;
	

EXITPOINT:
	
	return(errCode);
}


OSErr AppendPStrToHandle(const unsigned char *thePString,Handle theHandle,long *currentLength)
{
OSErr		errCode = noErr;
char		tempString[256];

	
	CopyPStrToCStr(thePString,tempString,sizeof(tempString));
	
	errCode = AppendCStrToHandle(tempString,theHandle,currentLength);
	

EXITPOINT:
	
	return(errCode);
}



OSErr AppendCStrToHandle(const char *theCString,Handle theHandle,long *currentLength,long *maxLength)
{
OSErr		errCode = noErr;
long		handleMaxLength,handleCurrentLength,stringLength,byteCount;


	if (theCString == nil)
	{
		SetErrorMessageAndBail(("AppendCStrToHandle: Bad parameter, theCString == nil"));
	}

	if (theHandle == nil)
	{
		SetErrorMessageAndBail(("AppendCStrToHandle: Bad parameter, theHandle == nil"));
	}
	
	
	if (maxLength != nil)
	{
		handleMaxLength = *maxLength;
	}
	
	else
	{
		handleMaxLength = GetHandleSize(theHandle);
	}
	
	
	if (currentLength != nil && *currentLength >= 0)
	{
		handleCurrentLength = *currentLength;
	}
	
	else
	{
		handleCurrentLength = CStrLength(*theHandle);
	}
	
	
	stringLength = CStrLength(theCString);
	
	byteCount = handleCurrentLength + stringLength + 1;
	
	if (byteCount > handleMaxLength)
	{
		SetHandleSize(theHandle,handleCurrentLength + stringLength + 1);
		
		if (maxLength != nil)
		{
			*maxLength = GetHandleSize(theHandle);
			
			handleMaxLength = *maxLength;
		}
		
		else
		{
			handleMaxLength = GetHandleSize(theHandle);
		}

		if (byteCount > handleMaxLength)
		{
			SetErrorMessageAndLongIntAndBail("AppendCStrToHandle: Can't increase Handle allocation, MemError() = ",MemError());
		}
	}
	
	
	BlockMove(theCString,*theHandle + handleCurrentLength,stringLength + 1);
	
	
	if (currentLength != nil)
	{
		*currentLength += stringLength;
	}


	errCode = noErr;
	
	
EXITPOINT:

	return(errCode);
}



OSErr AppendCharsToHandle(const char *theChars,const int numChars,Handle theHandle,long *currentLength,long *maxLength)
{
OSErr		errCode = noErr;
long		handleMaxLength,handleCurrentLength,byteCount;


	if (theChars == nil)
	{
		SetErrorMessageAndBail(("AppendCharsToHandle: Bad parameter, theChars == nil"));
	}

	if (theHandle == nil)
	{
		SetErrorMessageAndBail(("AppendCharsToHandle: Bad parameter, theHandle == nil"));
	}
	
	
	if (maxLength != nil)
	{
		handleMaxLength = *maxLength;
	}
	
	else
	{
		handleMaxLength = GetHandleSize(theHandle);
	}
	
	
	if (currentLength != nil && *currentLength >= 0)
	{
		handleCurrentLength = *currentLength;
	}
	
	else
	{
		handleCurrentLength = CStrLength(*theHandle);
	}
	
	
	byteCount = handleCurrentLength + numChars + 1;
	
	if (byteCount > handleMaxLength)
	{
		SetHandleSize(theHandle,handleCurrentLength + numChars + 1);
		
		if (maxLength != nil)
		{
			*maxLength = GetHandleSize(theHandle);
			
			handleMaxLength = *maxLength;
		}
		
		else
		{
			handleMaxLength = GetHandleSize(theHandle);
		}

		if (byteCount > handleMaxLength)
		{
			SetErrorMessageAndLongIntAndBail("AppendCharsToHandle: Can't increase Handle allocation, MemError() = ",MemError());
		}
	}
	
	
	BlockMove(theChars,*theHandle + handleCurrentLength,numChars);
	
	(*theHandle)[handleCurrentLength + numChars] = '\0';
	
	if (currentLength != nil)
	{
		*currentLength += numChars;
	}


	errCode = noErr;
	
	
EXITPOINT:

	return(errCode);
}



OSErr AppendLongIntToHandle(const long inTheLongInt,Handle theHandle,long *currentLength)
{
OSErr		errCode = noErr;
char		tempString[32];
	
	
	CopyLongIntToCStr(inTheLongInt,tempString,sizeof(tempString));
	
	errCode = AppendCStrToHandle(tempString,theHandle,currentLength);

	return(errCode);
}




long CStrLength(const char *theCString)
{
long	cStrLength = 0;

	
	if (theCString != nil)
	{
		for (cStrLength = 0;theCString[cStrLength] != 0;cStrLength++)
		{
		
		}
	}
	
	
	return(cStrLength);
}



long PStrLength(const unsigned char *thePString)
{
long	pStrLength = 0;

	
	if (thePString != nil)
	{
		pStrLength = thePString[0];
	}
	
	
	return(pStrLength);
}





void ZeroMem(void *theMemPtr,const unsigned long numBytes)
{
unsigned char	*theBytePtr;
unsigned long	*theLongPtr;
unsigned long	numSingleBytes;
unsigned long	theNumBytes;

	
	theNumBytes = numBytes;
	
	if (theMemPtr != nil && theNumBytes > 0)
	{
		theBytePtr = (unsigned char	*) theMemPtr;
		
		numSingleBytes = (unsigned long) theBytePtr & 0x0003;
		
		while (numSingleBytes > 0)
		{
			*theBytePtr++ = 0;
			
			theNumBytes--;
			numSingleBytes--;
		}
		

		theLongPtr = (unsigned long	*) theBytePtr;
		
		while (theNumBytes >= 4)
		{
			*theLongPtr++ = 0;
			
			theNumBytes -= 4;
		}
		
		
		theBytePtr = (unsigned char	*) theLongPtr;
		
		while (theNumBytes > 0)
		{
			*theBytePtr++ = 0;
			
			theNumBytes--;
		}
	}
}




char *FindCharInCStr(const char theChar,const char *theCString)
{
char	*theStringSearchPtr;

	
	theStringSearchPtr = (char	*) theCString;
	
	if (theStringSearchPtr != nil)
	{
		while (*theStringSearchPtr != '\0' && *theStringSearchPtr != theChar)
		{
			theStringSearchPtr++;
		}
		
		if (*theStringSearchPtr == '\0')
		{
			theStringSearchPtr = nil;
		}
	}
	
	return(theStringSearchPtr);
}



long FindCharOffsetInCStr(const char theChar,const char *theCString,const Boolean inIgnoreCase)
{
long	theOffset = -1;


	if (theCString != nil)
	{
		theOffset = 0;
		

		if (inIgnoreCase)
		{
		char	searchChar = theChar;
		
			if (searchChar >= 'a' && searchChar <= 'z')
			{
				searchChar = searchChar - 'a' + 'A';
			}
			
			
			while (*theCString != 0)
			{
			char	currentChar = *theCString;
			
				if (currentChar >= 'a' && currentChar <= 'z')
				{
					currentChar = currentChar - 'a' + 'A';
				}
			
				if (currentChar == searchChar)
				{
					break;
				}
				
				theCString++;
				theOffset++;
			}
		}
		
		else
		{
			while (*theCString != 0 && *theCString != theChar)
			{
				theCString++;
				theOffset++;
			}
		}
		
		if (*theCString == 0)
		{
			theOffset = -1;
		}
	}
	
	return(theOffset);
}


long FindCStrOffsetInCStr(const char *theCSubstring,const char *theCString,const Boolean inIgnoreCase)
{
long	theOffset = -1;


	if (theCSubstring != nil && theCString != nil)
	{
		for (theOffset = 0;;theOffset++)
		{
			if (theCString[theOffset] == 0)
			{
				theOffset = -1;
				
				goto EXITPOINT;
			}
			
			
			for (const char	*tempSubstringPtr = theCSubstring,*tempCStringPtr = theCString + theOffset;;tempSubstringPtr++,tempCStringPtr++)
			{
				if (*tempSubstringPtr == 0)
				{
					goto EXITPOINT;
				}
				
				else if (*tempCStringPtr == 0)
				{
					break;
				}
			
			char	searchChar = *tempSubstringPtr;
			char	currentChar = *tempCStringPtr;
			
				if (inIgnoreCase && searchChar >= 'a' && searchChar <= 'z')
				{
					searchChar = searchChar - 'a' + 'A';
				}
				
				if (inIgnoreCase && currentChar >= 'a' && currentChar <= 'z')
				{
					currentChar = currentChar - 'a' + 'A';
				}
				
				if (currentChar != searchChar)
				{
					break;
				}
			}
		}
		
		theOffset = -1;
	}


EXITPOINT:
	
	return(theOffset);
}



void InsertCStrIntoCStr(const char *theSrcCStr,const int theInsertionOffset,char *theDstCStr,const int maxDstStrLength)
{
int		currentLength;
int		insertLength;
int		numCharsToInsert;
int		numCharsToShift;

	
	if (theDstCStr != nil && theSrcCStr != nil && maxDstStrLength > 0 && theInsertionOffset < maxDstStrLength - 1)
	{
		currentLength = CStrLength(theDstCStr);
		
		insertLength = CStrLength(theSrcCStr);
		

		if (theInsertionOffset + insertLength < maxDstStrLength - 1)
		{
			numCharsToInsert = insertLength;
		}
		
		else
		{
			numCharsToInsert = maxDstStrLength - 1 - theInsertionOffset;
		}
		

		if (numCharsToInsert + currentLength < maxDstStrLength - 1)
		{
			numCharsToShift = currentLength - theInsertionOffset;
		}
		
		else
		{
			numCharsToShift = maxDstStrLength - 1 - theInsertionOffset - numCharsToInsert;
		}

		
		if (numCharsToShift > 0)
		{
			BlockMove(theDstCStr + theInsertionOffset,theDstCStr + theInsertionOffset + numCharsToInsert,numCharsToShift);
		}
		
		if (numCharsToInsert > 0)
		{
			BlockMove(theSrcCStr,theDstCStr + theInsertionOffset,numCharsToInsert);
		}
		
		theDstCStr[theInsertionOffset + numCharsToInsert + numCharsToShift] = 0;
	}
}



void InsertPStrIntoCStr(const unsigned char *theSrcPStr,const int theInsertionOffset,char *theDstCStr,const int maxDstStrLength)
{
int		currentLength;
int		insertLength;
int		numCharsToInsert;
int		numCharsToShift;

	
	if (theDstCStr != nil && theSrcPStr != nil && maxDstStrLength > 0 && theInsertionOffset < maxDstStrLength - 1)
	{
		currentLength = CStrLength(theDstCStr);
		
		insertLength = PStrLength(theSrcPStr);
		

		if (theInsertionOffset + insertLength < maxDstStrLength - 1)
		{
			numCharsToInsert = insertLength;
		}
		
		else
		{
			numCharsToInsert = maxDstStrLength - 1 - theInsertionOffset;
		}
		

		if (numCharsToInsert + currentLength < maxDstStrLength - 1)
		{
			numCharsToShift = currentLength - theInsertionOffset;
		}
		
		else
		{
			numCharsToShift = maxDstStrLength - 1 - theInsertionOffset - numCharsToInsert;
		}

		
		if (numCharsToShift > 0)
		{
			BlockMove(theDstCStr + theInsertionOffset,theDstCStr + theInsertionOffset + numCharsToInsert,numCharsToShift);
		}
		
		if (numCharsToInsert > 0)
		{
			BlockMove(theSrcPStr + 1,theDstCStr + theInsertionOffset,numCharsToInsert);
		}
		
		theDstCStr[theInsertionOffset + numCharsToInsert + numCharsToShift] = 0;
	}
}



OSErr InsertCStrIntoHandle(const char *theCString,Handle theHandle,const long inInsertOffset)
{
OSErr	errCode;
int		currentLength;
int		insertLength;

	
	SetErrorMessageAndBailIfNil(theCString,"InsertCStrIntoHandle: Bad parameter, theCString == nil");

	SetErrorMessageAndBailIfNil(theHandle,"InsertCStrIntoHandle: Bad parameter, theHandle == nil");
	
	currentLength = CStrLength(*theHandle);
	
	if (currentLength + 1 > ::GetHandleSize(theHandle))
	{
		SetErrorMessageAndBail("InsertCStrIntoHandle: Handle has been overflowed");
	}
	
	if (inInsertOffset > currentLength)
	{
		SetErrorMessageAndBail("InsertCStrIntoHandle: Insertion offset is greater than string length");
	}
	
	insertLength = CStrLength(theCString);
	
	::SetHandleSize(theHandle,currentLength + 1 + insertLength);
	
	if (::GetHandleSize(theHandle) < currentLength + 1 + insertLength)
	{
		SetErrorMessageAndLongIntAndBail("InsertCStrIntoHandle: Can't expand storage for Handle, MemError() = ",MemError());
	}
	
	::BlockMove(*theHandle + inInsertOffset,*theHandle + inInsertOffset + insertLength,currentLength - inInsertOffset + 1);
	
	::BlockMove(theCString,*theHandle + inInsertOffset,insertLength);


	errCode = noErr;
	
	
EXITPOINT:

	return(errCode);
}




void CopyCStrAndInsert1LongIntIntoCStr(const char *theSrcCStr,const long theNum,char *theDstCStr,const int maxDstStrLength)
{
	CopyCStrAndInsertCStrLongIntIntoCStr(theSrcCStr,nil,theNum,theDstCStr,maxDstStrLength);
}


void CopyCStrAndInsert2LongIntsIntoCStr(const char *theSrcCStr,const long long1,const long long2,char *theDstCStr,const int maxDstStrLength)
{
const long	theLongInts[] = { long1,long2 };

	CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,nil,theLongInts,theDstCStr,maxDstStrLength);
}


void CopyCStrAndInsert3LongIntsIntoCStr(const char *theSrcCStr,const long long1,const long long2,const long long3,char *theDstCStr,const int maxDstStrLength)
{
const long	theLongInts[] = { long1,long2,long3 };

	CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,nil,theLongInts,theDstCStr,maxDstStrLength);
}


void CopyCStrAndInsertCStrIntoCStr(const char *theSrcCStr,const char *theInsertCStr,char *theDstCStr,const int maxDstStrLength)
{
const char	*theCStrs[2] = { theInsertCStr,nil };

	CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,theCStrs,nil,theDstCStr,maxDstStrLength);
}



void CopyCStrAndInsertCStrLongIntIntoCStr(const char *theSrcCStr,const char *theInsertCStr,const long theNum,char *theDstCStr,const int maxDstStrLength)
{
const char	*theCStrs[2] = { theInsertCStr,nil };
const long	theLongInts[1] = { theNum };

	CopyCStrAndInsertCStrsLongIntsIntoCStr(theSrcCStr,theCStrs,theLongInts,theDstCStr,maxDstStrLength);
}



void CopyCStrAndInsertCStrsLongIntsIntoCStr(const char *theSrcCStr,const char **theInsertCStrs,const long *theLongInts,char *theDstCStr,const int maxDstStrLength)
{
int			dstCharIndex,srcCharIndex,theMaxDstStrLength;
int			theCStrIndex = 0;
int			theLongIntIndex = 0;

	
	theMaxDstStrLength = maxDstStrLength;
	
	if (theDstCStr != nil && theSrcCStr != nil && theMaxDstStrLength > 0)
	{
		dstCharIndex = 0;
		
		srcCharIndex = 0;
		
		
		//	Allow room for NULL at end of string
		
		theMaxDstStrLength--;
		
		
		for (;;)
		{
			//	Hit end of buffer?
			
			if (dstCharIndex >= theMaxDstStrLength)
			{
				theDstCStr[dstCharIndex++] = 0;
				
				goto EXITPOINT;
			}
			
			//	End of source string?
			
			else if (theSrcCStr[srcCharIndex] == 0)
			{
				theDstCStr[dstCharIndex++] = 0;
				
				goto EXITPOINT;
			}
			
			//	Did we find a '%s'?
			
			else if (theInsertCStrs != nil && theInsertCStrs[theCStrIndex] != nil && theSrcCStr[srcCharIndex] == '%' && theSrcCStr[srcCharIndex + 1] == 's')
			{
				//	Skip over the '%s'
				
				srcCharIndex += 2;
				
				
				//	Terminate the dest string and then concat the string
				
				theDstCStr[dstCharIndex] = 0;
				
				ConcatCStrToCStr(theInsertCStrs[theCStrIndex],theDstCStr,theMaxDstStrLength);
				
				dstCharIndex = CStrLength(theDstCStr);
				
				theCStrIndex++;
			}
			
			//	Did we find a '%ld'?
			
			else if (theLongInts != nil && theSrcCStr[srcCharIndex] == '%' && theSrcCStr[srcCharIndex + 1] == 'l' && theSrcCStr[srcCharIndex + 2] == 'd')
			{
				//	Skip over the '%ld'
				
				srcCharIndex += 3;
				
				
				//	Terminate the dest string and then concat the number
				
				theDstCStr[dstCharIndex] = 0;
				
				ConcatLongIntToCStr(theLongInts[theLongIntIndex],theDstCStr,theMaxDstStrLength);
				
				theLongIntIndex++;
				
				dstCharIndex = CStrLength(theDstCStr);
			}
			
			else
			{
				theDstCStr[dstCharIndex++] = theSrcCStr[srcCharIndex++];
			}
		}
	}



EXITPOINT:

	return;
}





OSErr CopyCStrAndInsertCStrLongIntIntoHandle(const char *theSrcCStr,const char *theInsertCStr,const long theNum,Handle *theHandle)
{
OSErr	errCode;
long	byteCount;

	
	if (theHandle != nil)
	{
		byteCount = CStrLength(theSrcCStr) + CStrLength(theInsertCStr) + 32;
		
		*theHandle = NewHandle(byteCount);
		
		if (*theHandle == nil)
		{
			SetErrorMessageAndLongIntAndBail("CopyCStrAndInsertCStrLongIntIntoHandle: Can't allocate Handle, MemError() = ",MemError());
		}
		
		
		HLock(*theHandle);
		
		CopyCStrAndInsertCStrLongIntIntoCStr(theSrcCStr,theInsertCStr,theNum,**theHandle,byteCount);
		
		HUnlock(*theHandle);
	}
	
	errCode = noErr;
	
	
EXITPOINT:

	return(errCode);
}





OSErr CopyIndexedWordToCStr(char *theSrcCStr,int whichWord,char *theDstCStr,int maxDstCStrLength)
{
OSErr		errCode;
char		*srcCharPtr,*dstCharPtr;
int			wordCount;
int			byteCount;


	if (theSrcCStr == nil)
	{
		SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, theSrcCStr == nil"));
	}
	
	if (theDstCStr == nil)
	{
		SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, theDstCStr == nil"));
	}
	
	if (whichWord < 0)
	{
		SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, whichWord < 0"));
	}
	
	if (maxDstCStrLength <= 0)
	{
		SetErrorMessageAndBail(("CopyIndexedWordToCStr: Bad parameter, maxDstCStrLength <= 0"));
	}

	
	*theDstCStr = '\0';
	
	srcCharPtr = theSrcCStr;

	while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
	{
		srcCharPtr++;
	}
	

	for (wordCount = 0;wordCount < whichWord;wordCount++)
	{
		while (*srcCharPtr != ' ' && *srcCharPtr != '\t' && *srcCharPtr != '\r' && *srcCharPtr != '\n' && *srcCharPtr != '\0')
		{
			srcCharPtr++;
		}
		
		if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
		{
			errCode = noErr;
			
			goto EXITPOINT;
		}

		while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
		{
			srcCharPtr++;
		}
		
		if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
		{
			errCode = noErr;
			
			goto EXITPOINT;
		}
	}


	dstCharPtr = theDstCStr;
	byteCount = 0;
	
	
	for(;;)
	{
		if (byteCount >= maxDstCStrLength - 1 || *srcCharPtr == '\0' || *srcCharPtr == ' ' || *srcCharPtr == '\t' || *srcCharPtr == '\r' || *srcCharPtr == '\n')
		{
			*dstCharPtr = '\0';
			break;
		}
		
		*dstCharPtr++ = *srcCharPtr++;
		
		byteCount++;
	}


	errCode = noErr;


EXITPOINT:

	return(errCode);
}





OSErr CopyIndexedWordToNewHandle(char *theSrcCStr,int whichWord,Handle *outTheHandle)
{
OSErr		errCode;
char		*srcCharPtr;
int			wordCount;
int			byteCount;


	if (theSrcCStr == nil)
	{
		SetErrorMessageAndBail(("CopyIndexedWordToNewHandle: Bad parameter, theSrcCStr == nil"));
	}
	
	if (outTheHandle == nil)
	{
		SetErrorMessageAndBail(("CopyIndexedWordToNewHandle: Bad parameter, outTheHandle == nil"));
	}
	
	if (whichWord < 0)
	{
		SetErrorMessageAndBail(("CopyIndexedWordToNewHandle: Bad parameter, whichWord < 0"));
	}

	
	*outTheHandle = nil;
	

	srcCharPtr = theSrcCStr;

	while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
	{
		srcCharPtr++;
	}
	

	for (wordCount = 0;wordCount < whichWord;wordCount++)
	{
		while (*srcCharPtr != ' ' && *srcCharPtr != '\t' && *srcCharPtr != '\r' && *srcCharPtr != '\n' && *srcCharPtr != '\0')
		{
			srcCharPtr++;
		}
		
		if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
		{
			break;
		}

		while (*srcCharPtr == ' ' || *srcCharPtr == '\t')
		{
			srcCharPtr++;
		}
		
		if (*srcCharPtr == '\r' || *srcCharPtr == '\n' || *srcCharPtr == '\0')
		{
			break;
		}
	}


	for (byteCount = 0;;byteCount++)
	{
		if (srcCharPtr[byteCount] == ' ' || srcCharPtr[byteCount] == '\t' || srcCharPtr[byteCount] == '\r' || srcCharPtr[byteCount] == '\n' || srcCharPtr[byteCount] == '\0')
		{
			break;
		}
	}

	
	*outTheHandle = NewHandle(byteCount + 1);
	
	if (*outTheHandle == nil)
	{
		SetErrorMessageAndLongIntAndBail("CopyIndexedWordToNewHandle: Can't allocate Handle, MemError() = ",MemError());
	}
	
	
	::BlockMove(srcCharPtr,**outTheHandle,byteCount);
	
	(**outTheHandle)[byteCount] = '\0';

	errCode = noErr;


EXITPOINT:

	return(errCode);
}



OSErr CopyIndexedLineToCStr(const char *theSrcCStr,int inWhichLine,int *lineEndIndex,Boolean *gotLastLine,char *theDstCStr,const int maxDstCStrLength)
{
OSErr		errCode;
int			theCurrentLine;
int			theCurrentLineOffset;
int			theEOSOffset;


	if (theSrcCStr == nil)
	{
		SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, theSrcCStr == nil"));
	}
	
	if (theDstCStr == nil)
	{
		SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, theDstCStr == nil"));
	}
	
	if (inWhichLine < 0)
	{
		SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, inWhichLine < 0"));
	}
	
	if (maxDstCStrLength <= 0)
	{
		SetErrorMessageAndBail(("CopyIndexedLineToCStr: Bad parameter, maxDstCStrLength <= 0"));
	}
	
	
	if (gotLastLine != nil)
	{
		*gotLastLine = false;
	}

	
	*theDstCStr = 0;
	
	theCurrentLineOffset = 0;
	
	theCurrentLine = 0;
	
	
	while (theCurrentLine < inWhichLine)
	{
		while (theSrcCStr[theCurrentLineOffset] != '\r' && theSrcCStr[theCurrentLineOffset] != 0)
		{
			theCurrentLineOffset++;
		}
		
		if (theSrcCStr[theCurrentLineOffset] == 0)
		{
			break;
		}
		
		theCurrentLineOffset++;
		theCurrentLine++;
	}
		
	if (theSrcCStr[theCurrentLineOffset] == 0)
	{
		SetErrorMessageAndLongIntAndBail("CopyIndexedLineToCStr: Too few lines in source text, can't get line ",inWhichLine);
	}


	theEOSOffset = FindCharOffsetInCStr('\r',theSrcCStr + theCurrentLineOffset);
	
	if (theEOSOffset >= 0)
	{
		CopyCSubstrToCStr(theSrcCStr + theCurrentLineOffset,theEOSOffset,theDstCStr,maxDstCStrLength);
		
		if (gotLastLine != nil)
		{
			*gotLastLine = false;
		}
	
		if (lineEndIndex != nil)
		{
			*lineEndIndex = theEOSOffset;
		}
	}
	
	else
	{
		theEOSOffset = CStrLength(theSrcCStr + theCurrentLineOffset);

		CopyCSubstrToCStr(theSrcCStr + theCurrentLineOffset,theEOSOffset,theDstCStr,maxDstCStrLength);
		
		if (gotLastLine != nil)
		{
			*gotLastLine = true;
		}
	
		if (lineEndIndex != nil)
		{
			*lineEndIndex = theEOSOffset;
		}
	}
	

	errCode = noErr;


EXITPOINT:

	return(errCode);
}



OSErr CopyIndexedLineToNewHandle(const char *theSrcCStr,int inWhichLine,Handle *outNewHandle)
{
OSErr		errCode;
int			theCurrentLine;
int			theCurrentLineOffset;
int			byteCount;


	SetErrorMessageAndBailIfNil(theSrcCStr,"CopyIndexedLineToNewHandle: Bad parameter, theSrcCStr == nil");
	SetErrorMessageAndBailIfNil(outNewHandle,"CopyIndexedLineToNewHandle: Bad parameter, outNewHandle == nil");
	
	if (inWhichLine < 0)
	{
		SetErrorMessageAndBail(("CopyIndexedLineToNewHandle: Bad parameter, inWhichLine < 0"));
	}
	

	theCurrentLineOffset = 0;
	
	theCurrentLine = 0;
	
	
	while (theCurrentLine < inWhichLine)
	{
		while (theSrcCStr[theCurrentLineOffset] != '\r' && theSrcCStr[theCurrentLineOffset] != '\0')
		{
			theCurrentLineOffset++;
		}
		
		if (theSrcCStr[theCurrentLineOffset] == '\0')
		{
			break;
		}
		
		theCurrentLineOffset++;
		theCurrentLine++;
	}
		
	if (theSrcCStr[theCurrentLineOffset] == '\0')
	{
		SetErrorMessageAndLongIntAndBail("CopyIndexedLineToNewHandle: Too few lines in source text, can't get line #",inWhichLine);
	}

	
	byteCount = 0;
	
	while (theSrcCStr[theCurrentLineOffset + byteCount] != '\r' && theSrcCStr[theCurrentLineOffset + byteCount] != '\0')
	{
		byteCount++;
	}
		
	
	*outNewHandle = NewHandle(byteCount + 1);
	
	if (*outNewHandle == nil)
	{
		SetErrorMessageAndLongIntAndBail("CopyIndexedLineToNewHandle: Can't allocate Handle, MemError() = ",MemError());
	}
	
	::BlockMove(theSrcCStr + theCurrentLineOffset,**outNewHandle,byteCount);
	
	(**outNewHandle)[byteCount] = '\0';

	errCode = noErr;


EXITPOINT:

	return(errCode);
}




OSErr CountDigits(const char *inCStr,int *outNumIntegerDigits,int *outNumFractDigits)
{
OSErr	errCode = noErr;
int		numIntDigits = 0;
int		numFractDigits = 0;
int 	digitIndex = 0;

	
	SetErrorMessageAndBailIfNil(inCStr,"CountDigits: Bad parameter, theSrcCStr == nil");
	SetErrorMessageAndBailIfNil(outNumIntegerDigits,"CountDigits: Bad parameter, outNumIntegerDigits == nil");
	SetErrorMessageAndBailIfNil(outNumFractDigits,"CountDigits: Bad parameter, outNumFractDigits == nil");
	
	digitIndex = 0;
	
	while (inCStr[digitIndex] >= '0' && inCStr[digitIndex] <= '9')
	{
		digitIndex++;
		numIntDigits++;
	}
	
	if (inCStr[digitIndex] == '.')
	{
		digitIndex++;
		
		while (inCStr[digitIndex] >= '0' && inCStr[digitIndex] <= '9')
		{
			digitIndex++;
			numFractDigits++;
		}
	}
	
	*outNumIntegerDigits = numIntDigits;
	
	*outNumFractDigits = numFractDigits;
	
	errCode = noErr;
	
EXITPOINT:

	return(errCode);
}



OSErr ExtractIntFromCStr(const char *theSrcCStr,int *outInt,Boolean skipLeadingSpaces)
{
OSErr		errCode;
int			theCharIndex;


	if (theSrcCStr == nil)
	{
		SetErrorMessageAndBail(("ExtractIntFromCStr: Bad parameter, theSrcCStr == nil"));
	}
	
	if (outInt == nil)
	{
		SetErrorMessageAndBail(("ExtractIntFromCStr: Bad parameter, outInt == nil"));
	}	

	
	*outInt = 0;
	
	theCharIndex = 0;
	
	if (skipLeadingSpaces == true)
	{
		while (theSrcCStr[theCharIndex] == ' ')
		{
			theCharIndex++;
		}
	}
	
	if (theSrcCStr[theCharIndex] < '0' || theSrcCStr[theCharIndex] > '9')
	{
		SetErrorMessageAndBail(("ExtractIntFromCStr: Bad parameter, theSrcCStr contains a bogus numeric representation"));
	}


	while (theSrcCStr[theCharIndex] >= '0' && theSrcCStr[theCharIndex] <= '9')
	{
		*outInt = (*outInt * 10) + (theSrcCStr[theCharIndex] - '0');
		
		theCharIndex++;
	}
	

	errCode = noErr;


EXITPOINT:

	return(errCode);
}



OSErr ExtractIntFromPStr(const unsigned char *theSrcPStr,int *outInt,Boolean skipLeadingSpaces)
{
OSErr		errCode;
char		theCStr[256];


	if (theSrcPStr == nil)
	{
		SetErrorMessageAndBail(("ExtractIntFromPStr: Bad parameter, theSrcPStr == nil"));
	}
	
	if (outInt == nil)
	{
		SetErrorMessageAndBail(("ExtractIntFromPStr: Bad parameter, outInt == nil"));
	}
	
	
	CopyPStrToCStr(theSrcPStr,theCStr,sizeof(theCStr));
	
	
	errCode = ExtractIntFromCStr(theCStr,outInt,skipLeadingSpaces);


EXITPOINT:

	return(errCode);
}



int CountOccurencesOfCharInCStr(const char inChar,const char *inSrcCStr)
{
int		theSrcCharIndex;
int		numOccurrences = -1;


	if (inSrcCStr != nil && inChar != '\0')
	{
		numOccurrences = 0;
		
		for (theSrcCharIndex = 0;inSrcCStr[theSrcCharIndex] != '\0';theSrcCharIndex++)
		{
			if (inSrcCStr[theSrcCharIndex] == inChar)
			{
				numOccurrences++;
			}
		}
	}
	
	return(numOccurrences);
}


int CountWordsInCStr(const char *inSrcCStr)
{
int		numWords = -1;


	if (inSrcCStr != nil)
	{
		numWords = 0;
		
		//	Skip lead spaces
		
		while (*inSrcCStr == ' ')
		{
			inSrcCStr++;
		}

		while (*inSrcCStr != '\0')
		{
			numWords++;

			while (*inSrcCStr != ' ' && *inSrcCStr != '\0')
			{
				inSrcCStr++;
			}
			
			while (*inSrcCStr == ' ')
			{
				inSrcCStr++;
			}
		}
	}
	
	return(numWords);
}




void ConvertCStrToUpperCase(char *theSrcCStr)
{
char		*theCharPtr;


	if (theSrcCStr != nil)
	{
		theCharPtr = theSrcCStr;
		
		while (*theCharPtr != 0)
		{
			if (*theCharPtr >= 'a' && *theCharPtr <= 'z')
			{
				*theCharPtr = *theCharPtr - 'a' + 'A';
			}
			
			theCharPtr++;
		}
	}
}







void ExtractCStrItemFromCStr(const char *inSrcCStr,const char inItemDelimiter,const int inItemNumber,Boolean *foundItem,char *outDstCharPtr,const int inDstCharPtrMaxLength,const Boolean inTreatMultipleDelimsAsSingleDelim)
{
int		theItem;
int		theSrcCharIndex;
int		theDstCharIndex;


	if (foundItem != nil)
	{
		*foundItem = false;
	}
	
	
	if (outDstCharPtr != nil && inDstCharPtrMaxLength > 0 && inItemNumber >= 0 && inItemDelimiter != 0)
	{
		*outDstCharPtr = 0;
		

		theSrcCharIndex = 0;
		
		for (theItem = 0;theItem < inItemNumber;theItem++)
		{
			while (inSrcCStr[theSrcCharIndex] != inItemDelimiter && inSrcCStr[theSrcCharIndex] != '\0')
			{
				theSrcCharIndex++;
			}
			
			if (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
			{
				theSrcCharIndex++;
				
				if (inTreatMultipleDelimsAsSingleDelim)
				{
					while (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
					{
						theSrcCharIndex++;
					}
				}
			}
			
			
			if (inSrcCStr[theSrcCharIndex] == '\0')
			{
				goto EXITPOINT;
			}
		}
		

		if (foundItem != nil)
		{
			*foundItem = true;
		}
		
		
		theDstCharIndex = 0;
		
		for (;;)
		{
			if (inSrcCStr[theSrcCharIndex] == 0 || inSrcCStr[theSrcCharIndex] == inItemDelimiter || theDstCharIndex >= inDstCharPtrMaxLength - 1)
			{
				outDstCharPtr[theDstCharIndex] = 0;
				
				break;
			}
			
			outDstCharPtr[theDstCharIndex++] = inSrcCStr[theSrcCharIndex++];
		}
	}
	
	
EXITPOINT:

	return;
}



OSErr ExtractCStrItemFromCStrIntoNewHandle(const char *inSrcCStr,const char inItemDelimiter,const int inItemNumber,Boolean *foundItem,Handle *outNewHandle,const Boolean inTreatMultipleDelimsAsSingleDelim)
{
OSErr	errCode;
int		theItem;
int		theSrcCharIndex;
int		theItemLength;


	if (inSrcCStr == nil)
	{
		SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, inSrcCStr == nil");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	if (outNewHandle == nil)
	{
		SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, outNewHandle == nil");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	if (foundItem == nil)
	{
		SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, foundItem == nil");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	if (inItemNumber < 0)
	{
		SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, inItemNumber < 0");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	if (inItemDelimiter == 0)
	{
		SetErrorMessage("ExtractCStrItemFromCStrIntoNewHandle: Bad parameter, inItemDelimiter == 0");
		errCode = kGenericError;
		goto EXITPOINT;
	}


	*foundItem = false;
	
	theSrcCharIndex = 0;
	
	for (theItem = 0;theItem < inItemNumber;theItem++)
	{
		while (inSrcCStr[theSrcCharIndex] != inItemDelimiter && inSrcCStr[theSrcCharIndex] != '\0')
		{
			theSrcCharIndex++;
		}
		
		if (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
		{
			theSrcCharIndex++;
			
			if (inTreatMultipleDelimsAsSingleDelim)
			{
				while (inSrcCStr[theSrcCharIndex] == inItemDelimiter)
				{
					theSrcCharIndex++;
				}
			}
		}
		
		
		if (inSrcCStr[theSrcCharIndex] == '\0')
		{
			errCode = noErr;
			
			goto EXITPOINT;
		}
	}
	

	*foundItem = true;
	
	
	for (theItemLength = 0;;theItemLength++)
	{
		if (inSrcCStr[theSrcCharIndex + theItemLength] == 0 || inSrcCStr[theSrcCharIndex + theItemLength] == inItemDelimiter)
		{
			break;
		}
	}
	

	*outNewHandle = NewHandle(theItemLength + 1);
	
	if (*outNewHandle == nil)
	{
		SetErrorMessageAndLongIntAndBail("ExtractCStrItemFromCStrIntoNewHandle: Can't allocate Handle, MemError() = ",MemError());
	}
	
	
	BlockMove(inSrcCStr + theSrcCharIndex,**outNewHandle,theItemLength);
	
	(**outNewHandle)[theItemLength] = 0;
	
	errCode = noErr;
	
	
EXITPOINT:

	return(errCode);
}






OSErr ExtractFloatFromCStr(const char *inCString,extended80 *outFloat)
{
OSErr				errCode;
Str255				theStr255;
Handle				theNumberPartsTableHandle = nil;
long				theNumberPartsOffset,theNumberPartsLength;
FormatResultType	theFormatResultType;
NumberParts			theNumberPartsTable;
NumFormatStringRec	theNumFormatStringRec;


	if (inCString == nil)
	{
		SetErrorMessage("ExtractFloatFromCStr: Bad parameter, inCString == nil");
		errCode = kGenericError;
		goto EXITPOINT;
	}

	if (outFloat == nil)
	{
		SetErrorMessage("ExtractFloatFromCStr: Bad parameter, outFloat == nil");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	
//	GetIntlResourceTable(smRoman,smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);

	GetIntlResourceTable(GetScriptManagerVariable(smSysScript),smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);	
	
	if (theNumberPartsTableHandle == nil)
	{
		SetErrorMessage("ExtractFloatFromCStr: Can't get number parts table for converting string representations to/from numeric representations");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	if (theNumberPartsLength > sizeof(theNumberPartsTable))
	{
		SetErrorMessage("ExtractFloatFromCStr: Number parts table has bad length");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	

	BlockMove(*theNumberPartsTableHandle + theNumberPartsOffset,&theNumberPartsTable,theNumberPartsLength);
	
	
	theFormatResultType = (FormatResultType) StringToFormatRec(kNumberFormatString,&theNumberPartsTable,&theNumFormatStringRec);
	
	if (theFormatResultType != fFormatOK)
	{
		SetErrorMessage("ExtractFloatFromCStr: StringToFormatRec() != fFormatOK");
		errCode = kGenericError;
		goto EXITPOINT;
	}

	
	CopyCStrToPStr(inCString,theStr255,sizeof(theStr255));


	theFormatResultType = (FormatResultType) StringToExtended(theStr255,&theNumFormatStringRec,&theNumberPartsTable,outFloat);
	
	if (theFormatResultType != fFormatOK && theFormatResultType != fBestGuess)
	{
		SetErrorMessageAndLongIntAndBail("ExtractFloatFromCStr: StringToExtended() = ",theFormatResultType);
	}

	
	errCode = noErr;
	

EXITPOINT:
	
	return(errCode);
}



OSErr CopyFloatToCStr(const extended80 *theFloat,char *theCStr,const int maxCStrLength,const int inMaxNumIntDigits,const int inMaxNumFractDigits)
{
OSErr				errCode;
Str255				theStr255;
Handle				theNumberPartsTableHandle = nil;
long				theNumberPartsOffset,theNumberPartsLength;
FormatResultType	theFormatResultType;
NumberParts			theNumberPartsTable;
NumFormatStringRec	theNumFormatStringRec;


	if (theCStr == nil)
	{
		SetErrorMessage("CopyFloatToCStr: Bad parameter, theCStr == nil");
		errCode = kGenericError;
		goto EXITPOINT;
	}

	if (theFloat == nil)
	{
		SetErrorMessage("CopyFloatToCStr: Bad parameter, theFloat == nil");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	

//	GetIntlResourceTable(smRoman,smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);

	GetIntlResourceTable(GetScriptManagerVariable(smSysScript),smNumberPartsTable,&theNumberPartsTableHandle,&theNumberPartsOffset,&theNumberPartsLength);	
	
	if (theNumberPartsTableHandle == nil)
	{
		SetErrorMessage("CopyFloatToCStr: Can't get number parts table for converting string representations to/from numeric representations");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	if (theNumberPartsLength > sizeof(theNumberPartsTable))
	{
		SetErrorMessage("CopyFloatToCStr: Number parts table has bad length");
		errCode = kGenericError;
		goto EXITPOINT;
	}
	
	
	BlockMove(*theNumberPartsTableHandle + theNumberPartsOffset,&theNumberPartsTable,theNumberPartsLength);
	
	
	if (inMaxNumIntDigits >= 0 || inMaxNumFractDigits >= 0)
	{
	char	numberFormat[64];
	int		numberFormatLength = 0;
	
		for (int i = 0;i < inMaxNumIntDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
		{
			numberFormat[numberFormatLength++] = '0';
		}
		
		if (inMaxNumFractDigits > 0 && numberFormatLength < sizeof(numberFormat) - 1)
		{
			numberFormat[numberFormatLength++] = '.';
			
			for (int i = 0;i < inMaxNumFractDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
			{
				numberFormat[numberFormatLength++] = '0';
			}
		}

		
		if (numberFormatLength < sizeof(numberFormat) - 1)
		{
			numberFormat[numberFormatLength++] = ';';
		}
		
		if (numberFormatLength < sizeof(numberFormat) - 1)
		{
			numberFormat[numberFormatLength++] = '-';
		}
		

		for (int i = 0;i < inMaxNumIntDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
		{
			numberFormat[numberFormatLength++] = '0';
		}
		
		if (inMaxNumFractDigits > 0 && numberFormatLength < sizeof(numberFormat) - 1)
		{
			numberFormat[numberFormatLength++] = '.';
			
			for (int i = 0;i < inMaxNumFractDigits && numberFormatLength < sizeof(numberFormat) - 1;i++)
			{
				numberFormat[numberFormatLength++] = '0';
			}
		}
		
		numberFormat[numberFormatLength] = '\0';


	Str255	tempStr255;
	
		CopyCStrToPStr(numberFormat,tempStr255,sizeof(tempStr255));
		
		theFormatResultType = (FormatResultType) StringToFormatRec(tempStr255,&theNumberPartsTable,&theNumFormatStringRec);
	}
	
	else
	{
		theFormatResultType = (FormatResultType) StringToFormatRec(kNumberFormatString,&theNumberPartsTable,&theNumFormatStringRec);
	}
	
	if (theFormatResultType != fFormatOK)
	{
		SetErrorMessage("CopyFloatToCStr: StringToFormatRec() != fFormatOK");
		errCode = kGenericError;
		goto EXITPOINT;
	}


	theFormatResultType = (FormatResultType) ExtendedToString(theFloat,&theNumFormatStringRec,&theNumberPartsTable,theStr255);
	
	if (theFormatResultType != fFormatOK)
	{
		SetErrorMessage("CopyFloatToCStr: ExtendedToString() != fFormatOK");
		errCode = kGenericError;
		goto EXITPOINT;
	}

	
	CopyPStrToCStr(theStr255,theCStr,maxCStrLength);
	
	errCode = noErr;
	

EXITPOINT:
	
	return(errCode);
}





void SkipWhiteSpace(char **ioSrcCharPtr,const Boolean inStopAtEOL)
{
	if (ioSrcCharPtr != nil && *ioSrcCharPtr != nil)
	{
		if (inStopAtEOL)
		{
			while ((**ioSrcCharPtr == ' ' || **ioSrcCharPtr == '\t') && **ioSrcCharPtr != '\r' && **ioSrcCharPtr != '\n')
			{
				*ioSrcCharPtr++;
			}
		}
		
		else
		{
			while (**ioSrcCharPtr == ' ' || **ioSrcCharPtr == '\t')
			{
				*ioSrcCharPtr++;
			}
		}
	}
}
The diff you're trying to view is too large. Only the first 1000 changed files have been loaded.
Showing with 0 additions and 0 deletions (0 / 0 diffs computed)
swh spinner

Computing file changes ...

ENEA — Copyright (C), ENEA. License: GNU AGPLv3+.
Legal notes  ::  JavaScript license information ::  Web API

back to top