/* */ #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 <unistd.h> #include <stdarg.h> #include "merc.h" #include "quotes.h" /* * Globals */ char *current_date args ((void)); int nnum_quotes args ((void)); /* * Local Functions */ int maxQuotes; #define NULLSTR( str ) ( str == NULL || str[0] == '\0' ) NEWQUOTE_DATA *quotes_table; char *qnshort_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[20]; buf[7] = date[21]; buf[8] = date[22]; buf[9] = date[23]; return buf; } void load_quotes (void) { FILE *fp; int i; if (!(fp = fopen (QUOTES_FILE, "r"))) { bug ("Could not open Quotes File for reading.", 0); return; } fscanf (fp, "%d\n", &maxQuotes); /* Use malloc so we can realloc later on */ quotes_table = malloc (sizeof (NEWQUOTE_DATA) * (maxQuotes + 1)); for (i = 0; i < maxQuotes; i++) { quotes_table[i].quote = fread_string (fp); quotes_table[i].coder = fread_string (fp); quotes_table[i].date = fread_string (fp); quotes_table[i].mudtime = fread_number (fp); } quotes_table[maxQuotes].coder = str_dup (""); fclose (fp); return; /* just return */ } char *qncurrent_date () { static char buf[128]; struct tm *t; time_t nowtime; nowtime = time (¤t_time); t = localtime (&nowtime); strftime (buf, 100, "%d/%m/%Y", t); return buf; } void save_quotes (void) { FILE *fp; int i; if (!(fp = fopen (QUOTES_FILE, "w"))) { perror (QUOTES_FILE); return; } fprintf (fp, "%d\n", maxQuotes); for (i = 0; i < maxQuotes; i++) { fprintf (fp, "%s~\n", quotes_table[i].quote); fprintf (fp, "%s~\n", quotes_table[i].coder); fprintf (fp, "%s~\n", quotes_table[i].date); fprintf (fp, "%ld\n", (long)quotes_table[i].mudtime); fprintf (fp, "\n"); } fclose (fp); return; } void delete_quote (int iQuote) { int i, j; NEWQUOTE_DATA *new_table; new_table = malloc (sizeof (NEWQUOTE_DATA) * maxQuotes); if (!new_table) return; for (i = 0, j = 0; i < maxQuotes + 1; i++) { if (i != iQuote) { new_table[j] = quotes_table[i]; j++; } } free (quotes_table); quotes_table = new_table; maxQuotes--; save_quotes (); return; } void do_naddquote (CHAR_DATA * ch, char *argument) { NEWQUOTE_DATA *new_table; char buf[MSL]; if (IS_NPC (ch)) return; if (argument[0] == '\0') { send_to_char ("Syntax: Addquote $QuoteString\n\r", ch); send_to_char ("Type 'quotes' to view the list.#n\n\r", ch); return; } maxQuotes++; new_table = realloc (quotes_table, sizeof (NEWQUOTE_DATA) * (maxQuotes + 1)); if (!new_table) { /* realloc failed */ send_to_char ("Memory allocation failed. Brace for impact.\n\r", ch); return; } quotes_table = new_table; quotes_table[maxQuotes - 1].quote = str_dup (argument); quotes_table[maxQuotes - 1].coder = str_dup (ch->name); quotes_table[maxQuotes - 1].date = str_dup (current_date ()); quotes_table[maxQuotes - 1].mudtime = current_time; sprintf (buf, "#wYou added the following quote:\n\r #r%s\n\r", argument); stc (buf, ch); sprintf (buf, "#c%s #whas added a new quote, type '#yquotes#w' to see what it was", ch->name); do_info (NULL, buf); save_quotes (); return; } void do_qusave (CHAR_DATA * ch, char *argument) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MSL]; argument = one_argument (argument, arg1); argument = one_argument (argument, arg2); if (IS_NPC (ch)) return; if (!ch->desc || NULLSTR (arg1)) { stc ("Syntax: editquote load/save\n\r", ch); stc ("Syntax: editquote delete (quote number)\n\r", ch); stc ("Syntax: editquote rename (quote number)\n\r", ch); return; } else if (!str_cmp (arg1, "load")) { load_quotes (); send_to_char ("Quotes Loaded.\n\r", ch); return; } else if (!str_cmp (arg1, "save")) { save_quotes (); send_to_char ("Quotes Saved.\n\r", ch); return; } else if (!str_cmp (arg1, "delete")) { int num; if (NULLSTR (arg2) || !is_number (arg2)) { send_to_char ("#wFor editquote delete, you must provide a quote number.#n\n\r", ch); send_to_char ("Syntax: editquote delete (quote number)\n\r", ch); return; } num = atoi (arg2); if (num < 0 || num > maxQuotes) { sprintf (buf, "Valid quotes are from 0 to %d.\n\r", maxQuotes); stc (buf, ch); return; } delete_quote (num); send_to_char ("Quote deleted.\n\r", ch); return; } else if (strcmp (arg1, "rename") == 0) { int num; if (NULLSTR (arg2) || !is_number (arg2) || NULLSTR (argument)) { send_to_char ("#yFor editquote rename, you must choose a quote number.#n\n\r", ch); send_to_char ("Syntax: editquote rename (quote number) 'New Quote'#n\n\r", ch); return; } num = atoi (arg2); if (num < 0 || num > maxQuotes) { char buf[MAX_STRING_LENGTH]; sprintf (buf, "Valid quotes are from 0 to %d.\n\r", maxQuotes); send_to_char (buf, ch); return; } quotes_table[num - 1].quote = str_dup (argument); save_quotes (); send_to_char ("Quote renamed.\n\r", ch); return; } } char *qnline_indent (char *text, int wBegin, int wMax) { static char buf[MAX_STRING_LENGTH]; char *ptr; char *ptr2; int count = 0; bool stop = FALSE; int wEnd=0; buf[0] = '\0'; ptr = text; ptr2 = buf; while (!stop) { if (count == 0) { if (*ptr == '\0') wEnd = wMax - wBegin; else if (strlen (ptr) < (wMax - wBegin)) wEnd = wMax - wBegin; else { int x = 0; while (*(ptr + (wMax - wBegin - x)) != ' ') x++; wEnd = wMax - wBegin - (x - 1); if (wEnd < 1) wEnd = wMax - wBegin; } } if (count == 0 && *ptr == ' ') ptr++; else if (++count != wEnd) { if ((*ptr2++ = *ptr++) == '\0') stop = TRUE; } else if (*ptr == '\0') { stop = TRUE; *ptr2 = '\0'; } else { int k; count = 0; *ptr2++ = '\n'; *ptr2++ = '\r'; for (k = 0; k < wBegin; k++) *ptr2++ = ' '; } } return buf; } /* int newquotes (void) { char *test; char quote[100]; int newquotes; int i; i = 0; sprintf (quote, "%ld", ch->pcdata->quoteplace); newquotes = 0; test = current_date (); for (i = 0; i < maxQuotes; i++) if (!str_cmp (test, quote)) newquotes++; return newquotes; } */ int nnum_quotes (void) { char *test; int today; int i; i = 0; test = current_date (); today = 0; for (i = 0; i < maxQuotes; i++) if (!str_cmp (test, quotes_table[i].date)) today++; return today; } void do_quotes (CHAR_DATA * ch, char *argument) { char arg[MIL], arg2[MIL], buf[MSL], *test; int i, page = 0, maxpage = 0, today; int display = 0; argument = one_argument (argument, arg); argument = one_argument (argument, arg2); if (IS_NPC (ch)) return; if (maxQuotes < 1) return; i = 0; test = current_date (); today = 0; for (i = 0; i < maxQuotes; i++) { if (!str_cmp (test, quotes_table[i].date)) today++; } if (is_number (arg)) page = atoi (arg); maxpage = (maxQuotes + 9) / 10; if (page > 0) { if (page > maxpage) { sprintf (buf, "Show which page 1-%d\n\r", maxpage); stc (buf, ch); return; } page *= 10; } stc ("^1#wNUMBER #cWITNESS #yDATE #wQUOTE #n\n\r", ch); stc ("#R--------------------------------------------------------------------------------#n\n\r", ch); if (!str_cmp (arg, "search")) { int dsp = 0; if (arg2[0] == '\0') { stc ("What do you want to search for??.\n\r", ch); return; } for (i = 0; i < maxQuotes; i++) { if (!str_infix (arg2, quotes_table[i].quote)) // if (strstr(quotes_table[i].quote, arg2)) { sprintf (buf, "#e[#w%4d#e] #c%-13s #y%10s #c- #w%-52s\n\r", (++dsp), quotes_table[i].coder, quotes_table[i].date, line_indent (quotes_table[i].quote, 34, 79)); stc (buf, ch); } } if (dsp == 0) stc ("There is NO match with what you have entered!.\n\r", ch); stc ("#R--------------------------------------------------------------------------------#n\n\r", ch); return; } for (i = 0; i < maxQuotes; i++) { if (page == 0 && quotes_table[i].mudtime + (2 * 24L * 3600L) < current_time) continue; display++; if (page > 0 && (page > 0 && (i < (page - 10) || i >= page))) continue; sprintf (buf, "#e[#w%4d#e] #c%-13s #y%10s #c- #w%-55s\n\r", (i + 1), quotes_table[i].coder, quotes_table[i].date, line_indent (quotes_table[i].quote, 34, 79)); stc (buf, ch); } ch->pcdata->quoteplace = quotes_table[i].mudtime; stc ("#R--------------------------------------------------------------------------------#n\n\r", ch); if (today > 0) sprintf (buf, "#wThere is a total of [#r%d#w] quotes of which [#c%d#w] %s been added today.#n", maxQuotes, today, today > 1 ? "have" : "has"); else sprintf (buf, "#wThere is a total of [#r%d#w] quotes.#n", maxQuotes); cent_to_char (buf, ch); stc ("#R--------------------------------------------------------------------------------#n\n\r", ch); sprintf (buf, "#wTo see pages of quotes use: 'quotes <#c1#w-#r%d#w>'", maxpage); cent_to_char (buf, ch); cent_to_char ("#wTo search all quotes for a quote use: 'quotes search <#cword#w>'#n", ch); stc ("#R--------------------------------------------------------------------------------#n\n\r", ch); }