/* * $LynxId: LYTraversal.c,v 1.30 2010/09/24 22:57:01 tom Exp $ */ #include #include #include #include #include #include #include #include #include /* routines to handle special traversal feature */ static void final_perror(const char *msg, int clean_flag) { int saved_errno = errno; if (LYCursesON) { if (clean_flag) cleanup(); else stop_curses(); } set_errno(saved_errno); perror(msg); } static void exit_with_perror(const char *msg) { final_perror(msg, TRUE); exit_immediately(EXIT_FAILURE); } BOOLEAN lookup_link(char *target) { FILE *ifp; char *buffer = NULL; char *line = NULL; int result = FALSE; if ((ifp = fopen(TRAVERSE_FILE, TXT_R)) == NULL) { if ((ifp = LYNewTxtFile(TRAVERSE_FILE)) == NULL) { exit_with_perror(CANNOT_OPEN_TRAV_FILE); } else { LYCloseOutput(ifp); return (FALSE); } } HTSprintf0(&line, "%s\n", target); while (LYSafeGets(&buffer, ifp) != NULL) { if (STREQ(line, buffer)) { result = TRUE; break; } } /* end while */ FREE(line); FREE(buffer); LYCloseInput(ifp); return (BOOL) (result); } void add_to_table(char *target) { FILE *ifp; if ((ifp = LYAppendToTxtFile(TRAVERSE_FILE)) == NULL) { exit_with_perror(CANNOT_OPEN_TRAV_FILE); } fprintf(ifp, "%s\n", target); LYCloseOutput(ifp); } void add_to_traverse_list(char *fname, char *prev_link_name) { FILE *ifp; if ((ifp = LYAppendToTxtFile(TRAVERSE_FOUND_FILE)) == NULL) { exit_with_perror(CANNOT_OPEN_TRAF_FILE); } fprintf(ifp, "%s\t%s\n", fname, prev_link_name); LYCloseOutput(ifp); } void dump_traversal_history(void) { int x; FILE *ifp; if (nhist <= 0) return; if ((ifp = LYAppendToTxtFile(TRAVERSE_FILE)) == NULL) { final_perror(CANNOT_OPEN_TRAV_FILE, FALSE); return; } fprintf(ifp, "\n\n%s\n\n\t %s\n\n", TRAV_WAS_INTERRUPTED, gettext("here is a list of the history stack so that you may rebuild")); for (x = nhist - 1; x >= 0; x--) { fprintf(ifp, "%s\t%s\n", HDOC(x).title, HDOC(x).address); } LYCloseOutput(ifp); } void add_to_reject_list(char *target) { FILE *ifp; CTRACE((tfp, "add_to_reject_list(%s)\n", target)); if ((ifp = LYAppendToTxtFile(TRAVERSE_REJECT_FILE)) == NULL) { exit_with_perror(CANNOT_OPEN_REJ_FILE); } fprintf(ifp, "%s\n", target); LYCloseOutput(ifp); } /* there need not be a reject file, so if it doesn't open, just return FALSE, meaning "target not in reject file" If the last character in a line in a reject file is "*", then also reject if target matches up to that point in the string Blank lines are ignored Lines that contain just a * are allowed, but since they mean "reject everything" it shouldn't come up much! */ BOOLEAN lookup_reject(char *target) { FILE *ifp; char *buffer = NULL; char *line = NULL; size_t len; int result = FALSE; if ((ifp = fopen(TRAVERSE_REJECT_FILE, TXT_R)) == NULL) { return (FALSE); } HTSprintf0(&line, "%s", target); while (LYSafeGets(&buffer, ifp) != NULL && !result) { LYTrimTrailing(buffer); len = strlen(buffer); if (len != 0) { /* if not an empty line */ if (buffer[len - 1] == '*') { /* if last char is * and the rest of the chars match */ if ((len == 1) || (StrNCmp(line, buffer, len - 1) == 0)) { result = TRUE; } } else { if (STREQ(line, buffer)) { result = TRUE; } } } } /* end while loop over the file */ FREE(buffer); FREE(line); LYCloseInput(ifp); CTRACE((tfp, "lookup_reject(%s) -> %d\n", target, result)); return (BOOL) (result); }