/*
**	Find - AmigaDOS 2.04 commodities utility
**
**	Copyright © 1991-1992 by Olaf `Olsen' Barthel
**		All Rights Reserved
*/

	/* A couple of handy gadtools object macros. */

#define GT_CHECKED(G)	((((struct Gadget *)(G)) -> Flags & GFLG_SELECTED) ? TRUE : FALSE)
#define GT_STRING(G)	(((struct StringInfo *)(((struct Gadget *)(G)) -> SpecialInfo)) -> Buffer)

	/* A macro to set the wait mouse pointer. */

#define SetWait(Window)	SetPointer((Window),&Stopwatch[0],16,16,-6,0)

	/* Various signal bits. */

#define SIG_REPLY	(1 << ReplySignal)
#define SIG_CLIP	(1 << ClipPort -> mp_SigBit)
#define SIG_WORKBENCH	(WorkbenchPort ? (1 << WorkbenchPort -> mp_SigBit) : NULL)
#define SIG_ICON	(1 << IconPort -> mp_SigBit)
#define SIG_WINDOW	(1 << Window -> UserPort -> mp_SigBit)
#define SIG_CX		(CxPort ? (1 << CxPort -> mp_SigBit) : NULL)
#define SIG_KILL	SIGBREAKF_CTRL_C

	/* Shell argument IDs. */

enum	{	ARG_AREA,ARG_PATTERN,ARG_NOWILDCARDS,ARG_POPKEY,ARG_PRI,ARG_POPUP };

	/* Menu IDs. */

enum	{	MEN_FULL=1,MEN_FILE,MEN_LIST,MEN_ABOUT,MEN_QUIT,MEN_COPY,
		MEN_SELECTAREA,MEN_ICONIFY };

	/* Gadget IDs. */

enum	{	GAD_NONE_ICONIFY=-2,GAD_NONE,GAD_SEARCHAREA,GAD_SEARCHFOR,GAD_WILDCARDS,GAD_START,GAD_TEXT,GAD_SCROLLER,GAD_FILELIST };

	/* Filetype IDs. */

enum	{	TYPE_FILE,TYPE_DIR,TYPE_ICON,
		TYPE_TEXT,
		TYPE_C,TYPE_H,
		TYPE_ASM,TYPE_I,
		TYPE_MOD,
		TYPE_REXX,
		TYPE_BASIC,
		TYPE_AMIGAGUIDE,
		TYPE_TEX,TYPE_METAFONT,TYPE_GF,TYPE_TEXFONT,TYPE_TEXDVI,TYPE_FLIB,
		TYPE_OLDMANX,TYPE_NEWMANX,TYPE_OLDMANXLIB,TYPE_NEWMANXLIB,
		TYPE_OBJECT,TYPE_LIB,
		TYPE_EXECUTABLE,
		TYPE_LIBRARY,TYPE_DEVICE,TYPE_FILESYS,TYPE_HANDLER,
		TYPE_GIF,TYPE_DEGAS,TYPE_MACPAINT,TYPE_SUPERPAINT,TYPE_PICT,TYPE_SUNRASTER,TYPE_POSTSCRIPT,TYPE_PCX,TYPE_TIFF,TYPE_BMP,TYPE_JFIF,TYPE_ILBM,
		TYPE_ANIM,TYPE_8SVX,TYPE_SMUS,TYPE_FTXT,TYPE_PREFS,TYPE_TERM,TYPE_AMIGAVISION,TYPE_IFF,
		TYPE_IMPLODER,TYPE_POWERPACKER,TYPE_LHPAK,TYPE_LHASFX,
		TYPE_ARC,TYPE_ARJ,TYPE_COMPRESSED,TYPE_CPIO,TYPE_MACCOMPRESS,TYPE_COMPACT,TYPE_DIAMOND,TYPE_LHARC,TYPE_LHA,TYPE_ZOO,TYPE_ZIP,TYPE_STUFFIT,TYPE_PACKIT,TYPE_DMS,TYPE_WARP,TYPE_ZOOM,
		TYPE_SPARCOBJECT,TYPE_SPARCEXECUTABLE,
		TYPE_MSDOSEXECUTABLE,
		TYPE_ATARIEXECUTABLE,
		TYPE_MACEXECUTABLE,
		TYPE_LINK
	};

	/* The NameString structure. */

struct NameString
{
	UBYTE			*NamePart;

	ULONG			 Protection;
	LONG			 Size;
	LONG			 Blocks;
	struct DateStamp	 Date;

	UBYTE			 Type;
	BYTE			 Selected;

	UBYTE			 Name[1];
};

	/* An extended node structure. */

struct FatNode
{
	struct Node		 VanillaNode;
	UBYTE			 Name[40];
};

	/* Find.c */

