// Filename:	dllist.h
// Contents:	the object definition for the doubly linked list object
// Author:	Greg Shaw
// Created:	8/2/93

/*
This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.

In addition to the permissions in the GNU General Public License, the
Free Software Foundation gives you unlimited permission to link the
compiled version of this file with other programs, and to distribute
those programs without any restriction coming from the use of this
file.  (The General Public License restrictions do apply in other
respects; for example, they cover modification of the file, and
distribution when not linked into another program.)

This file is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; see the file COPYING.  If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */

#ifndef _DLLIST_H_
#define _DLLIST_H_

#include "bbshdr.h"


// Structure:	finfo
// Contents:	the record for a file in a files section
// Author:	Greg Shaw
// Created:	8/1/93

typedef struct finfo
{
	char name[MAX_FILENAMELENGTH+1];		// name of file
	char sdesc[SDESC_LEN];		// short description
	char uploader[41];	// name of uploader
	char avail;		// is file online and available?
	time_t	date;		// date of upload
	int	numdls;		// number of times downloaded
	unsigned long filepos;	// position in file of description
	unsigned long size;	// size of file
	struct finfo *next;	// next record
	struct finfo *previous; // previous record
}; 

typedef struct finfo FInfo;

// Object:	dllist
// Purpose:	encapsulate a dynamically linked list object with
//		self-sorting capabilities.
// Attributes:	numrec - number of records in list
//		head - head of list
// 		tail - tail of list
//		sortstate - the current sorted state:
//			0 - unsorted (just loaded)
//			1 - ascending by date
//			2 - ascending by alphabetic
// Methods:	add - add to list
//		open - read in files section
// 		clear - nuke list
// 		sort - sort list (by key)
//		previous - return 'previous' record
//		next - return 'next' record
// Author:	Greg Shaw
// Created:	8/2/93

class dllist : public errlog
{
	int	numrec;		// number of records in list
	FInfo	*head;		// head of list
	FInfo	*tail;		// tail (end) of list
	FInfo	*here;		// current list record pointer
	int	sortstate;	// current sorted state
	sel_sort(int srtype, FInfo *head);	// sort records by type
public:
	dllist();		// constructor
	~dllist();		// destructor
	add(FInfo *rec);	// add to list
	clear_list(void);		// nuke list
	sort(int type);		// sort list
	top(void);		// go to head of list
	bottom(void);		// go to tail of list
	numrecs(void) { return(numrec); }; // return number of records
	FInfo *previous(void);	// previous record
	FInfo *next(void);	// next record
	FInfo *find(char *str);	// search record for string
};


#endif // _DLLIST_H_
