#include "os.h"
#include "structs.h"


#define TOLOWER(c)  (((c)>='A'  && (c) <= 'Z') ? ((c)+('a'-'A')) : (c))


int str_cmp (char *str1, char *str2)
{
  for (; *str1 || *str2; str1++, str2++)
    if (TOLOWER (*str1) != TOLOWER (*str2))
      return (1);

  return (0);
}

void del (char *filename, int name)
{
  char confirm[80];
  FILE *fl;
  struct char_file_u player;
  int pos, num;
  long end;

  if (!(fl = fopen (filename, "r+b"))) {
    perror ("list");
    exit (1);
  }

  puts ("Searching for player:");

  for (num = 1, pos = 0;; pos++, num++) {
    fread (&player, sizeof (player), 1, fl);
    if (feof (fl)) {
      fprintf (stderr, "delplay: could not locate %d.\n", name);
      exit (1);
    }

    if (num == name) {
      printf ("Confirm deletion of [%s] by typeing Yes: ", player.name);
      scanf ("%s", confirm);
      if (str_cmp ("Yes", confirm)) {
        printf ("Aborted delete.\n");
        exit (1);
      } else {
        break;
      }
    }

  }

  /* read the last player */
  fseek (fl, -1 * (int)sizeof (player), 2);
  fread (&player, sizeof (player), 1, fl);
  fseek (fl, pos * sizeof (player), 0);
  fwrite (&player, sizeof (player), 1, fl);
  fseek (fl, 0, 2);
  end = ftell (fl);
  fclose (fl);

#if !defined WIN32
  if (truncate (filename, end - sizeof (player))) {
    perror ("truncate");
    exit (1);
  }
#else
//  Windows doesn't have anything like truncate.
//  openfile
//  lseek()
//  SetEndOfFile()
//  closefile
#endif
}


int main (int argc, char **argv)
{
  if (argc != 3)
    puts ("Usage: delplay <DikuMUD player filename> <Player Number>");
  else {
    if (atoi (argv[2]) < 1) {
      puts ("Illegal player number, must be >= 1");
      return 1;
    } else {
      del (argv[1], atoi (argv[2]));
    }
  }
  return 0;
}