/* Tingen til at hente atributter / gemme atributter i fil */
#include "filedoor_structs_defines.h"
#include "filedoor_protos.h"
#include <strings.h>
#include <stdio.h>
#include <proto/exec.h>
#include <proto/dos.h>

int NumAttrs;                     /* Antal aktive atributter [0;NumAttrs-1] */
__far char *Attrs[500];           /* Pointere på de 100 mulige attributter */
__far void *AttrPtrs[500];        /* Pointere tilknyttet attributterne gemmes ikke på disk! */
static __far char filename[200];  /* Filnavn på userfil */

/* Find den aktuelle brugers attributfil */
void InitAttrs(void)
{
BPTR handle;
struct Areamem *a;
char *areastr;

  NumAttrs=0;
  strcpy(filename,"bbs:cydaldoor/users/");
  strcat(filename,UserName);
  if(handle=Open(filename,MODE_OLDFILE))
  {
    while((FGets(handle,filename,200))!=NULL)
    {
      if(Attrs[NumAttrs]=AllocVec(strlen(filename)+1,MEMF_ANY))
      {
        if(filename[strlen(filename)-1]<32) filename[strlen(filename)-1]=0;
        strcpy(Attrs[NumAttrs],filename);
        /* Særbehandling til taggede filer */
        if(Attrs[NumAttrs][0]=='T')
        {
          if(!strnicmp(GetNthOccur(Attrs[NumAttrs],':',2)+1,superarea,strlen(superarea)))
          {
            taggedfiles++;
            areastr=GetNthOccur(Attrs[NumAttrs],':',1)+1;
            a=firstarea;
            AttrPtrs[NumAttrs]=NULL;
            while(a!=NULL)
            {
              if(strncmp(a->area.filename,areastr,strlen(a->area.filename))==0) AttrPtrs[NumAttrs]=a;
              a=a->next;
            }
          }
        }
        NumAttrs++;
      }
    }
    Close(handle);
  }
}

/* Skriv attributter til disk */
void SaveAttrs(void)
{
int i;
BPTR handle;

  strcpy(filename,"bbs:cydaldoor/users/");
  strcat(filename,UserName);
  if(handle=Open(filename,MODE_NEWFILE))
  {
    for(i=0;i<NumAttrs;i++)
    {
      FPuts(handle,Attrs[i]);
      FPutC(handle,'\n');
    }
    Close(handle);
  }
}

/* Skriv attributter til disk OG fjern den fra hukommelsen */
void ZapAttrs(void)
{
int i;
BPTR handle;

  strcpy(filename,"bbs:cydaldoor/users/");
  strcat(filename,UserName);
  if(handle=Open(filename,MODE_NEWFILE))
  {
    for(i=0;i<NumAttrs;i++)
    {
      FPuts(handle,Attrs[i]);
      FPutC(handle,'\n');
      FreeVec(Attrs[i]);
    }
    NumAttrs=0;
    Close(handle);
  }
}

/* Tilføj en attribut. Erstatter ikke andre forekomster af samme, så beware! */
void AddAttr(char *str,void *extra)
{
  if(Attrs[NumAttrs]=AllocVec(strlen(str)+1,MEMF_ANY))
  {
    strcpy(Attrs[NumAttrs],str);
    AttrPtrs[NumAttrs]=extra;
    NumAttrs++;
  }
}

/* Fjern en attribut udpeget ved dens nummer */
void RemAttr(int i)
{
  if(i<NumAttrs)
  {
    FreeVec(Attrs[i]);
    Attrs[i]=Attrs[NumAttrs-1];
    AttrPtrs[i]=AttrPtrs[NumAttrs-1];
    NumAttrs--;
  }
}

/* Find en eksisterende attribut. (Eller NULL) Kan kun finde første forekomst hvis flere er mulige */
char *FindAttr(char letter)
{
int i;

  for(i=0;i<NumAttrs;i++)
  {
    if(Attrs[i][0]==letter) return(Attrs[i]+1);
  }
  return(NULL);
}

