// $VER: DiaFFree V1.3 (06 Sep 1994)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <dialog/dlg_pragmas.h>
#include <dialog/misc.h>
#include <dialog/file.h>
#include <dialog/msg.h>

#define __USE_SYSBASE

#include <proto/exec.h>
#include <proto/dos.h>


#define MINOSVER 37

#define VERSION_NAG \
        "\nYou have neglected your responsibility to upgrade\n"\
        "your system software to version 2.04 or greater!\n\n"

#define DLGERROR \
        "\nDiaFFree error: Can't open dlg.library!\n"

#define RERROR \
        "\nDiaFFree error: Can't read .fd description!\n"

#define WERROR \
        "\nDiaFFree error: Can't write .fd description!\n"

#define MEMORYERROR \
        "\nDiaMail error: No enough free memory. Check buffer value!\n\n"

#define HEADER \
        "\x1b[1m[1;35mDiaFFree V1.3\x1b[0m -- Set x day(s) old file(s) to FREE\n"\
        "Written by Janne Saarme 1994\n\n" \
        "Usage: DiaFFree -n [-b] [-l] [-o] [-r]areas\n\n" \
        "Switches:\n\n" \
        "-n<days>    List/Make x days old file(s) free\n" \
        "-b          Buffer size = Big ->Faster (default 1000)\n" \
        "-l          DiaGFlist style Filelist\n" \
        "-r<areas>   Area number(s) to skip. Syntax:1,2-10,15\n\n"
         
APTR DLGBase; 
BPTR f1, f2;

void  sulkemiset(void);
void  arvot(long arvo);

long laske=0, *taulukko, laskuri;

void main(int ac, char **arg)
{
static struct QuickFile *buf;
static struct Msg_Area area[100];
struct File_Header fheader;
struct ATime pvm;

char fname[30], filename[30], status[2], listonly=0, eiole=0, nooutput=0, *b, arvo=0,
     *month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};

short alueita=0, indeksi=-1, buffer=1000, nold=12345, tutki, tutki2;
long datainbuf, NewSec, filesize, n=1, f, actlength;

if(((struct Library *)SysBase)->lib_Version<MINOSVER ||
   DOSBase->dl_lib.lib_Version<MINOSVER) {
     Write(Output(), VERSION_NAG, sizeof(VERSION_NAG));
     exit(0);
     }

while((arg++, --ac) && **arg=='-')
      switch(arg[0][1])
         {
         case 'b':
         buffer = atoi(arg[0]+2);
         break; 
    
         case 'n': 
           nold = atoi(arg[0]+2);
           break;

         case 'l': 
           listonly = 1;
           break;

         case 'o': 
           nooutput = 1;
           break;
         
         case 'r': 
           taulukko=malloc(10000*sizeof(long)); 
           b = arg[0]+2;
           break;

         default:
           nold = 12345;
           break;
         }

if(nold==12345||nold==0||arg[0][0]=='?') {
   Write(Output(), HEADER, sizeof(HEADER));
   sulkemiset();
   }

while(*b)
      {
      f=atoi(b);
      while(isdigit(*b)) b++;
      if(*b=='-')
         {
         n=atoi(++b);
         while(isdigit(*b)) b++;
         }
      else
         n=f;

      if(*b) b++;

      while(f<=n) arvot(f++);
      }

if (!(DLGBase = OpenLibrary("dlg.library", 0))) {
    Write(Output(), DLGERROR, sizeof(DLGERROR));
    sulkemiset();
    }

if(!(f2 = Open("File:Area.bbs", MODE_READWRITE))) sulkemiset();

do {
  for(datainbuf=0, f=1; f && datainbuf<sizeof area; datainbuf+=f)
    if((f=Read(f2, (char *)area+datainbuf, sizeof area-datainbuf))<0) sulkemiset();
} while(datainbuf==sizeof area);

while(laskuri!=700)
{
if(area[alueita].Number == 0) laskuri = 700;
alueita++;
}

if(CheckSignal(SIGBREAKF_CTRL_C)) sulkemiset();

