#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <time.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/execbase.h>
#include <libraries/dosextens.h>
#include <libraries/locale.h>
#include <proto/exec.h>
#include <proto/dos.h>

#include "rn.h"
#include "rnlanguage.h"

extern  char Newsgroupfile[];

#define NAMELEN		100
#define MAXNAMELEN	256

int rntidy(int argc,char *argv[])
{	int msg,i,maxtime,maxmsgs=400,group=0,error=0,high,low,deleten=0;
	long lock,days;
	struct FileInfoBlock	fib;
	struct DateStamp		date;
	char   file[MAXNAMELEN],name[NAMELEN],line[NAMELEN],modified;
	FILE *fp;

	for(i=1;i<argc;i++)
	{
		if(!strncmp(argv[i],"-m",2))	maxmsgs=atoi(argv[i]+2);
		else
		if(!strncmp(argv[i],"-g",2))	group=i;
		else
		if(!strncmp(argv[i],"-d",2))	deleten=atoi(argv[i]+2);
		else
		{
			printf(printout(MSG_USAGE_TIDY));
			return 5;
		}
	}

	if(maxmsgs<3)		maxmsgs=50;
	if(maxmsgs>3000)	maxmsgs=3000;

	DateStamp(&date);

	if(fp=fopen(Newsgroupfile,"rb"))
	{
		while(!feof(fp))
		{
			if(fgets(line,NAMELEN-1,fp)==0)
				break;
			i=strlen(line)-1;
			if(i<1 || feof(fp))
				break;

			line[i]=0;
			i=0;
			while(line[i] && line[i]!=' ' && line[i]!='\t')
				++i;

			strncpy(name,line,i);
			name[i]=0;

			while(line[i] && (line[i]==' ' || line[i]=='\t'))
				++i;

			if(line[i])
				maxtime=atol(line+i);
			else
				maxtime=60;

			if(!group || !strcmp(name,argv[group]+2))
			{
				printf("\r%s\033[K\n",name);

				high=get_next(name)-1;
				low=get_lowest(name,high);

				msg=low;
				modified=0;
				while(msg<high)
				{
					articlename(file,name,msg,0);
					if(lock=Lock(file,ACCESS_READ))
					{
						if(Examine(lock,&fib))
						{
							days=date.ds_Days-fib.fib_Date.ds_Days;
							UnLock(lock);
							if(days>maxtime || high-low>maxmsgs || deleten>0)
							{
								DeleteFile(file);
								++low;
								if(deleten>0)
									--deleten;
								modified=-1;
								printf(printout(MSG_TIDY_DAYS),msg,days);
								fflush(stdout);
							}
							else
								break;	/* leave the loop.. */
						}
						else
						{
							++low;
							modified=-1;
						}
					}
					else
					{
						++low;
						modified=-1;
					}
					++msg;
					if(SetSignal(0L,SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C)
					{
						printf("\nBreak**\n");
						fclose(fp);
						return 10;
					}
				}

				if(modified)
				{
					set_next(name,high+1);
					set_lowest(name,low);
				}
			}
		}
		fclose(fp);
	}
	printf("\n");
	return error;
}

