diff options
Diffstat (limited to 'src/LYTraversal.c')
-rw-r--r-- | src/LYTraversal.c | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/LYTraversal.c b/src/LYTraversal.c new file mode 100644 index 0000000..2aa95fa --- /dev/null +++ b/src/LYTraversal.c @@ -0,0 +1,182 @@ +/* + * $LynxId: LYTraversal.c,v 1.30 2010/09/24 22:57:01 tom Exp $ + */ +#include <HTUtils.h> +#include <LYGlobalDefs.h> +#include <LYUtils.h> +#include <LYClean.h> +#include <LYCurses.h> +#include <LYStrings.h> +#include <LYTraversal.h> + +#include <LYexit.h> +#include <LYLeaks.h> + +/* 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); +} |