summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFormat.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/usr.bin/lynx/WWW/Library/Implementation/HTFormat.c')
-rw-r--r--gnu/usr.bin/lynx/WWW/Library/Implementation/HTFormat.c1756
1 files changed, 987 insertions, 769 deletions
diff --git a/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFormat.c b/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFormat.c
index d93f59cc1f9..968f051f3bd 100644
--- a/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFormat.c
+++ b/gnu/usr.bin/lynx/WWW/Library/Implementation/HTFormat.c
@@ -1,14 +1,14 @@
/* Manage different file formats HTFormat.c
-** =============================
-**
-** Bugs:
-** Not reentrant.
-**
-** Assumes the incoming stream is ASCII, rather than a local file
-** format, and so ALWAYS converts from ASCII on non-ASCII machines.
-** Therefore, non-ASCII machines can't read local files.
-**
-*/
+ * =============================
+ *
+ * Bugs:
+ * Not reentrant.
+ *
+ * Assumes the incoming stream is ASCII, rather than a local file
+ * format, and so ALWAYS converts from ASCII on non-ASCII machines.
+ * Therefore, non-ASCII machines can't read local files.
+ *
+ */
#include <HTUtils.h>
@@ -16,9 +16,7 @@
*/
#include <HTFormat.h>
-PUBLIC float HTMaxSecs = 1e10; /* No effective limit */
-PUBLIC float HTMaxLength = 1e10; /* No effective limit */
-PUBLIC long int HTMaxBytes = 0; /* No effective limit */
+static float HTMaxSecs = 1e10; /* No effective limit */
#ifdef UNIX
#ifdef NeXT
@@ -54,72 +52,80 @@ PUBLIC long int HTMaxBytes = 0; /* No effective limit */
#include <LYMainLoop.h>
#endif
-PUBLIC BOOL HTOutputSource = NO; /* Flag: shortcut parser to stdout */
+BOOL HTOutputSource = NO; /* Flag: shortcut parser to stdout */
#ifdef ORIGINAL
struct _HTStream {
- CONST HTStreamClass* isa;
- /* ... */
+ const HTStreamClass *isa;
+ /* ... */
};
#endif /* ORIGINAL */
/* this version used by the NetToText stream */
struct _HTStream {
- CONST HTStreamClass * isa;
- BOOL had_cr;
- HTStream * sink;
+ const HTStreamClass *isa;
+ BOOL had_cr;
+ HTStream *sink;
};
/* Presentation methods
-** --------------------
-*/
-PUBLIC HTList * HTPresentations = NULL;
-PUBLIC HTPresentation * default_presentation = NULL;
+ * --------------------
+ */
+HTList *HTPresentations = NULL;
+HTPresentation *default_presentation = NULL;
/*
* To free off the presentation list.
*/
#ifdef LY_FIND_LEAKS
-PRIVATE void HTFreePresentations NOPARAMS;
+static void HTFreePresentations(void);
#endif
/* Define a presentation system command for a content-type
-** -------------------------------------------------------
-*/
-PUBLIC void HTSetPresentation ARGS6(
- CONST char *, representation,
- CONST char *, command,
- double, quality,
- double, secs,
- double, secs_per_byte,
- long int, maxbytes)
+ * -------------------------------------------------------
+ */
+void HTSetPresentation(const char *representation,
+ const char *command,
+ const char *testcommand,
+ double quality,
+ double secs,
+ double secs_per_byte,
+ long int maxbytes,
+ AcceptMedia media)
{
- HTPresentation * pres = typecalloc(HTPresentation);
+ HTPresentation *pres = typecalloc(HTPresentation);
+
if (pres == NULL)
outofmem(__FILE__, "HTSetPresentation");
pres->rep = HTAtom_for(representation);
- pres->rep_out = WWW_PRESENT; /* Fixed for now ... :-) */
- pres->converter = HTSaveAndExecute; /* Fixed for now ... */
+ pres->rep_out = WWW_PRESENT; /* Fixed for now ... :-) */
+ pres->converter = HTSaveAndExecute; /* Fixed for now ... */
pres->quality = (float) quality;
pres->secs = (float) secs;
pres->secs_per_byte = (float) secs_per_byte;
pres->maxbytes = maxbytes;
+ pres->get_accept = 0;
+ pres->accept_opt = media;
+
pres->command = NULL;
StrAllocCopy(pres->command, command);
+ pres->testcommand = NULL;
+ StrAllocCopy(pres->testcommand, testcommand);
+
/*
- * Memory leak fixed.
- * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
+ * Memory leak fixed.
+ * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
*/
- if (!HTPresentations) {
+ if (!HTPresentations) {
HTPresentations = HTList_new();
#ifdef LY_FIND_LEAKS
atexit(HTFreePresentations);
#endif
}
- if (strcmp(representation, "*")==0) {
+ if (strcmp(representation, "*") == 0) {
FREE(default_presentation);
default_presentation = pres;
} else {
@@ -128,36 +134,39 @@ PUBLIC void HTSetPresentation ARGS6(
}
/* Define a built-in function for a content-type
-** ---------------------------------------------
-*/
-PUBLIC void HTSetConversion ARGS7(
- CONST char *, representation_in,
- CONST char *, representation_out,
- HTConverter*, converter,
- float, quality,
- float, secs,
- float, secs_per_byte,
- long int, maxbytes)
+ * ---------------------------------------------
+ */
+void HTSetConversion(const char *representation_in,
+ const char *representation_out,
+ HTConverter *converter,
+ float quality,
+ float secs,
+ float secs_per_byte,
+ long int maxbytes,
+ AcceptMedia media)
{
- HTPresentation * pres = typecalloc(HTPresentation);
+ HTPresentation *pres = typecalloc(HTPresentation);
+
if (pres == NULL)
outofmem(__FILE__, "HTSetConversion");
pres->rep = HTAtom_for(representation_in);
pres->rep_out = HTAtom_for(representation_out);
pres->converter = converter;
- pres->command = NULL; /* Fixed */
+ pres->command = NULL;
+ pres->testcommand = NULL;
pres->quality = quality;
pres->secs = secs;
pres->secs_per_byte = secs_per_byte;
pres->maxbytes = maxbytes;
- pres->command = NULL;
+ pres->get_accept = TRUE;
+ pres->accept_opt = media;
/*
- * Memory Leak fixed.
- * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
+ * Memory Leak fixed.
+ * 05-28-94 Lynx 2-3-1 Garrett Arch Blythe
*/
- if (!HTPresentations) {
+ if (!HTPresentations) {
HTPresentations = HTList_new();
#ifdef LY_FIND_LEAKS
atexit(HTFreePresentations);
@@ -169,33 +178,33 @@ PUBLIC void HTSetConversion ARGS7(
#ifdef LY_FIND_LEAKS
/*
-** Purpose: Free the presentation list.
-** Arguments: void
-** Return Value: void
-** Remarks/Portability/Dependencies/Restrictions:
-** Made to clean up Lynx's bad leakage.
-** Revision History:
-** 05-28-94 created Lynx 2-3-1 Garrett Arch Blythe
-*/
-PRIVATE void HTFreePresentations NOARGS
+ * Purpose: Free the presentation list.
+ * Arguments: void
+ * Return Value: void
+ * Remarks/Portability/Dependencies/Restrictions:
+ * Made to clean up Lynx's bad leakage.
+ * Revision History:
+ * 05-28-94 created Lynx 2-3-1 Garrett Arch Blythe
+ */
+static void HTFreePresentations(void)
{
- HTPresentation * pres = NULL;
+ HTPresentation *pres = NULL;
/*
- * Loop through the list.
+ * Loop through the list.
*/
while (!HTList_isEmpty(HTPresentations)) {
/*
- * Free off each item.
- * May also need to free off it's items, but not sure
- * as of yet.
+ * Free off each item. May also need to free off it's items, but not
+ * sure as of yet.
*/
- pres = (HTPresentation *)HTList_removeLastObject(HTPresentations);
+ pres = (HTPresentation *) HTList_removeLastObject(HTPresentations);
FREE(pres->command);
+ FREE(pres->testcommand);
FREE(pres);
}
/*
- * Free the list itself.
+ * Free the list itself.
*/
HTList_delete(HTPresentations);
HTPresentations = NULL;
@@ -203,40 +212,42 @@ PRIVATE void HTFreePresentations NOARGS
#endif /* LY_FIND_LEAKS */
/* File buffering
-** --------------
-**
-** The input file is read using the macro which can read from
-** a socket or a file.
-** The input buffer size, if large will give greater efficiency and
-** release the server faster, and if small will save space on PCs etc.
-*/
-#define INPUT_BUFFER_SIZE 4096 /* Tradeoff */
-PRIVATE char input_buffer[INPUT_BUFFER_SIZE];
-PRIVATE char * input_pointer;
-PRIVATE char * input_limit;
-PRIVATE int input_file_number;
+ * --------------
+ *
+ * The input file is read using the macro which can read from
+ * a socket or a file.
+ * The input buffer size, if large will give greater efficiency and
+ * release the server faster, and if small will save space on PCs etc.
+ */
+#define INPUT_BUFFER_SIZE 4096 /* Tradeoff */
+static char input_buffer[INPUT_BUFFER_SIZE];
+static char *input_pointer;
+static char *input_limit;
+static int input_file_number;
/* Set up the buffering
-**
-** These routines are public because they are in fact needed by
-** many parsers, and on PCs and Macs we should not duplicate
-** the static buffer area.
-*/
-PUBLIC void HTInitInput ARGS1 (int,file_number)
+ *
+ * These routines are public because they are in fact needed by
+ * many parsers, and on PCs and Macs we should not duplicate
+ * the static buffer area.
+ */
+void HTInitInput(int file_number)
{
input_file_number = file_number;
input_pointer = input_limit = input_buffer;
}
-PUBLIC int interrupted_in_htgetcharacter = 0;
-PUBLIC int HTGetCharacter NOARGS
+int interrupted_in_htgetcharacter = 0;
+int HTGetCharacter(void)
{
char ch;
+
interrupted_in_htgetcharacter = 0;
do {
if (input_pointer >= input_limit) {
int status = NETREAD(input_file_number,
input_buffer, INPUT_BUFFER_SIZE);
+
if (status <= 0) {
if (status == 0)
return EOF;
@@ -246,217 +257,250 @@ PUBLIC int HTGetCharacter NOARGS
return EOF;
}
CTRACE((tfp, "HTFormat: File read error %d\n", status));
- return EOF; /* -1 is returned by UCX
- at end of HTTP link */
+ return EOF; /* -1 is returned by UCX
+ at end of HTTP link */
}
input_pointer = input_buffer;
input_limit = input_buffer + status;
}
ch = *input_pointer++;
- } while (ch == (char) 13); /* Ignore ASCII carriage return */
+ } while (ch == (char) 13); /* Ignore ASCII carriage return */
return FROMASCII(UCH(ch));
}
#ifdef USE_SSL
-PUBLIC char HTGetSSLCharacter ARGS1(void *, handle)
+char HTGetSSLCharacter(void *handle)
{
char ch;
+
interrupted_in_htgetcharacter = 0;
- if(!handle)
- return (char)EOF;
+ if (!handle)
+ return (char) EOF;
do {
if (input_pointer >= input_limit) {
- int status = SSL_read((SSL *)handle,
- input_buffer, INPUT_BUFFER_SIZE);
+ int status = SSL_read((SSL *) handle,
+ input_buffer, INPUT_BUFFER_SIZE);
+
if (status <= 0) {
if (status == 0)
- return (char)EOF;
+ return (char) EOF;
if (status == HT_INTERRUPTED) {
- CTRACE((tfp, "HTFormat: Interrupted in HTGetSSLCharacter\n"));
+ CTRACE((tfp,
+ "HTFormat: Interrupted in HTGetSSLCharacter\n"));
interrupted_in_htgetcharacter = 1;
- return (char)EOF;
+ return (char) EOF;
}
CTRACE((tfp, "HTFormat: SSL_read error %d\n", status));
- return (char)EOF; /* -1 is returned by UCX
- at end of HTTP link */
+ return (char) EOF; /* -1 is returned by UCX
+ at end of HTTP link */
}
input_pointer = input_buffer;
input_limit = input_buffer + status;
}
ch = *input_pointer++;
- } while (ch == (char) 13); /* Ignore ASCII carriage return */
+ } while (ch == (char) 13); /* Ignore ASCII carriage return */
return FROMASCII(ch);
}
#endif /* USE_SSL */
-/* Match maintype to any MIME type starting with maintype,
- * for example: image/gif should match image
+/* Match maintype to any MIME type starting with maintype, for example:
+ * image/gif should match image
*/
-PRIVATE int half_match ARGS2(char *,trial_type, char *,target)
+static int half_match(char *trial_type, char *target)
{
char *cp = strchr(trial_type, '/');
/* if no '/' or no '*' */
- if (!cp || *(cp+1) != '*')
+ if (!cp || *(cp + 1) != '*')
return 0;
CTRACE((tfp, "HTFormat: comparing %s and %s for half match\n",
- trial_type, target));
+ trial_type, target));
- /* main type matches */
- if (!strncmp(trial_type, target, (cp-trial_type)-1))
+ /* main type matches */
+ if (!strncmp(trial_type, target, (cp - trial_type) - 1))
return 1;
return 0;
}
+/*
+ * Evaluate a deferred mailcap test command, i.e.,. one that substitutes the
+ * document's charset or other values in %{name} format.
+ */
+static BOOL failsMailcap(HTPresentation *pres, HTParentAnchor *anchor)
+{
+ if (pres->testcommand != 0) {
+ if (LYTestMailcapCommand(pres->testcommand,
+ anchor->content_type_params) != 0)
+ return TRUE;
+ }
+ return FALSE;
+}
+
#define WWW_WILDCARD_REP_OUT HTAtom_for("*")
/* Look up a presentation
-** ----------------------
-**
-** If fill_in is NULL, only look for an exact match.
-** If a wildcard match is made, *fill_in is used to store
-** a possibly modified presentation, and a pointer to it is
-** returned. For an exact match, a pointer to the presentation
-** in the HTPresentations list is returned. Returns NULL if
-** nothing found. - kw
-**
-*/
-PRIVATE HTPresentation * HTFindPresentation ARGS3(
- HTFormat, rep_in,
- HTFormat, rep_out,
- HTPresentation*, fill_in)
+ * ----------------------
+ *
+ * If fill_in is NULL, only look for an exact match.
+ * If a wildcard match is made, *fill_in is used to store
+ * a possibly modified presentation, and a pointer to it is
+ * returned. For an exact match, a pointer to the presentation
+ * in the HTPresentations list is returned. Returns NULL if
+ * nothing found. - kw
+ *
+ */
+static HTPresentation *HTFindPresentation(HTFormat rep_in,
+ HTFormat rep_out,
+ HTPresentation *fill_in,
+ HTParentAnchor *anchor)
{
- HTAtom * wildcard = NULL; /* = HTAtom_for("*"); lookup when needed - kw */
+ HTAtom *wildcard = NULL; /* = HTAtom_for("*"); lookup when needed - kw */
+ int n;
+ int i;
+ HTPresentation *pres;
+ HTPresentation *match;
+ HTPresentation *strong_wildcard_match = 0;
+ HTPresentation *weak_wildcard_match = 0;
+ HTPresentation *last_default_match = 0;
+ HTPresentation *strong_subtype_wildcard_match = 0;
CTRACE((tfp, "HTFormat: Looking up presentation for %s to %s\n",
- HTAtom_name(rep_in), HTAtom_name(rep_out)));
-
- /* don't do anymore do it in the Lynx code at startup LJM */
- /* if (!HTPresentations) HTFormatInit(); */ /* set up the list */
+ HTAtom_name(rep_in), HTAtom_name(rep_out)));
- {
- int n = HTList_count(HTPresentations);
- int i;
- HTPresentation * pres, *match,
- *strong_wildcard_match=0,
- *weak_wildcard_match=0,
- *last_default_match=0,
- *strong_subtype_wildcard_match=0;
-
- for (i = 0; i < n; i++) {
- pres = (HTPresentation *)HTList_objectAt(HTPresentations, i);
- if (pres->rep == rep_in) {
- if (pres->rep_out == rep_out) {
- CTRACE((tfp, "FindPresentation: found exact match: %s\n",
- HTAtom_name(pres->rep)));
- return pres;
-
- } else if (!fill_in) {
+ n = HTList_count(HTPresentations);
+ for (i = 0; i < n; i++) {
+ pres = (HTPresentation *) HTList_objectAt(HTPresentations, i);
+ if (pres->rep == rep_in) {
+ if (pres->rep_out == rep_out) {
+ if (failsMailcap(pres, anchor))
continue;
- } else {
- if (!wildcard) wildcard = WWW_WILDCARD_REP_OUT;
- if (pres->rep_out == wildcard) {
- if (!strong_wildcard_match)
- strong_wildcard_match = pres;
- /* otherwise use the first one */
- CTRACE((tfp, "StreamStack: found strong wildcard match: %s\n",
- HTAtom_name(pres->rep)));
- }
- }
+ CTRACE((tfp, "FindPresentation: found exact match: %s\n",
+ HTAtom_name(pres->rep)));
+ return pres;
} else if (!fill_in) {
continue;
-
- } else if (half_match(HTAtom_name(pres->rep),
- HTAtom_name(rep_in))) {
- if (pres->rep_out == rep_out) {
- if (!strong_subtype_wildcard_match)
- strong_subtype_wildcard_match = pres;
+ } else {
+ if (!wildcard)
+ wildcard = WWW_WILDCARD_REP_OUT;
+ if (pres->rep_out == wildcard) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ if (!strong_wildcard_match)
+ strong_wildcard_match = pres;
/* otherwise use the first one */
- CTRACE((tfp, "StreamStack: found strong subtype wildcard match: %s\n",
- HTAtom_name(pres->rep)));
+ CTRACE((tfp,
+ "StreamStack: found strong wildcard match: %s\n",
+ HTAtom_name(pres->rep)));
}
}
- if (pres->rep == WWW_SOURCE) {
- if (pres->rep_out == rep_out) {
- if (!weak_wildcard_match)
- weak_wildcard_match = pres;
- /* otherwise use the first one */
- CTRACE((tfp, "StreamStack: found weak wildcard match: %s\n",
- HTAtom_name(pres->rep_out)));
+ } else if (!fill_in) {
+ continue;
- } else if (!last_default_match) {
- if (!wildcard) wildcard = WWW_WILDCARD_REP_OUT;
- if (pres->rep_out == wildcard)
- last_default_match = pres;
+ } else if (half_match(HTAtom_name(pres->rep),
+ HTAtom_name(rep_in))) {
+ if (pres->rep_out == rep_out) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ if (!strong_subtype_wildcard_match)
+ strong_subtype_wildcard_match = pres;
+ /* otherwise use the first one */
+ CTRACE((tfp,
+ "StreamStack: found strong subtype wildcard match: %s\n",
+ HTAtom_name(pres->rep)));
+ }
+ }
+
+ if (pres->rep == WWW_SOURCE) {
+ if (pres->rep_out == rep_out) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ if (!weak_wildcard_match)
+ weak_wildcard_match = pres;
+ /* otherwise use the first one */
+ CTRACE((tfp,
+ "StreamStack: found weak wildcard match: %s\n",
+ HTAtom_name(pres->rep_out)));
+
+ } else if (!last_default_match) {
+ if (!wildcard)
+ wildcard = WWW_WILDCARD_REP_OUT;
+ if (pres->rep_out == wildcard) {
+ if (failsMailcap(pres, anchor))
+ continue;
+ last_default_match = pres;
/* otherwise use the first one */
}
}
}
+ }
- match = strong_subtype_wildcard_match ? strong_subtype_wildcard_match :
- strong_wildcard_match ? strong_wildcard_match :
- weak_wildcard_match ? weak_wildcard_match :
- last_default_match;
-
- if (match) {
- *fill_in = *match; /* Specific instance */
- fill_in->rep = rep_in; /* yuk */
- fill_in->rep_out = rep_out; /* yuk */
- return fill_in;
- }
+ match = (strong_subtype_wildcard_match
+ ? strong_subtype_wildcard_match
+ : (strong_wildcard_match
+ ? strong_wildcard_match
+ : (weak_wildcard_match
+ ? weak_wildcard_match
+ : last_default_match)));
+
+ if (match) {
+ *fill_in = *match; /* Specific instance */
+ fill_in->rep = rep_in; /* yuk */
+ fill_in->rep_out = rep_out; /* yuk */
+ return fill_in;
}
return NULL;
}
/* Create a filter stack
-** ---------------------
-**
-** If a wildcard match is made, a temporary HTPresentation
-** structure is made to hold the destination format while the
-** new stack is generated. This is just to pass the out format to
-** MIME so far. Storing the format of a stream in the stream might
-** be a lot neater.
-**
-*/
-PUBLIC HTStream * HTStreamStack ARGS4(
- HTFormat, rep_in,
- HTFormat, rep_out,
- HTStream*, sink,
- HTParentAnchor*, anchor)
+ * ---------------------
+ *
+ * If a wildcard match is made, a temporary HTPresentation
+ * structure is made to hold the destination format while the
+ * new stack is generated. This is just to pass the out format to
+ * MIME so far. Storing the format of a stream in the stream might
+ * be a lot neater.
+ *
+ */
+HTStream *HTStreamStack(HTFormat rep_in,
+ HTFormat rep_out,
+ HTStream *sink,
+ HTParentAnchor *anchor)
{
HTPresentation temp;
HTPresentation *match;
HTStream *result;
- CTRACE((tfp, "HTFormat: Constructing stream stack for %s to %s\n",
- HTAtom_name(rep_in), HTAtom_name(rep_out)));
+ CTRACE((tfp, "HTFormat: Constructing stream stack for %s to %s (%s)\n",
+ HTAtom_name(rep_in),
+ HTAtom_name(rep_out),
+ NONNULL(anchor->content_type_params)));
/* don't return on WWW_SOURCE some people might like
* to make use of the source!!!! LJM
*/
#if 0
if (rep_out == WWW_SOURCE || rep_out == rep_in)
- return sink; /* LJM */
+ return sink; /* LJM */
#endif
if (rep_out == rep_in) {
result = sink;
- } else if ((match = HTFindPresentation(rep_in, rep_out, &temp))) {
+ } else if ((match = HTFindPresentation(rep_in, rep_out, &temp, anchor))) {
if (match == &temp) {
CTRACE((tfp, "StreamStack: Using %s\n", HTAtom_name(temp.rep_out)));
} else {
CTRACE((tfp, "StreamStack: found exact match: %s\n",
- HTAtom_name(match->rep)));
+ HTAtom_name(match->rep)));
}
- result = (*match->converter)(match, anchor, sink);
+ result = (*match->converter) (match, anchor, sink);
} else {
result = NULL;
}
@@ -474,17 +518,17 @@ PUBLIC HTStream * HTStreamStack ARGS4(
}
/* Put a presentation near start of list
-** -------------------------------------
-**
-** Look up a presentation (exact match only) and, if found, reorder
-** it to the start of the HTPresentations list. - kw
-*/
-PUBLIC void HTReorderPresentation ARGS2(
- HTFormat, rep_in,
- HTFormat, rep_out)
+ * -------------------------------------
+ *
+ * Look up a presentation (exact match only) and, if found, reorder
+ * it to the start of the HTPresentations list. - kw
+ */
+void HTReorderPresentation(HTFormat rep_in,
+ HTFormat rep_out)
{
HTPresentation *match;
- if ((match = HTFindPresentation(rep_in, rep_out, NULL))) {
+
+ if ((match = HTFindPresentation(rep_in, rep_out, NULL, NULL))) {
HTList_removeObject(HTPresentations, match);
HTList_addObject(HTPresentations, match);
}
@@ -494,88 +538,77 @@ PUBLIC void HTReorderPresentation ARGS2(
* Setup 'get_accept' flag to denote presentations that are not redundant,
* and will be listed in "Accept:" header.
*/
-PUBLIC void HTFilterPresentations NOARGS
+void HTFilterPresentations(void)
{
int i, j;
int n = HTList_count(HTPresentations);
HTPresentation *p, *q;
BOOL matched;
- char *s, *t, *x, *y;
+ char *s, *t;
+ CTRACE((tfp, "HTFilterPresentations (AcceptMedia %#x)\n", LYAcceptMedia));
for (i = 0; i < n; i++) {
- p = (HTPresentation *)HTList_objectAt(HTPresentations, i);
+ p = (HTPresentation *) HTList_objectAt(HTPresentations, i);
s = HTAtom_name(p->rep);
- if (p->rep_out == WWW_PRESENT) {
- if (p->rep != WWW_SOURCE
- && strcasecomp(s, "www/mime")
- && strcasecomp(s, "www/compressed")
- && p->quality <= 1.0 && p->quality >= 0.0) {
- for (j = 0, matched = FALSE; j < i; j++) {
- q = (HTPresentation *)HTList_objectAt(HTPresentations, j);
- t = HTAtom_name(q->rep);
-
- if (!strcasecomp(s, t)) {
- matched = TRUE;
- break;
- }
- if ((x = strchr(s, '/')) != 0
- && (y = strchr(t, '/')) != 0) {
- int len1 = x++ - s;
- int len2 = y++ - t;
- int lens = (len1 > len2) ? len1 : len2;
-
- if ((*t == '*' || !strncasecomp(s, t, lens))
- && (*y == '*' || !strcasecomp(x, y))) {
- matched = TRUE;
- break;
- }
- }
+ p->get_accept = FALSE;
+ if ((LYAcceptMedia & p->accept_opt) != 0
+ && p->rep_out == WWW_PRESENT
+ && p->rep != WWW_SOURCE
+ && strcasecomp(s, "www/mime")
+ && strcasecomp(s, "www/compressed")
+ && p->quality <= 1.0 && p->quality >= 0.0) {
+ matched = TRUE;
+ for (j = 0; j < i; j++) {
+ q = (HTPresentation *) HTList_objectAt(HTPresentations, j);
+ t = HTAtom_name(q->rep);
+
+ if (!strcasecomp(s, t)) {
+ matched = FALSE;
+ CTRACE((tfp, " match %s %s\n", s, t));
+ break;
}
- if (!matched)
- p->get_accept = TRUE;
}
+ p->get_accept = matched;
}
}
}
/* Find the cost of a filter stack
-** -------------------------------
-**
-** Must return the cost of the same stack which StreamStack would set up.
-**
-** On entry,
-** length The size of the data to be converted
-*/
-PUBLIC float HTStackValue ARGS4(
- HTFormat, rep_in,
- HTFormat, rep_out,
- float, initial_value,
- long int, length)
+ * -------------------------------
+ *
+ * Must return the cost of the same stack which StreamStack would set up.
+ *
+ * On entry,
+ * length The size of the data to be converted
+ */
+float HTStackValue(HTFormat rep_in,
+ HTFormat rep_out,
+ float initial_value,
+ long int length)
{
- HTAtom * wildcard = WWW_WILDCARD_REP_OUT;
+ HTAtom *wildcard = WWW_WILDCARD_REP_OUT;
CTRACE((tfp, "HTFormat: Evaluating stream stack for %s worth %.3f to %s\n",
- HTAtom_name(rep_in), initial_value, HTAtom_name(rep_out)));
+ HTAtom_name(rep_in), initial_value, HTAtom_name(rep_out)));
if (rep_out == WWW_SOURCE || rep_out == rep_in)
return 0.0;
- /* don't do anymore do it in the Lynx code at startup LJM */
- /* if (!HTPresentations) HTFormatInit(); */ /* set up the list */
-
{
int n = HTList_count(HTPresentations);
int i;
- HTPresentation * pres;
+ HTPresentation *pres;
+
for (i = 0; i < n; i++) {
- pres = (HTPresentation *)HTList_objectAt(HTPresentations, i);
+ pres = (HTPresentation *) HTList_objectAt(HTPresentations, i);
if (pres->rep == rep_in &&
(pres->rep_out == rep_out || pres->rep_out == wildcard)) {
float value = initial_value * pres->quality;
+
if (HTMaxSecs != 0.0)
- value = value - (length*pres->secs_per_byte + pres->secs)
- /HTMaxSecs;
+ value = value - (length * pres->secs_per_byte + pres->secs)
+ / HTMaxSecs;
return value;
}
}
@@ -586,140 +619,140 @@ PUBLIC float HTStackValue ARGS4(
}
/* Display the page while transfer in progress
-** -------------------------------------------
-**
-** Repaint the page only when necessary.
-** This is a traverse call for HText_pageDisplay() - it works!.
-**
-*/
-PUBLIC void HTDisplayPartial NOARGS
+ * -------------------------------------------
+ *
+ * Repaint the page only when necessary.
+ * This is a traverse call for HText_pageDisplay() - it works!.
+ *
+ */
+void HTDisplayPartial(void)
{
#ifdef DISP_PARTIAL
if (display_partial) {
/*
- ** HText_getNumOfLines() = "current" number of complete lines received
- ** NumOfLines_partial = number of lines at the moment of last repaint.
- ** (we update NumOfLines_partial only when we repaint the display.)
- **
- ** display_partial could only be enabled in HText_new()
- ** so a new HTMainText object available - all HText_ functions use it,
- ** lines counter HText_getNumOfLines() in particular.
- **
- ** Otherwise HTMainText holds info from the previous document
- ** and we may repaint it instead of the new one:
- ** prev doc scrolled to the first line (=Newline_partial)
- ** is not good looking :-) 23 Aug 1998 Leonid Pauzner
- **
- ** So repaint the page only when necessary:
- */
+ * HText_getNumOfLines() = "current" number of complete lines received
+ * NumOfLines_partial = number of lines at the moment of last repaint.
+ * (we update NumOfLines_partial only when we repaint the display.)
+ *
+ * display_partial could only be enabled in HText_new() so a new
+ * HTMainText object available - all HText_ functions use it, lines
+ * counter HText_getNumOfLines() in particular.
+ *
+ * Otherwise HTMainText holds info from the previous document and we
+ * may repaint it instead of the new one: prev doc scrolled to the
+ * first line (=Newline_partial) is not good looking :-) 23 Aug 1998
+ * Leonid Pauzner
+ *
+ * So repaint the page only when necessary:
+ */
int Newline_partial = LYGetNewline();
if (((Newline_partial + display_lines) - 1 > NumOfLines_partial)
- /* current page not complete... */
- && (partial_threshold > 0 ?
- ((Newline_partial + partial_threshold) -1 <= HText_getNumOfLines()) :
+ /* current page not complete... */
+ && (partial_threshold > 0 ?
+ ((Newline_partial + partial_threshold) - 1 <=
+ HText_getNumOfLines()) :
((Newline_partial + display_lines) - 1 <= HText_getNumOfLines()))
- /*
- * Originally we rendered by increments of 2 lines,
- * but that got annoying on slow network connections.
- * Then we switched to full-pages. Now it's configurable.
- * If partial_threshold <= 0, then it's a full page
- */
- ) {
+ /*
+ * Originally we rendered by increments of 2 lines,
+ * but that got annoying on slow network connections.
+ * Then we switched to full-pages. Now it's configurable.
+ * If partial_threshold <= 0, then it's a full page
+ */
+ ) {
if (LYMainLoop_pageDisplay(Newline_partial))
NumOfLines_partial = HText_getNumOfLines();
}
}
#else /* nothing */
-#endif /* DISP_PARTIAL */
+#endif /* DISP_PARTIAL */
}
/* Put this as early as possible, OK just after HTDisplayPartial() */
-PUBLIC void HTFinishDisplayPartial NOARGS
+void HTFinishDisplayPartial(void)
{
#ifdef DISP_PARTIAL
- /*
- * End of incremental rendering stage here.
- */
- display_partial = FALSE;
+ /*
+ * End of incremental rendering stage here.
+ */
+ display_partial = FALSE;
#endif /* DISP_PARTIAL */
}
/* Push data from a socket down a stream
-** -------------------------------------
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-** The file number given is assumed to be a TELNET stream, i.e., containing
-** CRLF at the end of lines which need to be stripped to LF for unix
-** when the format is textual.
-**
-** State of socket and target stream on entry:
-** socket (file_number) assumed open,
-** target (sink) assumed valid.
-**
-** Return values:
-** HT_INTERRUPTED Interruption or error after some data received.
-** -2 Unexpected disconnect before any data received.
-** -1 Interruption or error before any data received, or
-** (UNIX) other read error before any data received, or
-** download cancelled.
-** HT_LOADED Normal close of socket (end of file indication
-** received), or
-** unexpected disconnect after some data received, or
-** other read error after some data received, or
-** (not UNIX) other read error before any data received.
-**
-** State of socket and target stream on return depends on return value:
-** HT_INTERRUPTED socket still open, target aborted.
-** -2 socket still open, target stream still valid.
-** -1 socket still open, target aborted.
-** otherwise socket closed, target stream still valid.
-*/
-PUBLIC int HTCopy ARGS4(
- HTParentAnchor *, anchor,
- int, file_number,
- void*, handle GCC_UNUSED,
- HTStream*, sink)
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * The file number given is assumed to be a TELNET stream, i.e., containing
+ * CRLF at the end of lines which need to be stripped to LF for unix
+ * when the format is textual.
+ *
+ * State of socket and target stream on entry:
+ * socket (file_number) assumed open,
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption or error after some data received.
+ * -2 Unexpected disconnect before any data received.
+ * -1 Interruption or error before any data received, or
+ * (UNIX) other read error before any data received, or
+ * download cancelled.
+ * HT_LOADED Normal close of socket (end of file indication
+ * received), or
+ * unexpected disconnect after some data received, or
+ * other read error after some data received, or
+ * (not UNIX) other read error before any data received.
+ *
+ * State of socket and target stream on return depends on return value:
+ * HT_INTERRUPTED socket still open, target aborted.
+ * -2 socket still open, target stream still valid.
+ * -1 socket still open, target aborted.
+ * otherwise socket closed, target stream still valid.
+ */
+int HTCopy(HTParentAnchor *anchor,
+ int file_number,
+ void *handle GCC_UNUSED,
+ HTStream *sink)
{
HTStreamClass targetClass;
BOOL suppress_readprogress = NO;
int bytes;
int rv = 0;
- /* Push the data down the stream
- */
- targetClass = *(sink->isa); /* Copy pointers to procedures */
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
- /* Push binary from socket down sink
- **
- ** This operation could be put into a main event loop
- */
+ /*
+ * Push binary from socket down sink
+ *
+ * This operation could be put into a main event loop
+ */
HTReadProgress(bytes = 0, 0);
for (;;) {
int status;
if (LYCancelDownload) {
LYCancelDownload = FALSE;
- (*targetClass._abort)(sink, NULL);
+ (*targetClass._abort) (sink, NULL);
rv = -1;
goto finished;
}
if (HTCheckForInterrupt()) {
- _HTProgress (TRANSFER_INTERRUPTED);
- (*targetClass._abort)(sink, NULL);
+ _HTProgress(TRANSFER_INTERRUPTED);
+ (*targetClass._abort) (sink, NULL);
if (bytes)
rv = HT_INTERRUPTED;
else
rv = -1;
goto finished;
}
-
#ifdef USE_SSL
if (handle)
- status = SSL_read((SSL *)handle, input_buffer, INPUT_BUFFER_SIZE);
+ status = SSL_read((SSL *) handle, input_buffer, INPUT_BUFFER_SIZE);
else
status = NETREAD(file_number, input_buffer, INPUT_BUFFER_SIZE);
#else
@@ -730,71 +763,69 @@ PUBLIC int HTCopy ARGS4(
if (status == 0) {
break;
} else if (status == HT_INTERRUPTED) {
- _HTProgress (TRANSFER_INTERRUPTED);
- (*targetClass._abort)(sink, NULL);
+ _HTProgress(TRANSFER_INTERRUPTED);
+ (*targetClass._abort) (sink, NULL);
if (bytes)
rv = HT_INTERRUPTED;
else
rv = -1;
goto finished;
} else if (SOCKET_ERRNO == ENOTCONN ||
-#ifdef _WINDOWS /* 1997/11/10 (Mon) 16:57:18 */
+#ifdef _WINDOWS /* 1997/11/10 (Mon) 16:57:18 */
SOCKET_ERRNO == ETIMEDOUT ||
#endif
SOCKET_ERRNO == ECONNRESET ||
SOCKET_ERRNO == EPIPE) {
/*
- * Arrrrgh, HTTP 0/1 compatibility problem, maybe.
+ * Arrrrgh, HTTP 0/1 compatibility problem, maybe.
*/
if (bytes <= 0) {
/*
- * Don't have any data, so let the calling
- * function decide what to do about it. - FM
+ * Don't have any data, so let the calling function decide
+ * what to do about it. - FM
*/
rv = -2;
goto finished;
} else {
#ifdef UNIX
- /*
- * Treat what we've received already as the complete
- * transmission, but not without giving the user
- * an alert. I don't know about all the different
- * TCP stacks for VMS etc., so this is currently
- * only for UNIX. - kw
- */
- HTInetStatus("NETREAD");
- HTAlert("Unexpected server disconnect.");
- CTRACE((tfp,
- "HTCopy: Unexpected server disconnect. Treating as completed.\n"));
- status = 0;
- break;
-#else /* !UNIX */
- /*
- * Treat what we've gotten already
- * as the complete transmission. - FM
- */
- CTRACE((tfp,
- "HTCopy: Unexpected server disconnect. Treating as completed.\n"));
- status = 0;
- break;
+ /*
+ * Treat what we've received already as the complete
+ * transmission, but not without giving the user an alert.
+ * I don't know about all the different TCP stacks for VMS
+ * etc., so this is currently only for UNIX. - kw
+ */
+ HTInetStatus("NETREAD");
+ HTAlert("Unexpected server disconnect.");
+ CTRACE((tfp,
+ "HTCopy: Unexpected server disconnect. Treating as completed.\n"));
+ status = 0;
+ break;
+#else /* !UNIX */
+ /*
+ * Treat what we've gotten already as the complete
+ * transmission. - FM
+ */
+ CTRACE((tfp,
+ "HTCopy: Unexpected server disconnect. Treating as completed.\n"));
+ status = 0;
+ break;
#endif /* UNIX */
}
#ifdef UNIX
} else { /* status < 0 and other errno */
/*
- * Treat what we've received already as the complete
- * transmission, but not without giving the user
- * an alert. I don't know about all the different
- * TCP stacks for VMS etc., so this is currently
- * only for UNIX. - kw
+ * Treat what we've received already as the complete
+ * transmission, but not without giving the user an alert. I
+ * don't know about all the different TCP stacks for VMS etc.,
+ * so this is currently only for UNIX. - kw
*/
HTInetStatus("NETREAD");
HTAlert("Unexpected read error.");
if (bytes) {
- (void)NETCLOSE(file_number);
+ (void) NETCLOSE(file_number);
rv = HT_LOADED;
} else {
- (*targetClass._abort)(sink, NULL);
+ (*targetClass._abort) (sink, NULL);
rv = -1;
}
goto finished;
@@ -804,85 +835,84 @@ PUBLIC int HTCopy ARGS4(
}
/*
- * Suppress ReadProgress messages when collecting a redirection
- * message, at least initially (unless/until anchor->content_type
- * gets changed, probably by the MIME message parser). That way
- * messages put up by the HTTP module or elsewhere can linger in
- * the statusline for a while. - kw
+ * Suppress ReadProgress messages when collecting a redirection
+ * message, at least initially (unless/until anchor->content_type gets
+ * changed, probably by the MIME message parser). That way messages
+ * put up by the HTTP module or elsewhere can linger in the statusline
+ * for a while. - kw
*/
suppress_readprogress = (anchor && anchor->content_type &&
!strcmp(anchor->content_type,
"message/x-http-redirection"));
#ifdef NOT_ASCII
{
- char * p;
- for (p = input_buffer; p < input_buffer+status; p++) {
+ char *p;
+
+ for (p = input_buffer; p < input_buffer + status; p++) {
*p = FROMASCII(*p);
}
}
#endif /* NOT_ASCII */
- (*targetClass.put_block)(sink, input_buffer, status);
+ (*targetClass.put_block) (sink, input_buffer, status);
bytes += status;
if (!suppress_readprogress)
HTReadProgress(bytes, anchor ? anchor->content_length : 0);
HTDisplayPartial();
- } /* next bufferload */
+ } /* next bufferload */
_HTProgress(TRANSFER_COMPLETE);
- (void)NETCLOSE(file_number);
+ (void) NETCLOSE(file_number);
rv = HT_LOADED;
-finished:
+ finished:
HTFinishDisplayPartial();
- return(rv);
+ return (rv);
}
/* Push data from a file pointer down a stream
-** -------------------------------------
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-**
-** State of file and target stream on entry:
-** FILE* (fp) assumed open,
-** target (sink) assumed valid.
-**
-** Return values:
-** HT_INTERRUPTED Interruption after some data read.
-** HT_PARTIAL_CONTENT Error after some data read.
-** -1 Error before any data read.
-** HT_LOADED Normal end of file indication on reading.
-**
-** State of file and target stream on return:
-** always fp still open, target stream still valid.
-*/
-PUBLIC int HTFileCopy ARGS2(
- FILE *, fp,
- HTStream*, sink)
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ *
+ * State of file and target stream on entry:
+ * FILE* (fp) assumed open,
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always fp still open, target stream still valid.
+ */
+int HTFileCopy(FILE *fp, HTStream *sink)
{
HTStreamClass targetClass;
int status, bytes;
int rv = HT_OK;
- /* Push the data down the stream
- */
- targetClass = *(sink->isa); /* Copy pointers to procedures */
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
- /* Push binary from socket down sink
- */
+ /* Push binary from socket down sink
+ */
HTReadProgress(bytes = 0, 0);
for (;;) {
status = fread(input_buffer, 1, INPUT_BUFFER_SIZE, fp);
- if (status == 0) { /* EOF or error */
+ if (status == 0) { /* EOF or error */
if (ferror(fp) == 0) {
rv = HT_LOADED;
break;
}
CTRACE((tfp, "HTFormat: Read error, read returns %d\n",
- ferror(fp)));
+ ferror(fp)));
if (bytes) {
rv = HT_PARTIAL_CONTENT;
} else {
@@ -891,11 +921,11 @@ PUBLIC int HTFileCopy ARGS2(
break;
}
- (*targetClass.put_block)(sink, input_buffer, status);
+ (*targetClass.put_block) (sink, input_buffer, status);
bytes += status;
HTReadProgress(bytes, 0);
- /* Suppress last screen update in partial mode - a regular update
- * under control of mainloop() should follow anyway. - kw
+ /* Suppress last screen update in partial mode - a regular update under
+ * control of mainloop() should follow anyway. - kw
*/
#ifdef DISP_PARTIAL
if (display_partial && bytes != HTMainAnchor->content_length)
@@ -903,7 +933,7 @@ PUBLIC int HTFileCopy ARGS2(
#endif
if (HTCheckForInterrupt()) {
- _HTProgress (TRANSFER_INTERRUPTED);
+ _HTProgress(TRANSFER_INTERRUPTED);
if (bytes) {
rv = HT_INTERRUPTED;
} else {
@@ -911,7 +941,7 @@ PUBLIC int HTFileCopy ARGS2(
}
break;
}
- } /* next bufferload */
+ } /* next bufferload */
HTFinishDisplayPartial();
return rv;
@@ -919,49 +949,42 @@ PUBLIC int HTFileCopy ARGS2(
#ifdef USE_SOURCE_CACHE
/* Push data from an HTChunk down a stream
-** ---------------------------------------
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-** State of memory and target stream on entry:
-** HTChunk* (chunk) and target (sink) assumed valid.
-**
-** Return values:
-** HT_LOADED All data sent.
-** HT_INTERRUPTED Interruption after some data read.
-**
-** State of memory and target stream on return:
-** always chunk unchanged, target stream still valid.
-*/
-PUBLIC int HTMemCopy ARGS2(
- HTChunk *, chunk,
- HTStream *, sink)
+ * ---------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * State of memory and target stream on entry:
+ * HTChunk* (chunk) and target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_LOADED All data sent.
+ * HT_INTERRUPTED Interruption after some data read.
+ *
+ * State of memory and target stream on return:
+ * always chunk unchanged, target stream still valid.
+ */
+int HTMemCopy(HTChunk *chunk, HTStream *sink)
{
HTStreamClass targetClass;
int bytes = 0;
- CONST char *data = chunk->data;
int rv = HT_OK;
targetClass = *(sink->isa);
HTReadProgress(0, 0);
- for (;;) {
+ for (; chunk != NULL; chunk = chunk->next) {
+
/* Push the data down the stream a piece at a time, in case we're
- ** running a large document on a slow machine.
- */
- int n = INPUT_BUFFER_SIZE;
- if (n > chunk->size - bytes)
- n = chunk->size - bytes;
- if (n == 0)
- break;
- (*targetClass.put_block)(sink, data, n);
- bytes += n;
- data += n;
+ * running a large document on a slow machine.
+ */
+ (*targetClass.put_block) (sink, chunk->data, chunk->size);
+ bytes += chunk->size;
+
HTReadProgress(bytes, 0);
HTDisplayPartial();
if (HTCheckForInterrupt()) {
- _HTProgress (TRANSFER_INTERRUPTED);
+ _HTProgress(TRANSFER_INTERRUPTED);
if (bytes) {
rv = HT_INTERRUPTED;
} else {
@@ -978,52 +1001,50 @@ PUBLIC int HTMemCopy ARGS2(
#ifdef USE_ZLIB
/* Push data from a gzip file pointer down a stream
-** -------------------------------------
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-**
-** State of file and target stream on entry:
-** gzFile (gzfp) assumed open (should have gzipped content),
-** target (sink) assumed valid.
-**
-** Return values:
-** HT_INTERRUPTED Interruption after some data read.
-** HT_PARTIAL_CONTENT Error after some data read.
-** -1 Error before any data read.
-** HT_LOADED Normal end of file indication on reading.
-**
-** State of file and target stream on return:
-** always gzfp still open, target stream still valid.
-*/
-PRIVATE int HTGzFileCopy ARGS2(
- gzFile, gzfp,
- HTStream*, sink)
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ *
+ * State of file and target stream on entry:
+ * gzFile (gzfp) assumed open (should have gzipped content),
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always gzfp still open, target stream still valid.
+ */
+static int HTGzFileCopy(gzFile gzfp, HTStream *sink)
{
HTStreamClass targetClass;
int status, bytes;
int gzerrnum;
int rv = HT_OK;
- /* Push the data down the stream
- */
- targetClass = *(sink->isa); /* Copy pointers to procedures */
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
- /* read and inflate gzip'd file, and push binary down sink
- */
+ /* read and inflate gzip'd file, and push binary down sink
+ */
HTReadProgress(bytes = 0, 0);
for (;;) {
status = gzread(gzfp, input_buffer, INPUT_BUFFER_SIZE);
- if (status <= 0) { /* EOF or error */
+ if (status <= 0) { /* EOF or error */
if (status == 0) {
rv = HT_LOADED;
break;
}
CTRACE((tfp, "HTGzFileCopy: Read error, gzread returns %d\n",
- status));
+ status));
CTRACE((tfp, "gzerror : %s\n",
- gzerror(gzfp, &gzerrnum)));
+ gzerror(gzfp, &gzerrnum)));
if (TRACE) {
if (gzerrnum == Z_ERRNO)
perror("gzerror ");
@@ -1036,13 +1057,13 @@ PRIVATE int HTGzFileCopy ARGS2(
break;
}
- (*targetClass.put_block)(sink, input_buffer, status);
+ (*targetClass.put_block) (sink, input_buffer, status);
bytes += status;
HTReadProgress(bytes, -1);
HTDisplayPartial();
if (HTCheckForInterrupt()) {
- _HTProgress (TRANSFER_INTERRUPTED);
+ _HTProgress(TRANSFER_INTERRUPTED);
if (bytes) {
rv = HT_INTERRUPTED;
} else {
@@ -1050,8 +1071,134 @@ PRIVATE int HTGzFileCopy ARGS2(
}
break;
}
- } /* next bufferload */
+ } /* next bufferload */
+
+ HTFinishDisplayPartial();
+ return rv;
+}
+
+#ifndef HAVE_ZERROR
+#define zError(s) LynxZError(s)
+static const char *zError(int status)
+{
+ static char result[80];
+ sprintf(result, "zlib error %d", status);
+ return result;
+}
+#endif
+
+/* Push data from a deflate file pointer down a stream
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file. The code is
+ * loosely based on the inflate.c file from w3m.
+ *
+ *
+ * State of file and target stream on entry:
+ * FILE (zzfp) assumed open (should have deflated content),
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always zzfp still open, target stream still valid.
+ */
+static int HTZzFileCopy(FILE *zzfp, HTStream *sink)
+{
+ static char dummy_head[1 + 1] =
+ {
+ 0x8 + 0x7 * 0x10,
+ (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
+ };
+
+ z_stream s;
+ HTStreamClass targetClass;
+ int bytes;
+ int rv = HT_OK;
+ char output_buffer[INPUT_BUFFER_SIZE];
+ int status;
+ int flush;
+ int retry = 0;
+ int len = 0;
+
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
+
+ s.zalloc = Z_NULL;
+ s.zfree = Z_NULL;
+ s.opaque = Z_NULL;
+ status = inflateInit(&s);
+ if (status != Z_OK) {
+ CTRACE((tfp, "HTZzFileCopy inflateInit() %s\n", zError(status)));
+ exit_immediately(1);
+ }
+ s.avail_in = 0;
+ s.next_out = (Bytef *) output_buffer;
+ s.avail_out = sizeof(output_buffer);
+ flush = Z_NO_FLUSH;
+
+ /* read and inflate deflate'd file, and push binary down sink
+ */
+ HTReadProgress(bytes = 0, 0);
+ for (;;) {
+ if (s.avail_in == 0) {
+ s.next_in = (Bytef *) input_buffer;
+ len = s.avail_in = fread(input_buffer, 1, INPUT_BUFFER_SIZE, zzfp);
+ }
+ status = inflate(&s, flush);
+ if (status == Z_STREAM_END || status == Z_BUF_ERROR) {
+ len = sizeof(output_buffer) - s.avail_out;
+ if (len > 0) {
+ (*targetClass.put_block) (sink, output_buffer, len);
+ bytes += len;
+ HTReadProgress(bytes, -1);
+ HTDisplayPartial();
+ }
+ rv = HT_LOADED;
+ break;
+ } else if (status == Z_DATA_ERROR && !retry++) {
+ status = inflateReset(&s);
+ if (status != Z_OK) {
+ CTRACE((tfp, "HTZzFileCopy inflateReset() %s\n", zError(status)));
+ rv = bytes ? HT_PARTIAL_CONTENT : -1;
+ break;
+ }
+ s.next_in = (Bytef *) dummy_head;
+ s.avail_in = sizeof(dummy_head);
+ status = inflate(&s, flush);
+ s.next_in = (Bytef *) input_buffer;
+ s.avail_in = len;
+ continue;
+ } else if (status != Z_OK) {
+ CTRACE((tfp, "HTZzFileCopy inflate() %s\n", zError(status)));
+ rv = bytes ? HT_PARTIAL_CONTENT : -1;
+ break;
+ } else if (s.avail_out == 0) {
+ len = sizeof(output_buffer);
+ s.next_out = (Bytef *) output_buffer;
+ s.avail_out = sizeof(output_buffer);
+
+ (*targetClass.put_block) (sink, output_buffer, len);
+ bytes += len;
+ HTReadProgress(bytes, -1);
+ HTDisplayPartial();
+
+ if (HTCheckForInterrupt()) {
+ _HTProgress(TRANSFER_INTERRUPTED);
+ rv = bytes ? HT_INTERRUPTED : -1;
+ break;
+ }
+ }
+ retry = 1;
+ } /* next bufferload */
+ inflateEnd(&s);
HTFinishDisplayPartial();
return rv;
}
@@ -1059,52 +1206,50 @@ PRIVATE int HTGzFileCopy ARGS2(
#ifdef USE_BZLIB
/* Push data from a bzip file pointer down a stream
-** -------------------------------------
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-**
-** State of file and target stream on entry:
-** BZFILE (bzfp) assumed open (should have bzipped content),
-** target (sink) assumed valid.
-**
-** Return values:
-** HT_INTERRUPTED Interruption after some data read.
-** HT_PARTIAL_CONTENT Error after some data read.
-** -1 Error before any data read.
-** HT_LOADED Normal end of file indication on reading.
-**
-** State of file and target stream on return:
-** always bzfp still open, target stream still valid.
-*/
-PRIVATE int HTBzFileCopy ARGS2(
- BZFILE *, bzfp,
- HTStream*, sink)
+ * -------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ *
+ * State of file and target stream on entry:
+ * BZFILE (bzfp) assumed open (should have bzipped content),
+ * target (sink) assumed valid.
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption after some data read.
+ * HT_PARTIAL_CONTENT Error after some data read.
+ * -1 Error before any data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always bzfp still open, target stream still valid.
+ */
+static int HTBzFileCopy(BZFILE * bzfp, HTStream *sink)
{
HTStreamClass targetClass;
int status, bytes;
int bzerrnum;
int rv = HT_OK;
- /* Push the data down the stream
- */
- targetClass = *(sink->isa); /* Copy pointers to procedures */
+ /* Push the data down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
- /* read and inflate bzip'd file, and push binary down sink
- */
+ /* read and inflate bzip'd file, and push binary down sink
+ */
HTReadProgress(bytes = 0, 0);
for (;;) {
status = BZ2_bzread(bzfp, input_buffer, INPUT_BUFFER_SIZE);
- if (status <= 0) { /* EOF or error */
+ if (status <= 0) { /* EOF or error */
if (status == 0) {
rv = HT_LOADED;
break;
}
CTRACE((tfp, "HTBzFileCopy: Read error, bzread returns %d\n",
- status));
+ status));
CTRACE((tfp, "bzerror : %s\n",
- BZ2_bzerror(bzfp, &bzerrnum)));
+ BZ2_bzerror(bzfp, &bzerrnum)));
if (bytes) {
rv = HT_PARTIAL_CONTENT;
} else {
@@ -1113,13 +1258,13 @@ PRIVATE int HTBzFileCopy ARGS2(
break;
}
- (*targetClass.put_block)(sink, input_buffer, status);
+ (*targetClass.put_block) (sink, input_buffer, status);
bytes += status;
HTReadProgress(bytes, -1);
HTDisplayPartial();
if (HTCheckForInterrupt()) {
- _HTProgress (TRANSFER_INTERRUPTED);
+ _HTProgress(TRANSFER_INTERRUPTED);
if (bytes) {
rv = HT_INTERRUPTED;
} else {
@@ -1127,7 +1272,7 @@ PRIVATE int HTBzFileCopy ARGS2(
}
break;
}
- } /* next bufferload */
+ } /* next bufferload */
HTFinishDisplayPartial();
return rv;
@@ -1135,84 +1280,83 @@ PRIVATE int HTBzFileCopy ARGS2(
#endif /* USE_BZLIB */
/* Push data from a socket down a stream STRIPPING CR
-** --------------------------------------------------
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the socket.
-**
-** The file number given is assumed to be a TELNET stream ie containing
-** CRLF at the end of lines which need to be stripped to LF for unix
-** when the format is textual.
-**
-*/
-PUBLIC void HTCopyNoCR ARGS3(
- HTParentAnchor *, anchor GCC_UNUSED,
- int, file_number,
- HTStream*, sink)
+ * --------------------------------------------------
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the socket.
+ *
+ * The file number given is assumed to be a TELNET stream ie containing
+ * CRLF at the end of lines which need to be stripped to LF for unix
+ * when the format is textual.
+ *
+ */
+void HTCopyNoCR(HTParentAnchor *anchor GCC_UNUSED,
+ int file_number,
+ HTStream *sink)
{
HTStreamClass targetClass;
int character;
- /* Push the data, ignoring CRLF, down the stream
- */
- targetClass = *(sink->isa); /* Copy pointers to procedures */
+ /* Push the data, ignoring CRLF, down the stream
+ */
+ targetClass = *(sink->isa); /* Copy pointers to procedures */
- /* Push text from telnet socket down sink
- **
- ** @@@@@ To push strings could be faster? (especially is we
- ** cheat and don't ignore CR! :-}
- */
+ /*
+ * Push text from telnet socket down sink
+ *
+ * @@@@@ To push strings could be faster? (especially is we cheat and
+ * don't ignore CR! :-}
+ */
HTInitInput(file_number);
for (;;) {
character = HTGetCharacter();
if (character == EOF)
break;
- (*targetClass.put_character)(sink, UCH(character));
+ (*targetClass.put_character) (sink, UCH(character));
}
}
/* Parse a socket given format and file number
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-** The file number given is assumed to be a TELNET stream ie containing
-** CRLF at the end of lines which need to be stripped to LF for unix
-** when the format is textual.
-**
-** State of socket and target stream on entry:
-** socket (file_number) assumed open,
-** target (sink) usually NULL (will call stream stack).
-**
-** Return values:
-** HT_INTERRUPTED Interruption or error after some data received.
-** -501 Stream stack failed (cannot present or convert).
-** -2 Unexpected disconnect before any data received.
-** -1 Stream stack failed (cannot present or convert), or
-** Interruption or error before any data received, or
-** (UNIX) other read error before any data received, or
-** download cancelled.
-** HT_LOADED Normal close of socket (end of file indication
-** received), or
-** unexpected disconnect after some data received, or
-** other read error after some data received, or
-** (not UNIX) other read error before any data received.
-**
-** State of socket and target stream on return depends on return value:
-** HT_INTERRUPTED socket still open, target aborted.
-** -501 socket still open, target stream NULL.
-** -2 socket still open, target freed.
-** -1 socket still open, target stream aborted or NULL.
-** otherwise socket closed, target stream freed.
-*/
-PUBLIC int HTParseSocket ARGS5(
- HTFormat, rep_in,
- HTFormat, format_out,
- HTParentAnchor *, anchor,
- int, file_number,
- HTStream*, sink)
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * The file number given is assumed to be a TELNET stream ie containing
+ * CRLF at the end of lines which need to be stripped to LF for unix
+ * when the format is textual.
+ *
+ * State of socket and target stream on entry:
+ * socket (file_number) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * HT_INTERRUPTED Interruption or error after some data received.
+ * -501 Stream stack failed (cannot present or convert).
+ * -2 Unexpected disconnect before any data received.
+ * -1 Stream stack failed (cannot present or convert), or
+ * Interruption or error before any data received, or
+ * (UNIX) other read error before any data received, or
+ * download cancelled.
+ * HT_LOADED Normal close of socket (end of file indication
+ * received), or
+ * unexpected disconnect after some data received, or
+ * other read error after some data received, or
+ * (not UNIX) other read error before any data received.
+ *
+ * State of socket and target stream on return depends on return value:
+ * HT_INTERRUPTED socket still open, target aborted.
+ * -501 socket still open, target stream NULL.
+ * -2 socket still open, target freed.
+ * -1 socket still open, target stream aborted or NULL.
+ * otherwise socket closed, target stream freed.
+ */
+int HTParseSocket(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ int file_number,
+ HTStream *sink)
{
- HTStream * stream;
+ HTStream *stream;
HTStreamClass targetClass;
int rv;
@@ -1220,63 +1364,63 @@ PUBLIC int HTParseSocket ARGS5(
if (!stream) {
char *buffer = 0;
+
if (LYCancelDownload) {
LYCancelDownload = FALSE;
return -1;
}
HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
- HTAtom_name(rep_in), HTAtom_name(format_out));
+ HTAtom_name(rep_in), HTAtom_name(format_out));
CTRACE((tfp, "HTFormat: %s\n", buffer));
- rv = HTLoadError(sink, 501, buffer); /* returns -501 */
+ rv = HTLoadError(sink, 501, buffer); /* returns -501 */
FREE(buffer);
} else {
/*
- ** Push the data, don't worry about CRLF we can strip them later.
- */
+ * Push the data, don't worry about CRLF we can strip them later.
+ */
targetClass = *(stream->isa); /* Copy pointers to procedures */
rv = HTCopy(anchor, file_number, NULL, stream);
if (rv != -1 && rv != HT_INTERRUPTED)
- (*targetClass._free)(stream);
+ (*targetClass._free) (stream);
}
return rv;
/* Originally: full: HT_LOADED; partial: HT_INTERRUPTED; no bytes: -1 */
}
/* Parse a file given format and file pointer
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-** The file number given is assumed to be a TELNET stream ie containing
-** CRLF at the end of lines which need to be stripped to \n for unix
-** when the format is textual.
-**
-** State of file and target stream on entry:
-** FILE* (fp) assumed open,
-** target (sink) usually NULL (will call stream stack).
-**
-** Return values:
-** -501 Stream stack failed (cannot present or convert).
-** -1 Download cancelled.
-** HT_NO_DATA Error before any data read.
-** HT_PARTIAL_CONTENT Interruption or error after some data read.
-** HT_LOADED Normal end of file indication on reading.
-**
-** State of file and target stream on return:
-** always fp still open; target freed, aborted, or NULL.
-*/
-PUBLIC int HTParseFile ARGS5(
- HTFormat, rep_in,
- HTFormat, format_out,
- HTParentAnchor *, anchor,
- FILE *, fp,
- HTStream*, sink)
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * The file number given is assumed to be a TELNET stream ie containing
+ * CRLF at the end of lines which need to be stripped to \n for unix
+ * when the format is textual.
+ *
+ * State of file and target stream on entry:
+ * FILE* (fp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always fp still open; target freed, aborted, or NULL.
+ */
+int HTParseFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *fp,
+ HTStream *sink)
{
- HTStream * stream;
+ HTStream *stream;
HTStreamClass targetClass;
int rv;
-#ifdef SH_EX /* 1998/01/04 (Sun) 16:04:09 */
+#ifdef SH_EX /* 1998/01/04 (Sun) 16:04:09 */
if (fp == NULL)
return HT_LOADED;
#endif
@@ -1285,30 +1429,32 @@ PUBLIC int HTParseFile ARGS5(
if (!stream) {
char *buffer = 0;
+
if (LYCancelDownload) {
LYCancelDownload = FALSE;
return -1;
}
HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
- HTAtom_name(rep_in), HTAtom_name(format_out));
+ HTAtom_name(rep_in), HTAtom_name(format_out));
CTRACE((tfp, "HTFormat(in HTParseFile): %s\n", buffer));
rv = HTLoadError(sink, 501, buffer);
FREE(buffer);
return rv;
}
- /* Push the data down the stream
- **
- ** @@ Bug: This decision ought to be made based on "encoding"
- ** rather than on content-type. @@@ When we handle encoding.
- ** The current method smells anyway.
- */
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
targetClass = *(stream->isa); /* Copy pointers to procedures */
rv = HTFileCopy(fp, stream);
if (rv == -1 || rv == HT_INTERRUPTED) {
- (*targetClass._abort)(stream, NULL);
+ (*targetClass._abort) (stream, NULL);
} else {
- (*targetClass._free)(stream);
+ (*targetClass._free) (stream);
}
if (rv == -1)
@@ -1321,35 +1467,35 @@ PUBLIC int HTParseFile ARGS5(
#ifdef USE_SOURCE_CACHE
/* Parse a document in memory given format and memory block pointer
-**
-** This routine is responsible for creating and PRESENTING any
-** graphic (or other) objects described by the file.
-**
-** State of memory and target stream on entry:
-** HTChunk* (chunk) assumed valid,
-** target (sink) usually NULL (will call stream stack).
-**
-** Return values:
-** -501 Stream stack failed (cannot present or convert).
-** HT_LOADED All data sent.
-**
-** State of memory and target stream on return:
-** always chunk unchanged; target freed, aborted, or NULL.
-*/
-PUBLIC int HTParseMem ARGS5(
- HTFormat, rep_in,
- HTFormat, format_out,
- HTParentAnchor *, anchor,
- HTChunk *, chunk,
- HTStream *, sink)
+ *
+ * This routine is responsible for creating and PRESENTING any
+ * graphic (or other) objects described by the file.
+ *
+ * State of memory and target stream on entry:
+ * HTChunk* (chunk) assumed valid,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * HT_LOADED All data sent.
+ *
+ * State of memory and target stream on return:
+ * always chunk unchanged; target freed, aborted, or NULL.
+ */
+int HTParseMem(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ HTChunk *chunk,
+ HTStream *sink)
{
- HTStream * stream;
+ HTStream *stream;
HTStreamClass targetClass;
int rv;
stream = HTStreamStack(rep_in, format_out, sink, anchor);
if (!stream) {
char *buffer = 0;
+
HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
HTAtom_name(rep_in), HTAtom_name(format_out));
CTRACE((tfp, "HTFormat(in HTParseMem): %s\n", buffer));
@@ -1359,19 +1505,19 @@ PUBLIC int HTParseMem ARGS5(
}
/* Push the data down the stream
- */
+ */
targetClass = *(stream->isa);
rv = HTMemCopy(chunk, stream);
- (*targetClass._free)(stream);
+ (*targetClass._free) (stream);
return HT_LOADED;
}
#endif
#ifdef USE_ZLIB
-PRIVATE int HTCloseGzFile ARGS1(
- gzFile, gzfp)
+static int HTCloseGzFile(gzFile gzfp)
{
int gzres;
+
if (gzfp == NULL)
return 0;
gzres = gzclose(gzfp);
@@ -1382,33 +1528,32 @@ PRIVATE int HTCloseGzFile ARGS1(
CTRACE((tfp, "gzclose : error number %d\n", gzres));
}
}
- return(gzres);
+ return (gzres);
}
/* HTParseGzFile
-**
-** State of file and target stream on entry:
-** gzFile (gzfp) assumed open,
-** target (sink) usually NULL (will call stream stack).
-**
-** Return values:
-** -501 Stream stack failed (cannot present or convert).
-** -1 Download cancelled.
-** HT_NO_DATA Error before any data read.
-** HT_PARTIAL_CONTENT Interruption or error after some data read.
-** HT_LOADED Normal end of file indication on reading.
-**
-** State of file and target stream on return:
-** always gzfp closed; target freed, aborted, or NULL.
-*/
-PUBLIC int HTParseGzFile ARGS5(
- HTFormat, rep_in,
- HTFormat, format_out,
- HTParentAnchor *, anchor,
- gzFile, gzfp,
- HTStream*, sink)
+ *
+ * State of file and target stream on entry:
+ * gzFile (gzfp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always gzfp closed; target freed, aborted, or NULL.
+ */
+int HTParseGzFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ gzFile gzfp,
+ HTStream *sink)
{
- HTStream * stream;
+ HTStream *stream;
HTStreamClass targetClass;
int rv;
@@ -1416,31 +1561,33 @@ PUBLIC int HTParseGzFile ARGS5(
if (!stream) {
char *buffer = 0;
+
HTCloseGzFile(gzfp);
if (LYCancelDownload) {
LYCancelDownload = FALSE;
return -1;
}
HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
- HTAtom_name(rep_in), HTAtom_name(format_out));
+ HTAtom_name(rep_in), HTAtom_name(format_out));
CTRACE((tfp, "HTFormat(in HTParseGzFile): %s\n", buffer));
rv = HTLoadError(sink, 501, buffer);
FREE(buffer);
return rv;
}
- /* Push the data down the stream
- **
- ** @@ Bug: This decision ought to be made based on "encoding"
- ** rather than on content-type. @@@ When we handle encoding.
- ** The current method smells anyway.
- */
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
targetClass = *(stream->isa); /* Copy pointers to procedures */
rv = HTGzFileCopy(gzfp, stream);
if (rv == -1 || rv == HT_INTERRUPTED) {
- (*targetClass._abort)(stream, NULL);
+ (*targetClass._abort) (stream, NULL);
} else {
- (*targetClass._free)(stream);
+ (*targetClass._free) (stream);
}
HTCloseGzFile(gzfp);
@@ -1451,40 +1598,106 @@ PUBLIC int HTParseGzFile ARGS5(
else
return HT_LOADED;
}
+
+/* HTParseZzFile
+ *
+ * State of file and target stream on entry:
+ * FILE (zzfp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always zzfp closed; target freed, aborted, or NULL.
+ */
+int HTParseZzFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ FILE *zzfp,
+ HTStream *sink)
+{
+ HTStream *stream;
+ HTStreamClass targetClass;
+ int rv;
+
+ stream = HTStreamStack(rep_in, format_out, sink, anchor);
+
+ if (!stream) {
+ char *buffer = 0;
+
+ fclose(zzfp);
+ if (LYCancelDownload) {
+ LYCancelDownload = FALSE;
+ return -1;
+ }
+ HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
+ HTAtom_name(rep_in), HTAtom_name(format_out));
+ CTRACE((tfp, "HTFormat(in HTParseGzFile): %s\n", buffer));
+ rv = HTLoadError(sink, 501, buffer);
+ FREE(buffer);
+ return rv;
+ }
+
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
+ targetClass = *(stream->isa); /* Copy pointers to procedures */
+ rv = HTZzFileCopy(zzfp, stream);
+ if (rv == -1 || rv == HT_INTERRUPTED) {
+ (*targetClass._abort) (stream, NULL);
+ } else {
+ (*targetClass._free) (stream);
+ }
+
+ fclose(zzfp);
+ if (rv == -1)
+ return HT_NO_DATA;
+ else if (rv == HT_INTERRUPTED || (rv > 0 && rv != HT_LOADED))
+ return HT_PARTIAL_CONTENT;
+ else
+ return HT_LOADED;
+}
#endif /* USE_ZLIB */
#ifdef USE_BZLIB
-PRIVATE void HTCloseBzFile ARGS1(
- BZFILE *, bzfp)
+static void HTCloseBzFile(BZFILE * bzfp)
{
if (bzfp)
BZ2_bzclose(bzfp);
}
/* HTParseBzFile
-**
-** State of file and target stream on entry:
-** bzFile (bzfp) assumed open,
-** target (sink) usually NULL (will call stream stack).
-**
-** Return values:
-** -501 Stream stack failed (cannot present or convert).
-** -1 Download cancelled.
-** HT_NO_DATA Error before any data read.
-** HT_PARTIAL_CONTENT Interruption or error after some data read.
-** HT_LOADED Normal end of file indication on reading.
-**
-** State of file and target stream on return:
-** always bzfp closed; target freed, aborted, or NULL.
-*/
-PUBLIC int HTParseBzFile ARGS5(
- HTFormat, rep_in,
- HTFormat, format_out,
- HTParentAnchor *, anchor,
- BZFILE*, bzfp,
- HTStream*, sink)
+ *
+ * State of file and target stream on entry:
+ * bzFile (bzfp) assumed open,
+ * target (sink) usually NULL (will call stream stack).
+ *
+ * Return values:
+ * -501 Stream stack failed (cannot present or convert).
+ * -1 Download cancelled.
+ * HT_NO_DATA Error before any data read.
+ * HT_PARTIAL_CONTENT Interruption or error after some data read.
+ * HT_LOADED Normal end of file indication on reading.
+ *
+ * State of file and target stream on return:
+ * always bzfp closed; target freed, aborted, or NULL.
+ */
+int HTParseBzFile(HTFormat rep_in,
+ HTFormat format_out,
+ HTParentAnchor *anchor,
+ BZFILE * bzfp,
+ HTStream *sink)
{
- HTStream * stream;
+ HTStream *stream;
HTStreamClass targetClass;
int rv;
@@ -1492,31 +1705,33 @@ PUBLIC int HTParseBzFile ARGS5(
if (!stream) {
char *buffer = 0;
+
HTCloseBzFile(bzfp);
if (LYCancelDownload) {
LYCancelDownload = FALSE;
return -1;
}
HTSprintf0(&buffer, CANNOT_CONVERT_I_TO_O,
- HTAtom_name(rep_in), HTAtom_name(format_out));
+ HTAtom_name(rep_in), HTAtom_name(format_out));
CTRACE((tfp, "HTFormat(in HTParseBzFile): %s\n", buffer));
rv = HTLoadError(sink, 501, buffer);
FREE(buffer);
return rv;
}
- /* Push the data down the stream
- **
- ** @@ Bug: This decision ought to be made based on "encoding"
- ** rather than on content-type. @@@ When we handle encoding.
- ** The current method smells anyway.
- */
+ /*
+ * Push the data down the stream
+ *
+ * @@ Bug: This decision ought to be made based on "encoding" rather than
+ * on content-type. @@@ When we handle encoding. The current method
+ * smells anyway.
+ */
targetClass = *(stream->isa); /* Copy pointers to procedures */
rv = HTBzFileCopy(bzfp, stream);
if (rv == -1 || rv == HT_INTERRUPTED) {
- (*targetClass._abort)(stream, NULL);
+ (*targetClass._abort) (stream, NULL);
} else {
- (*targetClass._free)(stream);
+ (*targetClass._free) (stream);
}
HTCloseBzFile(bzfp);
@@ -1530,63 +1745,65 @@ PUBLIC int HTParseBzFile ARGS5(
#endif /* USE_BZLIB */
/* Converter stream: Network Telnet to internal character text
-** -----------------------------------------------------------
-**
-** The input is assumed to be in ASCII, with lines delimited
-** by (13,10) pairs, These pairs are converted into (CR,LF)
-** pairs in the local representation. The (CR,LF) sequence
-** when found is changed to a '\n' character, the internal
-** C representation of a new line.
-*/
+ * -----------------------------------------------------------
+ *
+ * The input is assumed to be in ASCII, with lines delimited
+ * by (13,10) pairs, These pairs are converted into (CR,LF)
+ * pairs in the local representation. The (CR,LF) sequence
+ * when found is changed to a '\n' character, the internal
+ * C representation of a new line.
+ */
-PRIVATE void NetToText_put_character ARGS2(HTStream *, me, char, net_char)
+static void NetToText_put_character(HTStream *me, char net_char)
{
char c = FROMASCII(net_char);
+
if (me->had_cr) {
if (c == LF) {
me->sink->isa->put_character(me->sink, '\n'); /* Newline */
me->had_cr = NO;
return;
} else {
- me->sink->isa->put_character(me->sink, CR); /* leftover */
+ me->sink->isa->put_character(me->sink, CR); /* leftover */
}
}
me->had_cr = (BOOL) (c == CR);
if (!me->had_cr)
- me->sink->isa->put_character(me->sink, c); /* normal */
+ me->sink->isa->put_character(me->sink, c); /* normal */
}
-PRIVATE void NetToText_put_string ARGS2(HTStream *, me, CONST char *, s)
+static void NetToText_put_string(HTStream *me, const char *s)
{
- CONST char * p;
+ const char *p;
for (p = s; *p; p++)
NetToText_put_character(me, *p);
}
-PRIVATE void NetToText_put_block ARGS3(HTStream *, me, CONST char*, s, int, l)
+static void NetToText_put_block(HTStream *me, const char *s, int l)
{
- CONST char * p;
+ const char *p;
- for (p = s; p < (s+l); p++)
+ for (p = s; p < (s + l); p++)
NetToText_put_character(me, *p);
}
-PRIVATE void NetToText_free ARGS1(HTStream *, me)
+static void NetToText_free(HTStream *me)
{
- (me->sink->isa->_free)(me->sink); /* Close rest of pipe */
+ (me->sink->isa->_free) (me->sink); /* Close rest of pipe */
FREE(me);
}
-PRIVATE void NetToText_abort ARGS2(HTStream *, me, HTError, e)
+static void NetToText_abort(HTStream *me, HTError e)
{
- me->sink->isa->_abort(me->sink,e); /* Abort rest of pipe */
+ me->sink->isa->_abort(me->sink, e); /* Abort rest of pipe */
FREE(me);
}
/* The class structure
*/
-PRIVATE HTStreamClass NetToTextClass = {
+static HTStreamClass NetToTextClass =
+{
"NetToText",
NetToText_free,
NetToText_abort,
@@ -1597,9 +1814,9 @@ PRIVATE HTStreamClass NetToTextClass = {
/* The creation method
*/
-PUBLIC HTStream * HTNetToText ARGS1(HTStream *, sink)
+HTStream *HTNetToText(HTStream *sink)
{
- HTStream* me = typecalloc(HTStream);
+ HTStream *me = typecalloc(HTStream);
if (me == NULL)
outofmem(__FILE__, "NetToText");
@@ -1610,41 +1827,42 @@ PUBLIC HTStream * HTNetToText ARGS1(HTStream *, sink)
return me;
}
-PRIVATE HTStream HTBaseStreamInstance; /* Made static */
+static HTStream HTBaseStreamInstance; /* Made static */
+
/*
-** ERROR STREAM
-** ------------
-** There is only one error stream shared by anyone who wants a
-** generic error returned from all stream methods.
-*/
-PRIVATE void HTErrorStream_put_character ARGS2(HTStream *, me GCC_UNUSED, char, c GCC_UNUSED)
+ * ERROR STREAM
+ * ------------
+ * There is only one error stream shared by anyone who wants a
+ * generic error returned from all stream methods.
+ */
+static void HTErrorStream_put_character(HTStream *me GCC_UNUSED, char c GCC_UNUSED)
{
LYCancelDownload = TRUE;
}
-PRIVATE void HTErrorStream_put_string ARGS2(HTStream *, me GCC_UNUSED, CONST char *, s)
+static void HTErrorStream_put_string(HTStream *me GCC_UNUSED, const char *s)
{
if (s && *s)
LYCancelDownload = TRUE;
}
-PRIVATE void HTErrorStream_write ARGS3(HTStream *, me GCC_UNUSED, CONST char *, s, int, l)
+static void HTErrorStream_write(HTStream *me GCC_UNUSED, const char *s, int l)
{
if (l && s)
LYCancelDownload = TRUE;
}
-PRIVATE void HTErrorStream_free ARGS1(HTStream *, me GCC_UNUSED)
+static void HTErrorStream_free(HTStream *me GCC_UNUSED)
{
return;
}
-PRIVATE void HTErrorStream_abort ARGS2(HTStream *, me GCC_UNUSED, HTError, e GCC_UNUSED)
+static void HTErrorStream_abort(HTStream *me GCC_UNUSED, HTError e GCC_UNUSED)
{
return;
}
-PRIVATE CONST HTStreamClass HTErrorStreamClass =
+static const HTStreamClass HTErrorStreamClass =
{
"ErrorStream",
HTErrorStream_free,
@@ -1654,9 +1872,9 @@ PRIVATE CONST HTStreamClass HTErrorStreamClass =
HTErrorStream_write
};
-PUBLIC HTStream * HTErrorStream NOARGS
+HTStream *HTErrorStream(void)
{
CTRACE((tfp, "ErrorStream. Created\n"));
- HTBaseStreamInstance.isa = &HTErrorStreamClass; /* The rest is random */
+ HTBaseStreamInstance.isa = &HTErrorStreamClass; /* The rest is random */
return &HTBaseStreamInstance;
}