/* ************************************************************************ * File: wld2html.c * * Usage: Convert a DikuMUD .wld file into a series of .html files * * * * This program is in the public domain. * * Written (QUICKLY AND DIRTILY) by Jeremy Elson (jelson@circlemud.org) * * Based on the Circle 3.0 syntax checker program (scheck.c) * ************************************************************************ */ #define log(msg) fprintf(stderr, "%s\n", msg) #include "conf.h" #include "sysdep.h" #define MEM_USE 10000 char buf[MEM_USE]; int get_line(FILE * fl, char *buf); void skip_spaces(char **string); void parse_webster_html(char *arg); int main(int argc, char **argv) { int pid = 0; if (argc != 3) { return 0; /* no word/pid given */ } pid = atoi(argv[2]); snprintf(buf, sizeof(buf), "lynx -accept_all_cookies -source http://www.thefreedictionary.com/%s" " >webster.html", argv[1]); system(buf); parse_webster_html(argv[1]); if (pid) kill(pid, SIGUSR2); return (0); } void parse_webster_html(char *arg) { FILE *infile, *outfile; char scanbuf[MEM_USE], outline[MEM_USE], *p, *q; outfile = fopen("websterinfo", "w"); if (!outfile) exit(1); infile = fopen("webster.html", "r"); if (!infile) { fprintf(outfile, "A bug has occured in webster. (no webster.html) Please notify Welcor."); fclose(outfile); return; } // unlink("webster.html"); /* We can still read */ for ( ; get_line(infile, buf)!=0; ) { if (strncmp(buf, "", 37) != 0) continue; // read until we hit the line with results in it. p = buf+37; if (strncmp(p, "
", 4) == 0) { fprintf(outfile, "That word could not be found.\n"); goto end; } else if (strncmp(p, "
"); // chop the line at the end of tags:
word becomes ""); // skip the rest of this tag. while (1) { q = outline; while (*p != '<') { assert(p < scanbuf+sizeof(scanbuf)); *q++ = *p++; } if (!strncmp(p, " tag or a
or
tag, ignore it. *q++='\0'; fprintf(outfile, "%s", outline); if (!strncmp(p, ""); } } else if (strncmp(p, "
", 5) == 0) // not found, but suggestions are ample: { strncpy(scanbuf, p, sizeof(scanbuf)); // strtok on a copy. p = strtok(scanbuf, ">"); // chop the line at the end of tags:
word becomes "
" "" "word" p = strtok(NULL, ">"); // skip the rest of this tag. while (1) { q = outline; while (*p != '<') *q++ = *p++; if (!strncmp(p, " tag, ignore it. *q++='\0'; fprintf(outfile, "%s", outline); if (!strncmp(p, ""); } } else { // weird.. one of the above should be correct. fprintf(outfile, "It would appear that the free online dictionary has changed their format.\n" "Sorry, but you might need a webrowser instead.\n\n" "See http://www.thefreedictionary.com/%s", arg); goto end; } } end: fclose(infile); fprintf(outfile, "~"); fclose(outfile); } /* get_line reads the next non-blank line off of the input stream. * The newline character is removed from the input. */ int get_line(FILE * fl, char *buf) { char temp[MEM_USE]; do { fgets(temp, MEM_USE, fl); if (*temp) temp[strlen(temp) - 1] = '\0'; } while (!feof(fl) && !*temp); if (feof(fl)) return (0); else { strcpy(buf, temp); return (1); } } /* * Function to skip over the leading spaces of a string. */ void skip_spaces(char **string) { for (; **string && isspace(**string); (*string)++); }