/** Return a string with all help entries that match a pattern */ static char * list_matching_entries(char *pattern, help_file *help_dat, const char *sep) { static char buff[BUFFER_LEN]; int offset; char *bp; size_t n; int len; bp = buff; if (help_dat->admin) offset = 1; /* To skip the leading & */ else offset = 0; if (!wildcard(pattern)) { /* Quick way out, use the other kind of matching */ char the_topic[LINE_SIZE + 2]; help_indx *entry = NULL; strcpy(the_topic, normalize_entry(help_dat, pattern)); if (!help_dat->indx || help_dat->entries == 0) return T("#-1 NO INDEX FOR FILE"); entry = help_find_entry(help_dat, the_topic); if (!entry) return (char *) ""; return (char *) (entry->topic + offset); } bp = buff; if (sep) len = strlen(sep); for (n = 0; n < help_dat->entries; n++) if (quick_wild(pattern, help_dat->indx[n].topic + offset)) { safe_str(help_dat->indx[n].topic + offset, buff, &bp); if (sep) safe_strl(sep, len, buff, &bp); } if (bp > buff) *(bp - len) = '\0'; else { *bp = '\0'; } return buff; }
static const char * string_spitfile(help_file *help_dat, char *arg1) { help_indx *entry = NULL; FILE *fp; char line[LINE_SIZE + 1]; char the_topic[LINE_SIZE + 2]; size_t n; static char buff[BUFFER_LEN]; char *bp; strcpy(the_topic, normalize_entry(help_dat, arg1)); if (!help_dat->indx || help_dat->entries == 0) return T("#-1 NO INDEX FOR FILE"); entry = help_find_entry(help_dat, the_topic); if (!entry) { return T("#-1 NO ENTRY"); } if ((fp = fopen(help_dat->file, FOPEN_READ)) == NULL) { return T("#-1 UNAVAILABLE"); } if (fseek(fp, entry->pos, 0) < 0L) { return T("#-1 UNAVAILABLE"); } bp = buff; for (n = 0; n < BUFFER_LEN; n++) { if (fgets(line, LINE_SIZE, fp) == NULL) break; if (line[0] == '&') break; safe_str(line, buff, &bp); } *bp = '\0'; fclose(fp); return buff; }
static void do_new_spitfile(dbref player, char *arg1, help_file *help_dat) { help_indx *entry = NULL; FILE *fp; char *p, line[LINE_SIZE + 1]; char the_topic[LINE_SIZE + 2]; int default_topic = 0; size_t n; if (*arg1 == '\0') { default_topic = 1; arg1 = (char *) help_dat->command; } else if (*arg1 == '&') { notify(player, T("Help topics don't start with '&'.")); return; } if (strlen(arg1) > LINE_SIZE) *(arg1 + LINE_SIZE) = '\0'; if (help_dat->admin) { sprintf(the_topic, "&%s", arg1); } else strcpy(the_topic, arg1); if (!help_dat->indx || help_dat->entries == 0) { notify(player, T("Sorry, that command is temporarily unvailable.")); do_rawlog(LT_ERR, "No index for %s.", help_dat->command); return; } entry = help_find_entry(help_dat, the_topic); if (!entry && default_topic) entry = help_find_entry(help_dat, (help_dat->admin ? "&help" : "help")); if (!entry) { notify_format(player, T("No entry for '%s'."), arg1); return; } if ((fp = fopen(help_dat->file, FOPEN_READ)) == NULL) { notify(player, T("Sorry, that function is temporarily unavailable.")); do_log(LT_ERR, 0, 0, "Can't open text file %s for reading", help_dat->file); return; } if (fseek(fp, entry->pos, 0) < 0L) { notify(player, T("Sorry, that function is temporarily unavailable.")); do_rawlog(LT_ERR, "Seek error in file %s", help_dat->file); return; } strcpy(the_topic, strupper(entry->topic + (*entry->topic == '&'))); /* ANSI topics */ notify_format(player, "%s%s%s", ANSI_HILITE, the_topic, ANSI_END); if (SUPPORT_PUEBLO) notify_noenter(player, open_tag("SAMP")); for (n = 0; n < BUFFER_LEN; n++) { if (fgets(line, LINE_SIZE, fp) == NULL) break; if (line[0] == '&') break; if (line[0] == '\n') { notify(player, " "); } else { for (p = line; *p != '\0'; p++) if (*p == '\n') *p = '\0'; notify(player, line); } } if (SUPPORT_PUEBLO) notify(player, close_tag("SAMP")); fclose(fp); if (n >= BUFFER_LEN) notify_format(player, T("%s output truncated."), help_dat->command); }