#ifndef TBOXSTRINGS
#define TBOXSTRINGS
/********************************************************************/
/*						HEADER FILE									*/
/********************************************************************/
/*
*   >>>	File name:		TBOXStrings.h
*
*  	>>>	Purpose:		All those classic string defines.
* 	>>>	Project:		Toolbox		
* 	>>>	Date:			March 9, 1989
*  	>>>	By:				Adam Treister
*
*/
/********************************************************************/
/*	For Your Information			1802 Hillside Rd. SB CA 93101	*/
/********************************************************************/

/* PROTOTYPES:			*/

		void 	Num2String			(Ptr numP,Str255 string,short Format);
		void 	AltNum2String		(long num,Str255 str,short fmt);
		void 	Float2String		(float f, Str255 str, short nPlaces);
		void 	String2Float		(Str255 str, float *fP);
		void 	String2Num			(Str255 string,long *num,short Format);
		void 	Num2Date			(long num,Str255 string,short Format);
		void 	Date2Num			(Str255 string,long *num,short Format);

		long 	PrecisionCheck		(long num,short format);
		long 	ConstantPrecision	(long num,short format);
		void 	StrCopy				(Str255 a,Str255 b);
 		void 	Cat3				(Str255 a,Str255 b,Str255 c);
		void 	StrTrunc			(Str255 s,short width);
 		void 	SubString			(Str255 src,short begin,short end,Str255 *targetP);
		void 	InsertChar			(unsigned char	*str, unsigned char c, short pos);
		void	AppendChar			(unsigned char	*str,unsigned char c);
 		void 	PadString			(unsigned char	*str, unsigned short endLen,Boolean justRight);
		void 	Commatize			(Str255 string);
 		void 	DrawNum				(Ptr numP,short format, Boolean parens);
 		void 	DrawCenteredNum		(Ptr numP,short format);
 		void 	DrawCenteredString	(Str255	string);
		void 	DrawFmtStringInBox	(Rect r,Ptr ptr,short format);
		void  	GetDateStr			(char *dateStr);
		void 	SqueezeCRs 			( Str255 string );
		Boolean IsAlphaStr			(Str255 str);
		void 	StripNumString		(Str255 str);
		void 	Num2PStr	(short type, void *numPtr, char *pStr, short format, short places);
		void 	PStr2Num	(char *pStr, short type,void *numPtr);

		void 	PStrCat		(short count, unsigned char *dst, ...);
		int 	PStrCmp		(unsigned char *src, unsigned char *dst);
		void 	PStrCopy	(unsigned char	*src, short pos, short count, unsigned char	*dst);
		void 	PStrDel		(unsigned char *s,short pos, short count);
		void 	PStrIns		(unsigned char *src, unsigned char *dst,short pos);
		void 	PStrRep		( char	*dst,  short	pos,  short	len,  char	*src) ;	

		int 	PStrFind	(unsigned char	*p, unsigned char	*t, short	pos) ;	
		int 	PStrFindC	(Str255 s, unsigned char c); 	
		int 	PStrFindFC	( unsigned char	*s,  short	c) 	;
		int 	PStrFindFNS	(unsigned char	*s, unsigned char	*set) 	;
		int 	PStrFindFS	(unsigned char	*s, unsigned char	*set);
		int 	PStrFindLC	(unsigned char	*s,  short	c) 	;
		int 	PStrFindLS	(unsigned char	*s, unsigned char	*set);
		int 	PStrFixLen	(unsigned char *temp, short len, short c);

	
	
/******************************************************************/
/* ------------------------------------------------------------ */
/*	FIELD FORMATS		 numbers are in order of format menu!	*/
/* ------------------------------------------------------------ */

enum {	INTEGER=1,FIXED1,FIXED2,FIXED3,
		PERCENT1,PERCENT2,PERCENT3,
		DOLLAR,DOLCENTS,
		MONTHDATE,DAYDATE,YEARDATE,
		ALPHA,CALPHA,
		FLOAT0,FLOAT1,FLOAT2,FLOAT3,FLOAT4
	};

