summaryrefslogtreecommitdiffstats
path: root/src/LYTraversal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/LYTraversal.c')
-rw-r--r--src/LYTraversal.c182
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);
+}