#include <exec/types.h>
#include <exec/nodes.h>

char *printout(ULONG);

/* rnprefs.c */

struct RnPrefs
{
	char Normal[10];
	char Header[10];
	char From[10];
	char Subject[10];
	char Article[10];
	char Include[10];
	char Groupname[10];
	char More[10];
	char Ext2[10];
	char Ext1[10];
	UWORD	Bits;
};

#define RN_FULLHEADER	(1L<<0)
#define RN_NOCLEAR		(1L<<1)
#define RN_HIDEINCLUDE	(1L<<2)
#define RN_SHOWDATE		(1L<<3)
#define RN_SHOWORG		(1L<<4)
#define RN_GRABALL		(1L<<5)
#define RN_NOMORE		(1L<<6)
#define RN_NOSCROLL		(1L<<7)
#define RN_NOCURSOR		(1L<<8)

#define	CONSOLE	1	/* not yet implemented */
#define	VT100	2
#define	ANSI	3

void init_prefs(struct RnPrefs *prefs,char term);
void show_prefs(struct RnPrefs *prefs,int flag);
void edit_prefs(struct RnPrefs *prefs,int rows);
void read_prefs(struct RnPrefs *prefs,char *filename,char term);
void write_prefs(struct RnPrefs *prefs,char *filename);

/* rnbits.c */

#define FLAG_CHECKED		1
#define FLAG_MODERATED		2
#define FLAG_READ_ONLY		4

#define FLAG_UNSUBSCRIBED	64

struct Range
{
	struct Node node;
	long low;
	long high;
};

struct groupnode
{
	struct Node Node;
	char name[80];
	ULONG expire;
	ULONG flags;
	long lowest;
	long highest;
	long unread;
	struct List ReadRanges;
	struct List MarkedRanges;
};

int  Setbit(struct groupnode *group,int number);
int  Clearbit(struct groupnode *group,int number);
int  Testbit(struct groupnode *group,int number);
void Setallbits(struct groupnode *group,int leave);
int  Countbits(struct groupnode *group);
void Freebits(struct groupnode *group);
int  Findnextbit(struct groupnode *group,int number);
int  Findprevbit(struct groupnode *group,int number);


/* rnnewsrc.c */

void write_newsrc(char *filename,struct List *grouplist);
void read_newsrc(char *filename,struct List *grouplist);
void free_newsrc(struct List *grouplist);
void sort_newsrc(struct List *grouplist);
void check_unread(char *Active,char *Newsgroupfile,struct List *grouplist,struct RnPrefs *prefs);
int  checkgroup(char *Active,struct groupnode *node);
/* -1 if the group does not exist */

struct groupnode *search_group(struct List *grouplist,char *name);
struct groupnode *get_group(int direction,int force,struct groupnode *start);


/* rngroups.c */

/* if flag=0, the whole filename is returned, otherwise only tail */
char *articlename(char *file,char *groupname,int number,int flag);
char *articlegroup(char *dir,char *groupname);

int  is_group(char *groupname);
long get_next(char *groupname);
long get_lowest(char *groupname,int highest);
int  set_next(char *groupname,long next);		/* returns 0 for success */
long inc_next(char *groupname);					/* returns the old next */
int  set_lowest(char *groupname,long lowest);	/* returns 0 for success */
int  findlowest(char *groupname,int highest,int oldlowest);
void update_active(char *activefile);

int  add_group(char *groupname,ULONG expire,ULONG flags);	/* 0 for success */
int  delete_group(char *groupname);

/* rnmisc.h */

char *get_time(void);
int  simplepatternmatch(char *string,char *pattern);
int  batchfile(char *newsfile,char *newsgroups,char *path);

/* rnutil.h */

void sf7toiso(char *filename);
int  getline(unsigned char *hotkeys,unsigned char *line,int maxlen,UBYTE pre,UBYTE echo);

