summaryrefslogtreecommitdiff
path: root/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFWriter.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/lynx/WWW/Library/Implementation/HTFWriter.c')
-rw-r--r--gnu/usr.bin/lynx/WWW/Library/Implementation/HTFWriter.c358
1 files changed, 358 insertions, 0 deletions
diff --git a/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFWriter.c b/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFWriter.c
new file mode 100644
index 00000000000..8ef9ba1b6e1
--- /dev/null
+++ b/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFWriter.c
@@ -0,0 +1,358 @@
+/* FILE WRITER HTFWrite.h
+** ===========
+**
+** This version of the stream object just writes to a C file.
+** The file is assumed open and left open.
+**
+** Bugs:
+** strings written must be less than buffer size.
+*/
+
+#include "HTUtils.h"
+
+#include "HTFWriter.h"
+
+#include "HTFormat.h"
+#include "HTAlert.h"
+#include "HTFile.h"
+
+#include "LYLeaks.h"
+
+#define FREE(x) if (x) {free(x); x = NULL;}
+
+/* Stream Object
+** ------------
+*/
+
+struct _HTStream {
+ CONST HTStreamClass * isa;
+
+ FILE * fp;
+ char * end_command;
+ char * remove_command;
+ BOOL announce;
+};
+
+
+/*_________________________________________________________________________
+**
+** B L A C K H O L E C L A S S
+**
+** There is only one black hole instance shared by anyone
+** who wanst a black hole. These black holes don't radiate,
+** they just absorb data.
+*/
+PRIVATE void HTBlackHole_put_character ARGS2(HTStream *, me, char, c)
+{}
+PRIVATE void HTBlackHole_put_string ARGS2(HTStream *, me, CONST char*, s)
+{}
+PRIVATE void HTBlackHole_write ARGS3(HTStream *, me, CONST char*, s, int, l)
+{}
+PRIVATE void HTBlackHole_free ARGS1(HTStream *, me)
+{}
+PRIVATE void HTBlackHole_abort ARGS2(HTStream *, me, HTError, e)
+{}
+
+
+/* Black Hole stream
+** -----------------
+*/
+PRIVATE CONST HTStreamClass HTBlackHoleClass =
+{
+ "BlackHole",
+ HTBlackHole_free,
+ HTBlackHole_abort,
+ HTBlackHole_put_character, HTBlackHole_put_string,
+ HTBlackHole_write
+};
+
+PRIVATE HTStream HTBlackHoleInstance =
+{
+ &HTBlackHoleClass,
+ NULL,
+ NULL,
+ NULL,
+ NO
+};
+
+/* Black hole craetion
+*/
+PUBLIC HTStream * HTBlackHole NOARGS
+{
+ return &HTBlackHoleInstance;
+}
+
+
+/*_________________________________________________________________________
+**
+** F I L E A C T I O N R O U T I N E S
+** Bug:
+** All errors are ignored.
+*/
+
+/* Character handling
+** ------------------
+*/
+
+PRIVATE void HTFWriter_put_character ARGS2(HTStream *, me, char, c)
+{
+ putc(c, me->fp);
+}
+
+
+
+/* String handling
+** ---------------
+**
+** Strings must be smaller than this buffer size.
+*/
+PRIVATE void HTFWriter_put_string ARGS2(HTStream *, me, CONST char*, s)
+{
+ fputs(s, me->fp);
+}
+
+
+/* Buffer write. Buffers can (and should!) be big.
+** ------------
+*/
+PRIVATE void HTFWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l)
+{
+ fwrite(s, 1, l, me->fp);
+}
+
+
+
+
+/* Free an HTML object
+** -------------------
+**
+** Note that the SGML parsing context is freed, but the created
+** object is not,
+** as it takes on an existence of its own unless explicitly freed.
+*/
+PRIVATE void HTFWriter_free ARGS1(HTStream *, me)
+{
+ fclose(me->fp);
+ if (me->end_command) { /* Temp file */
+ _HTProgress(me->end_command); /* Tell user what's happening */
+ system(me->end_command);
+ FREE(me->end_command);
+ if (me->remove_command) {
+ system(me->remove_command);
+ FREE(me->remove_command);
+ }
+ }
+
+ FREE(me);
+}
+
+/* End writing
+*/
+
+PRIVATE void HTFWriter_abort ARGS2(HTStream *, me, HTError, e)
+{
+ fclose(me->fp);
+ if (me->end_command) { /* Temp file */
+ if (TRACE) fprintf(stderr,
+ "HTFWriter: Aborting: file not executed.\n");
+ FREE(me->end_command);
+ if (me->remove_command) {
+ system(me->remove_command);
+ FREE(me->remove_command);
+ }
+ }
+
+ FREE(me);
+}
+
+
+
+/* Structured Object Class
+** -----------------------
+*/
+PRIVATE CONST HTStreamClass HTFWriter = /* As opposed to print etc */
+{
+ "FileWriter",
+ HTFWriter_free,
+ HTFWriter_abort,
+ HTFWriter_put_character, HTFWriter_put_string,
+ HTFWriter_write
+};
+
+
+/* Subclass-specific Methods
+** -------------------------
+*/
+
+PUBLIC HTStream* HTFWriter_new ARGS1(FILE *, fp)
+{
+ HTStream* me;
+
+ if (!fp) return NULL;
+
+ me = (HTStream*)malloc(sizeof(*me));
+ if (me == NULL) outofmem(__FILE__, "HTML_new");
+ me->isa = &HTFWriter;
+
+ me->fp = fp;
+ me->end_command = NULL;
+ me->remove_command = NULL;
+ me->announce = NO;
+
+ return me;
+}
+
+/* Make system command from template
+** ---------------------------------
+**
+** See mailcap spec for description of template.
+*/
+/* @@ to be written. sprintfs will do for now. */
+
+
+
+/* Take action using a system command
+** ----------------------------------
+**
+** originally from Ghostview handling by Marc Andreseen.
+** Creates temporary file, writes to it, executes system command
+** on end-document. The suffix of the temp file can be given
+** in case the application is fussy, or so that a generic opener can
+** be used.
+*/
+PUBLIC HTStream* HTSaveAndExecute ARGS3(
+ HTPresentation *, pres,
+ HTParentAnchor *, anchor, /* Not used */
+ HTStream *, sink) /* Not used */
+
+#ifdef unix
+#define REMOVE_COMMAND "/bin/rm -f %s\n"
+#endif
+#ifdef VMS
+#define REMOVE_COMMAND "delete/noconfirm/nolog %s.."
+#endif
+
+#ifdef REMOVE_COMMAND
+{
+ char *fnam;
+ CONST char * suffix;
+
+ HTStream* me;
+
+ if (HTClientHost) {
+ HTAlert("Can't save data to file -- please run WWW locally");
+ return HTBlackHole();
+ }
+
+ me = (HTStream*)malloc(sizeof(*me));
+ if (me == NULL) outofmem(__FILE__, "Save and execute");
+ me->isa = &HTFWriter;
+
+ /* Save the file under a suitably suffixed name */
+
+ suffix = HTFileSuffix(pres->rep);
+
+ fnam = (char *)malloc (L_tmpnam + 16 + strlen(suffix));
+ tmpnam (fnam);
+ if (suffix) strcat(fnam, suffix);
+
+ me->fp = fopen (fnam, "w");
+ if (!me->fp) {
+ HTAlert("Can't open temporary file!");
+ FREE(fnam);
+ FREE(me);
+ return NULL;
+ }
+
+/* Make command to process file
+*/
+ me->end_command = (char *)malloc (
+ (strlen (pres->command) + 10+ 3*strlen(fnam))
+ * sizeof (char));
+ if (me == NULL) outofmem(__FILE__, "SaveAndExecute");
+
+ sprintf (me->end_command, pres->command, fnam, fnam, fnam);
+
+ me->remove_command = NULL; /* If needed, put into end_command */
+#ifdef NOPE
+/* Make command to delete file
+*/
+ me->remove_command = (char *)malloc (
+ (strlen (REMOVE_COMMAND) + 10+ strlen(fnam))
+ * sizeof (char));
+ if (me == NULL) outofmem(__FILE__, "SaveAndExecute");
+
+ sprintf (me->remove_command, REMOVE_COMMAND, fnam);
+#endif
+
+ me->announce = NO;
+ FREE(fnam);
+ return me;
+}
+
+#else /* can do remove */
+{ return NULL; }
+#endif
+
+
+/* Save Locally
+** ------------
+**
+** Bugs:
+** GUI Apps should open local Save panel here really.
+**
+*/
+PUBLIC HTStream* HTSaveLocally ARGS3(
+ HTPresentation *, pres,
+ HTParentAnchor *, anchor, /* Not used */
+ HTStream *, sink) /* Not used */
+
+{
+ char *fnam;
+ char *answer;
+ CONST char * suffix;
+
+ HTStream* me;
+
+ if (HTClientHost) {
+ HTAlert("Can't save data to file -- please run WWW locally");
+ return HTBlackHole();
+ }
+
+ me = (HTStream*)malloc(sizeof(*me));
+ if (me == NULL) outofmem(__FILE__, "SaveLocally");
+ me->isa = &HTFWriter;
+ me->end_command = NULL;
+ me->remove_command = NULL; /* If needed, put into end_command */
+ me->announce = YES;
+
+ /* Save the file under a suitably suffixed name */
+
+ suffix = HTFileSuffix(pres->rep);
+
+ fnam = (char *)malloc (L_tmpnam + 16 + strlen(suffix));
+ tmpnam (fnam);
+ if (suffix) strcat(fnam, suffix);
+
+ /* Save Panel */
+ answer = HTPrompt("Give name of file to save in", fnam);
+
+ FREE(fnam);
+
+ me->fp = fopen (answer, "w");
+ if (!me->fp) {
+ HTAlert("Can't open local file to write into.");
+ FREE(answer);
+ FREE(me);
+ return NULL;
+ }
+
+ FREE(answer);
+ return me;
+}
+
+
+
+/* Format Converter using system command
+** -------------------------------------
+*/