/* Lille util til at oprette et nyt area */

#include <proto/exec.h>
#include <proto/dos.h>
#include <exec/memory.h>
#include <utility/tagitem.h>
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>

#include "/filedoor_structs_defines.h"

char *argptrs[7];
struct Area newa;
__far struct File *filesarray[10000];
filecount=0;
void *indexptr;
ULONG indexsiz;

char * __asm ShortFind(register __a0 char *indexfile,register __a1 char *filename,register __d7 ULONG len);

BOOL LoadFile(char *filnavnet, APTR *ptrptr, ULONG *sizptr)
{
struct FileInfoBlock *fib;
BPTR filhandle;

  if (filhandle=Open(filnavnet,MODE_OLDFILE))
  {
    if (fib=AllocDosObjectTags(DOS_FIB,TAG_END))
    {
      if (ExamineFH(filhandle,fib))
      {
        if (*ptrptr=AllocVec(fib->fib_Size,MEMF_ANY))
        {
          if (fib->fib_Size==Read(filhandle,*ptrptr,fib->fib_Size))
          {
            *sizptr=fib->fib_Size;
            FreeDosObject(DOS_FIB,fib);
            Close(filhandle);
            return(TRUE);
          } else printf("Coulden't read file %s\n",filnavnet);
          FreeVec(*ptrptr);
        } else printf("No memory\n");
        FreeDosObject(DOS_FIB,fib);
      } else printf("AmigaDos won't cooperate!\n");
    } else printf("REALLY no memory\n");
    Close(filhandle);
  } else printf("Coulden't open file %s\n",filnavnet);
  return(FALSE);
}

void findshort(struct File *f)
{
unsigned char *match;
unsigned char tempstr[100];
int i;

  match=ShortFind(indexptr,f->name,indexsiz);
  if(match!=NULL)
  {
    while(match[0]!=32) match++;  /* skip filnavn */
    while(match[0]==32) match++;  /* skip mellemrum før desc */
    for(i=0;match[i]>=32 && i<80;i++)
      tempstr[i]=match[i];
    tempstr[i]=0;
    strcpy(f->shortdesc,tempstr);
  }
}

void findlong(struct File *f)
{
char tempstr[100];
char pathstr[150];
char *lastdot;
BPTR handle;

  /* Prøv at finde en fil med efternavnet .readme */
  lastdot=tempstr;
  strcpy(tempstr,f->name);
  while(strchr(lastdot+1,'.')!=NULL)
    lastdot=strchr(lastdot+1,'.');
  if(lastdot!=tempstr)
  {
    strcpy(lastdot,".readme");
    strcpy(pathstr,newa.path);
    AddPart(pathstr,tempstr,150);
    if(handle=Open(pathstr,MODE_OLDFILE))
    {
      strcpy(f->longdesc,pathstr);
      f->flags=(f->flags&~(FILEFLAG_LONGFILE|FILEFLAG_LONGARCHIVE))|FILEFLAG_LONGFILE;
      Close(handle);
    }
  }
  /* Led efter file_id.diz indeni arkiv her... når vi gider engang */
}

void find(void)
{
struct File *f;
char pattern[300];
struct FileInfoBlock *fib;
BPTR lock;

  if(fib=AllocDosObject(DOS_FIB,0L))
  {
    if(lock=Lock(newa.path,ACCESS_READ))
    {
      ParsePatternNoCase(argptrs[5],pattern,300);
      Examine(lock,fib);
      if(fib->fib_DirEntryType>0)
      {
        while(ExNext(lock,fib))
        {
          if(fib->fib_DirEntryType<0 && MatchPatternNoCase(pattern,fib->fib_FileName))
          {
            if(f=AllocVec(sizeof(struct File),MEMF_CLEAR))
            {
              strcpy(f->name,fib->fib_FileName);
              f->siz=fib->fib_Size;
              f->dl=0;
              f->qual=65535;
              f->date=fib->fib_Date.ds_Days;
              f->flags=0;
              findshort(f);
              findlong(f);
              filesarray[filecount++]=f;
            }
          }
        }
      }
      UnLock(lock);
    }
    else printf("%s not found\n",newa.path);
    FreeDosObject(DOS_FIB,fib);
  }
  else printf("No memory\n");
}

