/* types */

#define AUTO            auto    /* automatic variables */
#define AGLOBAL         ;       /* global (project-scope) */
#define MODULE		static	/* external static (file-scope) */
#define PERSIST		static	/* internal static (function-scope) */
typedef signed char	ABOOL;	/* 8-bit signed quantity (replaces BOOL) */
typedef signed char	SBYTE;	/* 8-bit signed quantity (replaces Amiga BYTE) */
typedef signed short	SWORD;	/* 16-bit signed quantity (replaces Amiga WORD) */
typedef signed long	SLONG;	/* 32-bit signed quantity (same as LONG) */
#define elif		else if

#define BUG 0
#define COM 1
#define ENH 2

#define TAB               9 /* tab */
#define LF               10 /* linefeed */
#define CR               13 /* carriage return */
#define ESCAPE           27 /* escape */
#define QUOTE            34 /* " (double quote) */

#define GREY              0
#define BLACK             1
#define WHITE             2
#define RED               3
#define BLUE              4
#define LIGHTGREY         5
#define PURPLE            6
#define YELLOW            7

#define MAXELEMENTS      14 // counting from 0

#define TITLEBARTEXT      "Report+ 4.22"

#define ABOUTXPIXEL     312
#define ABOUTYPALPIXEL  128
#define ABOUTYPUBPIXEL   98

#define FIRSTQUALIFIER 0x61
#define LASTQUALIFIER  0x67
#define KEYUP          0x80 /* key release */

AGLOBAL void report1(void);
AGLOBAL void report2(void);
AGLOBAL void report3(void);
AGLOBAL void report_loop(ULONG class, struct Gadget* addr, UWORD code);
AGLOBAL void report_exit(void);
AGLOBAL void report_init(void);
AGLOBAL void sender(void);
AGLOBAL void config(void);

AGLOBAL void aminet1(void);
AGLOBAL void aminet2(void);
AGLOBAL void aminet_loop(ULONG class, struct Gadget* addr, UWORD code);

AGLOBAL void acse1(void);
AGLOBAL void acse2(void);
AGLOBAL void acse3(void);
AGLOBAL void acse_exit(void);
AGLOBAL void decrypt(void);

AGLOBAL void autodoc_init(void);
AGLOBAL void autodoc_exit(void);
AGLOBAL void autodoc1(void);
AGLOBAL void autodoc2(void);

AGLOBAL void manuf0(void);
AGLOBAL void runquery(ULONG querymanuf, ULONG queryproduct);
AGLOBAL void updatemanuf(void);
AGLOBAL void manuf_loop(ULONG class, struct Gadget* addr, UWORD code);

AGLOBAL void iff1(void);
AGLOBAL void iff_loop(ULONG class, struct Gadget* addr, UWORD code);

AGLOBAL void eol1(void);
AGLOBAL void eol2(void);
AGLOBAL void eolasl(void);
AGLOBAL void eol_do(ABOOL gui);
AGLOBAL void eol_loop(ULONG class, struct Gadget* addr, UWORD code, UWORD qual)
AGLOBAL void wildcard(STRPTR pattern);

AGLOBAL void size1(void);
AGLOBAL void updatesize(void);
AGLOBAL void size_loop(ULONG class, struct Gadget* addr, UWORD code);
AGLOBAL void size_exit(void);

AGLOBAL void batt1(void);
AGLOBAL void batt_loop(ULONG class, struct Gadget* addr, UWORD code, UWORD qual, SWORD mousex, SWORD mousey);
AGLOBAL void batt_init(void);

AGLOBAL void files1(void);
AGLOBAL void files_loop(ULONG class, struct Gadget* addr, UWORD code, UWORD qual);
AGLOBAL void files_init(void);
AGLOBAL void files_exit(void);

// rp.c
AGLOBAL void outputasl(void);
AGLOBAL void outputstring(void);
AGLOBAL void fliplog(ABOOL keyboard);
AGLOBAL void dirasl(void);
AGLOBAL void getdate(void);
AGLOBAL void loop(void);
AGLOBAL void navigate(void);
AGLOBAL void rq(STRPTR text);
AGLOBAL void cleanexit(SBYTE rc);
AGLOBAL void closewindow(void);
AGLOBAL void FreeNameNodes(struct List* ListPtr);
AGLOBAL void say(STRPTR sentence, UBYTE colour);
AGLOBAL void asl(void);
AGLOBAL void launcheditor(void);
AGLOBAL void readordie(STRPTR pathname);
AGLOBAL void writeout(STRPTR pathname); // remember write() is reserved
AGLOBAL ABOOL readin(STRPTR pathname);
AGLOBAL void newwindow(SWORD width, SWORD height, STRPTR title, ULONG idcmp);
AGLOBAL void setgadget(WORD leftx, WORD topy, WORD width, WORD height, STRPTR text,
    ULONG flags);
