pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
/*****************************************************************************
 ** MKSTUBS - Marty 1996
 ** A stub generator for the special event handler.
 ** This little file will read the zone files, and create a special stub file
 ** which then can be used to program your special events for the objects
 ** Also makes an objtable and mobtable for all them.
 *****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include "files.h"
#include "types.h"

/****************************************************************************
 ** Message shown when the files can't be found.\n
 ***************************************************************************/
void usage(void)
{  printf("MKSTUBS - pDirt Special events stubs generator                   1996 Marty.\n"
          "This file will read the file ../DATA/WORLD/files and generate stubs for all \n"
          "zones. Or you can specify the zone name and it will only generate stubs\n"
          "for that zone.\n");
}

/****************************************************************************
 ** Small utility routine to make the table files
 ****************************************************************************/
void uppercase(char *str)
{  int i=0;
   while (str[i] != '\0')
   {  str[i] = toupper(str[i]);
      i++;
   }
}  

/*****************************************************************************
 ** Create the stubs and objtable & mobtable for a specified zone.
 ** f is the opened zonefile, str is the zonename, and the last two are 
 ** filepointers to the objtable and mobile table file.
 ****************************************************************************/
void makestubsfor(FILE *f,char *str,FILE *objtable,FILE *mobtable)
{  FILE *stubfilemob = NULL ,*stubfileobj = NULL;
   char line[100];
   char id[10],name[30];
   char fn[80];
   char upcase_zone[80];
   char upcase_name[30];
   int mobs = 0, objs = 0;
   Boolean obj = False;

   /* Copy zone name, and make it uppercase */
   strcpy(upcase_zone,str);
   uppercase(upcase_zone);

   fgets(line,100,f);
   
   while (!feof(f))
   {  
      sscanf(line," %s = %s",id,name);     /* Scan line */
      if (strcmp(id,"%objects") == 0)      
      {  
         /* We are in an object section, so i think it is save to assume that
            there will be objects in this file, so lets open the obj stub file
          */
         sprintf(fn,"%s.obj.stubs",str);
         stubfileobj = fopen(fn,"w+");
         
         /* print a header */
         fprintf(stubfileobj,"\
/*****************************************************************************\n\
 ** Automatically created stubfile for all mobiles in zone %s. \n\
 ** Do not edit this file, mkstub by Marty 1996\n\
 *****************************************************************************/\n",
         str);

         obj = True;
      } 
      else if (strcmp(id,"%mobiles") == 0)
      {  /* Same idea as the object section above */
         sprintf(fn,"%s.mob.stubs",str);
         stubfilemob = fopen(fn,"w+");

         fprintf(stubfilemob,"\
/*****************************************************************************\n\
 ** Automatically created stubfile for all mobiles in zone %s. \n\
 ** Do not edit this file, mkstub by Marty 1996\n\
 *****************************************************************************/\n",
            str);

         obj = False;
      }
      /* If the line was a start of a new object or mobile, then the id
       * would have been either 'Name' or 'name', so we make a stub
       */
      if (strcmp(id,"Name") == 0 || strcmp (id,"name") == 0)
      {  
         fprintf((obj ? stubfileobj : stubfilemob),"\
EVENT_HANDLER(%s_%s_%s)\n\
{  switch (event)\n\
   default: break;\n\
   }\n\
}\n\n",(obj ? "obj" : "mob"), str,name);
       
         /* Also add it to the table */
         strcpy(upcase_name,name);
         uppercase(upcase_name);
         if (obj)
           fprintf(objtable,"  { OBJ_%s_%s\t\t, obj_%s_%s}, \n",
               upcase_zone,upcase_name,str,name);
         else
           fprintf(mobtable,"  { MOB_%s_%s\t\t,mob_%s_%s}, \n",
               upcase_zone,upcase_name,str,name);
               
          if (obj) 
            objs++;
          else
            mobs++;
      }
      fgets(line,100,f);  
   }
   /* Done reading file, so report what we did, and close the files */
   printf(" %d mobiles and %d objects\n",mobs,objs);
   
   if (stubfilemob != NULL) fclose(stubfilemob);
   if (stubfileobj != NULL) fclose(stubfileobj);
   
   /* Check if the file contains some usefull stuff, otherwise 
      delete it.
    */
   if (objs == 0)
   {  sprintf(fn,"%s.obj.stubs",str);
      unlink(fn);
   }
   if (mobs == 0)
   {  sprintf(fn,"%s.mob.stubs",str);
      unlink(fn);
   }
}

