//================================================================================
// PROGRAM: Catalog Index Maker
// VERSION: v3.0
//COMPILER: Lattice C v6.51
//    DATE: May 17, 1994
//================================================================================

//**********************
//*****  Includes  *****
//**********************

#include <proto/all.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <tempest/headers.h>

void PRINTF(char *,...);
UWORD GetCheckSum(char *);
void StripReturn(char *string);

//********************
//*****  PRINTF  *****
//********************

void PRINTF(char *fmt,...)
{
 va_list args;
 char string[150];
 va_start(args, fmt);
 vsprintf(string, fmt, args);
 va_end(args);
 Write(Output(),string,strlen(string));
}

//***************************
//*****  Get Check Sum  *****
//***************************

UWORD GetCheckSum(char *string)
{
 UWORD ck=0;
 register char c, *s;
 strupr(string);
 for(s=string;c=*s++;) ck+=c;
 return((UWORD)ck);
}

//******************
//*****  Main  *****
//******************

int main(int argc,char *argv[])
{
 struct Csum Csum;
 char FileName[31];
 int Area,SubArea,SubAreas;
 int in,out,out2,out3,stat;
 int subareas;
 char filepath[120];
 register y,z;
 struct Catalogs Catalogs;
 struct SeekCatalogs SeekCatalogs;
 struct File_Area File_Area;

 if(argc!=5)
  {
   PRINTF("\n[m[1m    _________________\n");
   PRINTF("   / ___/ [4m/[m[1m/ / ___/ /    [[32mCatalogIndexMaker v3.50[m[1m][m\n");
   PRINTF("[1m  [4m/[m[1m__  /   _/ ___/ [4m/[m[1m__\n");
   PRINTF("[1m [4m/[m[1m____[4m/[m[1m_/\\_[4m)[m[1m____[4m/[m[1m____/   For Tempest BBS - [Programmer: Michael Bockert]\n");
   PRINTF("\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n");
   PRINTF("\n[m   USAGE: CatalogIndexMaker [TEMPESTPath] [CatalogsPath] [Area#] [SubArea#]\n");
   PRINTF("  EXAMPLE: CatalogIndexMaker TEMPEST: CATALOGS: 1 0\n\n");
   PRINTF("[TempestPath] Path to Tempest Main directory\n");
   PRINTF("[CatalogPath] Path to Catalog Files\n");
   PRINTF("      [Area#] # of Area to update, A=All Areas\n");
   PRINTF("   [SubArea#] # of Sub Area to update, 0=Upload Listing\n\n");
   exit(0);
  }
 Area=atoi(argv[3]);
 SubArea=atoi(argv[4]);

 PRINTF("\n\n");
 if((argv[3][0]=='A')||(argv[3][0]=='a'))
  {
   for(y=0;y<40;y++)
    {
     sprintf(filepath,"%sSetup/Files.Data",argv[1]);
     in=Open(filepath,MODE_OLDFILE);
     if(in!=0)
      {
       Seek(in,sizeof(struct File_Area)*y,OFFSET_BEGINNING);
       Read(in,(char *)&File_Area,sizeof(struct File_Area));
       subareas=File_Area.Catalogs;
      }
     else
      {
       PRINTF("*ERROR - Could not open Files.data*\n");
       subareas=0;
      }
     if(subareas==0) subareas=1;
     for(z=0;z<subareas;z++)
      {
       if(z==0) sprintf(filepath,"%sCatalog_%d.data",argv[2],y);
       else     sprintf(filepath,"%sCatalog_%d-%d.data",argv[2],y,z);
       if(access(filepath,0)==0)
        {
         in=Open(filepath,MODE_OLDFILE);
         if(in==0)
          {
           PRINTF("*ERROR - Could not open area %d, subarea %d*\n",y,z);
           exit(0);
          }
         if(z==0) sprintf(filepath,"%sCatalog_%d.idx",argv[2],y);
         else     sprintf(filepath,"%sCatalog_%d-%d.idx",argv[2],y,z);
         out=Open(filepath,MODE_NEWFILE);
         if(out==0)
          {
           PRINTF("*ERROR - Could not make idx file for area %d, subarea %d*\n",y,z);
           Close(in);
           exit(0);
          }
         if(z==0) sprintf(filepath,"%sCatalog_%d.csum",argv[2],y);
         else     sprintf(filepath,"%sCatalog_%d-%d.csum",argv[2],y,z);
         out2=Open(filepath,MODE_NEWFILE);
         if(out2==0)
          {
           PRINTF("*ERROR - Could not make csum file for area %d, subarea %d*\n",y,z);
           Close(in);
           Close(out);
           exit(0);
          }
         if(z==0) sprintf(filepath,"%sCatalog_%d.seek",argv[2],y);
         else     sprintf(filepath,"%sCatalog_%d-%d.seek",argv[2],y,z);
         out3=Open(filepath,MODE_NEWFILE);
         if(out3==0)
          {
           PRINTF("*ERROR - Could not make seek file for area %d, subarea %d*\n",y,z);
           Close(in);
           Close(out);
           Close(out2);
           exit(0);
          }
         if(z==0) PRINTF("Creating Index Files for Area %2.2d...",y);
         else     PRINTF("Creating Index Files for Area %2.2d, SubArea %2.2d....",y,z);
         while(1)
          {
           stat=Read(in,(char *)&Catalogs,sizeof(struct Catalogs));
           if(stat!=sizeof(struct Catalogs)) break;
           setmem(&FileName,sizeof(FileName),NULL);
           Catalogs.FileName[30]=NULL;
           StripReturn(Catalogs.FileName);
           strcpy(FileName,Catalogs.FileName);
           Write(out,(char *)&FileName,sizeof(FileName));
           Csum.Csum=GetCheckSum(FileName);
           Write(out2,(char *)&Csum,sizeof(struct Csum));
           SeekCatalogs.SeekPosition=Catalogs.SeekPosition;
           SeekCatalogs.SizeOfEntry =Catalogs.SizeOfEntry;
           strcpy(SeekCatalogs.FileName,Catalogs.FileName);
           Write(out3,(char *)&SeekCatalogs,sizeof(struct SeekCatalogs));
          }
         Close(in);
         Close(out);
         Close(out2);
         Close(out3);
         PRINTF("Done\n");
        }
      }
    }
  }
 else
  {
   if((Area<0)||(Area>39))
    {
     PRINTF("*ERROR - Invalid Area #*\n");
     exit(0);
    }
   if(SubArea==0) sprintf(filepath,"%sCatalog_%d.data",argv[2],Area);
   else           sprintf(filepath,"%sCatalog_%d-%d.data",argv[2],Area,SubArea);
   if(access(filepath,0)==0)
    {
     in=Open(filepath,MODE_OLDFILE);
     if(in==0)
      {
       PRINTF("*ERROR - Could not open area %d, subarea %d*\n",Area,SubArea);
       exit(0);
      }
     if(SubArea==0) sprintf(filepath,"%sCatalog_%d.idx",argv[2],Area);
     else           sprintf(filepath,"%sCatalog_%d-%d.idx",argv[2],Area,SubArea);
     out=Open(filepath,MODE_NEWFILE);
     if(out==0)
      {
       PRINTF("*ERROR - Could not make idx file for area %d, subarea %d*\n",Area,SubArea);
       Close(in);
       exit(0);
      }
     if(SubArea==0) sprintf(filepath,"%sCatalog_%d.csum",argv[2],Area);
     else           sprintf(filepath,"%sCatalog_%d-%d.csum",argv[2],Area,SubArea);
     out2=Open(filepath,MODE_NEWFILE);
     if(out2==0)
      {
       PRINTF("*ERROR - Could not make csum file for Area %d, Subarea %d*\n",Area,SubArea);
       Close(in);
       Close(out);
       exit(0);
      }
     if(SubArea==0) sprintf(filepath,"%sCatalog_%d.seek",argv[2],Area);
     else           sprintf(filepath,"%sCatalog_%d-%d.seek",argv[2],Area,SubArea);
     out3=Open(filepath,MODE_NEWFILE);
     if(out3==0)
      {
       PRINTF("*ERROR - Could not make seek file for area %d, subarea %d*\n",Area,SubArea);
       Close(in);
       Close(out);
       Close(out2);
       exit(0);
      }
     if(SubArea==0) PRINTF("Creating Index Files for Area %2.2d...",Area);
     else           PRINTF("Creating Index Files for Area %2.2d, SubArea %2.2d...",Area,SubArea);
     while(1)
      {
       stat=Read(in,(char *)&Catalogs,sizeof(struct Catalogs));
       if(stat!=sizeof(struct Catalogs)) break;
       setmem(&FileName,sizeof(FileName),NULL);
       Catalogs.FileName[30]=NULL;
       StripReturn(Catalogs.FileName);
       strcpy(FileName,Catalogs.FileName);
       Write(out,(char *)&FileName,sizeof(FileName));

       Csum.Csum=GetCheckSum(FileName);
       Write(out2,(char *)&Csum,sizeof(struct Csum));

       SeekCatalogs.SeekPosition=Catalogs.SeekPosition;
       SeekCatalogs.SizeOfEntry =Catalogs.SizeOfEntry;
       strcpy(SeekCatalogs.FileName,Catalogs.FileName);
       Write(out3,(char *)&SeekCatalogs,sizeof(struct SeekCatalogs));
      }
     Close(in);
     Close(out);
     Close(out2);
     Close(out3);
     PRINTF("Done\n");
    }
   else PRINTF("*ERROR - Could not open %s*\n",filepath);
  }
 PRINTF("Exiting\n");
 exit(0);
}
//===========================* Beginning of Module *===========================
void StripReturn(char *string)
{
 register int x;
 for(x=strlen(string);x>0;x--)
  {
   if((string[x-1]!='\r')&&(string[x-1]!='\n')&&(string[x-1]!=' ')) break;
   else string[x-1]=NULL;
  }
}
