/*
  SortByDate.c - von Christof Brühann
  Betriebssystem: Kickstart V2.04
  Compilieren mit DICE: dcc SortByDate.c -o SortByDate
*/

#include <dos/dos.h>
#include <exec/memory.h>
#include <time.h>
#include <dos/var.h>
#define FIBSIZE sizeof(struct FileInfoBlock)
char *mon[]={"Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug",
	     "Sep","Okt","Nov","Dez"};
UBYTE dir[255]={0};
struct FileInfoBlock *fib,*fibptr[250];

void Usage()				/* Info über Aufruf ausgeben */
{
 printf("\nSortByDate [<verzeichnis>] [<anzahl>]\n\n");
 printf("<verzeichnis> - auszugebenes Verzeichnis (Voreinstellung: aktuelles ");
 puts("Verzeichnis)");
 printf("<anzahl>      - Anzahl auszugebener Einträge (Voreinstellung: alle)");
 printf("\n\n");
}

void main(argc,argv)
SHORT argc;
UBYTE **argv;
{
 LONG num2list=250,numall=0,i,j;
 time_t secs;
 struct tm *tm;
 struct Lock *lock;
 APTR mem;
 if (strcmp(argv[1],"?")==0 || argc>3) Usage(); /* ggf. Programminfo ausgeben */
 else
 {
  if (argc==2)					/* Parameter untersuchen */
   if (sscanf(argv[1],"%d",&num2list)==-1)	/* und Variablen für */
   {						/* Verzeichnis und Anzahl */
    num2list=250;				/* beschreiben */
    strcpy(dir,argv[1]);
   }

  if (argc==3)					/* zwei Parameter vorhanden ? */
  {
   if (sscanf(argv[1],"%d",&num2list)==-1)
   {
    strcpy(dir,argv[1]);
    num2list=0;
    sscanf(argv[2],"%d",&num2list);
   }
   else strcpy(dir,argv[2]);
  }
  if (num2list<1) Usage();
  mem=(APTR)AllocMem(num2list*FIBSIZE,MEMF_PUBLIC);
				 /* Speicher für Verzeichniseinträge besorgen */
  fib=(struct FileInfoBlock *)AllocMem(FIBSIZE,MEMF_PUBLIC);
  if (mem&&fib)			/* genug Speicher vorhanden ? */
  {
   for (i=0;i<num2list;i++) fibptr[i]=mem+i*FIBSIZE;
				/* Zeiger auf Verzeichniseinträge beschreiben */
   if (lock=(APTR)Lock(dir,ACCESS_READ))    /* Lock auf Verzeichnis holen */
   {
    if (Examine(lock,fib))		     /* nähere Infos über Verzeichnis */
     if (fib->fib_DirEntryType>0)     /*Parameter für Verzeichnis eine Datei ?*/
     {
      while (ExNext(lock,fib))		  		  /* nächster Eintrag */
      {
       numall++;			     /* Zähler für gefundene Einträge */
       if (numall==1) memcpy(fibptr[0],fib,FIBSIZE);
       else
       {
	j=num2list;
	if (numall<num2list) j=numall;
	for (i=0;i<j;i++) 	    /* Eintrag in vorhandene Liste einordnen: */
	{
	 if (CompareDates(&fibptr[i]->fib_Date,&fib->fib_Date)>=0)
					/* bzgl. Revisionsdatum vergleichen */
	 {
	  memcpy(fibptr[i+1],fibptr[i],(j-i-1)*FIBSIZE); /* einordnen */
	  memcpy(fibptr[i],fib,FIBSIZE);
	  i=-1;
	  break;
	 }
	}
	if ((i!=-1) && (numall<=num2list))
	 memcpy(fibptr[numall-1],fib,FIBSIZE);
       }
      }
      j=num2list;			/* Ausgabe der sortierten Liste: */
      if (numall<num2list) j=numall;
      for (i=j-1;i>=0;i--)
      {
       printf("%-25s     ",fibptr[i]->fib_FileName);
       if (fibptr[i]->fib_DirEntryType>0) printf("%7s","Dir");
 	else printf("%7d",fibptr[i]->fib_Size);
       secs=fibptr[i]->fib_Date.ds_Days*(1440*60)+fibptr[i]->fib_Date.ds_Minute*
            60+fibptr[i]->fib_Date.ds_Tick/50;
				    /* Umwandlung von DateStamp nach Sekunden */
       tm=localtime(&secs);	    /* tm-Struktur ausfüllen lassen */
       printf("  %02d.%3s.%02d  %02d:%02d:%02d",tm->tm_mday,mon[tm->tm_mon],
	      tm->tm_year,tm->tm_hour,tm->tm_min,tm->tm_sec);
       printf("\n");
      }
      printf("%d von %d Einträgen ausgegeben.\n",j,numall);
     }
     else printf("'%s' ist kein Verzeichnis !\n",fib->fib_FileName);
    UnLock(lock);
   }
   else puts("Falsches Verzeichnis !");
  }
  if (mem) FreeMem(mem,num2list*FIBSIZE);
  if (fib) FreeMem(fib,FIBSIZE);
 }
}
