#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;
}