about summary refs log tree commit diff stats
path: root/src/LYHistory.c
diff options
context:
space:
mode:
authorThomas E. Dickey <dickey@invisible-island.net>1996-09-02 19:39:24 -0400
committerThomas E. Dickey <dickey@invisible-island.net>1996-09-02 19:39:24 -0400
commite087f6d44e87f489fcb3056e86319ebba4218156 (patch)
treed045b58011bfbbf5186d34c4fed9e0dedb363275 /src/LYHistory.c
downloadlynx-snapshots-e087f6d44e87f489fcb3056e86319ebba4218156.tar.gz
snapshot of project "lynx", label v2_6
Diffstat (limited to 'src/LYHistory.c')
-rw-r--r--src/LYHistory.c256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/LYHistory.c b/src/LYHistory.c
new file mode 100644
index 00000000..d947820d
--- /dev/null
+++ b/src/LYHistory.c
@@ -0,0 +1,256 @@
+#include "HTUtils.h"
+#include "tcp.h"
+#include "HTAlert.h"
+#include "HText.h"
+#include "LYUtils.h"
+#include "LYHistory.h"
+#include "LYPrint.h"
+#include "LYDownload.h"
+#include "LYGlobalDefs.h"
+#include "LYSignal.h"
+#include "LYStrings.h"
+#include "LYCharUtils.h"
+
+#ifdef DIRED_SUPPORT
+#include "LYUpload.h"
+#include "LYLocal.h"
+#endif /* DIRED_SUPPORT */
+
+#include "LYexit.h"
+#include "LYLeaks.h"
+ 
+#define FREE(x) if (x) {free(x); x = NULL;}
+
+/*
+ *  Push the current filename, link and line number onto the history list.
+ */
+PUBLIC void LYpush ARGS1(document *,doc)
+{
+
+    if( *doc->address == '\0')  /* dont push null file names */
+	return;
+
+    /* don't push the history, download, or printer lists */
+    if(!strcmp(doc->title, HISTORY_PAGE_TITLE) ||
+		!strcmp(doc->title, PRINT_OPTIONS_TITLE) ||
+		!strcmp(doc->title, DOWNLOAD_OPTIONS_TITLE) ) {
+	if (!LYforce_no_cache)
+	    LYoverride_no_cache = TRUE;
+	return;
+    }
+
+#ifdef DIRED_SUPPORT
+    if(!strcmp(doc->title, DIRED_MENU_TITLE) ||
+		!strcmp(doc->title, UPLOAD_OPTIONS_TITLE) ||
+                !strcmp(doc->title, PERMIT_OPTIONS_TITLE)) {
+	if (!LYforce_no_cache)
+	    LYoverride_no_cache = TRUE;
+	return;
+    }
+#endif /* DIRED_SUPPORT */
+
+    if(nhist>1 && STREQ(history[nhist-1].address, doc->address) &&
+       !strcmp(history[nhist-1].post_data ? history[nhist-1].post_data : "",
+               doc->post_data ? doc->post_data : "") &&
+	       history[nhist-1].isHEAD == doc->isHEAD) 
+        return;  /* file is identical to one before it don't push it */
+
+    if(nhist>2 && STREQ(history[nhist-2].address, doc->address) &&
+       !strcmp(history[nhist-2].post_data ? history[nhist-2].post_data : "",
+               doc->post_data ? doc->post_data : "") &&
+	       history[nhist-2].isHEAD == doc->isHEAD) {
+	  nhist--; /* pop one off the stack */
+          return;  /* file is identical to one two before it don't push it */
+    }
+
+    if (nhist<MAXHIST)  {
+	history[nhist].link = doc->link;
+	history[nhist].page = doc->line;
+	history[nhist].title = 0;
+	StrAllocCopy(history[nhist].title, doc->title);
+	history[nhist].address = 0;
+	StrAllocCopy(history[nhist].address, doc->address);
+	history[nhist].post_data = 0;
+	StrAllocCopy(history[nhist].post_data, doc->post_data);
+	history[nhist].post_content_type = 0;
+	StrAllocCopy(history[nhist].post_content_type, doc->post_content_type);
+	history[nhist].isHEAD = doc->isHEAD;
+	nhist++;
+
+        if(TRACE)
+    	    fprintf(stderr,"\nLYpush: address:%s\n        title:%s\n",
+						doc->address,doc->title);
+    }
+}
+
+/*
+ *  Pop the previous filename, link and line number from the history list.
+ */
+PUBLIC void LYpop ARGS1(document *,doc)
+{
+ 
+    if (nhist>0) {
+	nhist--;
+	doc->link = history[nhist].link;
+	doc->line = history[nhist].page;
+	FREE(doc->title);
+	doc->title = history[nhist].title;    /* will be freed later */
+	FREE(doc->address);
+	doc->address = history[nhist].address;  /* will be freed later */
+	FREE(doc->post_data);
+	doc->post_data = history[nhist].post_data;
+	FREE(doc->post_content_type);
+	doc->post_content_type = history[nhist].post_content_type;
+	doc->isHEAD = history[nhist].isHEAD;
+
+        if(TRACE)
+	    fprintf(stderr,"LYpop: address:%s\n     title:%s\n",
+						doc->address,doc->title);
+
+    }
+}
+
+/*
+ *  Pop the specified hist entry, link and line number from the history
+ *  list but don't actually remove the entry, just return it.
+ *  (This procedure is badly named :)
+ */
+PUBLIC void LYpop_num ARGS2(int,number, document *,doc)
+{
+    if (number >= 0 && nhist >= number) {
+	doc->link = history[number].link;
+	doc->line = history[number].page;
+	StrAllocCopy(doc->title, history[number].title);
+	StrAllocCopy(doc->address, history[number].address);
+	StrAllocCopy(doc->post_data, history[number].post_data);
+	StrAllocCopy(doc->post_content_type, history[number].post_content_type);
+	doc->isHEAD = history[number].isHEAD;
+    }
+}
+
+/*
+ *  This procedure outputs the history buffer into a temporary file.
+ *  
+ */
+PUBLIC int showhistory ARGS1(char **,newfile)
+{
+    static char tempfile[256];
+    static BOOLEAN first = TRUE;
+    static char hist_filename[256];
+    char *Title = NULL;
+    int x = 0;
+    FILE *fp0;
+
+    if (first) {
+	tempname(tempfile, NEW_FILE);
+	first = FALSE;
+#ifdef VMS
+    } else {
+	remove(tempfile);  /* Remove duplicates on VMS. */
+#endif /* VMS */
+    }
+
+    if ((fp0 = fopen(tempfile,"w")) == NULL) {
+	HTAlert(CANNOT_OPEN_TEMP);
+	return(-1);
+    }
+
+    /*
+     *  Make the file a URL now.
+     */
+#ifdef VMS
+    sprintf(hist_filename,"file://localhost/%s", tempfile);
+#else
+    sprintf(hist_filename,"file://localhost%s", tempfile);
+#endif /* VMS */
+    StrAllocCopy(*newfile, hist_filename);
+    LYforce_HTML_mode = TRUE;	/* force this file to be HTML */
+    LYforce_no_cache = TRUE;	/* force this file to be new */
+
+    fprintf(fp0, "<head>\n<title>%s</title>\n</head>\n<body>\n",
+		 HISTORY_PAGE_TITLE);
+
+    fprintf(fp0, "<h1>You have reached the History Page</h1>\n");
+    fprintf(fp0, "<h2>%s Version %s</h2>\n<pre>", LYNX_NAME, LYNX_VERSION);
+    fprintf(fp0, "<em>You selected:</em>\n");
+    for (x = nhist-1; x >= 0; x--) {
+	/*
+	 *  The number of the document in the hist stack,
+	 *  its name in a link, and its address. - FM
+	 */
+	if (history[x].title != NULL) {
+	    StrAllocCopy(Title, history[x].title);
+	    LYEntify(&Title, TRUE);
+	} else {
+	    StrAllocCopy(Title, "(no title)");
+	}
+	fprintf(fp0,
+		"%s<em>%d</em>. <tab id=t%d><a href=\"LYNXHIST:%d\">%s</a>\n",
+		(x > 99 ? "" : x < 9 ? "  " : " "),  
+		x, x, x, Title);
+	if (history[x].address != NULL) {
+	    StrAllocCopy(Title, history[x].address);
+	    LYEntify(&Title, TRUE);
+	} else {
+	    StrAllocCopy(Title, "(no address)");
+	}
+	fprintf(fp0, "<tab to=t%d>%s\n", x, Title);
+    }
+
+    fprintf(fp0,"</pre>\n</body>\n");
+
+    fclose(fp0);
+    FREE(Title);
+    return(0);
+}
+
+/* 
+ *  This is a kludge to make the history page seem like any other type of
+ *  file since more info is needed than can be provided by the normal link
+ *  structure.  I saved out the history number to a special URL.  The info
+ *  looks like:  LYNXHIST:#
+ */
+PUBLIC void historytarget ARGS1(document *,newdoc)
+{
+    int number, c;
+    DocAddress WWWDoc;
+
+    if ((!newdoc || !newdoc->address) ||
+        strlen(newdoc->address) < 10 || !isdigit(*(newdoc->address+9)))
+	return;
+
+    if ((number = atoi(newdoc->address+9)) > nhist || number < 0)
+        return;
+
+    LYpop_num(number, newdoc);
+
+    /*
+     *  If we have POST content, aren't forcing no_cache,
+     *  and still have the text cached, ask the user whether
+     *  to resubmit the form. - FM
+     */
+    if (newdoc->post_data != NULL && LYforce_no_cache == FALSE) {
+        if (LYresubmit_posts == TRUE) {
+	    LYoverride_no_cache = FALSE;
+	} else {
+	    WWWDoc.address = newdoc->address;
+            WWWDoc.post_data = newdoc->post_data;
+            WWWDoc.post_content_type = newdoc->post_content_type;
+	    WWWDoc.isHEAD = newdoc->isHEAD;
+	    if ((HText *)HTAnchor_document(
+				HTAnchor_parent(HTAnchor_findAddress(&WWWDoc))
+					  )) {
+		LYoverride_no_cache = TRUE;
+		_statusline(
+		   "Document from Form with POST content.  Resubmit? (y/n) ");
+		c = LYgetch();
+		if (TOUPPER(c) == 'Y') {
+		    LYoverride_no_cache = FALSE;
+		}
+	    }
+	}
+    }
+
+    if (number != 0)
+	StrAllocCat(newdoc->title," (From History)");
+}