if(!(buf=malloc(buffer*sizeof(*buf)))) { Write(Output(), MEMORYERROR, sizeof(MEMORYERROR)); sulkemiset(); }

while (alueita!=indeksi)
{
if (f2) Close(f2); f2=0;
arvo = 0;indeksi++;

for(laskuri=0; laskuri<=laske; laskuri++) {
   tutki  = taulukko[laskuri];
   tutki2 = area[indeksi].Number;
   if(CheckSignal(SIGBREAKF_CTRL_C)) sulkemiset();
   if(tutki==tutki2) arvo=1;
   }
    
if(arvo!=1) {   
  if(CheckSignal(SIGBREAKF_CTRL_C)) sulkemiset();
  sprintf(fname, "File:%d/File.dat", area[indeksi].Number);
  if(!(f2 = Open(fname, MODE_READWRITE))) sulkemiset();
  eiole=0, f=0;

  do { 
    for(datainbuf=0, f=1; f && datainbuf<sizeof *buf; datainbuf+=f)
       if((f=Read(f2, (char *)buf+datainbuf, buffer*sizeof(*buf)-datainbuf))<0) sulkemiset(); /* I/O virhe */

     for(n=0; n<datainbuf/sizeof *buf; n++) {
        char *p;
    
        NewSec = AmigaTime()-(nold * 86400);
        
        if(buf[n].date < NewSec) {
          sprintf(filename, "File:%d/%d.fd", area[indeksi].Number, buf[n].number);
	
          if(!(f1 = Open(filename, MODE_READWRITE))) {
             Write(Output(), RERROR, sizeof(RERROR));
             sulkemiset();
             }
           
          filesize = sizeof(fheader);
          actlength = Read(f1, &fheader, filesize);

          if(actlength==-1) { Write(Output(), RERROR, sizeof(RERROR)); sulkemiset(); }      
       
          if(eiole==0&&listonly==1) {
             Printf("\n=-= File area is %ld (%s) =-=\n\n", area[indeksi].Number, area[indeksi].Name);           
             Printf("=-= Name =-=     = Date =   =Size= =-= Description =-=               =Status=\n");
             eiole=1;
             }

          if(listonly == 1) {
            UnpackTime(buf[n].date, &pvm);
            for(p=buf[n].desc; *p; p++) if(*p=='\r') *p=' ';
            if(p>buf[n].desc+33) strcpy(buf[n].desc+(33-3), "...");     
            if(fheader.Attribute == 0) strcpy(status,"Ratio");
            if(fheader.Attribute == 1) strcpy(status,"Free");
            Printf("%-14.14s  %02ld-%3s-%4ld %4ldKB %-33.33s  %s\n", buf[n].filename,
	             pvm.mday, month[pvm.mon], pvm.year, (buf[n].size)/1000, buf[n].desc, status);
            }
          else {
            if(fheader.Attribute == 0)  {
              fheader.Attribute = 1;
	
              if((Seek(f1, 0, OFFSET_BEGINNING))==-1) {
                 Write(Output(), WERROR, sizeof(WERROR));
                 sulkemiset();
                 }
	
            actlength = Write(f1, &fheader, filesize);
         
            if(actlength == 0 ) { Write(Output(), WERROR, sizeof(WERROR)); sulkemiset(); }  
           
            if(nooutput == 0) Printf("\v(%s) %s is now free.                          \n",area[indeksi].Name, buf[n].filename);
              }
            }	
          if (f1) Close(f1); f1=0;
          }

        if(CheckSignal(SIGBREAKF_CTRL_C)) sulkemiset();
        }
     }
     while(datainbuf==buffer*sizeof(*buf)); /* jos bufferi jäi vajaaksi, niin file on lopussa */
  }
}
sulkemiset();
}

void arvot(long arvo)
{
taulukko[laske]=arvo; laske++;
}

void sulkemiset(void) 
{
Printf("\n");
if (f1)      Close(f1);
if (f2)      Close(f2);
if (DLGBase) CloseLibrary(DLGBase);
exit(0);
}

