/* This program is made by Anders Melchiorsen and is completely free.
 * Use is your own responsibility. (I dare use it.)
 *
 * Suggestions, critisism, and donations are welcome:
 *
 *  Anders Melchiorsen      FidoNet:  2:238/97.9
 *  Kirkebyen 5
 *  7950 Erslev
 *  Denmark
 *
 * Compile using DICE:
 *  dcc Troels.c -o Troels.o -2.0 -mi -ms -mRR -c
 *  dlink Troels.o -o Troels -r
 */

/* Includes */
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <dos/dosasl.h>
#include <dos/dostags.h>
#include <exec/memory.h>

/* To figure the archive type out */
enum { TYPE_UNKNOWN, TYPE_LZX, TYPE_LHA };

/* Template stuff */
enum { INBOUND, LHA, LZX, NUM_ARGS };

/* Protos */
void strcpy(char *dst, char *src);
void strcat(char *dst, char *src);

int
Troels(void)
{
    /* For ReadArgs() */
    STRPTR TemplResult[NUM_ARGS];
    struct RDArgs *TemplRA;

    /* For pattern matching */
    struct AnchorPath *Anchor;

    /* Libraries we need */
    struct Library *SysBase, *DOSBase;

    /* Set to errorcode if something is wrong */
    LONG success = 0;

    /* Open libraries */
    SysBase = *(struct ExecBase **)4;
    if (DOSBase = OpenLibrary("dos.library", 37))
    {
	if (Anchor = AllocVec(sizeof(struct AnchorPath), MEMF_CLEAR))
	{
	    if (TemplRA = ReadArgs("INBOUND/A/K,LHA/A/K,LZX/A/K", TemplResult, NULL))
	    {
		BPTR newdir;

		if (newdir = Lock((STRPTR)TemplResult[INBOUND], ACCESS_READ))
		{
		    ULONG ret;

		    /* Enter Inbound */
		    newdir = CurrentDir(newdir);

		    /* Find all packets */
		    ret = MatchFirst("#?.(MO|TU|WE|TH|FR|SA|SU)[0-9]", Anchor);
		    while (ret != ERROR_NO_MORE_ENTRIES)
		    {
			LONG type = TYPE_UNKNOWN;
			UBYTE execute[256], *foundfile = Anchor->ap_Info.fib_FileName;

			/* Figure the file type out */
			{
			    BPTR handle;
			    UBYTE buffer[8];

			    if (handle = Open(foundfile, MODE_OLDFILE))
			    {
				Read(handle, buffer, sizeof(buffer));
				Close(handle);

				if (buffer[0] == 'L' && buffer[1] == 'Z' && buffer[2] == 'X')
				    type = TYPE_LZX;
				if (buffer[2] == '-' && buffer[3] == 'l' && buffer[4] == 'h')
				    type = TYPE_LHA;
			    }
			}

			switch (type)
			{
			    case TYPE_LZX:
				strcpy(execute, (STRPTR)TemplResult[LZX]);
				break;

			    case TYPE_LHA:
				strcpy(execute, (STRPTR)TemplResult[LHA]);
				break;
			}

			/* Now do common things */
			if (type != TYPE_UNKNOWN)
			{
			    strcat(execute, " -x0 x ");
			    strcat(execute, foundfile);

			    if (!SystemTagList(execute, NULL))
				DeleteFile(foundfile);
			    else
			    {
				/* Something worng happend, rename the file */
				strcpy(execute, foundfile);
				strcat(execute, ".bad");
				Rename(foundfile, execute);
			    }
			}

			ret = MatchNext(Anchor);
		    }

		    /* Clean up */
		    MatchEnd(Anchor);

		    /* Go back to original directory */
		    UnLock(CurrentDir(newdir));
		} else
		    success = IoErr();

		FreeArgs(TemplRA);
	    } else
		success = IoErr();

	    FreeVec(Anchor);
	} else
	    success = ERROR_NO_FREE_STORE;

	PrintFault(success, "Troels");
	CloseLibrary(DOSBase);
    } else
	success = 10;

    return (success ? 10 : 0);
}

void
strcpy(char *dst, char *src)
{
    while (*dst++ = *src++)
	;
}

void
strcat(char *dst, char *src)
{
    while (*dst)
	dst++;
    strcpy(dst, src);
}

const char versiontag[] = "$VER: Troels 1.0 (9.6.95)";