/* Erstat tidligere eller indsæt ny forekomst af en attribut */
void SetAttr(char *string)
{
int i;

  for(i=0;i<NumAttrs;i++)
  {
    if(Attrs[i][0]==string[0]) RemAttr(i);
  }
  AddAttr(string,NULL);
}

/* Marker/umarker fil i et område */
/* returnerer flag for om fil nu er markeret eller ikke markeret */
BOOL ToggleTag(struct Areamem *a,struct Filemem *f)
{
int i,j;
char tstr[200];

  for(i=0;i<NumAttrs;i++)
  {
    if(Attrs[i][0]=='T')
    {
      j=1;
      if(strncmp(Attrs[i]+j,f->f.name,strlen(f->f.name))==0)
      {
        j+=strlen(f->f.name)+1;
        if(strncmp(Attrs[i]+j,a->area.filename,strlen(a->area.filename))==0)
        {
          j+=strlen(a->area.filename)+1;
          if(strncmp(Attrs[i]+j,superarea,strlen(superarea))==0)
          {
            RemAttr(i);
            taggedfiles--;
            return(FALSE);
          }
        }
      }
    }
  }
  sprintf(tstr,"T%s:%s:%s",f->f.name,a->area.filename,superarea);
  AddAttr(tstr,a);
  taggedfiles++;
  return(TRUE);
}

/* Undersøger om en fil er markeret */
/* returnerer flag for om fil nu er markeret eller ikke markeret */
BOOL CheckTag(struct Areamem *a,struct Filemem *f)
{
int i,j;

  for(i=0;i<NumAttrs;i++)
  {
    if(Attrs[i][0]=='T')
    {
      j=1;
      if(strncmp(Attrs[i]+j,f->f.name,strlen(f->f.name))==0)
      {
        j+=strlen(f->f.name)+1;
        if(strncmp(Attrs[i]+j,a->area.filename,strlen(a->area.filename))==0)
        {
          j+=strlen(a->area.filename)+1;
          if(strncmp(Attrs[i]+j,superarea,strlen(superarea))==0) return(TRUE);
        }
      }
    }
  }
  return(FALSE);
}

/* Marker/umarker et område */
/* returnerer flag for om område nu er markeret eller ikke markeret */
BOOL ToggleAreaTag(struct Areamem *a)
{
int i,j;
char tstr[200];

  for(i=0;i<NumAttrs;i++)
  {
    if(Attrs[i][0]=='A')
    {
      j=1;
      if(strncmp(Attrs[i]+j,a->area.filename,strlen(a->area.filename))==0)
      {
        j+=strlen(a->area.filename)+1;
        if(strncmp(Attrs[i]+j,superarea,strlen(superarea))==0)
        {
          RemAttr(i);
          return(FALSE);
        }
      }
    }
  }
  sprintf(tstr,"A%s:%s",a->area.filename,superarea);
  AddAttr(tstr,a);
  return(TRUE);
}

/* Undersøger om et area er markeret */
/* returnerer flag for om område nu er markeret eller ikke markeret */
BOOL CheckAreaTag(struct Areamem *a)
{
int i,j;

  for(i=0;i<NumAttrs;i++)
  {
    if(Attrs[i][0]=='A')
    {
      j=1;
      if(strncmp(Attrs[i]+j,a->area.filename,strlen(a->area.filename))==0)
      {
        j+=strlen(a->area.filename)+1;
        if(strncmp(Attrs[i]+j,superarea,strlen(superarea))==0) return(TRUE);
      }
    }
  }
  return(FALSE);
}

/* Lille hjælpefunktion finder n'te forekomst af tegn i streng */
char *GetNthOccur(char *streng,char tegn,int n)
{
int i;

  for(i=0;streng[i];i++)
  {
    if(streng[i]==tegn) if(!--n) return(streng+i);
  }
  return(NULL);
}