int comparefiles(struct File **a,struct File **b)
{
  return(stricmp((*a)->name,(*b)->name));
}


void spam(void)
{
}

void purge(void)
{
char filnavn[200];
int i;
BPTR handle;

  strcpy(filnavn,"bbs:cydaldoor/");
  strcat(filnavn,argptrs[0]);
  strcat(filnavn,"/");
  strcat(filnavn,newa.filename);
  if(handle=Open(filnavn,MODE_NEWFILE))
  {
    for(i=0;i<filecount;i++)
    {
      Write(handle,filesarray[i],sizeof(struct File));
      FreeVec(filesarray[i]);
    }
    Close(handle);
  }
  else printf("%s coulden't be opened\n",filnavn);
}

int main(int argc,char *argv[])
{
char argstr[256];
char filename[100];
struct RDArgs *argstruct;
int i;
BPTR handle,lock;

  memset(&newa,0,sizeof(struct Area));
  strcpy(argstr,(char *)GetArgStr());
  if(argstr[strlen(argstr)-1]!='\n') strcat(argstr,"\n");
  for(i=0;i<5;i++) argptrs[i]=NULL;
  argstruct=ReadArgs("Superareafilename=Super/K/A,"\
                     "Areafilename=File/K/A,"\
                     "Areaname=Area/K/A,"\
                     "Filepath=Path/K/A,"\
                     "Accesslevel=Axxs/K/A/N,"\
                     "Includepattern=Patt/K/A,"\
                     "Shortfile=Short/K/A",(long *)argptrs,NULL);
  /* Hvis det lykkedes at parse argumenterne ordentligt */
  if(argstruct)
  {
    /* Lav superarea directory */
    strcpy(filename,"bbs:cydaldoor/");
    strcat(filename,argptrs[0]);
    if(lock=CreateDir(filename))
    {
      UnLock(lock);
    }
    else
    {
      if(lock=Lock(filename,ACCESS_READ))
      {
        UnLock(lock);
      }
      else
      {
        printf("Warning: Superarea-directory not located\n");
      }
    }
    /* Find filen med de korte filbeskrivelser */
    if(!LoadFile(argptrs[6],&indexptr,&indexsiz))
    {
      printf("..Failed to locate indexfile\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Kopier filnavnet på areafilen til areastruct */
    strcpy(filename,argptrs[1]);
    if(strcmp(".area",filename+strlen(filename)-5)) strcat(filename,".area");
    if(strlen(filename)<32)
      strcpy(newa.filename,filename);
    else
    {
      printf("Areafilename too long\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Kopier det beskrivende navn af area til areastruct */
    if(strlen(argptrs[2])<32)
      strcpy(newa.name,argptrs[2]);
    else
    {
      printf("Areaname too long\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Kopier sti til areas filer til areastruct */
    if(strlen(argptrs[3])<100)
      strcpy(newa.path,argptrs[3]);
    else
    {
      printf("Path to area's files too long\nTough luck eh?\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Kopier accesslevel påkrævet */
    if(argptrs[4])
      newa.access=*((LONG *)argptrs[4]);
    else
      newa.access=0;
    /* Tilføj den genererede areastruct til superareafilen */
    strcpy(filename,"bbs:cydaldoor/");
    strcat(filename,FilePart(argptrs[0]));
    if(strcmp(".superarea",filename+strlen(filename)-10)) strcat(filename,".superarea");
    if(handle=Open(filename,MODE_READWRITE))
    {
      Seek(handle,0L,OFFSET_END);
      Write(handle,&newa,sizeof(struct Area));
      Close(handle);
    }
    else
    {
      printf("Couldn't open area file\n");
      FreeArgs(argstruct);
      return(20);
    }
    /* Lav en fornuftig areafil */
    find();
    qsort(filesarray,filecount,sizeof(struct File *),comparefiles);
    purge();
    spam();
    spam();
    spam();
    /* I want to break freeeeee... (Queen) */
    FreeArgs(argstruct);
    FreeVec(indexptr);
  }
  else
  {
    printf("Incorrect arguments specified\n%s ? for template\n",argv[0]);
    return(20);
  }
  return(0);
}
