/*
 * Umbenennen von BIN-Files (interner Name)
 *
 * 3.9.1988 Ralf Meister
 *
 */

#include "stdio.h"
#include "stdlib.h"


#define MESSAGE "RENBIN renames GST object code files (modul name)     \
    1988 Ralf Meister"


/* Einige globale Varialble */
int waitforkey=0,help=0;

/* Ausgeben von Fehlermeldungen */
void error(s)
char *s;
{
   fprintf(stderr,"*** %s\n",s);
   if(waitforkey)getch();
   exit(1);
}


/* Umbenennen von GST bin„r Dateien (interner Name) */
void rename_bin(filename,newname)
char *filename,*newname;
{
   char path[64],*source="\xfb\x01";
   FILE *fp;
   int length,slen;
   char *puffer;

   /* Das Bin„r-File er”ffnen */
   if((fp=fopene(filename,"rb",path))==NULL)
      error("can't find file");
   /* Stelle die L„nge des Files fest */
   fseek(fp,0,2);
   length=ftell(fp);
   rewind(fp);
   /* Lade die Datei in den Speicher */
   if( (puffer=malloc(length))==NULL)
      error("no more memory");
   if(fread(puffer,length,1,fp)!=1)
      error("reading error");
   fclose(fp);
   if(*puffer!=0xfb || *(puffer+1)!=0x01)
      error("source directive expected");
   /* Den Zeiger auf den Start neu setzen, L„nge entsprechend setzen */
   slen=*(puffer+2);
   /* eine Meldung ausgeben was gemacht wird */
   {
      register int i;
      printf("rename ");
      for(i=0;i<slen;i++) printf("%c",*(puffer+3+i));
      printf(" to %s\n",newname);
   }
   
   length-=(slen+3);
   puffer+=(slen+3);
   *(source+2)=slen=strlen(newname);
   /* Und die Datei neu schreiben */
   /* Pfad „ndern, da evtl. durch Environment nicht im akt. Ordner */
   chdir(path); 
   if((fp=fopen(filename,"wb"))==NULL)
      error("can't write file");
   if( fwrite(source,3,1,fp)!=1)
      error("can't write file");/* Source Directive und L„nge schreiben */
   if( fwrite(newname,slen,1,fp)!= 1)
      error("can't write file");/* neuen Namen schreiben */
   if( fwrite(puffer,length,1,fp)!=1 )
      error("can't write file");/* Und den Rest der Daten schreiben */
   fclose(fp);
}


void usage()
{
   puts("RENBIN.TTP [-w][-h] <bin-file> <new name>");
   puts(" -w wait for key before terminating");
   puts(" -h prints this tiny help message");
   puts(" <bin file> TOS filename of object code file in GST format");
   puts(" <new name> internal name of object code module");
   help=1;
}

void main(argc,argv)
int argc;
char *argv[];
{
   int next;
   char option,*odata;

   puts(MESSAGE);
   /* Durchsuce die Parameterzeile nach Optionen */
   for(next=1;(odata=argopt(argc,argv,"",&next,&option))!=NULL;)
      switch(option)
      {
         case 'h':
         case 'H':usage();
                  break;
         case 'w':
         case 'W':waitforkey=1;
                  break;
         default: fprintf(stderr,"Invalid option %c\n",option);
                  break;
      }
   if(!help)
   {
      if(next+2!=argc)
         error("invalid command line");
      rename_bin(argv[next],argv[next+1]);
   }
   if(waitforkey) getch();
}

