#include <sys/types.h> #include <sys/time.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <zlib.h> /* including main header file */ #include "mud.h" CHANGE_DATA *change_list = NULL; CHANGE_DATA *change_last = NULL; CHANGE_DATA *change_free = NULL; void add_changefile(char *name, char *date, char *text); FILE *fpReserve; bool remove_change (int i); void load_changes() { CHANGE_DATA *change; FILE *fp; char *name; if ((fp = fopen(CHANGE_FILE, "r")) == NULL) { log_string("Non-fatal error: changes.txt not found!"); return; } name = fread_word(fp); while (compares(name, END_MARKER)) { change = malloc(sizeof(CHANGE_DATA)); change->imm = strdup(name); change->date = fread_string(fp); change->text = fread_string(fp); if (change_list) change_list->prev = change; change->next = change_list; change_list = change; if (!change_last) change_last = change; name = fread_word(fp); } fclose(fp); } void save_changes() { FILE *fp; CHANGE_DATA *change; int i = 0; if ((fp = fopen("../txt/changes.txt","w")) == NULL) { log_string("Error writing to changes.txt"); return; } for (change = change_last; change; change = change->prev) { if (++i > MAX_CHANGE) break; fprintf(fp, "%s\n", change->imm); fprintf(fp, "%s~\n", change->date); fprintf(fp, "%s~\n", change->text); } fprintf(fp, "%s\n", END_MARKER); fclose(fp); } void do_addchange( D_MOBILE *ch, char *argument ) { CHANGE_DATA *change; CHANGE_DATA *cchange; char *strtime; char buf[MAX_BUFFER]; int i; /* we need something to add to the list */ if (argument[0] == '\0' || strlen(argument) < 5) { stc("What did you change?\n\r", ch); return; } /* Mainly to avoid that the list looks ugly */ if (strlen(argument) > 120) { stc("Keep it on 120 chars please.\n\r", ch); return; } /* Set the current time */ strtime = ctime(¤t_time); for (i = 0; i < 6; i++) { buf[i] = strtime[i + 4]; } buf[6] = '\0'; /* If we have a free change, we reuse it */ if (change_free) { change = change_free; change_free = change_free->next; change->next = NULL; if (change_free) change_free->prev = NULL; } else change = malloc(sizeof(*change)); /* set the strings for the change */ change->imm = strdup(ch->name); change->text = strdup(argument); change->date = strdup(buf); add_changefile(strdup(ch->name), strdup(buf), strdup(argument)); /* If theres already a change, just add to the list */ if (change_last) { change_last->next = change; change->prev = change_last; change->next = NULL; change_last = change; } else /* there are no changes. */ { change->next = change_list; change_list = change; change_last = change; } /* Removing the oldest change if the list has gone beyond the max */ cchange = change_list; i = 0; while ((cchange = cchange->next) != NULL) i++; if (i >= MAX_CHANGE) remove_change(1); stc("Change added.\n\r", ch ); save_changes(); return; } void add_changefile(char *name, char *date, char *text) { FILE *fp; char buf[MAX_BUFFER]; buf[0] = '\0'; if ( (fp = fopen(CHANGE2_FILE, "a") ) == NULL) { log_string("Unable to open changelog.txt!\n"); } else { sprintf(buf, "%-7s %-7s %s\n", name, date, text); fprintf(fp, buf); fclose( fp ); } return; } void cmd_clearchanges (D_MOBILE * ch, char *arg) { FILE *fp; char *strtime; char buf[MAX_BUFFER]; int i; int result; char oldname[] = CHANGE2_FILE; char newname[MAX_BUFFER]; strtime = ctime(¤t_time); for (i = 0; i < 6; i++) { buf[i] = strtime[i + 4]; } buf[6] = '\0'; /* Lets backup the file first */ sprintf(newname, "%schanges.txt", buf); /* Get rid of Spaces! */ smash_space(newname); result = rename(oldname, newname); if (result != 0 ) { log_string("clearchanges(): Failed renaming"); return; } if ( (fp = fopen(CHANGE2_FILE, "w") ) == NULL) { log_string("Unable to open changelog.txt!\n"); } else { fprintf(fp, "\n\n- = - = - = - Changes since %s\n\n", buf); fprintf(fp, "- = - = - = - See %s to see Older changes\n\n", newname); fclose( fp ); } return; } void do_changes(D_MOBILE *ch, char *argument) { CHANGE_DATA *change; char buf[MAX_BUFFER]; char tempbuf[MAX_BUFFER]; bool found = FALSE; int i = 0; sprintf(buf, " [***] Code Changes Since Reboot && Random Messages [***]\n\r\n\r"); for (change = change_list; change; change = change->next) { found = TRUE; ++i; sprintf(tempbuf, " [%3d] %-6s %-9s %s\n\r", i, change->date, change->imm, change->text); strcat(buf, tempbuf); } if (found) stc(buf, ch); else stc("No changes.\n\r", ch); return; } void do_delchange(D_MOBILE *ch, char *argument) { char arg[MAX_OUTPUT]; bool found = FALSE; int i; one_arg(argument, arg); if ((i = atoi(arg)) < 1) { stc("Which number change did you want to remove ?\n\r", ch); return; } found = remove_change(i); if (!found) stc("No such change.\n\r", ch); else stc("Change removed.\n\r", ch); save_changes(); return; } /* * This function handles the actual removing of the change */ bool remove_change(int i) { CHANGE_DATA *change; bool found = FALSE; for (change = change_list; change; change = change->next) { if (--i > 0) continue; found = TRUE; /* update the pointer to the last change if needed */ if (change == change_last) change_last = change->prev; /* handle the special case of the first change */ if (change == change_list) { change_list = change->next; if (change->next) change->next->prev = NULL; } else { change->prev->next = change->next; if (change->next) change->next->prev = change->prev; } /* Handle the free list */ change->next = change_free; change->prev = NULL; if (change_free) change_free->prev = change; change_free = change; /* terminate the loop */ break; } /* did we remove anything ? */ return found; }