/* Dump header part of the table file */
void makemobtablefile(FILE *fp)
{  fprintf(fp,"\
#ifndef _MOBTABLE_H_\n\
#define _MOBTABLE_H_\n\n\
MAPPING(mob_table) = \n\
{\n");
}

/* Dump header part of the objtable file */
void makeobjtablefile(FILE *fp)
{  /* Write headers */
   fprintf(fp,"\
#ifndef _OBJTABLE_H_\n\
#define _OBJTABLE_H_\n\n\
MAPPING(obj_table) = \n\
{\n");
}

/****************************************************************************
 ** Open objtable and mobtable file, and read the '../data/WORLD/files' file
 ** which hold all the zone names.
 ** If we can open the zone file, then make stubs for that zone.
 ***************************************************************************/
void readzones(FILE *fp)
{  FILE *f;
   FILE *objtable;
   FILE *mobtable;
   char zn[80];
   char fn[120];

   objtable = fopen("objtable.h","w+");
   mobtable = fopen("mobtable.h","w+");

   makeobjtablefile(objtable);
   makemobtablefile(mobtable);
   
   fgets(zn,80,fp);
   
   while (!feof(fp))
   {   /* Strip \n or \r from the buffer */
       if (zn[strlen(zn)-1] == '\n' || zn[strlen(zn)-1] == '\r')
           zn[strlen(zn)-1] = '\0';
   
       /* Try to open the file */        
       sprintf(fn,"%s/WORLD/%s.zone",DATA_DIR,zn);
       f = fopen(fn,"r");
       if (f == NULL)
       {  printf("Could not find %s\n",fn);
          fgets(zn,80,fp);
          continue;
       }
       /* File is open, so lets make stubs */
       printf("Creating stubs for %s",zn);
       makestubsfor(f,zn,objtable,mobtable);
       fclose(f);
       fgets(zn,80,fp);
   }

   /* Nicely close the objtable and mobtable */
   
   fprintf(objtable,"\
  { OBJ_VOID_VOID		, NULL}\n\
}\n\n\
#endif\n");

   fprintf(mobtable,"\
}\n\n\
#endif\n");

   fclose(mobtable);
   fclose(objtable);
}

void main(int argc,char **argv)
{  FILE *filesfp;

   if (argc == 1)
   {
      filesfp = fopen(DATA_DIR"WORLD/files","r");
      if (filesfp == NULL)
      {  printf("Error opening 'files'\n");
      } 
      else
      {  readzones(filesfp);
         printf("Done");
      }
      fclose(filesfp);
   } 
   else if (argc == 2)
   {  char fn[80];
      FILE *of, *mf;  
      sprintf(fn,"%s/WORLD/%s.zone",DATA_DIR,argv[1]);
      filesfp = fopen(fn,"r");
      if (filesfp == NULL)
      {  usage();
         printf("Could not open %s\n",fn);
         return;
      }
      printf("Generating stubs for %s: ",argv[1]);
      of = fopen("objtable.h","w+");
      mf = fopen("mobtable.h","w+");

      makeobjtablefile(of);
      makemobtablefile(mf);
      makestubsfor(filesfp,argv[1],of,mf);
      fprintf(of,"\n}\n\n#endif\n");
      fprintf(mf,"\n}\n\n#endif\n");
      fclose(of);
      fclose(mf);
      fclose(filesfp);
   }
   else usage();
}