#if defined(macintosh) #include <types.h> #else #include <sys/types.h> #include <sys/time.h> #endif #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <assert.h> #include <unistd.h> #include <stdarg.h> #include <limits.h> #include "merc.h" //Local Functions int MAX_CHANGES; struct changes_data * changes_table; char *short_date( time_t time ) { static char buf[20]; char tmp[20]; char *date; if ( time < 0 ) { time = current_time; } date = ctime( &time ); tmp[0] = date[4]; tmp[1] = date[5]; tmp[2] = date[6]; tmp[3] = '\0'; if ( !str_cmp( tmp, "jan" ) ) { buf[0] = '0'; buf[1] = '1'; } else if ( !str_cmp( tmp, "feb" ) ) { buf[0] = '0'; buf[1] = '2'; } else if ( !str_cmp( tmp, "mar" ) ) { buf[0] = '0'; buf[1] = '3'; } else if ( !str_cmp( tmp, "apr" ) ) { buf[0] = '0'; buf[1] = '4'; } else if ( !str_cmp( tmp, "may" ) ) { buf[0] = '0'; buf[1] = '5'; } else if ( !str_cmp( tmp, "jun" ) ) { buf[0] = '0'; buf[1] = '6'; } else if ( !str_cmp( tmp, "jul" ) ) { buf[0] = '0'; buf[1] = '7'; } else if ( !str_cmp( tmp, "aug" ) ) { buf[0] = '0'; buf[1] = '8'; } else if ( !str_cmp( tmp, "sep" ) ) { buf[0] = '0'; buf[1] = '9'; } else if ( !str_cmp( tmp, "oct" ) ) { buf[0] = '1'; buf[1] = '0'; } else if ( !str_cmp( tmp, "nov" ) ) { buf[0] = '1'; buf[1] = '1'; } else if ( !str_cmp( tmp, "dec" ) ) { buf[0] = '1'; buf[1] = '2'; } else { buf[3] = '9'; buf[4] = '9'; } buf[2] = '/'; if ( date[8] == ' ' ) buf[3] = '0'; else buf[3] = date[8]; buf[4] = date[9]; buf[5] = '/'; buf[6] = date[22]; buf[7] = date[23]; return buf; } void load_changes(void) { FILE *fp; int i; char filename [ MAX_STRING_LENGTH ]; sprintf( filename, "../changes/%s", CHANGES_FILE ); if ( !(fp = fopen( filename, "r")) ) { bug( "Could not open filename for reading.", 0 ); perror( filename ); return; } fscanf( fp, "%d\n", &MAX_CHANGES ); changes_table = malloc( sizeof( CHANGES_DATA) * (MAX_CHANGES+1) ); for (i = 0; i < MAX_CHANGES; i++) { char letter; do { letter = getc( fp ); if ( feof(fp) ) { fclose( fp ); return; } } while ( isspace(letter) ); ungetc( letter, fp ); if ( str_cmp( fread_word( fp ), "Change" ) ) break; changes_table[i].change = fread_string( fp ); if ( str_cmp( fread_word( fp ), "Coder" ) ) break; changes_table[i].coder = fread_string( fp ); if ( str_cmp( fread_word( fp ), "Date" ) ) break; changes_table[i].date = fread_string( fp ); } fclose(fp); return; /* just return */ } void do_addchange(CHAR_DATA *ch, char *argument ) { CHANGES_DATA * new_table; if ( IS_NPC( ch ) ) return; if ( argument[0] == '\0' ) { send_to_char( "Syntax: Addchange: $Change\n\r", ch ); send_to_char( "#RType #n'changes'#R to view the list.#n\n\r", ch ); return; } MAX_CHANGES++; new_table = realloc( changes_table, sizeof( CHANGES_DATA ) *(MAX_CHANGES+1) ); if (!new_table) /* realloc failed */ { send_to_char ("Memory allocation failed. Brace for impact.\n\r",ch); return; } changes_table = new_table; changes_table[MAX_CHANGES-1].change = wordwrap( argument ); changes_table[MAX_CHANGES-1].coder = str_dup( ch->name ); changes_table[MAX_CHANGES-1].date = short_date(current_time); send_to_char("Changes Created.\n\r",ch); send_to_char("Type 'changes' to see the changes.\n\r",ch); save_changes(); return; } void save_changes(void) { char filename [ MAX_INPUT_LENGTH ]; FILE *fp; int i; sprintf( filename, "../changes/%s", CHANGES_FILE ); if ( !(fp = fopen( filename,"w")) ) { perror( filename ); return; } fprintf( fp, "%d\n", MAX_CHANGES ); for (i = 0; i < MAX_CHANGES; i++) { fprintf (fp, "Change %s~\n", changes_table[i].change); fprintf (fp, "Coder %s~\n", changes_table[i].coder); fprintf (fp, "Date %s~\n", changes_table[i].date); } fclose(fp); return; } void delete_change(int iChange) { int i,j; CHANGES_DATA * new_table; new_table = malloc( sizeof( CHANGES_DATA ) * MAX_CHANGES ); if( !new_table ) { return; } for ( i= 0, j = 0; i < MAX_CHANGES+1; i++) { if( i != iChange ) { new_table[j] = changes_table[i]; j++; } } free( changes_table ); changes_table = new_table; MAX_CHANGES--; save_changes(); return; } void do_chsave( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if (!ch->desc || *arg1 == '\0') { send_to_char("Syntax: chsave load/save\n\r",ch); send_to_char("Syntax: chsave delete (change number)\n\r",ch); send_to_char("Syntax: chsave rename (change number) 'New Text'\n\r",ch); send_to_char("Syntax: chsave wordwrap (change number)\n\r",ch); return; } if ( strcmp(arg1,"load")== 0 ) { load_changes( ); send_to_char("Changes Loaded.\n\r",ch); return; } else if ( strcmp(arg1,"save")== 0 ) { save_changes( ); send_to_char("Changes Saved.\n\r",ch); return; } else if ( strcmp(arg1, "wordwrap")== 0) { int num; if ( NULLSTR(arg2) || !is_number( arg2)) { send_to_char("#yFor chsave wordwrap, you must choose a change number.#n\n\r",ch); send_to_char("#1Syntax#2:#4 chsave wordwrap (change number)#n\n\r",ch); return; } num = atoi( arg2 ); if ( num < 1 || num > MAX_CHANGES ) { char buf[MAX_STRING_LENGTH]; sprintf(buf,"Valid changes are from 1 to %d.\n\r",MAX_CHANGES); send_to_char( buf,ch ); return; } changes_table[num-1].change = wordwrap( changes_table[num-1].change ); save_changes( ); send_to_char("Change wordwrapped.\n\r",ch); return; } else if ( strcmp(arg1, "rename")== 0) { int num; if ( NULLSTR(arg2) || !is_number( arg2) || NULLSTR(argument) ) { send_to_char("#yFor chsave rename, you must choose a change number.#n\n\r",ch); send_to_char("#1Syntax#2:#4 chsave rename (change number) 'New Change'#n\n\r",ch); return; } num = atoi( arg2 ); if ( num < 1 || num > MAX_CHANGES ) { char buf[MAX_STRING_LENGTH]; sprintf(buf,"Valid changes are from 1 to %d.\n\r",MAX_CHANGES); send_to_char( buf,ch ); return; } changes_table[num-1].change = wordwrap( argument ); save_changes( ); send_to_char("Change renamed.\n\r",ch); return; } else if ( strcmp(arg1, "delete")== 0) { int num; if ( NULLSTR(arg2) || !is_number( arg2 ) ) { send_to_char("#yFor chsave delete, you must provide a change number.#n\n\r",ch); send_to_char("#1Syntax#2:#4 chsave delete (change number)#n\n\r",ch); return; } num = atoi( arg2 ); if ( num < 0 || num > MAX_CHANGES ) { char buf[MAX_STRING_LENGTH]; sprintf(buf,"Valid changes are from 0 to %d.\n\r",MAX_CHANGES); send_to_char( buf,ch ); return; } delete_change( num ); send_to_char("Change deleted.\n\r",ch); return; } else { send_to_char("Syntax: chsave load/save.\n\r",ch); send_to_char("Syntax: chsave delete (change number)\n\r",ch); return; } } void do_changes(CHAR_DATA *ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char *test; int today; int i; one_argument( argument, arg ); if (IS_NPC(ch)) return; i = 0; test = short_date(current_time); today = 0; for ( i = 0; i < MAX_CHANGES; i++) { if (!str_cmp(test,changes_table[i].date)) today++; } if (!str_cmp(arg,"all")) { sprintf(buf, "Changes done to #RE#rv#0e #GO#gf De#Cstr#cuc#lti#Lon#n\n\r"); send_to_char(buf,ch); sprintf(buf, "#yNo. Coder Date Change\n\r" ); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); for (i = 0; i < MAX_CHANGES; i++) { sprintf(buf, " #4%3d#G- #C%-12s #R*#c%-8s #o%-45s\n\r", i+1,changes_table[i].coder , changes_table[i].date, changes_table[i].change); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); } sprintf(buf, "#4There is a total of %d changes in the database.#n\n\r", MAX_CHANGES); send_to_char(buf,ch); send_to_char("#4Also see: Changes 'current' for a list of current changes. #n\n\r",ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); sprintf(buf, "#1There is a total of %d new changes that were added today.#n\n\r", today); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); send_to_char("\n\r", ch ); } else if (!str_cmp(arg,"current")) { sprintf(buf, "Changes done to #RE#rv#0e #GO#gf De#Cstr#cuc#lti#Lon#n\n\r"); send_to_char(buf,ch); if ( MAX_CHANGES < 15 ) { sprintf(buf, "#yNo. Coder Date Change\n\r" ); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); for (i = 0; i < MAX_CHANGES; i++) { sprintf(buf, " #4%3d#G- #C%-12s #R*#c%-8s #o%-45s\n\r", i+1,changes_table[i].coder , changes_table[i].date, changes_table[i].change); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); } sprintf(buf, "#4There is a total of %d changes in the database.#n\n\r", MAX_CHANGES); send_to_char(buf,ch); send_to_char("#4Also see: Changes 'current' for a list of current changes. #n\n\r",ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); sprintf(buf, "#1There is a total of %d new changes that were added today.#n\n\r", today); send_to_char(buf,ch); sprintf(buf,"#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); send_to_char("\n\r", ch ); } else { sprintf(buf, "Changes done to #RE#rv#0e #GO#gf De#Cstr#cuc#lti#Lon#n\n\r"); send_to_char(buf,ch); sprintf(buf, "#yNo. Coder Date Change\n\r" ); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); for (i = (MAX_CHANGES - 15); i < MAX_CHANGES; i++) { sprintf(buf, " #4%3d#G- #C%-12s #R*#c%-8s #o%-45s\n\r", i+1,changes_table[i].coder , changes_table[i].date, changes_table[i].change); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); } sprintf(buf, "#4There are 15 out of %d changes in the database listed.#n\n\r", MAX_CHANGES); send_to_char(buf,ch); send_to_char("#4Also see: Changes 'all' for a complete list.#n\n\r",ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); sprintf(buf, "#1There is a total of %d new changes that were added today.#n\n\r", today); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); send_to_char("\n\r", ch ); } } else { sprintf(buf, "Changes done to #RE#rv#0e #GO#gf De#Cstr#cuc#lti#Lon#n\n\r"); send_to_char(buf,ch); if ( MAX_CHANGES < 15 ) { sprintf(buf, "#yNo. Coder Date Change\n\r" ); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); for (i = 0; i < MAX_CHANGES; i++) { sprintf(buf, " #4%3d#G- #C%-12s #R*#c%-8s #o%-45s\n\r", i+1,changes_table[i].coder , changes_table[i].date, changes_table[i].change); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); } sprintf(buf, "#4There is a total of %d changes in the database.#n\n\r", MAX_CHANGES); send_to_char(buf,ch); send_to_char("#4Also see: Changes 'current' for a list of current changes. #n\n\r",ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); sprintf(buf, "#1There is a total of %d new changes that were added today.#n\n\r", today); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); send_to_char("\n\r", ch ); } else { sprintf(buf, "Changes done to #RE#rv#0e #GO#gf De#Cstr#cuc#lti#Lon#n\n\r"); send_to_char(buf,ch); sprintf(buf, "#yNo. Coder Date Change\n\r" ); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); for (i = (MAX_CHANGES - 15); i < MAX_CHANGES; i++) { sprintf(buf, " #4%3d#G- #C%-12s #R*#c%-8s #o%-45s\n\r", i+1,changes_table[i].coder , changes_table[i].date, changes_table[i].change); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); } sprintf(buf, "#4There are 15 out of %d changes in the database listed.#n\n\r", MAX_CHANGES); send_to_char(buf,ch); send_to_char("#4Also see: Changes 'all' for a complete list.#n\n\r",ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); sprintf(buf, "#1There is a total of %d new changes that were added today.#n\n\r", today); send_to_char(buf,ch); sprintf(buf, "#0-----------------------------------------------------------------------#n\n\r" ); send_to_char(buf,ch); send_to_char("\n\r", ch ); } } return; } char *wordwrap( char *oldstring ) { char newstring[MAX_STRING_LENGTH]; char newstring2[MAX_STRING_LENGTH]; int i; int j; int x; int length; i=j=x=0; length=strlen(oldstring); for (i=0;i < length;i++) { if (oldstring[i] == ' ') { newstring[j++] = oldstring[i]; x++; if (x >= 35) { x = 0; newstring[j++] = '\n'; for (x=0;x <= 30;x++){newstring[j++] = ' ';} x=0; } while(oldstring[i] == ' ')i++; while(oldstring[i] == '\n') i++; while(oldstring[i] == '\r') i++; while(oldstring[i] == ' ')i++; } while(oldstring[i] == '\n') i++; while(oldstring[i] == '\r') i++; newstring[j++] = oldstring[i]; x++; } { char end[2]; end[0] = newstring[strlen(newstring)-1]; end[1] = '\0'; if (!strcmp(end, ".")) newstring[j++] = '\0'; else { newstring[j++] = '.'; newstring[j++] = '\0'; } } strcpy(newstring2,newstring); return(str_dup(newstring2)); }