/** Add new help command. This function is * the basis for the help_command directive in mush.cnf. It creates * a new help entry for the hash table, builds a help index, * and adds the new command to the command table. * \param command_name name of help command to add. * \param filename name of the help file to use for this command. * \param admin if 1, this command reads admin topics, rather than standard. */ void add_help_file(const char *command_name, const char *filename, int admin) { help_file *h; if (help_init == 0) init_help_files(); if (!command_name || !filename || !*command_name || !*filename) return; /* If there's already an entry for it, complain */ h = hashfind(strupper(command_name), &help_files); if (h) { do_rawlog(LT_ERR, "Duplicate help_command %s ignored.", command_name); return; } h = mush_malloc(sizeof *h, "help_file.entry"); h->command = mush_strdup(strupper(command_name), "help_file.command"); h->file = mush_strdup(filename, "help_file.filename"); h->entries = 0; h->indx = NULL; h->admin = admin; help_build_index(h, h->admin); if (!h->indx) { mush_free(h->command, "help_file.command"); mush_free(h->file, "help_file.filename"); mush_free(h, "help_file.entry"); return; } (void) command_add(h->command, CMD_T_ANY | CMD_T_NOPARSE, NULL, 0, NULL, cmd_helpcmd); hashadd(h->command, h, &help_files); }
/** Rebuild a single help file index. Used in inotify reindexing. * \param filename the name of the help file to reindex. * \return true if a help file was reindexed, false otherwise. */ bool help_reindex_by_name(const char *filename) { help_file *curr; bool retval = 0; for (curr = hash_firstentry(&help_files); curr; curr = hash_nextentry(&help_files)) { if (strcmp(curr->file, filename) == 0) { if (curr->indx) mush_free(curr->indx, "help_index"); curr->indx = NULL; curr->entries = 0; help_build_index(curr, curr->admin); retval = 1; } } return retval; }
/** Rebuild a help file index. * \verbatim * This command implements @readcache. * \endverbatim * \param player the enactor. */ void help_reindex(dbref player) { help_file *curr; for (curr = hash_firstentry(&help_files); curr; curr = hash_nextentry(&help_files)) { if (curr->indx) { mush_free(curr->indx, "help_index"); curr->indx = NULL; curr->entries = 0; } help_build_index(curr, curr->admin); } if (player != NOTHING) { notify(player, T("Help files reindexed.")); do_rawlog(LT_WIZ, "Help files reindexed by %s(#%d)", Name(player), player); } else do_rawlog(LT_WIZ, "Help files reindexed."); }
/** Add new help command. This function is * the basis for the help_command directive in mush.cnf. It creates * a new help entry for the hash table, builds a help index, * and adds the new command to the command table. * \param command_name name of help command to add. * \param filename name of the help file to use for this command. * \param admin if 1, this command reads admin topics, rather than standard. */ void add_help_file(const char *command_name, const char *filename, int admin) { help_file *h; char newfilename[256] = "\0"; /* Must use a buffer for MacOS file path conversion */ strncpy(newfilename, filename, 256); if (help_init == 0) init_help_files(); if (!command_name || !filename || !*command_name || !*newfilename) return; /* If there's already an entry for it, complain */ h = hashfind(strupper(command_name), &help_files); if (h) { do_rawlog(LT_ERR, T("Duplicate help_command %s ignored."), command_name); return; } h = mush_malloc(sizeof *h, "help_file.entry"); h->command = mush_strdup(strupper(command_name), "help_file.command"); h->file = mush_strdup(newfilename, "help_file.filename"); h->entries = 0; h->indx = NULL; h->admin = admin; help_build_index(h, h->admin); if (!h->indx) { mush_free(h->command, "help_file.command"); mush_free(h->file, "help_file.filename"); mush_free(h, "help_file.entry"); return; } (void) command_add(h->command, CMD_T_ANY | CMD_T_NOPARSE, NULL, cmd_helpcmd, NULL); hashadd(h->command, h, &help_files); }