VOID __regargs			DisableWindow(BYTE IncludeStart);
VOID				EnableWindow(VOID);
VOID __saveds __asm		EditRoutine(register __a0 struct Hook *Hook,register __a1 ULONG *Msg,register __a2 struct SGWork *Work);
VOID __saveds			ClipServer(VOID);
BYTE __regargs			SaveClip(UBYTE *Buffer,LONG Size);
LONG __regargs			LoadClip(UBYTE *Buffer,LONG Size);
VOID __stdargs			ShowMessage(UBYTE *Text,...);
BOOL __stdargs			ShowRequest(UBYTE *Text,UBYTE *Gadgets,...);
UBYTE * __regargs		BuildBits(ULONG Protection);
VOID __regargs			BuildDate(struct DateStamp *Stamp);
VOID __regargs			BuildList(UBYTE *String);
VOID __regargs			ClearRect(WORD Len,WORD Top);
VOID				RefreshList(VOID);
BYTE				SelectSearchArea(VOID);
VOID				RefreshFile(VOID);
VOID				RefreshGfx(VOID);
BYTE __regargs			Iconify(BYTE Complain);
VOID				ClearFileInfo(VOID);
VOID __stdargs			DrawFileInfo(WORD X,WORD Y,BYTE Cut,UBYTE *Format,...);
VOID				FreeNameList(VOID);
struct NameString * __regargs	AddNameList(UBYTE *Name);
VOID __regargs			MatchSetup(UBYTE *Pattern,BYTE Wildcards);
BYTE __regargs			MatchString(UBYTE *String);
BYTE				CheckAbort(VOID);
VOID __regargs			StartSearch(BPTR Dir,UBYTE *Name,UBYTE Levels);
LONG __stdargs			Compare(struct NameString **A,struct NameString **B);
BYTE __regargs			IsAssign(UBYTE *Name);
VOID __regargs			MultiSearch(UBYTE *Name,UBYTE *TempName);
VOID				ShowInfo(VOID);
VOID				FindFile(VOID);
struct Gadget * __regargs	CreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList,APTR VisualInfo,UWORD TopEdge);
VOID				CloseGfx(VOID);
VOID __regargs			CentreWindow(struct Screen *Screen,WORD *LeftEdge,WORD *TopEdge,WORD Left,WORD Top);
BYTE				OpenGfx(VOID);
VOID __regargs			CloseAll(LONG ReturnCode);
VOID				OpenAll(VOID);
VOID				ShutdownCx(VOID);
BYTE				SetupCx(VOID);
VOID				SetupWindow(VOID);
VOID __regargs			HandleCxMsg(CxMsg *Message);
LONG __regargs			ListName(BPTR File,LONG Index);
VOID __regargs			SaveList(LONG Mode);
VOID __saveds			FindServer(VOID);
VOID __stdargs			main(int argc,char **argv);

	/* Identify.c */

UBYTE __regargs			Identify(UBYTE *Name);

	/* QuickSort.asm. */

VOID __stdargs			qsort(APTR,LONG,LONG,APTR);

	/* External data declarations. */

extern struct ExecBase		*SysBase;
extern struct DosLibrary	*DOSBase;
extern struct IntuitionBase	*IntuitionBase;
extern struct GfxBase		*GfxBase;
extern struct Library		*WorkbenchBase;
extern struct Library		*IconBase;
extern struct Library		*IFFParseBase;
extern struct Library		*GadToolsBase;
extern struct Library		*UtilityBase;
extern struct Library		*AslBase;
extern struct Library		*CxBase;

extern struct Process		*MainProcess;
extern struct Process		*FindProcess;
extern BYTE			 ReplySignal;

extern struct Process		*ClipProcess;
extern struct MsgPort		*ClipPort;

extern struct MsgPort		*WorkbenchPort;
extern struct AppWindow		*WorkbenchWindow;

extern struct Hook		 StringHook;

extern struct WBStartup		*WBenchMsg;

extern APTR			 VisualInfo;
extern struct Gadget		*GadgetList;
extern struct Gadget		*GadgetArray[7];
extern struct Screen		*DefaultScreen;
extern struct Window		*Window;
extern UBYTE			 WindowTitle[300];
extern struct Gadget		*LastActiveGadget;
extern UWORD			 WindowWidth,
				 WindowHeight;
extern struct RastPort		*RPort;
extern struct DrawInfo		*DrawInfo;
extern BYTE			 SelectWhich;

extern WORD			 ListTopLine,
				 PathTopLine,
				 ListRightColumn;

extern struct NameString	**NameList;
extern LONG			  NumNames,
				  MaxNames;

extern struct List		  FileList;
extern struct FatNode		  FileNames[10];
extern struct List		  EmptyList;

extern UBYTE			 FullFileName[512],LastFileName[32];

extern LONG			 MaxNameLen;
extern UBYTE			 MaxNameFormat[50];

extern LONG			 NumFiles,
				 NumDirs,
				 NumLinks;

extern UBYTE			 AreaName[256],
				 SearchString[256],
				 MessageBuffer[256];

extern UWORD __chip		 Stopwatch[(2 + 16) * 2];

extern struct TextFont		*DefaultFont;
extern struct TextAttr		 SystemFont;
extern UBYTE			 SystemFontName[256];
extern UWORD			 SystemFontWidth,
				 SystemFontHeight,
				 SystemFontBase;
extern struct TextAttr		 BigSystemFont;
extern UBYTE			 BigSystemFontName[256];

extern struct IBox		 ZoomBox;

extern UBYTE			*FileTypes[];

extern struct FileRequester	*FileRequest,
				*SaveFileRequest;

extern struct NewMenu		 FindMenuConfig[];
extern struct Menu		*FindMenu;

extern struct NewBroker		 NewBroker;
extern struct MsgPort		*CxPort;
extern CxObj			*Broker;
extern UBYTE			 HotkeyBuffer[256];
extern LONG			 CxPriority;
extern UBYTE			**ToolTypes;

extern UBYTE			 MatchData[256],NewPattern[256],PatternDistance[256];
extern WORD			 PatternWidth;
extern BYTE			 UseWildcards;

extern BYTE			 Aborted,
				 Scanning,
				 WasIconified,
				 NewLook,
				 Terminated,
				 IconTerminated,
				 DoIconify;
extern LONG			 ListTop,
				 LastSelected;

extern UBYTE			 Date[20],
				 Time[20];
