#include <stdio.h> #include <ctype.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+"))) { perror("list"); exit(); } 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(); } 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(); } else { break; } } } /* read the last player */ fseek(fl, -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 (truncate(filename, end-sizeof(player))) perror("truncate"); } 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"); else del(argv[1], atoi(argv[2])); } }