#define __USE_SYSBASE
#include <proto/exec.h>
#include <exec/memory.h>
#include <proto/dos.h>
#include <string.h>

#define BLEU "\033[33m"
#define NORM "\033[0m"
#define TEMPLATE "FILE/A"

#define MSG BLEU"IDX 1.04 (c) Thomas Pimmel 93-94 Allenbrand Brice 97\n"NORM
#define Malloc(x) AllocVec(x,MEMF_PUBLIC|MEMF_CLEAR)

#define ERR2 "Fichier de proverbe introuvable\n"
#define ERR3 "Ne peut créer le fichier d'index\n"
#define ERR4 "Mémoire insuffisante\n"
#define HELP "Mauvais arguments\n"MSG"FILE/A   : Nom du fichier proverbe (sans extension)\n\0$VER: IDX 1.04 (20.3.97)"
#define END "IDX : %lu proverbes indexés\n"

ULONG Pipo(void)
{
 struct DosLibrary *DOSBase;
 struct ExecBase *SysBase;
 struct RDArgs *rdargs;
 char *nom,*buffer,*tb;
 long opts[1];
 unsigned int nb,n,m;
 BPTR f;

 SysBase=*((struct ExecBase **)4);
 if(DOSBase=(struct DosLibrary *)OpenLibrary("dos.library",0))
 {
  opts[0]=0;
  if(rdargs=ReadArgs(TEMPLATE,opts,NULL))
  {
   if(!opts[0])
    PutStr(HELP);
   else
   {
    if(nom=Malloc(100))
    {
     strcpy(nom,((char **)opts)[0]);
     strcat(nom,".PROV");
     if(f=Open(nom,MODE_OLDFILE))
     {
      Seek(f,0,OFFSET_END);
      m=Seek(f,0,OFFSET_BEGINNING);
      if(tb=buffer=Malloc(m))
      {
       Read(f,buffer,m);
       Close(f);
       strcpy(nom,((char **)opts)[0]);
       strcat(nom,".INDEX");
       if(f=Open(nom,MODE_NEWFILE))
       {
        Write(f,"PROV\0\0\0\0",8);
        n=0;
        nb=1;
        while((nb++)<=m)
         if(*(tb++)=='|')
         {
          Write(f,&nb,4);
          n++;
         }
        SetFileSize(f,-4,OFFSET_CURRENT);
        Printf(END,n);
        Close(f);
       }
       else
        PutStr(ERR3);
       FreeVec(buffer);
      }
      else
      {
       Close(f);
       PutStr(ERR4);
      }
     }
     else
      PutStr(ERR2);
     FreeVec(nom);
    }
    else
     PutStr(ERR4);
   }
   FreeArgs(rdargs);
  }
  else
   PutStr(HELP);
  CloseLibrary((struct Library *)DOSBase);
 }
 return(0);
}
