#if defined(OS400) && (__OS400_TGTVRM__ >= 510)
#pragma datamodel(P128)
#endif

/*********************************************************************/
/*                                                                   */
/* Licensed Materials - Property of IBM                              */
/*                                                                   */
/* L-GHUS-5RWNHM, L-GHUS-5RWNFH                                      */
/* (C) Copyright IBM Corp. 1989, 2005  All Rights Reserved           */
/*                                                                   */
/* US Government Users Restricted Rights - Use, duplication or       */
/* disclosure restricted by GSA ADP Schedule Contract with           */
/* IBM Corp.                                                         */
/*                                                                   */
/*********************************************************************/



/*	Miscellaneous Package Global Definitions */

#ifndef MISC_DEFS
#define MISC_DEFS


#ifdef __cplusplus
extern "C" {
#endif



/*	Some useful constants */

#define	MAXALPHANUMBER		40
#define	MAXALPHATIMEDATE	80
#define	MAXALPHATIMEDATEPAIR (80 * 2 + 3)
#define MAXSPRINTF			256
#define MAXSOUNDEX			(4+1)		/* 4 chars plus null terminator */

/*	Flags for IntlTextCompare */

#define INTL_ACCENT_SENSITIVE	0x00000001
#define INTL_CASE_SENSITIVE		0x00000002


/* time structure - NOTE: These fields MUST BE int's, NOT UNSIGNEDS! */

typedef struct {
	int year;					/* 1-32767 */
	int month;					/* 1-12 */
	int day;					/* 1-31 */
	int weekday;				/* 1-7, Sunday is 1 */
	int hour;					/* 0-23 */
	int minute;					/* 0-59 */
	int second;					/* 0-59 */
	int hundredth;				/* 0-99 */
	int dst;					/* FALSE or TRUE */
	int zone;					/* -11 to +11 */
	TIMEDATE GM;
} TIME;

/*	Special encodings for TIMEDATE fields.  Note that these are all in
	HOST-SPECIFIC format, and must be used with TimeConstruct or
	TimeExtractJulianDate or TimeExtractTicks! */

#define ALLDAY 0xffffffffL		/* put this in the TIME field */
#define ANYDAY 0xffffffffL		/* put this in the DATE field */
#define TICKS_IN_DAY 8640000L	/* 10msec ticks in a day */
#define TICKS_IN_HOUR 360000L	/* 10msec ticks in an hour */
#define TICKS_IN_MINUTE 6000L	/* 10msec ticks in a minute */
#define TICKS_IN_SECOND 100L	/* 10msec ticks in a second */
#define SECS_IN_DAY 86400L		/* seconds in a day */
#define SECS_IN_WEEK 604800L	/* seconds in a week */
#define SECS_IN_MONTH 2592000L	/* seconds in a month (30 days) */


/* DTFlags values (do not change - these values are also stored on disk!) */

#define DT_VALID		0x8000		/* Validity bit: If 1, use new DTFMT; if 0, use old TFMT */
#define	DT_4DIGITYEAR	0x0001		/* Require 4 digit year on INPUT (not output) */
#define DT_ALPHAMONTH	0x0002		/* Require months be INPUT as letters, not digits (e.g. "jan", not 01) */
#define DT_SHOWTIME		0x0004		/* Display time element on output */
#define DT_SHOWDATE		0x0008		/* Display date element on output */
#define DT_24HOUR		0x0040		/* Display time on output using 24 hour clock format */
#define DT_STYLE_YMD	1			/* Date element order:  Year, Month, Day, Day-of-week */
#define DT_STYLE_MDY	2			/* Date element order: Day-of-week, Month, Day, Year */
#define DT_STYLE_DMY	3			/* Date element order: Day-of-week, Day, Month, Year */
#define DT_STYLE_MSK	0x000f0000	/* This is where we store the style value in DTFlags */
#define DT_GET_STYLE(dwflag)		((dwflag & DT_STYLE_MSK) >> 0x10)			/* Macro to retrieve the style value from DTFlags */
#define DT_SET_STYLE(dwflag, style)	(dwflag = ((dwflag & 0xfff0ffff) | (style << 0x10)))	/* Macro to store the style value in DTFlags */

/* DTFlags2 values (do not change - these values are also stored on disk!) */

#define DT_USE_TFMT					0x0001		/* Use the 4.X format structure instead of this 5.X format structure */


/* DTYearFmt values (do not change - these values are also stored on disk!) */

#define DT_YFMT_YY		1				/* 2 digit year */
#define	DT_YFMT_YYYY	2			/* 4 digit year */
/* The following DTYearFmt values are valid only for Imperial calendars */
#define DT_YFMT_GE		3				/* Single letter (first letter ) of epoch name and 1 or 2 digit (no leading zeros) year */
#define DT_YFMT_GEE		4				/* Single letter (first letter ) of epoch name and 2 digit (with leading zeros, if necessary) year */
#define DT_YFMT_GGE		5
#define DT_YFMT_GGEE	6			/* Abbreviated spelling and 2 digit (with leading zeros, if necessary) year */
#define DT_YFMT_GGGE	7
#define DT_YFMT_GGGEE	8		/* fully spelled out epoch name and 2 digit (with leading zeros, if necessary) year */

/* DTDOWFmt values (Day-Of-Week) (do not change - these values are also stored on disk!) */

#define DT_WFMT_WWW		1
#define DT_WFMT_WWWW	2
#define DT_WFMT_WWWP	3			/* 3 letter abbreviation inside parenthesis */
#define DT_WFMT_WWWWP	4		/* Spelled out fully inside parenthesis */

/* DTMonthFmt values (do not change - these values are also stored on disk!) */

#define DT_MFMT_M		1
#define DT_MFMT_MM		2
#define DT_MFMT_MMM		3
#define DT_MFMT_MMMM	4

/* DTDayFmt values (do not change - these values are also stored on disk!) */

#define DT_DFMT_D		1
#define DT_DFMT_DD		2

/* DTDShow values (controls what is shown on OUTPUT for date) */
/* (do not change - these values are also stored on disk!) */

#define DT_DSHOW_ALL	1
#define DT_DSHOW_YM		2
#define DT_DSHOW_WMD	3
#define DT_DSHOW_W		4
#define DT_DSHOW_M		5
#define DT_DSHOW_MD		6
#define DT_DSHOW_MDY	7
#define DT_DSHOW_D		8
#define DT_DSHOW_Y		9

/* DTDSpecial bit values:  Special handling of date OUTPUT */
/* (do not change - these values are also stored on disk!) */

#define DT_DSPEC_NONE	0				/* No special handling */
#define DT_DSPEC_TODAY	0x0001			/* Use 'Today', 'Yesterday', 'Tomorrow', when possible */
#define DT_DSPEC_Y4		0x0002			/* Always display year on OUTPUT as 4 digit year */
#define DT_DSPEC_21Y4	0x0004			/* Output 2 digit year for this century; use 4 digit year for other century */
#define DT_DSPEC_CURYR	0x0008			/* Display year when not the current year */

/* DTTShow values (controls what to shown on OUTPUT for time) */
/* (do not change - these values are also stored on disk!) */

#define DT_TSHOW_H		1
#define DT_TSHOW_HM		2
#define DT_TSHOW_HMS	3
#define DT_TSHOW_ALL	4

/* Values for FTFMT "Preferences" field (do not change - these values are also stored on disk!) */

#define	NPREF_CLIENT	0		/* Get preferences from the client */
#define	NPREF_FIELD		1		/* Get preferences fromt the form or view */

/* Date/Time formatting data */

typedef struct {
	BYTE	Preferences;		/* NPREF_xxx. Get preferences from the Client or from the Form/View? */
	DWORD	DTFlags;
	DWORD	DTFlags2;			/* In case we need more room */
	BYTE	DTDOWFmt;			/* Day-of-week format choice */
	BYTE	DTYearFmt;			  /* Year format choice */
	BYTE	DTMonthFmt;			/* Month format choice */
	BYTE	DTDayFmt;			 /* Day format choice */
	BYTE	DTDShow;			/* Date display choice */
	BYTE	DTTShow;			/* Time display choice */
	BYTE	DTDSpecial;			/* Date special display choice */
	BYTE	DTTZone;			/* Time zone display choice */
	char*	DTDsep1;			/* Date field separator string #1 */
	char*	DTDsep2;			/* Date field separator string #2 */
	char*	DTDsep3;			/* Date field separator string #3 */
	char*	DTTsep;				/* Time field separator string */
} DTFMT;


/* Currency flags */

#define	NCURFMT_SYMFOLLOWS	0x0001		/* The currency symbol follows the value */
#define	NCURFMT_USESPACES	0x0002		/* Inset space between symbol and value */
#define NCURFMT_ISOSYMUSED 0x0004	/* Using 3 letter ISO for currency symbol */

/* Currency selection values */

#define NCURFMT_COMMON	0
#define NCURFMT_CUSTOM	1

/*	Number Format */

#define	NFMT_GENERAL		0		/* Number Formats */
#define	NFMT_FIXED			1
#define	NFMT_SCIENTIFIC		2
#define	NFMT_CURRENCY		3

#define	NATTR_PUNCTUATED	0x0001	/* Number Attributes */
#define	NATTR_PARENS		0x0002
#define	NATTR_PERCENT		0x0004
#define NATTR_VARYING		0x0008

typedef struct {
	BYTE Digits;					/* Number of decimal digits */
	BYTE Format;					/* Display Format */
	BYTE Attributes;				/* Display Attributes */
	BYTE Unused;
} NFMT;

/*	Time Format */

#define	TDFMT_FULL			0		/* year, month, and day */
#define	TDFMT_CPARTIAL		1		/* month and day, year if not this year */
#define	TDFMT_PARTIAL		2		/* month and day */
#define	TDFMT_DPARTIAL		3		/* year and month */
#define TDFMT_FULL4			4		/* year(4digit), month, and day */
#define TDFMT_CPARTIAL4		5		/* month and day, year(4digit) if not this year */
#define TDFMT_DPARTIAL4		6		/* year(4digit) and month */
#define	TTFMT_FULL			0		/* hour, minute, and second */
#define	TTFMT_PARTIAL		1		/* hour and minute */
#define	TTFMT_HOUR			2		/* hour */
#define	TZFMT_NEVER			0		/* all times converted to THIS zone */
#define	TZFMT_SOMETIMES		1		/* show only when outside this zone */
#define	TZFMT_ALWAYS		2		/* show on all times, regardless */

#define	TSFMT_DATE			0		/* DATE */
#define	TSFMT_TIME			1		/* TIME */
#define	TSFMT_DATETIME		2		/* DATE TIME */
#define	TSFMT_CDATETIME		3		/* DATE TIME or TIME Today or TIME Yesterday */

typedef struct {
	BYTE Date;						/* Date Display Format */
	BYTE Time;						/* Time Display Format */
	BYTE Zone;						/* Time Zone Display Format */
	BYTE Structure;					/* Overall Date/Time Structure */
} TFMT;

typedef MEMHANDLE INTLTIMEDATEHANDLE;

/*
 * Property values to set for converting an extended International TIMEDATE value.
 */
typedef enum
{
	AMStringProperty = 1,
	PMStringProperty = 2
} INTL_TIMEDATE_PROPERTY;


/* function templates */

BOOL LNPUBLIC		TimeLocalToGM (TIME far *Time);
BOOL LNPUBLIC		TimeGMToLocal (TIME far *Time);
BOOL LNPUBLIC		TimeGMToLocalZone (TIME far *Time);
int LNPUBLIC		TimeDateCompare (const TIMEDATE far *t1, const TIMEDATE far *t2);
int LNPUBLIC		TimeDateCollate (const TIMEDATE far *t1, const TIMEDATE far *t2);
DWORD LNPUBLIC		TimeExtractJulianDate (const TIMEDATE far *);
DWORD LNPUBLIC		TimeExtractDate (const TIMEDATE far *);
DWORD LNPUBLIC		TimeExtractTicks (const TIMEDATE far *);
void LNPUBLIC		TimeExtractLocal (const TIMEDATE far *Time, BOOL fTime, TIMEDATE far *retTime);
void LNPUBLIC		TimeConstruct (DWORD Date, DWORD Time, TIMEDATE far *result);


#define	TIMEDATE_MINIMUM	0
#define	TIMEDATE_MAXIMUM	1
#define	TIMEDATE_WILDCARD	2
void LNPUBLIC		TimeConstant(WORD, TIMEDATE far *);

#define TimeDateEqual(a,b) ((BOOL)TimeDateCollate(a,b)==0)
#define TimeDateClear(a) (TimeConstant(TIMEDATE_MINIMUM, a))
STATUS LNPUBLIC		TimeDateIncrement (TIMEDATE far *Time, LONG Interval);
LONG LNPUBLIC		TimeDateDifference (const TIMEDATE far *t1, const TIMEDATE far *t2);
void LNPUBLIC		TimeDateDifferenceFloat (const TIMEDATE far *t1,
						const TIMEDATE far *t2, NUMBER far *difference);
BOOL LNPUBLIC		TimeDateAdjust (TIMEDATE far *Time, int seconds, int minutes, int hours, int days, int months, int years);
int LNPUBLIC		IntlTextCompare(const void far *Str1, WORD Str1Len,
									const void far *Str2, WORD Str2Len, DWORD Flags);
STATUS LNPUBLIC		ConvertTextToTIMEDATE (const void far *IntlFormat,
										const TFMT far *TextFormat,
										char far * far *Text,
										WORD MaxLength,
										TIMEDATE far *retTIMEDATE);
/*
 * Functions to allow TIMEDATE conversion on extended International Timedates.
 */
STATUS LNPUBLIC IntlTIMEDATECreateHandle(INTLTIMEDATEHANDLE *hTimeDateHandle);
void LNPUBLIC IntlTIMEDATEDeleteHandle(INTLTIMEDATEHANDLE hTimeDateHandle);
STATUS LNPUBLIC IntlTIMEDATESetValue(INTLTIMEDATEHANDLE hTimeDateHandle, INTL_TIMEDATE_PROPERTY prop, void *propValue);
STATUS LNPUBLIC IntlTIMEDATEGetValue(INTLTIMEDATEHANDLE hTimeDateHandle, INTL_TIMEDATE_PROPERTY prop, WORD valueLen, void *retpropValue);
STATUS LNPUBLIC IntlTIMEDATEConvertToText (INTLTIMEDATEHANDLE hTimeDateHandle, const void far *IntlFormat,
										const DTFMT *ExtTextFormat, WORD DTFMTLen,
										const TIMEDATE *InputTime, WORD TextBufferLength,
										char *retTextBuffer, WORD *retTextLength);
STATUS LNPUBLIC		ConvertTextToTIMEDATEPAIR (const void far *IntlFormat,
										const TFMT far *TextFormat,
										char far * far *Text,
										WORD MaxLength,
										TIMEDATE_PAIR far *retTIMEDATE);
STATUS LNPUBLIC		ConvertTIMEDATEToText (const void far *IntlFormat,
										const TFMT far *TextFormat,
										const TIMEDATE far *InputTime,
										char far *retTextBuffer,
										WORD TextBufferLength,
										WORD far *retTextLength);
STATUS LNPUBLIC		ConvertTIMEDATEPAIRToText (const void far *IntlFormat,
										const TFMT far *TextFormat,
										const TIMEDATE_PAIR far *InputTime,
										char far *retTextBuffer,
										WORD TextBufferLength,
										WORD far *retTextLength);
STATUS LNPUBLIC		ConvertTextToFLOAT (const void far *IntlFormat,
										const NFMT far *NumberFormat,
										char far * far *ppInputText,
										WORD InputTextMaxLength,
										NUMBER far *retNumber);
STATUS LNPUBLIC		ConvertFLOATToText (const void far *IntlFormat,
										const NFMT far *NumberFormat,
										NUMBER far *Number,
										char far *retTextBuffer,
										WORD TextBufferLength,
										WORD far *retTextLength);
void LNPUBLIC Soundex (const char far *String, WORD StringLength, char far *retSoundexString);

/* Abstract */

/* chunk separator parameters */
#define ABS_CHUNKBEGIN "ChunkBegin="
#define ABS_CHUNKSEP "ChunkSep="
#define ABS_CHUNKEND "ChunkEnd="

/* abstraction commands */
#define ABS_TEXTONLY		"textonly "
#define ABS_COUNTWORDS		"countwords "
#define ABS_SAVE			"save "
#define ABS_RESTORE			"restore "
#define ABS_TRYFIT			"tryfit "
#define ABS_ABBREV			"abbrev "
#define ABS_SORTCHUNKS		"sortchunks "
#define ABS_NOSTOPLIST		"nostoplist "
#define ABS_NOSIGLIST		"nosiglist "
#define ABS_USEDICT			"ab-usedict "
#define ABS_NODICT			"ab-usedict=0 "
#define ABS_DROPVOWELS		"ab-dropvowels "
#define ABS_KEEPVOWELS		"ab-dropvowels=0 "
#define ABS_TRIMWHITE		"ab-trimwhite "
#define ABS_NOTRIMWHITE		"ab-trimwhite=0 "
#define ABS_TRIMPUNCT		"ab-trimpunct "
#define ABS_NOTRIMPUNCT		"ab-trimpunct=0 "
#define ABS_DROPFIRSTVOWEL	"ab-dropfirstvowels "
#define ABS_KEEPFIRSTVOWEL	"ab-dropfirstvowels=0 "


STATUS LNPUBLIC Abstract(char far *szKeywords,
						char far *szText,
						DWORD maxAbstract,
						char far *szAbstract,
						DWORD far *retSize);


STATUS LNPUBLIC SECHashPassword(WORD		wPasswordLen,
							   BYTE		*Password,
							   WORD		wMaxDigestLen,
							   WORD		*retDigestLen,
							   BYTE		*retDigest,
							   DWORD	ReservedFlags,
							   void		*pReserved
							   );

STATUS LNPUBLIC SECVerifyPassword(WORD		wPasswordLen,
							   	  BYTE		*Password,
							   	  WORD		wDigestLen,
							   	  BYTE		*Digest,
							   	  DWORD		ReservedFlags,
							   	  void		*pReserved
							      );

/* Notes bitmap conversion routines and constants.  Should be exposed in the CAPI
   notescvt.c
*/
#define CONVERT_NOTESBITMAP_TO_GIF 0
typedef STATUS (LNCALLBACKPTR pConvertNBmpWriter)(void *pWriterCtx,	/* user defined writer context */
												  BYTE *bytes,		/* data bytes */
												  DWORD byteCount,	/* maxChunkSize or totalImageSizeInBytes */
												  DWORD totalImageSizeInBytes);
STATUS LNPUBLIC ConvertNotesBitmapRead(MEMHANDLE *phConvertContext,
									   WORD cdSignature,
									   char far *pCDRecord,
									   DWORD recordLength
									   );
STATUS LNPUBLIC ConvertNotesBitmap(MEMHANDLE hConvertContext,	/* created by ConvertNotesBitmapRead */
								   WORD convertTo,			/* CONVERT_NOTESBITMAP_TO_GIF */
								   DWORD maxChunkSize,		/* if zero will pass entire bitmap in bytes parameter of pWriter function*/
								   pConvertNBmpWriter pWriter, /* user defined writer */
								   void *pWriterCtx			   /* context passed to user defined writer */
								   );
STATUS LNPUBLIC ConvertNotesBitmapFree(MEMHANDLE *phConvertContext);


#ifdef __cplusplus
}
#endif

#endif /* MISC_DEFS */

#if defined(OS400) && (__OS400_TGTVRM__ >= 510)
#pragma datamodel(pop)
#endif