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

#include "rn.h"

#define NAMELEN		100
#define MAXNAMELEN	256

#define POSTGROUPS	32	/* max groups on the Newsgroups: line */

#define MAXPATTERNS	64	/* max patterns for each host */

extern char Newshome[];
extern char Sysfile[];
extern char Batchfile[];
extern char Timezone[];

char *get_time()
{	long joo;
	struct tm *hui;
	static char aika[80];
	static const char Wday[7][4]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
	static const char Month[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};

	joo=time(&joo);
	hui=localtime(&joo);

	sprintf(aika,"%s, %d %s %d %d%d:%d%d:%d%d %s",
				Wday[hui->tm_wday],
				hui->tm_mday,Month[hui->tm_mon],hui->tm_year,
				hui->tm_hour/10,hui->tm_hour%10,
				hui->tm_min/10,hui->tm_min%10,
				hui->tm_sec/10,hui->tm_sec%10,
				Timezone);
	return aika;
}


/*********************************
 Handles patterns:
	"*"
	"*string*"
	"*string"
	"string*" and
	"string"
*********************************/

int simplepatternmatch(char *string,char *pattern)
{	int lenp=strlen(pattern),lens=strlen(string);

	if(!lenp)
		return 0;					/* Empty string does not match */

	if(lenp==1 && pattern[0]=='*')	/* "*" matches all */
	{
		return -1;
	}

	if(pattern[0]=='*' && pattern[lenp-1]=='*')
	{
		if(lenp==2)
			return -1;				/* "**" matches all */

		pattern[lenp-1]=0;
		if(strstr(string,pattern+1))
		{
			pattern[lenp-1]='*';
			return -1;				/* match */
		}
		else
		{
			pattern[lenp-1]='*';
			return 0;				/* no match */
		}
	}

	if(pattern[0]=='*')
	{
		if(!strncmp(string+lens-lenp+1,pattern+1,lenp-1))
			return -1;				/* match */
		else
			return 0;				/* no match */
	}

	if(pattern[lenp-1]=='*')
	{
		if(!strncmp(string,pattern,lenp-1))
			return -1;				/* match */
		else
			return 0;				/* no match */
	}

	if(lenp!=lens)
		return 0;

	if(!strcmp(string,pattern))
		return -1;
	else
		return 0;
}


int batchfile(char *newsfile,char *newsgroups,char *path)
{	char arg[2*MAXNAMELEN],name[MAXNAMELEN],temp[NAMELEN],
		 pattern[MAXNAMELEN],ngroups[MAXNAMELEN];
	char *groups[POSTGROUPS],*patterns[MAXPATTERNS];
	FILE *handle,*reffile;
	int i,j,k,match,numgrp=0,numptr,curpos;

	strcpy(ngroups,newsgroups);		/* separate newsgroups */
	i=j=0;
	groups[numgrp++]=&newsgroups[0];
	while(newsgroups[i] && numgrp<POSTGROUPS-1)
	{
		if(newsgroups[i]==',')
		{
			ngroups[j++]='\0';
			i++;
			groups[numgrp++]=&ngroups[i];
		}
		else
		{
			ngroups[j++]=ngroups[i++];
		}
	}

	if(handle=fopen(Sysfile,"rb"))
	{
		while(!feof(handle))
		{
			curpos = 0;
again:
			if(fgets(arg+curpos,2*MAXNAMELEN-curpos,handle)==0)
				break;
			i=strlen(arg)-1;
			if(i<0 || feof(handle))
				break;
			if(i<2*MAXNAMELEN-20 && arg[i-1]=='\\')	/* Line continuation */
			{
				curpos = i-1;
				arg[i-1] = '\0';
				goto again;
			}

			arg[i]= '\0';

			if(i && arg[0]!='#')
			{
				i=0;
				while(arg[i] && arg[i]!=':')
					++i;
				if(arg[i])
					arg[i]=0;
				else
					arg[i+1]=0;
				strcpy(name,arg);			/* hostname */
				strcpy(pattern,arg+i+1);	/* newsgroup patterns */

				sprintf(temp,"!%s!",name);

				/* Path: <name>!dkjqji */
				/* Path: kdoqkop!<name>!jopqw */
				if((strncmp(path,name,strlen(name)) || path[strlen(name)]!='!') &&
					!strstr(path,temp))	/* do not send back */
				{

					/* separate patterns */
					i=j=0;
					numptr=0;
					patterns[numptr++]=&pattern[0];
					while(pattern[i] && numptr<MAXPATTERNS-1)
					{
						if(pattern[i]==',' || pattern[i]==' ' || pattern[i]=='\t')
						{
							pattern[i++]='\0';
							while(pattern[i]==' ' || pattern[i]=='\t')
								++i;
							if(pattern[i])
								patterns[numptr++]=&pattern[i];
						}
						else
						{
							++i;
						}
					}

					match=0;

					for(k=0;k<numgrp;k++)	/* for each x-posted group */
					{
						for(j=0;j<numptr;j++)	/* for each pattern */
						{
							if(patterns[j][0]=='-')
							{
								if(simplepatternmatch(groups[k],patterns[j]+1))
								{	match=0;
								}
							}
							else
							{
								if(simplepatternmatch(groups[k],patterns[j]))
								{	match=-1;
								}
							}
						}
						if(match)
							break;
					}

					if(match==-1)	/* if match and no not-wanted group */
					{
						sprintf(arg,Batchfile,name);
						if(reffile=fopen(arg,"ab"))
						{
							fprintf(reffile,"%s\n",newsfile);
							fclose(reffile);
						}
					}
				}
			}
		}
		fclose(handle);
	}
	return 0;
}

