/*
	Puppy's include file
	T. Jennings 17 Nov 87

"Fido" is a trademark of Tom Jennings. It you utter it send me a dollar.
"FidoNet" is a also registered trademark of Tom Jennings. If you even think 
it send me two dollars. If you use both, send me ten dollars and your first
born child. All rights reserved. So there.


Puppy (k) All Rights Reversed

	Fido Software
	164 Shipley
	San Francisco CA 94107
	(415)-764-1629, FidoSW BBS
	(415)-882-9835, ch@os, one day will be known as 1:125/164
*/

/* These are my assumptions as to data element sizes for the source here. You
will need to change these if the following assumptions arent right:

char			8 bits or more, signed or not
int 			more than 8 bits, though 8 will work 99% of the time
			(that last 1% if left as an exercise for the programmer)

long			more than 16 bits, preferably 32. Note as above

FLAG			at least one bit long; set to 0 or 1, and tested
			for != 0
BYTE			8 bits long. You can define as necessary.
WORD			16 bits. Ditto
LONG			32 bits. Ditto Ditto

BYTE, WORD and LONG are used for two reasons: to take advantage of the word
length in modulo arithmetic (ie. XMODEM block numbers, 0...255) or because
they are an interface to other code, ie. WORD baud rates passed to the 
drivers. Changing these assumptions may not be trivial, since they are
frequently buried into the algorithms. (Check out XMODEM.C for a classic
example of this.) */

#define FLAG char	/* just a boolean */
#define BYTE char	/* Lattice chars are 8 bit */
#define WORD unsigned	/* Lattice unsigneds are 16 bits */
#define LONG long	/* Lattice ... */


/* Absolute Truths (current version ...) */

#define SS 80				/* standard, universal, string size */
#define TSYNC 0xae			/* FidoNet sync character */

/* Fancy numbers for protocol module. */

#define TELINK 1			/* file transmission modes, */
#define MODEM7 2
#define XMODEM 3
#define KERMIT 4
#define ZMODEM 5

#define NULL 0				/* nothing */

#define MINS_HR	60			/* minutes in an hour */
#define DAYS_WK 7			/* days in a week */
#define MINS_DAY (24 * 60)		/* minutes in an hour */
#define MINS_WK (MINS_DAY * DAYS_WK)

/* Standard node structure used throughout Fido. This is buried within all
the other major structures. */

struct _node {
	int zone;		/* zone number */
	int net;		/* net number */
	int number;		/* node number */
};

/* This is the structure in which system routines return the current time
and date. This structure is buried in some other structures. Its only
six bytes, why mess with it? */

struct _time {
	BYTE year;
	BYTE month;
	BYTE day;
	BYTE hour;
	BYTE minute;
	BYTE second;
};

/* These are all in the "library", MS-C.C and MS-ASM.ASM. */

char *str_node();
char *skip_delim();
char *next_arg();
char *strip_path();
char *getarg();

/* These are in the msg base mostly */

struct _msg *getmsg();
struct _msg *newmsg();

/* These are elsewhere */

long lseek();
char *getmem();


/* Message header structure: the headers are contained in a single file;
the message bodies are contained in another. The headers are kept in
memory at all times. */

struct _msg {
	char from[36];		/* who from, */
	char to[36];		/* who to, */
	char subj[36];		/* message subject, */
	struct _time time;	/* message creation time */
	WORD attr;		/* attribute bits (see below) */
	WORD topic;		/* topic selection(s) */
	WORD topic_map;		/* shared topics */
};

/* Message attribute bits */

#define MSGEXISTS 1		/* message slot occupied */
#define MSGREAD 2		/* read by addressee */
#define MSGSENT 4		/* sent OK (remote) */
#define MSGTAG 8		/* general purpose tag bit */		    


#define SCHEDS 35		/* size of scheduler event table */

/* Scheduler event structure within PUP.SYS. Tags defined:

A - W		FIDONET events
X		ERRORLEVEL event
all others	RESERVED
*/

struct _sched {
	char bits;		/* see below */
	char tag;		/* event type, above, */
	char hr;		/*   hour, */
	char min;		/*   minute, */
	int len;		/* event length, or ERRORLEVEL for tag X */
};

#define SCHED_OPTIONAL 1	/* this event may be skipped */
#define SCHED_COMPLETE 2	/* this event already run */

/* PUPPY.SYS: This is where Puppy keeps its shit together. */

struct _pup {
	long callers;		/* number of callers to the system */
	long quote_pos;		/* quote file position */
	struct _node id;	/* our node ID */
	int nlimit;		/* normal callers limit, */
	int klimit;		/* K byte limit, */
	int top;		/* current top of the pile */
	unsigned msgnbr;	/* current highest message number */

	int messages;		/* total messages allowed */
	int msgsize;		/* size of each message body record */
	struct {
		char name[8];	/* topic name, */
		char desc[24];	/* its description */
	} topic[16];		/* 16 of 'em */

	int maxbaud;		/* maximum baud rate */
	char mdmstr[SS];	/* modem initialization string */
	WORD cd_bit;		/* bit to test for Carrier Detect, */
	int iodev;		/* default serial channel number */	

	int connect_tries;	/* attempt with connect limit */
	int dial_tries;		/* dial attempts */

	struct _sched sched[SCHEDS]; /* the schedulers event table */

	char filepref[SS];	/* file upload & download prefix */
};


/* This is the structure used to make getinfo() calls, and both returns
the desired information and stores information needed by the getinfo()
function itself between interations. The first half is the interface part;
Pup code depends on those fields being there. The lower half is used by
the getinfo() function itself. Change as you see fit. */

struct _fileinfo {

	char name[13];		/* REQUIRED filename (no path, drive, etc) */
	long size;		/* REQUIRED file size */
	struct _time time;	/* REQUIRED creation time (may be zero's) */

/* This is the block of shit that getinfo() uses internally. */

	struct {
		char s_attrib;	/* Search attribute */
		char x[21];
		WORD time;	/* MSDOS packed time */
		WORD date;	/* MSDOS packed date */
		long fsize;	/* MSDOS file size */
		char name[13];	/* MSDOS packed name */
	} xfbuf;
};