AGLOBAL void append(STRPTR pathname);
AGLOBAL ULONG checkbreak(void);
AGLOBAL void clearlblist(void);
AGLOBAL void boingball(void);
AGLOBAL void unboingball(void);
AGLOBAL ABOOL aboutloop(void);
AGLOBAL VOID DrawGels(void);
AGLOBAL void AddNameToTail(struct List* ListPtr, STRPTR name);
AGLOBAL void double_exit(void);
AGLOBAL void double_init(void);

// telb.c
AGLOBAL void textedit(void);
AGLOBAL void listbrowse(void);

#define REPORT1HEIGHT   128 /* page 11 */
#define REPORT2HEIGHT   180 /* page 12 */
#define REPORT3HEIGHT    92 /* page 15 */
#define SENDERHEIGHT    124 /* page 13 */
#define CONFIGHEIGHT    186 /* page 14 */
#define AMINET1HEIGHT   256 /* page 21 */
#define AMINET2HEIGHT    92 /* page 22 */
#define ACSE1HEIGHT     180 /* page 31 */
#define ACSE2HEIGHT     126 /* page 32 */
#define ACSE3HEIGHT      94 /* page 33 */
#define AUTODOC1HEIGHT  256 /* page 41 */
#define AUTODOC2HEIGHT   84 /* page 42 */
#define IFF1HEIGHT      182 /* page 61 */
#define MANUF1HEIGHT    114 /* page 51 */
#define EOL1HEIGHT      150 /* page 71 */
#define EOL2HEIGHT       78 /* page 72 */
#define SIZE1HEIGHT     228 /* page 81 */
#define BATT1HEIGHT     166 /* page 91 */
#define FILES1HEIGHT    224 /* page 101 */

#define MEDFIELD         32
#define LONGFIELD        64
#define VLONGFIELD      254
#define LONGESTFIELD  16536

AGLOBAL struct SharedStruct
{   ABOOL log;
    UWORD function;
    TEXT  editor[VLONGFIELD + 1],
          output[VLONGFIELD + 1];
};
AGLOBAL struct NameNode
{   struct Node nn_Node;
    UBYTE       nn_Data[LONGFIELD + 1]; // must be long enough!
};
AGLOBAL struct ReportStruct
{   ULONG floppies;
    UWORD agnus, denise, cpu, model, type, severity, subsystem;
    TEXT  chipram[5], fastram[5],
          hard[MEDFIELD + 1],
          debug[LONGFIELD + 1],
          developer[LONGFIELD + 1],
          expansion[LONGFIELD + 1],
          subject[LONGFIELD + 1],
          ks[6],
          wb[6],
          pv[LONGFIELD + 1],
          pp[LONGFIELD + 1],
          thirdname[MEDFIELD + 1],
          thirdver[MEDFIELD + 1],
          thirdmanuf[MEDFIELD + 1],
          lastname[MEDFIELD + 1],
          firstname[MEDFIELD + 1],
          company[MEDFIELD + 1],
          phone[MEDFIELD + 1],
          email[MEDFIELD + 1],
          refer[VLONGFIELD + 1],
          referid[VLONGFIELD + 1],
          path[VLONGFIELD + 1],
          config[VLONGFIELD + 1];
};
AGLOBAL struct AutodocStruct
{   ULONG version;
    TEXT  library[MEDFIELD + 1],        /* eg. workbench.library */
          function[MEDFIELD + 1],
          description[VLONGFIELD + 1];
    struct
    {   TEXT  name[MEDFIELD + 1],
              type[MEDFIELD + 1],
              reg[MEDFIELD + 1];
    } var[9];
};
AGLOBAL struct EOLStruct
{   ABOOL detabulate;
    UWORD source, dest;
    ULONG tabsize;
    TEXT  pathname[LONGESTFIELD + 1], /* <= 4096 bytes total of pathnames */
          finallist[LONGESTFIELD + 1],
          thisfile[VLONGFIELD + 1],   /* <= 254 characters per pathname */
          thatfile[VLONGFIELD + 1];
};
