/* Relabel 1.0 -- © D. Göhler, E. Conrad 1995 */

#include <string.h>
#include <stdlib.h>
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#define BUFSIZE 300

/* Maxon C++ 3.0: mcppc3 -pc relabel.c -lamiga
   SAS-C 6.x    : sc relabel.c LINK
   DICE x.x     : dcc relabel.c         */

int relabel(int init, int count, char *argv[])
{  char buf[BUFSIZE]; int lauf;

   strcpy (buf,"C:Relabel ");
   for (lauf = init; count--; lauf++)
   {  strcat(buf,argv[lauf]); strcat(buf," "); }
   return (System(buf,0L) == DOSFALSE
          ? RETURN_OK : RETURN_FAIL);
}

char C_Array[] = "yaq12wsxcde34rfvbgt56zhnmju78ik,"
                 ".lo90pö-äüßPLOIKMJUZHNBGTRFVCDEW";

ULONG hash(unsigned char *string)
{  ULONG retcode = strlen(string);
   while (*string)
   {  retcode = (retcode * 29 + *string++) & 0xfffff; }
   return retcode;
}

void CalculateNew(char *oldpass, char *codename)
{
   unsigned int oldhash = hash(oldpass);
   unsigned int codehash = hash(codename);
   unsigned int index,i=0;
   char newpass[10];

   srand(codehash);
   while (i < 8)
   {  index = (rand()*(oldhash+i) >> 3) % 64;
      newpass[i++] = C_Array[index];
   }
   newpass[8] = '\0';
   Printf("%s\n",newpass);
}

void StripLF(char *name)
{  char *p = name + strlen(name) - 1;
   if (*p == '\n') *p = '\0';
}

int main(int argc, char *argv[])
{  if (argc > 1) // mit Parametern gestartet ...
   {  relabel (1,argc-1,argv); }
   else
   {  char oldname[BUFSIZE],newname[BUFSIZE];
      char *names[3] = {">NIL:",0,0};

      names[1] = oldname; names[2] = newname;
      Flush(Output()); Flush(Input()); // leider nötig
      FPuts(Output(),"Alter Name des Datenträgers: ");
      Flush(Output()); FGets(Input(),oldname,BUFSIZE-2);
      FPuts(Output(),"Neuer Name des Datenträgers: ");
      Flush(Output()); FGets(Input(),newname,BUFSIZE-2);
      StripLF(oldname); StripLF(newname);
      if (relabel(0,3,names) == RETURN_FAIL)
      {  CalculateNew(oldname,newname);  }
   }
   return RETURN_OK;
}
