#include #include #include #include #include #include #include inline char *one_argument(char *argument, char *arg_first) { while (*argument <= ' ' && *argument) argument++; if (*argument == '\'' || *argument == '\"') { char cEnd = *argument++; while (*argument && *argument != cEnd) *arg_first++ = *argument++; argument++; } else while (*argument > ' ') *arg_first++ = *argument++; *arg_first = '\0'; while (*argument <= ' ' && *argument) argument++; return argument; } inline int is_exact_name(char *str, char *namelist) { char name[1024]; for (;;) { namelist = one_argument(namelist, name); if (!name[0]) return 0; if (!strcasecmp(str,name)) return 1; } } char *search_help(int running_level, char *fileName, char *keyword) { static char ret[8192]; char *cp = ret; int i; char level[1024], keywords[1024]; struct stat buf; char *file; FILE *fp = fopen(fileName, "r"); if (fp) { fstat(fileno(fp), &buf); file = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, fileno(fp), 0); if (!file) return "mmap failed"; } else return "null fp"; file = strstr(file, "#HELPS"); if (!file) { munmap(file, buf.st_size); fclose(fp); return "#helps not found"; } file += 6; while (1) { i = 0; while (*file <= ' ') file++; while (*file > ' ') level[i++] = *file++; level[i] = '\0'; file++; if (!strcmp(level, "#$")) { munmap(file, buf.st_size); fclose(fp); return "File format error"; } while (*file <= ' ') file++; i = 0; while (*file != '~') keywords[i++] = *file++; keywords[i] = '\0'; if (keywords[0] == '$' && !keywords[1]) { munmap(file, buf.st_size); fclose(fp); return NULL; } file++; if (atoi(level) <= running_level && is_exact_name(keyword, keywords)) { while (*file != '~') *cp++ = *file++; munmap(file, buf.st_size); fclose(fp); return ret; } else while (*file != '~') file++; file++; } } char *help_text(char *keyword, int level) { char *ret; if ((ret = search_help(level, "/home/divine/Rom24/area/help.are", keyword))) return ret; if ((ret = search_help(level, "/home/divine/Rom24/area/rom.are", keyword))) return ret; if ((ret = search_help(level, "/home/divine/Rom24/area/group.are", keyword))) return ret; return "Help File Not Found."; }