diff options
author | Thomas E. Dickey <dickey@invisible-island.net> | 2011-12-01 09:41:59 -0500 |
---|---|---|
committer | Thomas E. Dickey <dickey@invisible-island.net> | 2011-12-01 09:41:59 -0500 |
commit | cac80105508d5fd74e402be4094c123687a6d399 (patch) | |
tree | d2599e968a0986ea47e0db234a987a1dbe9438aa /WWW | |
parent | 159e9403a44c5f95e8a9c8bf9ef45011c2f80baf (diff) | |
download | lynx-snapshots-cac80105508d5fd74e402be4094c123687a6d399.tar.gz |
snapshot of project "lynx", label v2-8-8dev_9d
Diffstat (limited to 'WWW')
-rw-r--r-- | WWW/Library/Implementation/HTFWriter.c | 361 | ||||
-rw-r--r-- | WWW/Library/Implementation/SGML.c | 9 | ||||
-rw-r--r-- | WWW/Library/Implementation/UCMap.h | 4 |
3 files changed, 367 insertions, 7 deletions
diff --git a/WWW/Library/Implementation/HTFWriter.c b/WWW/Library/Implementation/HTFWriter.c new file mode 100644 index 00000000..90ab003e --- /dev/null +++ b/WWW/Library/Implementation/HTFWriter.c @@ -0,0 +1,361 @@ +/* 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. + */ + +#define HTSTREAM_INTERNAL 1 + +#include <HTUtils.h> + +#include <HTFWriter.h> + +#include <HTFormat.h> +#include <HTAlert.h> +#include <HTFile.h> + +#include <LYUtils.h> +#include <LYLeaks.h> + +/* 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. + */ +static void HTBlackHole_put_character(HTStream *me, char c) +{ +} +static void HTBlackHole_put_string(HTStream *me, const char *s) +{ +} +static void HTBlackHole_write(HTStream *me, const char *s, int l) +{ +} +static void HTBlackHole_free(HTStream *me) +{ +} +static void HTBlackHole_abort(HTStream *me, HTError e) +{ +} + +/* Black Hole stream + * ----------------- + */ +static const HTStreamClass HTBlackHoleClass = +{ + "BlackHole", + HTBlackHole_free, + HTBlackHole_abort, + HTBlackHole_put_character, HTBlackHole_put_string, + HTBlackHole_write +}; + +static HTStream HTBlackHoleInstance = +{ + &HTBlackHoleClass, + NULL, + NULL, + NULL, + NO +}; + +/* Black hole craetion +*/ +HTStream *HTBlackHole(void) +{ + 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 + * ------------------ + */ + +static void HTFWriter_put_character(HTStream *me, char c) +{ + putc(c, me->fp); +} + +/* String handling + * --------------- + * + * Strings must be smaller than this buffer size. + */ +static void HTFWriter_put_string(HTStream *me, const char *s) +{ + fputs(s, me->fp); +} + +/* Buffer write. Buffers can (and should!) be big. + * ------------ + */ +static void HTFWriter_write(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. + */ +static void HTFWriter_free(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 +*/ + +static void HTFWriter_abort(HTStream *me, HTError e) +{ + fclose(me->fp); + if (me->end_command) { /* Temp file */ + CTRACE((tfp, "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 + * ----------------------- + */ +static const HTStreamClass HTFWriter = /* As opposed to print etc */ +{ + "FileWriter", + HTFWriter_free, + HTFWriter_abort, + HTFWriter_put_character, HTFWriter_put_string, + HTFWriter_write +}; + +/* Subclass-specific Methods + * ------------------------- + */ + +HTStream *HTFWriter_new(FILE *fp) +{ + HTStream *me; + + if (!fp) + return NULL; + + me = (HTStream *) malloc(sizeof(*me)); + if (me == NULL) + outofmem(__FILE__, "HTML_new"); + + assert(me != NULL); + + 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. + */ +HTStream *HTSaveAndExecute(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(CANNOT_SAVE_REMOTE); + return HTBlackHole(); + } + + me = (HTStream *) malloc(sizeof(*me)); + if (me == NULL) + outofmem(__FILE__, "Save and execute"); + + assert(me != NULL); + + me->isa = &HTFWriter; + + /* Save the file under a suitably suffixed name */ + + suffix = HTFileSuffix(pres->rep, anchor->content_encoding); + + fnam = (char *) malloc(L_tmpnam + 16 + strlen(suffix)); + if (fnam == NULL) + outofmem(__FILE__, "HTSaveAndExecute"); + + assert(fnam != NULL); + + tmpnam(fnam); + strcat(fnam, suffix); + + me->fp = fopen(fnam, BIN_W); + if (!me->fp) { + HTAlert(CANNOT_OPEN_TEMP); + FREE(fnam); + FREE(me); + return NULL; + } + +/* Make command to process file +*/ + me->end_command = 0; + HTSprintf0(&(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 = 0; + HTSprintf0(&(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. + * + */ +HTStream *HTSaveLocally(HTPresentation *pres, + HTParentAnchor *anchor, /* Not used */ + HTStream *sink) /* Not used */ + +{ + char *fnam; + char *answer; + const char *suffix; + + HTStream *me; + + if (HTClientHost) { + HTAlert(CANNOT_SAVE_REMOTE); + return HTBlackHole(); + } + + me = (HTStream *) malloc(sizeof(*me)); + if (me == NULL) + outofmem(__FILE__, "SaveLocally"); + + assert(me != NULL); + + 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, anchor->content_encoding); + + fnam = (char *) malloc(L_tmpnam + 16 + strlen(suffix)); + if (fnam == NULL) + outofmem(__FILE__, "HTSaveLocally"); + + assert(fnam != NULL); + + tmpnam(fnam); + strcat(fnam, suffix); + + /* Save Panel */ + answer = HTPrompt(GIVE_FILENAME, fnam); + + FREE(fnam); + + me->fp = fopen(answer, BIN_W); + if (!me->fp) { + HTAlert(CANNOT_OPEN_OUTPUT); + FREE(answer); + FREE(me); + return NULL; + } + + FREE(answer); + return me; +} + +/* Format Converter using system command + * ------------------------------------- + */ diff --git a/WWW/Library/Implementation/SGML.c b/WWW/Library/Implementation/SGML.c index 37927772..fb9d298b 100644 --- a/WWW/Library/Implementation/SGML.c +++ b/WWW/Library/Implementation/SGML.c @@ -1,5 +1,5 @@ /* - * $LynxId: SGML.c,v 1.144 2011/06/11 12:09:43 tom Exp $ + * $LynxId: SGML.c,v 1.147 2011/12/01 02:11:01 tom Exp $ * * General SGML Parser code SGML.c * ======================== @@ -2634,17 +2634,14 @@ static void SGML_character(HTStream *context, int c_in) /* * Terminate the numeric entity and try to handle it. - FM */ - unsigned long lcode; + UCode_t code; int i; HTChunkTerminate(string); #ifdef USE_PRETTYSRC entity_string = string->data; #endif - if ((context->isHex - ? sscanf(string->data, "%lx", &lcode) - : sscanf(string->data, "%lu", &lcode)) == 1) { - UCode_t code = (UCode_t) lcode; + if (UCScanCode(&code, string->data, context->isHex)) { /* =============== work in ASCII below here =============== S/390 -- gil -- 1092 */ if (AssumeCP1252(context)) { diff --git a/WWW/Library/Implementation/UCMap.h b/WWW/Library/Implementation/UCMap.h index 6f9e74bc..b55fa6bd 100644 --- a/WWW/Library/Implementation/UCMap.h +++ b/WWW/Library/Implementation/UCMap.h @@ -1,5 +1,5 @@ /* - * $LynxId: UCMap.h,v 1.26 2010/09/25 15:18:32 tom Exp $ + * $LynxId: UCMap.h,v 1.27 2011/12/01 02:00:57 tom Exp $ */ #ifndef UCMAP_H #define UCMAP_H @@ -25,6 +25,8 @@ extern "C" { typedef long UCode_t; + extern BOOL UCScanCode(UCode_t *, const char *, BOOL); + extern int UCTransUniChar(UCode_t unicode, int charset_out); extern int UCTransUniCharStr(char *outbuf, |