/******************************* characters we love to use *****/
	
	#define ENTER			(unsigned char) 0x03
	#define RETURN			(unsigned char) 0x0D
	#define CR 				(unsigned char) 0x0D
	#define TAB 			(unsigned char) 0x09
	#define LF	 			(unsigned char) 0x0A
	#define LINEFEED	 	(unsigned char) 0x0A

	#define DELETE 			(unsigned char) 0x08
	#define	BS				(unsigned char) 0x08
	#define	BACKSPACE		(unsigned char) 0x08
	#define	ESC				(unsigned char) 0x1B

	#define ELLIPSIS 		(unsigned char) 0xC9
	#define BULLET 			(unsigned char) 0xA5

	#define BLANK 			(unsigned char) 0x20
	#define SPACE 			(unsigned char) 0x20
	#define	DOT				(unsigned char) 0x2E
	#define	COMMA			(unsigned char) 0x2C
	#define NEGATIVE		(unsigned char) 0x2D
	#define SLASH			(unsigned char) 0x2F
	#define OPENPAREN 		'('
	#define CLOSEPAREN 		')'
	#define PERCENTSIGN 	'%'
	#define OPENBRACKET 	'['
	#define CLOSEBRACKET 	']'
	#define COLON 			':'
	#define BACKSLASH 		'\\'
	#define QUOTE 			'\''
	#define DBLQUOTE 		'"'
	#define ATSIGN 			'@'
	#define IS_WHITE(c) ((c) == SPACE || (c) == TAB || (c) == LF || (c) == CR)
	
	#define UpArrow			(unsigned char) 0x1E
	#define DownArrow		(unsigned char) 0x1F
	#define LeftArrow 		(unsigned char) 0x1C
	#define RightArrow 		(unsigned char) 0x1D
	enum {LEFTARROW = 28,RTARROW,UPARROW,DOWNARROW}; /** ¥CAUTION:  I think these are US keybd specific!!! */

/* 	#define DOLLARSIGN 		'$'							Not internationaly kosher!
	#define	DecimalPoint	(unsigned char) 0x2E
 */
 
	
#ifndef  _dontDefcharFlags
	extern char charFlags[];
#endif
#define _strings_

/******************** defines for efficient character testing ***/

	#define 	_alpha 			1
	#define 	_digit 			2
	#define 	_hex			4
	#define 	_octal			8
	#define		_ascii			16
	#define		_cntrl			32
	#define 	_punct			64
	#define 	_space			128
	
/******************** the efficient character testing macros ***/

/*	The c character passed to the macros below should be
	'declared as' or 'cast to' type 'Byte' or 'unsigned char'.
	Type char gets sign extended to an integer. Thus, when c > 127
	the _char[] subscript becomes negative!  Note that immediate
	chars such as '¥' do not get sign extended so they're okay.
*/
	#define	IsAlphaNum(c)	(charFlags[(c)+1]&(_alpha|_digit))
	#define	IsAlpha(c)		(charFlags[(c)+1]&_alpha)
	#define	IsAscii(c)		(charFlags[(c)+1]&_ascii)
	#define	IsCntrl(c)		(charFlags[(c)+1]&_cntrl)
	#define IsCSym(c)		((charFlags[(c)+1]&(_alpha|_digit))||(c)=='_')
	#define IsCSymF(c)		((charFlags[(c)+1]&_alpha)||(c)=='_')
	#define IsDigit(c)		(charFlags[(c)+1]&_digit)
	#define IsGraph(c)		((c)>='!'&&(c)<='~')
	#define	IsOctDigit(c)	(charFlags[(c)+1]&_octal)
	#define	IsPrint(c)		((c)>=32&&(c)<=255)
	#define	IsPunct(c)		(charFlags[(c)+1]&_punct)
	#define	IsSpace(c)		(charFlags[(c)+1]&_space)
	#define	IsHexDigit(c)	(charFlags[(c)+1]&_hex)			

	#define	IsBackspace(c)		((c) == BACKSPACE)
	#define	IsNegative(c)		((c) == NEGATIVE)
	#define	IsDecimalPoint(c)	((c) == gDecPoint)
	#define	IsReturnKey(c)		((c) == RETURN)
	#define	IsNextFieldKey(c)	(((c) == RETURN) || ((c) == TAB) || ((c) == ENTER))
	#define IsRightArrow(c)		((c)==RightArrow)
	#define IsLeftArrow(c)		((c)==LeftArrow)
	#define IsUpArrow(c)		((c)==UpArrow)
	#define IsDownArrow(c)		((c)==DownArrow)
	#define IsSlash(c)			((c)==SLASH)
	#define IsComma(c)			((c)==COMMA)
	#define toupper(c)  (((c) >= 'a' AND (c) <= 'z') ? (c) + 'A' - 'a' : (c))
	#define tolower(c)  (((c) >= 'A' AND (c) <= 'Z') ? (c) + 'a' - 'A' : (c))
	
#endif
