r5657 jmb - in /trunk/libparserutils: src/input/filter.c test/INDEX test/Makefile test/regression/filter-badenc-segv.c
by netsurf@semichrome.net
Author: jmb
Date: Sun Nov 9 06:42:11 2008
New Revision: 5657
URL: http://source.netsurf-browser.org?rev=5657&view=rev
Log:
Fix double free of filter read codec when resetting to an unsupported encoding.
Added:
trunk/libparserutils/test/regression/filter-badenc-segv.c
Modified:
trunk/libparserutils/src/input/filter.c
trunk/libparserutils/test/INDEX
trunk/libparserutils/test/Makefile
Modified: trunk/libparserutils/src/input/filter.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/input/filter.c...
==============================================================================
--- trunk/libparserutils/src/input/filter.c (original)
+++ trunk/libparserutils/src/input/filter.c Sun Nov 9 06:42:11 2008
@@ -100,8 +100,10 @@
error = parserutils_charset_codec_create(int_enc, alloc, pw,
&f->write_codec);
if (error != PARSERUTILS_OK) {
- if (f->read_codec != NULL)
+ if (f->read_codec != NULL) {
parserutils_charset_codec_destroy(f->read_codec);
+ f->read_codec = NULL;
+ }
f->alloc(f, 0, pw);
return error;
}
@@ -124,14 +126,20 @@
return PARSERUTILS_BADPARM;
#ifdef WITH_ICONV_FILTER
- if (input->cd != (iconv_t) -1)
+ if (input->cd != (iconv_t) -1) {
iconv_close(input->cd);
-#else
- if (input->read_codec != NULL)
+ input->cd = (iconv_t) -1;
+ }
+#else
+ if (input->read_codec != NULL) {
parserutils_charset_codec_destroy(input->read_codec);
-
- if (input->write_codec != NULL)
+ input->read_codec = NULL;
+ }
+
+ if (input->write_codec != NULL) {
parserutils_charset_codec_destroy(input->write_codec);
+ input->write_codec = NULL;
+ }
#endif
input->alloc(input, 0, input->pw);
@@ -383,16 +391,20 @@
old_enc = "UTF-8";
#ifdef WITH_ICONV_FILTER
- if (input->cd != (iconv_t) -1)
+ if (input->cd != (iconv_t) -1) {
iconv_close(input->cd);
+ input->cd = (iconv_t) -1;
+ }
input->cd = iconv_open(
parserutils_charset_mibenum_to_name(input->int_enc), enc);
if (input->cd == (iconv_t) -1)
return PARSERUTILS_NOMEM;
#else
- if (input->read_codec != NULL)
+ if (input->read_codec != NULL) {
parserutils_charset_codec_destroy(input->read_codec);
+ input->read_codec = NULL;
+ }
error = parserutils_charset_codec_create(enc, input->alloc,
input->pw, &input->read_codec);
@@ -403,4 +415,5 @@
input->settings.encoding = mibenum;
return PARSERUTILS_OK;
-}
+
+}
Modified: trunk/libparserutils/test/INDEX
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/INDEX?rev=565...
==============================================================================
--- trunk/libparserutils/test/INDEX (original)
+++ trunk/libparserutils/test/INDEX Sun Nov 9 06:42:11 2008
@@ -18,3 +18,4 @@
regression/cscodec-segv Segfault in charset codecs
regression/filter-segv Segfault in input filtering
regression/stream-nomem Inputstream buffer expansion
+regression/filter-badenc-segv Segfault on resetting bad encoding in filter
Modified: trunk/libparserutils/test/Makefile
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/Makefile?rev=...
==============================================================================
--- trunk/libparserutils/test/Makefile (original)
+++ trunk/libparserutils/test/Makefile Sun Nov 9 06:42:11 2008
@@ -38,7 +38,7 @@
TESTS_$(d) := aliases cscodec-8859 cscodec-ext8 cscodec-utf8 cscodec-utf16 \
charset dict filter inputstream parserutils rbtree
TESTS_$(d) := $(TESTS_$(d)) regression/cscodec-segv regression/filter-segv \
- regression/stream-nomem
+ regression/stream-nomem regression/filter-badenc-segv
# Items for top-level makefile to use
ITEMS_CLEAN := $(ITEMS_CLEAN) \
Added: trunk/libparserutils/test/regression/filter-badenc-segv.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/regression/fi...
==============================================================================
--- trunk/libparserutils/test/regression/filter-badenc-segv.c (added)
+++ trunk/libparserutils/test/regression/filter-badenc-segv.c Sun Nov 9 06:42:11 2008
@@ -1,0 +1,50 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <parserutils/parserutils.h>
+
+#include "input/filter.h"
+
+#include "testutils.h"
+
+static void *myrealloc(void *ptr, size_t len, void *pw)
+{
+ UNUSED(pw);
+
+ return realloc(ptr, len);
+}
+
+int main(int argc, char **argv)
+{
+ parserutils_filter *input;
+ parserutils_filter_optparams params;
+
+ if (argc != 2) {
+ printf("Usage: %s <filename>\n", argv[0]);
+ return 1;
+ }
+
+ assert(parserutils_initialise(argv[1], myrealloc, NULL) ==
+ PARSERUTILS_OK);
+
+ assert(parserutils_filter_create("UTF-8", myrealloc, NULL, &input) ==
+ PARSERUTILS_OK);
+
+ params.encoding.name = "GBK";
+ assert(parserutils_filter_setopt(input,
+ PARSERUTILS_FILTER_SET_ENCODING, ¶ms) ==
+ PARSERUTILS_BADENCODING);
+
+ params.encoding.name = "GBK";
+ assert(parserutils_filter_setopt(input,
+ PARSERUTILS_FILTER_SET_ENCODING, ¶ms) ==
+ PARSERUTILS_BADENCODING);
+
+ parserutils_filter_destroy(input);
+
+ assert(parserutils_finalise(myrealloc, NULL) == PARSERUTILS_OK);
+
+ printf("PASS\n");
+
+ return 0;
+}
14 years, 2 months
r5656 jmb - in /trunk/hubbub: src/parser.c src/tokeniser/tokeniser.c test/tokeniser.c test/tokeniser2.c test/tokeniser3.c
by netsurf@semichrome.net
Author: jmb
Date: Sat Nov 8 17:20:42 2008
New Revision: 5656
URL: http://source.netsurf-browser.org?rev=5656&view=rev
Log:
Port hubbub to new lpu API
Modified:
trunk/hubbub/src/parser.c
trunk/hubbub/src/tokeniser/tokeniser.c
trunk/hubbub/test/tokeniser.c
trunk/hubbub/test/tokeniser2.c
trunk/hubbub/test/tokeniser3.c
Modified: trunk/hubbub/src/parser.c
URL: http://source.netsurf-browser.org/trunk/hubbub/src/parser.c?rev=5656&r1=5...
==============================================================================
--- trunk/hubbub/src/parser.c (original)
+++ trunk/hubbub/src/parser.c Sat Nov 8 17:20:42 2008
@@ -40,6 +40,7 @@
hubbub_parser *hubbub_parser_create(const char *enc, bool fix_enc,
hubbub_alloc alloc, void *pw)
{
+ parserutils_error perror;
hubbub_parser *parser;
if (alloc == NULL)
@@ -62,10 +63,10 @@
}
}
- parser->stream = parserutils_inputstream_create(enc,
+ perror = parserutils_inputstream_create(enc,
enc != NULL ? HUBBUB_CHARSET_CONFIDENT : HUBBUB_CHARSET_UNKNOWN,
- hubbub_charset_extract, alloc, pw);
- if (parser->stream == NULL) {
+ hubbub_charset_extract, alloc, pw, &parser->stream);
+ if (perror != PARSERUTILS_OK) {
alloc(parser, 0, pw);
return NULL;
}
Modified: trunk/hubbub/src/tokeniser/tokeniser.c
URL: http://source.netsurf-browser.org/trunk/hubbub/src/tokeniser/tokeniser.c?...
==============================================================================
--- trunk/hubbub/src/tokeniser/tokeniser.c (original)
+++ trunk/hubbub/src/tokeniser/tokeniser.c Sat Nov 8 17:20:42 2008
@@ -281,6 +281,7 @@
hubbub_tokeniser *hubbub_tokeniser_create(parserutils_inputstream *input,
hubbub_alloc alloc, void *pw)
{
+ parserutils_error perror;
hubbub_tokeniser *tok;
if (input == NULL || alloc == NULL)
@@ -290,8 +291,8 @@
if (tok == NULL)
return NULL;
- tok->buffer = parserutils_buffer_create(alloc, pw);
- if (tok->buffer == NULL) {
+ perror = parserutils_buffer_create(alloc, pw, &tok->buffer);
+ if (perror != PARSERUTILS_OK) {
alloc(tok, 0, pw);
return NULL;
}
Modified: trunk/hubbub/test/tokeniser.c
URL: http://source.netsurf-browser.org/trunk/hubbub/test/tokeniser.c?rev=5656&...
==============================================================================
--- trunk/hubbub/test/tokeniser.c (original)
+++ trunk/hubbub/test/tokeniser.c Sat Nov 8 17:20:42 2008
@@ -38,9 +38,8 @@
/* Initialise library */
assert(hubbub_initialise(argv[1], myrealloc, NULL) == HUBBUB_OK);
- stream = parserutils_inputstream_create("UTF-8", 0, NULL,
- myrealloc, NULL);
- assert(stream != NULL);
+ assert(parserutils_inputstream_create("UTF-8", 0, NULL,
+ myrealloc, NULL, &stream) == PARSERUTILS_OK);
tok = hubbub_tokeniser_create(stream, myrealloc, NULL);
assert(tok != NULL);
Modified: trunk/hubbub/test/tokeniser2.c
URL: http://source.netsurf-browser.org/trunk/hubbub/test/tokeniser2.c?rev=5656...
==============================================================================
--- trunk/hubbub/test/tokeniser2.c (original)
+++ trunk/hubbub/test/tokeniser2.c Sat Nov 8 17:20:42 2008
@@ -141,9 +141,8 @@
ctx->output_index = 0;
ctx->char_off = 0;
- stream = parserutils_inputstream_create("UTF-8", 0, NULL,
- myrealloc, NULL);
- assert(stream != NULL);
+ assert(parserutils_inputstream_create("UTF-8", 0, NULL,
+ myrealloc, NULL, &stream) == PARSERUTILS_OK);
tok = hubbub_tokeniser_create(stream, myrealloc, NULL);
assert(tok != NULL);
Modified: trunk/hubbub/test/tokeniser3.c
URL: http://source.netsurf-browser.org/trunk/hubbub/test/tokeniser3.c?rev=5656...
==============================================================================
--- trunk/hubbub/test/tokeniser3.c (original)
+++ trunk/hubbub/test/tokeniser3.c Sat Nov 8 17:20:42 2008
@@ -138,9 +138,8 @@
ctx->output_index = 0;
ctx->char_off = 0;
- stream = parserutils_inputstream_create("UTF-8", 0, NULL,
- myrealloc, NULL);
- assert(stream != NULL);
+ assert(parserutils_inputstream_create("UTF-8", 0, NULL,
+ myrealloc, NULL, &stream) == PARSERUTILS_OK);
tok = hubbub_tokeniser_create(stream, myrealloc, NULL);
assert(tok != NULL);
14 years, 2 months
r5655 chris_y - /trunk/netsurf/amiga/dist/NetSurf.guide
by netsurf@semichrome.net
Author: chris_y
Date: Sat Nov 8 17:20:33 2008
New Revision: 5655
URL: http://source.netsurf-browser.org?rev=5655&view=rev
Log:
Added a note about local MIME types.
Modified:
trunk/netsurf/amiga/dist/NetSurf.guide
Modified: trunk/netsurf/amiga/dist/NetSurf.guide
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/dist/NetSurf.guide?...
==============================================================================
--- trunk/netsurf/amiga/dist/NetSurf.guide (original)
+++ trunk/netsurf/amiga/dist/NetSurf.guide Sat Nov 8 17:20:33 2008
@@ -11,6 +11,7 @@
@{"Options file " link options}
@{"ARexx port " link arexx}
@{"Hotlist menu " link hotlist}
+@{"Local MIME types " link mimetypes}
@{"Credits " link contact}
@endnode
@@ -110,6 +111,18 @@
@endnode
+@node mimetypes "Local MIME Types"
+NetSurf determines the MIME types of local files primarily by checking the icon of the file. If the icon is not found it will check the default icon for the file type.
+
+It looks for a tooltype MIMETYPE and, if found, will use the contents as the filetype of the file. If not found it makes a guess at the MIME type using datatypes.library, however this will not be very accurate.
+
+The Installer script will set the MIMETYPE tooltype on basic relevant default filetype icons. If you get problems:
+* If the file has a real icon, add MIMETYPE=<MIME type of file> to the tooltypes.
+* If the file does not have an icon, check:
+1. The file type is showing in DefIcons Prefs editor
+2. The icon ENVARC:Sys/def_<filetype> contains the MIMETYPE tooltype.
+@endnode
+
@node contact "Credits"
NetSurf was ported to AmigaOS 4 by Chris Young
chris(a)unsatisfactorysoftware.co.uk
14 years, 2 months
r5654 chris_y - in /trunk/netsurf/amiga/dist: AutoInstall Install Install.info
by netsurf@semichrome.net
Author: chris_y
Date: Sat Nov 8 17:11:18 2008
New Revision: 5654
URL: http://source.netsurf-browser.org?rev=5654&view=rev
Log:
Installation scripts
Install is a standard Installer script
AutoInstall is an AmigaDOS script for AmiUpdate which calls the above Install script
in an unattended install mode.
Added:
trunk/netsurf/amiga/dist/AutoInstall (with props)
trunk/netsurf/amiga/dist/Install (with props)
trunk/netsurf/amiga/dist/Install.info (with props)
Added: trunk/netsurf/amiga/dist/AutoInstall
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/dist/AutoInstall?re...
==============================================================================
--- trunk/netsurf/amiga/dist/AutoInstall (added)
+++ trunk/netsurf/amiga/dist/AutoInstall Sat Nov 8 17:11:18 2008
@@ -1,0 +1,3 @@
+; AmiUpdate AutoInstall for NetSurf
+cd NetSurf
+Installer Install APPNAME NetSurfAutoInstall DEFUSER NOVICE
Propchange: trunk/netsurf/amiga/dist/AutoInstall
------------------------------------------------------------------------------
amiga:protection = ----rwed ---- ----
Propchange: trunk/netsurf/amiga/dist/AutoInstall
------------------------------------------------------------------------------
svn:executable = *
Added: trunk/netsurf/amiga/dist/Install
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/dist/Install?rev=56...
==============================================================================
--- trunk/netsurf/amiga/dist/Install (added)
+++ trunk/netsurf/amiga/dist/Install Sat Nov 8 17:11:18 2008
@@ -1,0 +1,146 @@
+; Installation script for NetSurf
+
+(procedure p_setmimetype #type #mimetype
+ (transcript "Setting MIME Type " #mimetype " for default " #type " icon")
+
+ (set #fullpath (cat "ENVARC:Sys/def_" #type))
+
+ (tooltype
+ (prompt "Setting MIME type")
+ (help @tooltype-help)
+ (dest #fullpath)
+ (settooltype "MIMETYPE" #mimetype)
+ )
+)
+
+(if (= @app-name "NetSurfAutoInstall") (set #AutoInstall 1))
+
+(if (<> #AutoInstall 1) (welcome))
+
+(complete 0)
+
+(set @default-dest (getenv "AppPaths/NetSurf"))
+
+(set @default-dest
+ (askdir
+ (prompt "Where would you like to install NetSurf?")
+ (help @askdir-help)
+ (default @default-dest)
+ )
+)
+
+(copylib
+ (prompt "Please check the version of NetSurf you are copying against "
+ "any which might already be installed.")
+ (help @copylib-help)
+ (source "NetSurf")
+ (dest @default-dest)
+ (infos)
+ (optional "askuser" "force" "oknodelete")
+ (confirm "expert")
+)
+
+(complete 20)
+
+(copyfiles
+ (prompt "Copying files")
+ (source "")
+ (choices "Resources" "Rexx" "NetSurf.guide" "NetSurf.readme")
+ (help @copyfiles-help)
+ (dest @default-dest)
+ (infos)
+; (all)
+)
+
+(complete 70)
+
+(set #options-exist (exists (tackon @default-dest "Resources/Options")))
+
+(if (= #options-exist 0)
+ (
+ (set #screen-width ;(querydisplay "screen" "width"))
+ (asknumber
+ (prompt "Enter desired screen width")
+ (help @asknumber-help)
+ (default 1024)
+ )
+ )
+ (set #screen-height ;(querydisplay "screen" "height"))
+ (asknumber
+ (prompt "Enter desired screen height")
+ (help @asknumber-help)
+ (default 768)
+ )
+ )
+
+ (set #depth ;(querydisplay "screen" "depth"))
+ (askchoice
+ (prompt "Enter desired screen depth")
+ (help @asknumber-help)
+ (choices "16" "24" "32")
+ (default 2)
+ )
+ )
+
+ (select #depth
+ (set #screen-depth "16")
+ (set #screen-depth "24")
+ (set #screen-depth "32")
+ )
+
+ (set #themename
+ (askchoice
+ (prompt "Please select theme")
+ (help @askchoice-help)
+ (choices "Default" "AISS")
+ (default 0)
+ )
+ )
+
+ (select #themename
+ (set #theme "Resources/Themes/Default")
+ (set #theme "Resources/Themes/AISS")
+ )
+
+ (textfile
+ (prompt "Setting default options")
+ (help @textfile-help)
+ (dest (tackon @default-dest "Resources/Options"))
+ (append "font_min_size:12\n"
+ "window_x:0\n"
+ "window_y:24\n"
+ "window_width:" #screen-width "\n"
+ "window_height:" (- #screen-height 24) "\n"
+ "window_screen_width:" #screen-width "\n"
+ "window_screen_height:" #screen-height "\n"
+ "theme:" #theme "\n")
+ )
+ )
+)
+
+(complete 90)
+
+(working "Setting MIME types")
+(p_setmimetype "css" "text/css")
+(p_setmimetype "html" "text/html")
+(p_setmimetype "ascii" "text/plain")
+(p_setmimetype "jpeg" "image/jpeg")
+(p_setmimetype "gif" "image/gif")
+(p_setmimetype "png" "image/png")
+(p_setmimetype "jng" "image/jng")
+(p_setmimetype "mng" "image/mng")
+(p_setmimetype "svg" "image/svg")
+(p_setmimetype "bmp" "image/bmp")
+(p_setmimetype "ico" "image/ico")
+(p_setmimetype "sprite" "image/x-riscos-sprite")
+
+(complete 100)
+
+(if (= #AutoInstall 1)
+ (
+ (exit (quiet))
+ )
+ (
+ (exit)
+ )
+)
Propchange: trunk/netsurf/amiga/dist/Install
------------------------------------------------------------------------------
amiga:protection = ----rwed ---- ----
Propchange: trunk/netsurf/amiga/dist/Install
------------------------------------------------------------------------------
svn:executable = *
Added: trunk/netsurf/amiga/dist/Install.info
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/dist/Install.info?r...
==============================================================================
Binary file - no diff available.
Propchange: trunk/netsurf/amiga/dist/Install.info
------------------------------------------------------------------------------
amiga:protection = ----rw-d ---- ----
Propchange: trunk/netsurf/amiga/dist/Install.info
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
14 years, 2 months
r5653 chris_y - in /trunk/netsurf: !NetSurf/Resources/de/ !NetSurf/Resources/en/ !NetSurf/Resources/fr/ !NetSurf/Resources/it/ !NetSurf/Resources/nl/ ./ amiga/
by netsurf@semichrome.net
Author: chris_y
Date: Sat Nov 8 17:08:55 2008
New Revision: 5653
URL: http://source.netsurf-browser.org?rev=5653&view=rev
Log:
AmigaOS implementation of complete page save.
Added:
trunk/netsurf/amiga/save_complete.c (with props)
trunk/netsurf/amiga/save_complete.h (with props)
Modified:
trunk/netsurf/!NetSurf/Resources/de/Messages
trunk/netsurf/!NetSurf/Resources/en/Messages
trunk/netsurf/!NetSurf/Resources/fr/Messages
trunk/netsurf/!NetSurf/Resources/it/Messages
trunk/netsurf/!NetSurf/Resources/nl/Messages
trunk/netsurf/Makefile.sources
trunk/netsurf/amiga/gui.c
trunk/netsurf/amiga/gui.h
trunk/netsurf/amiga/menu.c
trunk/netsurf/amiga/menu.h
Modified: trunk/netsurf/!NetSurf/Resources/de/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/de/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/de/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/de/Messages Sat Nov 8 17:08:55 2008
@@ -229,6 +229,7 @@
SaveAs:Save as
Source:Source...
TextNS:Text...
+SaveCompNS:Complete...
PDF:PDF...
# Edit menu
Modified: trunk/netsurf/!NetSurf/Resources/en/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/en/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/en/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/en/Messages Sat Nov 8 17:08:55 2008
@@ -229,6 +229,7 @@
SaveAs:Save as
Source:Source...
TextNS:Text...
+SaveCompNS:Complete...
PDF:PDF...
# Edit menu
Modified: trunk/netsurf/!NetSurf/Resources/fr/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/fr/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/fr/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/fr/Messages Sat Nov 8 17:08:55 2008
@@ -229,6 +229,7 @@
SaveAs:Save as
Source:Source...
TextNS:Text...
+SaveCompNS:Complete...
PDF:PDF...
# Edit menu
Modified: trunk/netsurf/!NetSurf/Resources/it/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/it/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/it/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/it/Messages Sat Nov 8 17:08:55 2008
@@ -230,6 +230,7 @@
SaveAs:Salva come
Source:Sorgente...
TextNS:Testo...
+SaveCompNS:Complete...
PDF:PDF...
# Edit menu
Modified: trunk/netsurf/!NetSurf/Resources/nl/Messages
URL: http://source.netsurf-browser.org/trunk/netsurf/%21NetSurf/Resources/nl/M...
==============================================================================
--- trunk/netsurf/!NetSurf/Resources/nl/Messages (original)
+++ trunk/netsurf/!NetSurf/Resources/nl/Messages Sat Nov 8 17:08:55 2008
@@ -229,6 +229,7 @@
SaveAs:Save as
Source:Source...
TextNS:Text...
+SaveCompNS:Complete...
PDF:PDF...
# Edit menu
Modified: trunk/netsurf/Makefile.sources
URL: http://source.netsurf-browser.org/trunk/netsurf/Makefile.sources?rev=5653...
==============================================================================
--- trunk/netsurf/Makefile.sources (original)
+++ trunk/netsurf/Makefile.sources Sat Nov 8 17:08:55 2008
@@ -90,7 +90,7 @@
S_AMIGA := compat.c gui.c tree.c history.c hotlist.c schedule.c \
thumbnail.c misc.c bitmap.c font.c filetype.c utf8.c login.c \
plotters.c object.c menu.c save_pdf.c arexx.c version.c \
- cookies.c context_menu.c clipboard.c
+ cookies.c context_menu.c clipboard.c save_complete.c fetch_file.c
S_AMIGA := $(addprefix amiga/,$(S_AMIGA))
# S_FRAMEBUFFER are sources purely for the framebuffer build
Modified: trunk/netsurf/amiga/gui.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/gui.c?rev=5653&r1=5...
==============================================================================
--- trunk/netsurf/amiga/gui.c (original)
+++ trunk/netsurf/amiga/gui.c Sat Nov 8 17:08:55 2008
@@ -66,6 +66,7 @@
#include "amiga/cookies.h"
#include "amiga/clipboard.h"
#include <proto/keymap.h>
+#include "amiga/save_complete.h"
#ifdef WITH_HUBBUB
#include <hubbub/hubbub.h>
@@ -339,6 +340,7 @@
if(!hotlist) ami_hotlist_init(&hotlist);
ami_global_history_initialise();
ami_cookies_initialise();
+ save_complete_init();
strcpy(&throbberfile,option_theme);
AddPart(&throbberfile,"Theme",100);
@@ -393,6 +395,7 @@
long rarray[] = {0};
struct RDArgs *args;
STRPTR template = "URL/A";
+ STRPTR temp_homepage_url = NULL;
enum
{
@@ -412,7 +415,7 @@
{
if(rarray[A_URL])
{
- option_homepage_url = (char *)strdup(rarray[A_URL]);
+ temp_homepage_url = (char *)strdup(rarray[A_URL]);
}
FreeArgs(args);
}
@@ -451,7 +454,15 @@
TAG_DONE);
}
- bw = browser_window_create(option_homepage_url, 0, 0, true,false); // curbw = temp
+ if(temp_homepage_url)
+ {
+ bw = browser_window_create(temp_homepage_url, 0, 0, true,false);
+ free(temp_homepage_url);
+ }
+ else
+ {
+ bw = browser_window_create(option_homepage_url, 0, 0, true,false); // curbw = temp
+ }
}
void ami_handle_msg(void)
@@ -1004,6 +1015,8 @@
if(gwin->tabs == 0) return;
+ gui_window_get_scroll(gwin->bw->window,&gwin->bw->window->scrollx,&gwin->bw->window->scrolly);
+
GetAttr(CLICKTAB_CurrentNode,gwin->gadgets[GID_TABS],(ULONG *)&tabnode);
GetClickTabNodeAttrs(tabnode,
TNA_UserData,&gwin->bw,
@@ -1014,6 +1027,8 @@
if(redraw)
{
+ gui_window_set_scroll(gwin->bw->window,gwin->bw->window->scrollx,gwin->bw->window->scrolly);
+
browser_window_update(gwin->bw,false);
if(gwin->bw->current_content)
@@ -1252,6 +1267,8 @@
gwin->shared->next_tab++;
if(option_new_tab_active) ami_switch_tab(gwin->shared,false);
+
+ ami_update_buttons(gwin->shared);
return gwin;
}
Modified: trunk/netsurf/amiga/gui.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/gui.h?rev=5653&r1=5...
==============================================================================
--- trunk/netsurf/amiga/gui.h (original)
+++ trunk/netsurf/amiga/gui.h Sat Nov 8 17:08:55 2008
@@ -118,6 +118,8 @@
int c_x;
int c_y;
int c_h;
+ int scrollx;
+ int scrolly;
};
void ami_get_msg(void);
Modified: trunk/netsurf/amiga/menu.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/menu.c?rev=5653&r1=...
==============================================================================
--- trunk/netsurf/amiga/menu.c (original)
+++ trunk/netsurf/amiga/menu.c Sat Nov 8 17:08:55 2008
@@ -36,6 +36,7 @@
#include "amiga/cookies.h"
#include <proto/exec.h>
#include "amiga/arexx.h"
+#include "amiga/save_complete.h"
BOOL menualreadyinit;
@@ -62,31 +63,32 @@
menulab[4] = ami_utf8_easy((char *)messages_get("SaveAs"));
menulab[5] = ami_utf8_easy((char *)messages_get("Source"));
menulab[6] = ami_utf8_easy((char *)messages_get("TextNS"));
- menulab[7] = ami_utf8_easy((char *)messages_get("PDF"));
- menulab[8] = NM_BARLABEL;
- menulab[9] = ami_utf8_easy((char *)messages_get("CloseTab"));
- menulab[10] = ami_utf8_easy((char *)messages_get("CloseWindow"));
- menulab[11] = NM_BARLABEL;
- menulab[12] = ami_utf8_easy((char *)messages_get("Quit"));
- menulab[13] = ami_utf8_easy((char *)messages_get("Edit"));
- menulab[14] = ami_utf8_easy((char *)messages_get("CopyNS"));
- menulab[15] = ami_utf8_easy((char *)messages_get("Paste"));
- menulab[16] = ami_utf8_easy((char *)messages_get("SelectAllNS"));
- menulab[17] = ami_utf8_easy((char *)messages_get("ClearNS"));
- menulab[18] = ami_utf8_easy((char *)messages_get("Browser"));
- menulab[19] = ami_utf8_easy((char *)messages_get("HistGlobalNS"));
- menulab[20] = ami_utf8_easy((char *)messages_get("ShowCookies"));
- menulab[21] = ami_utf8_easy((char *)messages_get("Hotlist"));
- menulab[22] = ami_utf8_easy((char *)messages_get("HotlistAdd"));
- menulab[23] = ami_utf8_easy((char *)messages_get("HotlistShowNS"));
- menulab[24] = NM_BARLABEL;
-
- menulab[65] = ami_utf8_easy((char *)messages_get("Settings"));
- menulab[66] = ami_utf8_easy((char *)messages_get("SnapshotWindow"));
- menulab[67] = ami_utf8_easy((char *)messages_get("SettingsSave"));
- menulab[68] = ami_utf8_easy((char *)messages_get("ARexx"));
- menulab[69] = ami_utf8_easy((char *)messages_get("ARexxExecute"));
- menulab[70] = NM_BARLABEL;
+ menulab[7] = ami_utf8_easy((char *)messages_get("SaveCompNS"));
+ menulab[8] = ami_utf8_easy((char *)messages_get("PDF"));
+ menulab[9] = NM_BARLABEL;
+ menulab[10] = ami_utf8_easy((char *)messages_get("CloseTab"));
+ menulab[11] = ami_utf8_easy((char *)messages_get("CloseWindow"));
+ menulab[12] = NM_BARLABEL;
+ menulab[13] = ami_utf8_easy((char *)messages_get("Quit"));
+ menulab[14] = ami_utf8_easy((char *)messages_get("Edit"));
+ menulab[15] = ami_utf8_easy((char *)messages_get("CopyNS"));
+ menulab[16] = ami_utf8_easy((char *)messages_get("Paste"));
+ menulab[17] = ami_utf8_easy((char *)messages_get("SelectAllNS"));
+ menulab[18] = ami_utf8_easy((char *)messages_get("ClearNS"));
+ menulab[19] = ami_utf8_easy((char *)messages_get("Browser"));
+ menulab[20] = ami_utf8_easy((char *)messages_get("HistGlobalNS"));
+ menulab[21] = ami_utf8_easy((char *)messages_get("ShowCookies"));
+ menulab[22] = ami_utf8_easy((char *)messages_get("Hotlist"));
+ menulab[23] = ami_utf8_easy((char *)messages_get("HotlistAdd"));
+ menulab[24] = ami_utf8_easy((char *)messages_get("HotlistShowNS"));
+ menulab[25] = NM_BARLABEL;
+
+ menulab[AMI_MENU_HOTLIST_MAX] = ami_utf8_easy((char *)messages_get("Settings"));
+ menulab[AMI_MENU_HOTLIST_MAX+1] = ami_utf8_easy((char *)messages_get("SnapshotWindow"));
+ menulab[AMI_MENU_HOTLIST_MAX+2] = ami_utf8_easy((char *)messages_get("SettingsSave"));
+ menulab[AMI_MENU_HOTLIST_MAX+3] = ami_utf8_easy((char *)messages_get("ARexx"));
+ menulab[AMI_MENU_HOTLIST_MAX+4] = ami_utf8_easy((char *)messages_get("ARexxExecute"));
+ menulab[AMI_MENU_HOTLIST_MAX+5] = NM_BARLABEL;
}
struct NewMenu *ami_create_menu(ULONG type)
@@ -101,6 +103,7 @@
{ NM_ITEM,0,0,0,0,0,}, // save
{ NM_SUB,0,"S",0,0,0,}, // save as source
{ NM_SUB,0,0,0,0,0,}, // save as text
+ { NM_SUB,0,0,0,0,0,}, // save as complete
{ NM_SUB,0,0,0,0,0,}, // save as pdf
{ NM_ITEM,NM_BARLABEL,0,0,0,0,},
{ NM_ITEM,0,"K",0,0,0,}, // close tab
@@ -356,6 +359,7 @@
bool openwin=false;
bool opentab=true;
char *temp;
+ BPTR lock = 0;
if(option_force_tabs)
{
@@ -425,6 +429,27 @@
break;
case 2:
+ if(AslRequestTags(filereq,
+ ASLFR_TitleText,messages_get("NetSurf"),
+ ASLFR_Screen,scrn,
+ ASLFR_DoSaveMode,TRUE,
+ ASLFR_InitialFile,FilePart(gwin->bw->current_content->url),
+ TAG_DONE))
+ {
+ strlcpy(&fname,filereq->fr_Drawer,1024);
+ AddPart(fname,filereq->fr_File,1024);
+ ami_update_pointer(gwin->win,GUI_POINTER_WAIT);
+ if(lock = CreateDir(fname))
+ {
+ UnLock(lock);
+ save_complete(gwin->bw->current_content,fname);
+ SetComment(fname,gwin->bw->current_content->url);
+ }
+ ami_update_pointer(gwin->win,GUI_POINTER_DEFAULT);
+ }
+ break;
+
+ case 3:
#ifdef WITH_PDF_EXPORT
if(AslRequestTags(filereq,
ASLFR_TitleText,messages_get("NetSurf"),
Modified: trunk/netsurf/amiga/menu.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/menu.h?rev=5653&r1=...
==============================================================================
--- trunk/netsurf/amiga/menu.h (original)
+++ trunk/netsurf/amiga/menu.h Sat Nov 8 17:08:55 2008
@@ -28,10 +28,10 @@
/* Maximum number of menu items - first value is number of static items
* (ie. everything not intially defined as NM_IGNORE) */
-#define AMI_MENU_MAX 31 + AMI_HOTLIST_ITEMS
+#define AMI_MENU_MAX 32 + AMI_HOTLIST_ITEMS
/* Where the hotlist entries start */
-#define AMI_MENU_HOTLIST 25
+#define AMI_MENU_HOTLIST 26
/* Where the hotlist entries end */
#define AMI_MENU_HOTLIST_MAX AMI_MENU_HOTLIST+AMI_HOTLIST_ITEMS
Added: trunk/netsurf/amiga/save_complete.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/save_complete.c?rev...
==============================================================================
--- trunk/netsurf/amiga/save_complete.c (added)
+++ trunk/netsurf/amiga/save_complete.c Sat Nov 8 17:08:55 2008
@@ -1,0 +1,821 @@
+/*
+ * Copyright 2004 John M Bell <jmb202(a)ecs.soton.ac.uk>
+ * Copyright 2004-2007 James Bursa <bursa(a)users.sourceforge.net>
+ * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Save HTML document with dependencies (implementation).
+ */
+
+#include "utils/config.h"
+//#define _GNU_SOURCE /* for strndup */
+#include <assert.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <regex.h>
+#include <libxml/HTMLtree.h>
+#include <libxml/parserInternals.h>
+#include "utils/config.h"
+#include "css/css.h"
+#include "render/box.h"
+#include "amiga/save_complete.h"
+#include "utils/log.h"
+#include "utils/url.h"
+#include "utils/utils.h"
+#include <proto/dos.h>
+#include <proto/icon.h>
+#include <workbench/icon.h>
+
+regex_t save_complete_import_re;
+
+/** An entry in save_complete_list. */
+struct save_complete_entry {
+ struct content *content;
+ struct save_complete_entry *next; /**< Next entry in list */
+};
+
+/** List of urls seen and saved so far. */
+static struct save_complete_entry *save_complete_list = 0;
+
+static bool save_complete_html(struct content *c, const char *path,
+ bool index);
+static bool save_imported_sheets(struct content *c, const char *path);
+static char * rewrite_stylesheet_urls(const char *source, unsigned int size,
+ int *osize, const char *base);
+static bool rewrite_document_urls(xmlDoc *doc, const char *base);
+static bool rewrite_urls(xmlNode *n, const char *base);
+static bool rewrite_url(xmlNode *n, const char *attr, const char *base);
+static bool save_complete_list_add(struct content *content);
+static struct content * save_complete_list_find(const char *url);
+static bool save_complete_list_check(struct content *content);
+/* static void save_complete_list_dump(void); */
+static bool save_complete_inventory(const char *path);
+
+/**
+ * Save an HTML page with all dependencies.
+ *
+ * \param c CONTENT_HTML to save
+ * \param path directory to save to (must exist)
+ * \return true on success, false on error and error reported
+ */
+
+bool save_complete(struct content *c, const char *path)
+{
+ bool result;
+
+ result = save_complete_html(c, path, true);
+
+ if (result)
+ result = save_complete_inventory(path);
+
+ /* free save_complete_list */
+ while (save_complete_list) {
+ struct save_complete_entry *next = save_complete_list->next;
+ free(save_complete_list);
+ save_complete_list = next;
+ }
+
+ return result;
+}
+
+
+/**
+ * Save an HTML page with all dependencies, recursing through imported pages.
+ *
+ * \param c CONTENT_HTML to save
+ * \param path directory to save to (must exist)
+ * \param index true to save as "index"
+ * \return true on success, false on error and error reported
+ */
+
+bool save_complete_html(struct content *c, const char *path, bool index)
+{
+ char spath[256];
+ unsigned int i;
+ htmlParserCtxtPtr parser;
+ BPTR fh = 0;
+
+ if (c->type != CONTENT_HTML)
+ return false;
+
+ if (save_complete_list_check(c))
+ return true;
+
+ /* save stylesheets, ignoring the base and adblocking sheets */
+ for (i = STYLESHEET_STYLE; i != c->data.html.stylesheet_count; i++) {
+ struct content *css = c->data.html.stylesheet_content[i];
+ char *source;
+ int source_len;
+
+ if (!css)
+ continue;
+ if (save_complete_list_check(css))
+ continue;
+
+ if (i != STYLESHEET_STYLE) {
+ if (!save_complete_list_add(css)) {
+ warn_user("NoMemory", 0);
+ return false;
+ }
+ }
+
+ if (!save_imported_sheets(css, path))
+ return false;
+
+ if (i == STYLESHEET_STYLE)
+ continue; /* don't save <style> elements */
+
+ snprintf(spath, sizeof spath, "%s/%x", path,
+ (unsigned int) css);
+ source = rewrite_stylesheet_urls(css->source_data,
+ css->source_size, &source_len, css->url);
+ if (!source) {
+ warn_user("NoMemory", 0);
+ return false;
+ }
+
+/*
+ error = xosfile_save_stamped(spath, 0xf79, source,
+ source + source_len);
+*/
+
+ if(fh = FOpen(spath,MODE_NEWFILE,0))
+ {
+ FWrite(fh,source,1,source_len);
+ FClose(fh);
+ SetComment(spath,c->url);
+ }
+
+ free(source);
+/*
+ if (error) {
+ LOG(("xosfile_save_stamped: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("SaveError", error->errmess);
+ return false;
+ }
+*/
+ }
+
+ /* save objects */
+ for (i = 0; i != c->data.html.object_count; i++) {
+ struct content *obj = c->data.html.object[i].content;
+
+ /* skip difficult content types */
+ if (!obj || obj->type >= CONTENT_OTHER || !obj->source_data)
+ continue;
+ if (save_complete_list_check(obj))
+ continue;
+
+ if (!save_complete_list_add(obj)) {
+ warn_user("NoMemory", 0);
+ return false;
+ }
+
+ if (obj->type == CONTENT_HTML) {
+ if (!save_complete_html(obj, path, false))
+ return false;
+ continue;
+ }
+
+ snprintf(spath, sizeof spath, "%s/%x", path,
+ (unsigned int) obj);
+/*
+ error = xosfile_save_stamped(spath,
+ ro_content_filetype(obj),
+ obj->source_data,
+ obj->source_data + obj->source_size);
+ if (error) {
+ LOG(("xosfile_save_stamped: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("SaveError", error->errmess);
+ return false;
+ }
+*/
+ if(fh = FOpen(spath,MODE_NEWFILE,0))
+ {
+ FWrite(fh,obj->source_data,1,obj->source_size);
+ FClose(fh);
+ SetComment(spath,obj->url);
+ }
+
+ }
+
+ /*save_complete_list_dump();*/
+
+ /* make a copy of the document tree */
+ parser = htmlCreateMemoryParserCtxt(c->source_data, c->source_size);
+ if (!parser) {
+ warn_user("NoMemory", 0);
+ return false;
+ }
+ /* set parser charset */
+ if (c->data.html.encoding) {
+ xmlCharEncodingHandler *enc_handler;
+ enc_handler =
+ xmlFindCharEncodingHandler(c->data.html.encoding);
+ if (enc_handler) {
+ xmlCtxtResetLastError(parser);
+ if (xmlSwitchToEncoding(parser, enc_handler)) {
+ xmlFreeDoc(parser->myDoc);
+ htmlFreeParserCtxt(parser);
+ warn_user("MiscError",
+ "Encoding switch failed");
+ return false;
+ }
+ }
+ }
+
+ htmlParseDocument(parser);
+
+ /* rewrite all urls we know about */
+ if (!rewrite_document_urls(parser->myDoc, c->data.html.base_url)) {
+ xmlFreeDoc(parser->myDoc);
+ htmlFreeParserCtxt(parser);
+ warn_user("NoMemory", 0);
+ return false;
+ }
+
+ /* save the html file out last of all */
+ if (index)
+ {
+ struct DiskObject *dobj = NULL;
+
+ snprintf(spath, sizeof spath, "%s/index", path);
+
+ dobj = GetIconTags(NULL,ICONGETA_GetDefaultName,"html",
+ ICONGETA_GetDefaultType,WBPROJECT,
+ TAG_DONE);
+
+ PutIconTags(spath,dobj,
+ ICONPUTA_NotifyWorkbench,TRUE,
+ TAG_DONE);
+ }
+ else
+ {
+ snprintf(spath, sizeof spath, "%s/%x", path, (unsigned int)c);
+ }
+
+ errno = 0;
+ if (htmlSaveFileFormat(spath, parser->myDoc, 0, 0) == -1) {
+ if (errno)
+ warn_user("SaveError", strerror(errno));
+ else
+ warn_user("SaveError", "htmlSaveFileFormat failed");
+ return false;
+ }
+
+/*
+ error = xosfile_set_type(spath, 0xfaf);
+ if (error) {
+ LOG(("xosfile_set_type: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("SaveError", error->errmess);
+ return false;
+ }
+*/
+
+ xmlFreeDoc(parser->myDoc);
+ htmlFreeParserCtxt(parser);
+
+ return true;
+}
+
+
+/**
+ * Save stylesheets imported by a CONTENT_CSS.
+ *
+ * \param c a CONTENT_CSS
+ * \param path path to save to
+ * \return true on success, false on error and error reported
+ */
+
+bool save_imported_sheets(struct content *c, const char *path)
+{
+ char spath[256];
+ unsigned int j;
+ char *source;
+ int source_len;
+ BPTR fh = 0;
+
+ for (j = 0; j != c->data.css.import_count; j++) {
+ struct content *css = c->data.css.import_content[j];
+
+ if (!css)
+ continue;
+ if (save_complete_list_check(css))
+ continue;
+
+ if (!save_complete_list_add(css)) {
+ warn_user("NoMemory", 0);
+ return false;
+ }
+
+ if (!save_imported_sheets(css, path))
+ return false;
+
+ snprintf(spath, sizeof spath, "%s/%x", path,
+ (unsigned int) css);
+ source = rewrite_stylesheet_urls(css->source_data,
+ css->source_size, &source_len, css->url);
+ if (!source) {
+ warn_user("NoMemory", 0);
+ return false;
+ }
+
+ if(fh = FOpen(spath,MODE_NEWFILE,0))
+ {
+ FWrite(fh,source,1,source_len);
+ FClose(fh);
+ SetComment(spath,c->url);
+ }
+/*
+ error = xosfile_save_stamped(spath, 0xf79, source,
+ source + source_len);
+*/
+ free(source);
+/*
+ if (error) {
+ LOG(("xosfile_save_stamped: 0x%x: %s",
+ error->errnum, error->errmess));
+ warn_user("SaveError", error->errmess);
+ return false;
+ }
+*/
+ }
+
+ return true;
+}
+
+
+/**
+ * Initialise the save_complete module.
+ */
+
+void save_complete_init(void)
+{
+ /* Match an @import rule - see CSS 2.1 G.1. */
+ regcomp_wrapper(&save_complete_import_re,
+ "@import" /* IMPORT_SYM */
+ "[ \t\r\n\f]*" /* S* */
+ /* 1 */
+ "(" /* [ */
+ /* 2 3 */
+ "\"(([^\"]|[\\]\")*)\"" /* STRING (approximated) */
+ "|"
+ /* 4 5 */
+ "'(([^']|[\\]')*)'"
+ "|" /* | */
+ "url\\([ \t\r\n\f]*" /* URI (approximated) */
+ /* 6 7 */
+ "\"(([^\"]|[\\]\")*)\""
+ "[ \t\r\n\f]*\\)"
+ "|"
+ "url\\([ \t\r\n\f]*"
+ /* 8 9 */
+ "'(([^']|[\\]')*)'"
+ "[ \t\r\n\f]*\\)"
+ "|"
+ "url\\([ \t\r\n\f]*"
+ /* 10 */
+ "([^) \t\r\n\f]*)"
+ "[ \t\r\n\f]*\\)"
+ ")", /* ] */
+ REG_EXTENDED | REG_ICASE);
+}
+
+
+/**
+ * Rewrite stylesheet \@import rules for save complete.
+ *
+ * @param source stylesheet source
+ * @param size size of source
+ * @param osize updated with the size of the result
+ * @param base url of stylesheet
+ * @return converted source, or 0 on out of memory
+ */
+
+char * rewrite_stylesheet_urls(const char *source, unsigned int size,
+ int *osize, const char *base)
+{
+ char *res;
+ const char *url;
+ char *url2;
+ char buf[20];
+ unsigned int offset = 0;
+ int url_len = 0;
+ struct content *content;
+ int m;
+ unsigned int i;
+ unsigned int imports = 0;
+ regmatch_t match[11];
+ url_func_result result;
+
+ /* count number occurences of @import to (over)estimate result size */
+ /* can't use strstr because source is not 0-terminated string */
+ for (i = 0; 7 < size && i != size - 7; i++) {
+ if (source[i] == '@' &&
+ tolower(source[i + 1]) == 'i' &&
+ tolower(source[i + 2]) == 'm' &&
+ tolower(source[i + 3]) == 'p' &&
+ tolower(source[i + 4]) == 'o' &&
+ tolower(source[i + 5]) == 'r' &&
+ tolower(source[i + 6]) == 't')
+ imports++;
+ }
+
+ res = malloc(size + imports * 20);
+ if (!res)
+ return 0;
+ *osize = 0;
+
+ while (offset < size) {
+ m = regexec(&save_complete_import_re, source + offset,
+ 11, match, 0);
+ if (m)
+ break;
+
+ /*for (unsigned int i = 0; i != 11; i++) {
+ if (match[i].rm_so == -1)
+ continue;
+ fprintf(stderr, "%i: '%.*s'\n", i,
+ match[i].rm_eo - match[i].rm_so,
+ source + offset + match[i].rm_so);
+ }*/
+
+ url = 0;
+ if (match[2].rm_so != -1) {
+ url = source + offset + match[2].rm_so;
+ url_len = match[2].rm_eo - match[2].rm_so;
+ } else if (match[4].rm_so != -1) {
+ url = source + offset + match[4].rm_so;
+ url_len = match[4].rm_eo - match[4].rm_so;
+ } else if (match[6].rm_so != -1) {
+ url = source + offset + match[6].rm_so;
+ url_len = match[6].rm_eo - match[6].rm_so;
+ } else if (match[8].rm_so != -1) {
+ url = source + offset + match[8].rm_so;
+ url_len = match[8].rm_eo - match[8].rm_so;
+ } else if (match[10].rm_so != -1) {
+ url = source + offset + match[10].rm_so;
+ url_len = match[10].rm_eo - match[10].rm_so;
+ }
+ assert(url);
+
+ url2 = strndup(url, url_len);
+ if (!url2) {
+ free(res);
+ return 0;
+ }
+ result = url_join(url2, base, (char**)&url);
+ free(url2);
+ if (result == URL_FUNC_NOMEM) {
+ free(res);
+ return 0;
+ }
+
+ /* copy data before match */
+ memcpy(res + *osize, source + offset, match[0].rm_so);
+ *osize += match[0].rm_so;
+
+ if (result == URL_FUNC_OK) {
+ content = save_complete_list_find(url);
+ if (content) {
+ /* replace import */
+ snprintf(buf, sizeof buf, "@import '%x'",
+ (unsigned int) content);
+ memcpy(res + *osize, buf, strlen(buf));
+ *osize += strlen(buf);
+ } else {
+ /* copy import */
+ memcpy(res + *osize, source + offset + match[0].rm_so,
+ match[0].rm_eo - match[0].rm_so);
+ *osize += match[0].rm_eo - match[0].rm_so;
+ }
+ }
+ else {
+ /* copy import */
+ memcpy(res + *osize, source + offset + match[0].rm_so,
+ match[0].rm_eo - match[0].rm_so);
+ *osize += match[0].rm_eo - match[0].rm_so;
+ }
+
+ assert(0 < match[0].rm_eo);
+ offset += match[0].rm_eo;
+ }
+
+ /* copy rest of source */
+ if (offset < size) {
+ memcpy(res + *osize, source + offset, size - offset);
+ *osize += size - offset;
+ }
+
+ return res;
+}
+
+
+/**
+ * Rewrite URLs in a HTML document to be relative.
+ *
+ * \param doc root of the document tree
+ * \param base base url of document
+ * \return true on success, false on out of memory
+ */
+
+bool rewrite_document_urls(xmlDoc *doc, const char *base)
+{
+ xmlNode *node;
+
+ for (node = doc->children; node; node = node->next)
+ if (node->type == XML_ELEMENT_NODE)
+ if (!rewrite_urls(node, base))
+ return false;
+
+ return true;
+}
+
+
+/**
+ * Traverse tree, rewriting URLs as we go.
+ *
+ * \param n xmlNode of type XML_ELEMENT_NODE to rewrite
+ * \param base base url of document
+ * \return true on success, false on out of memory
+ *
+ * URLs in the tree rooted at element n are rewritten.
+ */
+
+bool rewrite_urls(xmlNode *n, const char *base)
+{
+ xmlNode *child;
+
+ assert(n->type == XML_ELEMENT_NODE);
+
+ /**
+ * We only need to consider the following cases:
+ *
+ * Attribute: Elements:
+ *
+ * 1) data <object>
+ * 2) href <a> <area> <link>
+ * 3) src <script> <input> <frame> <iframe> <img>
+ * 4) n/a <style>
+ * 5) n/a any <base> tag
+ * 6) background any (except those above)
+ */
+ if (!n->name) {
+ /* ignore */
+ }
+ /* 1 */
+ else if (strcmp(n->name, "object") == 0) {
+ if (!rewrite_url(n, "data", base))
+ return false;
+ }
+ /* 2 */
+ else if (strcmp(n->name, "a") == 0 ||
+ strcmp(n->name, "area") == 0 ||
+ strcmp(n->name, "link") == 0) {
+ if (!rewrite_url(n, "href", base))
+ return false;
+ }
+ /* 3 */
+ else if (strcmp(n->name, "frame") == 0 ||
+ strcmp(n->name, "iframe") == 0 ||
+ strcmp(n->name, "input") == 0 ||
+ strcmp(n->name, "img") == 0 ||
+ strcmp(n->name, "script") == 0) {
+ if (!rewrite_url(n, "src", base))
+ return false;
+ }
+ /* 4 */
+ else if (strcmp(n->name, "style") == 0) {
+ unsigned int len;
+ xmlChar *content;
+
+ for (child = n->children; child != 0; child = child->next) {
+ /* Get current content */
+ content = xmlNodeGetContent(child);
+ if (!content)
+ /* unfortunately we don't know if this is
+ * due to memory exhaustion, or because
+ * there is no content for this node */
+ continue;
+
+ /* Rewrite @import rules */
+ char *rewritten = rewrite_stylesheet_urls(
+ content,
+ strlen((char*)content),
+ &len, base);
+ xmlFree(content);
+ if (!rewritten)
+ return false;
+
+ /* set new content */
+ xmlNodeSetContentLen(child,
+ (const xmlChar*)rewritten,
+ len);
+ }
+
+ return true;
+ }
+ /* 5 */
+ else if (strcmp(n->name, "base") == 0) {
+ /* simply remove any <base> tags from the document */
+ xmlUnlinkNode(n);
+ xmlFreeNode(n);
+ /* base tags have no content, so there's no point recursing
+ * additionally, we've just destroyed this node, so trying
+ * to recurse would result in bad things happening */
+ return true;
+ }
+ /* 6 */
+ else {
+ if (!rewrite_url(n, "background", base))
+ return false;
+ }
+
+ /* now recurse */
+ for (child = n->children; child;) {
+ /* we must extract the next child now, as if the current
+ * child is a <base> element, it will be removed from the
+ * tree (see 5, above), thus preventing extraction of the
+ * next child */
+ xmlNode *next = child->next;
+ if (child->type == XML_ELEMENT_NODE) {
+ if (!rewrite_urls(child, base))
+ return false;
+ }
+ child = next;
+ }
+
+ return true;
+}
+
+
+/**
+ * Rewrite an URL in a HTML document.
+ *
+ * \param n The node to modify
+ * \param attr The html attribute to modify
+ * \param base base url of document
+ * \return true on success, false on out of memory
+ */
+
+bool rewrite_url(xmlNode *n, const char *attr, const char *base)
+{
+ char *url, *data;
+ char rel[20];
+ struct content *content;
+ url_func_result res;
+
+ if (!xmlHasProp(n, (const xmlChar *) attr))
+ return true;
+
+ data = xmlGetProp(n, (const xmlChar *) attr);
+ if (!data)
+ return false;
+
+ res = url_join(data, base, &url);
+ xmlFree(data);
+ if (res == URL_FUNC_NOMEM)
+ return false;
+ else if (res == URL_FUNC_OK) {
+ content = save_complete_list_find(url);
+ if (content) {
+ /* found a match */
+ free(url);
+ snprintf(rel, sizeof rel, "%x",
+ (unsigned int) content);
+ if (!xmlSetProp(n, (const xmlChar *) attr,
+ (xmlChar *) rel))
+ return false;
+ } else {
+ /* no match found */
+ if (!xmlSetProp(n, (const xmlChar *) attr,
+ (xmlChar *) url)) {
+ free(url);
+ return false;
+ }
+ free(url);
+ }
+ }
+
+ return true;
+}
+
+
+/**
+ * Add a content to the save_complete_list.
+ *
+ * \param content content to add
+ * \return true on success, false on out of memory
+ */
+
+bool save_complete_list_add(struct content *content)
+{
+ struct save_complete_entry *entry;
+ entry = malloc(sizeof (*entry));
+ if (!entry)
+ return false;
+ entry->content = content;
+ entry->next = save_complete_list;
+ save_complete_list = entry;
+ return true;
+}
+
+
+/**
+ * Look up a url in the save_complete_list.
+ *
+ * \param url url to find
+ * \return content if found, 0 otherwise
+ */
+
+struct content * save_complete_list_find(const char *url)
+{
+ struct save_complete_entry *entry;
+ for (entry = save_complete_list; entry; entry = entry->next)
+ if (strcmp(url, entry->content->url) == 0)
+ return entry->content;
+ return 0;
+}
+
+
+/**
+ * Look up a content in the save_complete_list.
+ *
+ * \param content pointer to content
+ * \return true if the content is in the save_complete_list
+ */
+
+bool save_complete_list_check(struct content *content)
+{
+ struct save_complete_entry *entry;
+ for (entry = save_complete_list; entry; entry = entry->next)
+ if (entry->content == content)
+ return true;
+ return false;
+}
+
+
+#if 0
+/**
+ * Dump save complete list to stderr
+ */
+void save_complete_list_dump(void)
+{
+ struct save_complete_entry *entry;
+ for (entry = save_complete_list; entry; entry = entry->next)
+ fprintf(stderr, "%p : %s\n", entry->content,
+ entry->content->url);
+}
+#endif
+
+
+/**
+ * Create the inventory file listing original URLs.
+ */
+
+bool save_complete_inventory(const char *path)
+{
+ char spath[256];
+ FILE *fp;
+
+ snprintf(spath, sizeof spath, "%s/Inventory", path);
+
+ fp = fopen(spath, "w");
+ if (!fp) {
+ LOG(("fopen(): errno = %i", errno));
+ warn_user("SaveError", strerror(errno));
+ return false;
+ }
+
+ struct save_complete_entry *entry;
+ for (entry = save_complete_list; entry; entry = entry->next)
+ fprintf(fp, "%x %s\n",
+ (unsigned int) entry->content,
+ entry->content->url);
+
+ fclose(fp);
+
+ return true;
+}
+
Propchange: trunk/netsurf/amiga/save_complete.c
------------------------------------------------------------------------------
amiga:protection = ----rwed ---- ----
Propchange: trunk/netsurf/amiga/save_complete.c
------------------------------------------------------------------------------
svn:executable = *
Added: trunk/netsurf/amiga/save_complete.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/save_complete.h?rev...
==============================================================================
--- trunk/netsurf/amiga/save_complete.h (added)
+++ trunk/netsurf/amiga/save_complete.h Sat Nov 8 17:08:55 2008
@@ -1,0 +1,32 @@
+/*
+ * Copyright 2004 John M Bell <jmb202(a)ecs.soton.ac.uk>
+ * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf, http://www.netsurf-browser.org/
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Save HTML document with dependencies (interface).
+ */
+
+#ifndef AMIGA_SAVE_COMPLETE_H
+#define AMIGA_SAVE_COMPLETE_H
+
+#include "content/content.h"
+
+void save_complete_init(void);
+bool save_complete(struct content *c, const char *path);
+
+#endif
Propchange: trunk/netsurf/amiga/save_complete.h
------------------------------------------------------------------------------
amiga:protection = ----rwed ---- ----
Propchange: trunk/netsurf/amiga/save_complete.h
------------------------------------------------------------------------------
svn:executable = *
14 years, 2 months
r5652 jmb - in /trunk/libparserutils: include/parserutils/ include/parserutils/charset/ include/parserutils/input/ include/parserutils/utils/ src/charset/ src/charset/codecs/ src/input/ src/utils/ test/ test/regression/
by netsurf@semichrome.net
Author: jmb
Date: Sat Nov 8 17:08:30 2008
New Revision: 5652
URL: http://source.netsurf-browser.org?rev=5652&view=rev
Log:
Return errors from constructors and destructors.
Modified:
trunk/libparserutils/include/parserutils/charset/codec.h
trunk/libparserutils/include/parserutils/errors.h
trunk/libparserutils/include/parserutils/input/inputstream.h
trunk/libparserutils/include/parserutils/utils/buffer.h
trunk/libparserutils/include/parserutils/utils/stack.h
trunk/libparserutils/include/parserutils/utils/vector.h
trunk/libparserutils/src/charset/codec.c
trunk/libparserutils/src/charset/codecs/codec_8859.c
trunk/libparserutils/src/charset/codecs/codec_ascii.c
trunk/libparserutils/src/charset/codecs/codec_ext8.c
trunk/libparserutils/src/charset/codecs/codec_impl.h
trunk/libparserutils/src/charset/codecs/codec_utf16.c
trunk/libparserutils/src/charset/codecs/codec_utf8.c
trunk/libparserutils/src/input/filter.c
trunk/libparserutils/src/input/filter.h
trunk/libparserutils/src/input/inputstream.c
trunk/libparserutils/src/utils/buffer.c
trunk/libparserutils/src/utils/dict.c
trunk/libparserutils/src/utils/errors.c
trunk/libparserutils/src/utils/rbtree.c
trunk/libparserutils/src/utils/rbtree.h
trunk/libparserutils/src/utils/stack.c
trunk/libparserutils/src/utils/vector.c
trunk/libparserutils/test/cscodec-8859.c
trunk/libparserutils/test/cscodec-ext8.c
trunk/libparserutils/test/cscodec-utf16.c
trunk/libparserutils/test/cscodec-utf8.c
trunk/libparserutils/test/filter.c
trunk/libparserutils/test/inputstream.c
trunk/libparserutils/test/rbtree.c
trunk/libparserutils/test/regression/cscodec-segv.c
trunk/libparserutils/test/regression/filter-segv.c
trunk/libparserutils/test/regression/stream-nomem.c
Modified: trunk/libparserutils/include/parserutils/charset/codec.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/include/parserutil...
==============================================================================
--- trunk/libparserutils/include/parserutils/charset/codec.h (original)
+++ trunk/libparserutils/include/parserutils/charset/codec.h Sat Nov 8 17:08:30 2008
@@ -84,10 +84,12 @@
/* Create a charset codec */
-parserutils_charset_codec *parserutils_charset_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw);
+parserutils_error parserutils_charset_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec);
/* Destroy a charset codec */
-void parserutils_charset_codec_destroy(parserutils_charset_codec *codec);
+parserutils_error parserutils_charset_codec_destroy(
+ parserutils_charset_codec *codec);
/* Configure a charset codec */
parserutils_error parserutils_charset_codec_setopt(
Modified: trunk/libparserutils/include/parserutils/errors.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/include/parserutil...
==============================================================================
--- trunk/libparserutils/include/parserutils/errors.h (original)
+++ trunk/libparserutils/include/parserutils/errors.h Sat Nov 8 17:08:30 2008
@@ -18,6 +18,7 @@
PARSERUTILS_INVALID = 3,
PARSERUTILS_FILENOTFOUND = 4,
PARSERUTILS_NEEDDATA = 5,
+ PARSERUTILS_BADENCODING = 6,
} parserutils_error;
/* Convert a parserutils error value to a string */
Modified: trunk/libparserutils/include/parserutils/input/inputstream.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/include/parserutil...
==============================================================================
--- trunk/libparserutils/include/parserutils/input/inputstream.h (original)
+++ trunk/libparserutils/include/parserutils/input/inputstream.h Sat Nov 8 17:08:30 2008
@@ -46,11 +46,13 @@
#define PARSERUTILS_INPUTSTREAM_OOD (0xFFFFFFFEU)
/* Create an input stream */
-parserutils_inputstream *parserutils_inputstream_create(const char *enc,
+parserutils_error parserutils_inputstream_create(const char *enc,
uint32_t encsrc, parserutils_charset_detect_func csdetect,
- parserutils_alloc alloc, void *pw);
+ parserutils_alloc alloc, void *pw,
+ parserutils_inputstream **stream);
/* Destroy an input stream */
-void parserutils_inputstream_destroy(parserutils_inputstream *stream);
+parserutils_error parserutils_inputstream_destroy(
+ parserutils_inputstream *stream);
/* Append data to an input stream */
parserutils_error parserutils_inputstream_append(
Modified: trunk/libparserutils/include/parserutils/utils/buffer.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/include/parserutil...
==============================================================================
--- trunk/libparserutils/include/parserutils/utils/buffer.h (original)
+++ trunk/libparserutils/include/parserutils/utils/buffer.h Sat Nov 8 17:08:30 2008
@@ -22,9 +22,9 @@
};
typedef struct parserutils_buffer parserutils_buffer;
-parserutils_buffer *parserutils_buffer_create(parserutils_alloc alloc,
- void *pw);
-void parserutils_buffer_destroy(parserutils_buffer *buffer);
+parserutils_error parserutils_buffer_create(parserutils_alloc alloc,
+ void *pw, parserutils_buffer **buffer);
+parserutils_error parserutils_buffer_destroy(parserutils_buffer *buffer);
parserutils_error parserutils_buffer_append(parserutils_buffer *buffer,
const uint8_t *data, size_t len);
Modified: trunk/libparserutils/include/parserutils/utils/stack.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/include/parserutil...
==============================================================================
--- trunk/libparserutils/include/parserutils/utils/stack.h (original)
+++ trunk/libparserutils/include/parserutils/utils/stack.h Sat Nov 8 17:08:30 2008
@@ -16,9 +16,9 @@
struct parserutils_stack;
typedef struct parserutils_stack parserutils_stack;
-parserutils_stack *parserutils_stack_create(size_t item_size, size_t chunk_size,
- parserutils_alloc alloc, void *pw);
-void parserutils_stack_destroy(parserutils_stack *stack);
+parserutils_error parserutils_stack_create(size_t item_size, size_t chunk_size,
+ parserutils_alloc alloc, void *pw, parserutils_stack **stack);
+parserutils_error parserutils_stack_destroy(parserutils_stack *stack);
parserutils_error parserutils_stack_push(parserutils_stack *stack, void *item);
parserutils_error parserutils_stack_pop(parserutils_stack *stack, void *item);
Modified: trunk/libparserutils/include/parserutils/utils/vector.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/include/parserutil...
==============================================================================
--- trunk/libparserutils/include/parserutils/utils/vector.h (original)
+++ trunk/libparserutils/include/parserutils/utils/vector.h Sat Nov 8 17:08:30 2008
@@ -16,9 +16,10 @@
struct parserutils_vector;
typedef struct parserutils_vector parserutils_vector;
-parserutils_vector *parserutils_vector_create(size_t item_size,
- size_t chunk_size, parserutils_alloc alloc, void *pw);
-void parserutils_vector_destroy(parserutils_vector *vector);
+parserutils_error parserutils_vector_create(size_t item_size,
+ size_t chunk_size, parserutils_alloc alloc, void *pw,
+ parserutils_vector **vector);
+parserutils_error parserutils_vector_destroy(parserutils_vector *vector);
parserutils_error parserutils_vector_append(parserutils_vector *vector,
void *item);
Modified: trunk/libparserutils/src/charset/codec.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/charset/codec....
==============================================================================
--- trunk/libparserutils/src/charset/codec.c (original)
+++ trunk/libparserutils/src/charset/codec.c Sat Nov 8 17:08:30 2008
@@ -31,23 +31,29 @@
* \param charset Target charset
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to codec instance, or NULL on failure
+ * \param codec Pointer to location to receive codec instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhaustion,
+ * PARSERUTILS_BADENCODING on unsupported charset
*/
-parserutils_charset_codec *parserutils_charset_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw)
+parserutils_error parserutils_charset_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec)
{
- parserutils_charset_codec *codec;
+ parserutils_charset_codec *c;
parserutils_charset_handler **handler;
const parserutils_charset_aliases_canon * canon;
+ parserutils_error error;
- if (charset == NULL || alloc == NULL)
- return NULL;
+ if (charset == NULL || alloc == NULL || codec == NULL)
+ return PARSERUTILS_BADPARM;
/* Canonicalise parserutils_charset name. */
canon = parserutils_charset_alias_canonicalise(charset,
strlen(charset));
if (canon == NULL)
- return NULL;
+ return PARSERUTILS_BADENCODING;
/* Search for handler class */
for (handler = handler_table; *handler != NULL; handler++) {
@@ -57,37 +63,43 @@
/* None found */
if ((*handler) == NULL)
- return NULL;
+ return PARSERUTILS_BADENCODING;
/* Instantiate class */
- codec = (*handler)->create(canon->name, alloc, pw);
- if (codec == NULL)
- return NULL;
+ error = (*handler)->create(canon->name, alloc, pw, &c);
+ if (error != PARSERUTILS_OK)
+ return error;
/* and initialise it */
- codec->mibenum = canon->mib_enum;
+ c->mibenum = canon->mib_enum;
- codec->errormode = PARSERUTILS_CHARSET_CODEC_ERROR_LOOSE;
+ c->errormode = PARSERUTILS_CHARSET_CODEC_ERROR_LOOSE;
- codec->alloc = alloc;
- codec->alloc_pw = pw;
+ c->alloc = alloc;
+ c->alloc_pw = pw;
- return codec;
+ *codec = c;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy a charset codec
*
* \param codec The codec to destroy
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
*/
-void parserutils_charset_codec_destroy(parserutils_charset_codec *codec)
+parserutils_error parserutils_charset_codec_destroy(
+ parserutils_charset_codec *codec)
{
if (codec == NULL)
- return;
+ return PARSERUTILS_BADPARM;
codec->handler.destroy(codec);
codec->alloc(codec, 0, codec->alloc_pw);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/charset/codecs/codec_8859.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/charset/codecs...
==============================================================================
--- trunk/libparserutils/src/charset/codecs/codec_8859.c (original)
+++ trunk/libparserutils/src/charset/codecs/codec_8859.c Sat Nov 8 17:08:30 2008
@@ -66,9 +66,11 @@
} charset_8859_codec;
static bool charset_8859_codec_handles_charset(const char *charset);
-static parserutils_charset_codec *charset_8859_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw);
-static void charset_8859_codec_destroy (parserutils_charset_codec *codec);
+static parserutils_error charset_8859_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec);
+static parserutils_error charset_8859_codec_destroy(
+ parserutils_charset_codec *codec);
static parserutils_error charset_8859_codec_encode(
parserutils_charset_codec *codec,
const uint8_t **source, size_t *sourcelen,
@@ -125,12 +127,16 @@
* \param charset The charset to read from / write to
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to codec, or NULL on failure
- */
-parserutils_charset_codec *charset_8859_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw)
-{
- charset_8859_codec *codec;
+ * \param codec Pointer to location to receive codec
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhausion
+ */
+parserutils_error charset_8859_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec)
+{
+ charset_8859_codec *c;
uint16_t match = parserutils_charset_mibenum_from_name(
charset, strlen(charset));
uint32_t *table = NULL;
@@ -144,35 +150,40 @@
assert(table != NULL);
- codec = alloc(NULL, sizeof(charset_8859_codec), pw);
- if (codec == NULL)
- return NULL;
-
- codec->table = table;
-
- codec->read_buf[0] = 0;
- codec->read_len = 0;
-
- codec->write_buf[0] = 0;
- codec->write_len = 0;
+ c = alloc(NULL, sizeof(charset_8859_codec), pw);
+ if (c == NULL)
+ return PARSERUTILS_NOMEM;
+
+ c->table = table;
+
+ c->read_buf[0] = 0;
+ c->read_len = 0;
+
+ c->write_buf[0] = 0;
+ c->write_len = 0;
/* Finally, populate vtable */
- codec->base.handler.destroy = charset_8859_codec_destroy;
- codec->base.handler.encode = charset_8859_codec_encode;
- codec->base.handler.decode = charset_8859_codec_decode;
- codec->base.handler.reset = charset_8859_codec_reset;
-
- return (parserutils_charset_codec *) codec;
+ c->base.handler.destroy = charset_8859_codec_destroy;
+ c->base.handler.encode = charset_8859_codec_encode;
+ c->base.handler.decode = charset_8859_codec_decode;
+ c->base.handler.reset = charset_8859_codec_reset;
+
+ *codec = (parserutils_charset_codec *) c;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy an ISO-8859-n codec
*
* \param codec The codec to destroy
- */
-void charset_8859_codec_destroy (parserutils_charset_codec *codec)
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error charset_8859_codec_destroy (parserutils_charset_codec *codec)
{
UNUSED(codec);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/charset/codecs/codec_ascii.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/charset/codecs...
==============================================================================
--- trunk/libparserutils/src/charset/codecs/codec_ascii.c (original)
+++ trunk/libparserutils/src/charset/codecs/codec_ascii.c Sat Nov 8 17:08:30 2008
@@ -39,9 +39,11 @@
} charset_ascii_codec;
static bool charset_ascii_codec_handles_charset(const char *charset);
-static parserutils_charset_codec *charset_ascii_codec_create(
- const char *charset, parserutils_alloc alloc, void *pw);
-static void charset_ascii_codec_destroy (parserutils_charset_codec *codec);
+static parserutils_error charset_ascii_codec_create(
+ const char *charset, parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec);
+static parserutils_error charset_ascii_codec_destroy(
+ parserutils_charset_codec *codec);
static parserutils_error charset_ascii_codec_encode(
parserutils_charset_codec *codec,
const uint8_t **source, size_t *sourcelen,
@@ -93,42 +95,51 @@
* \param charset The charset to read from / write to
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to codec, or NULL on failure
- */
-parserutils_charset_codec *charset_ascii_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw)
-{
- charset_ascii_codec *codec;
+ * \param codec Pointer to location to receive codec
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhausion
+ */
+parserutils_error charset_ascii_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec)
+{
+ charset_ascii_codec *c;
UNUSED(charset);
- codec = alloc(NULL, sizeof(charset_ascii_codec), pw);
- if (codec == NULL)
- return NULL;
-
- codec->read_buf[0] = 0;
- codec->read_len = 0;
-
- codec->write_buf[0] = 0;
- codec->write_len = 0;
+ c = alloc(NULL, sizeof(charset_ascii_codec), pw);
+ if (c == NULL)
+ return PARSERUTILS_NOMEM;
+
+ c->read_buf[0] = 0;
+ c->read_len = 0;
+
+ c->write_buf[0] = 0;
+ c->write_len = 0;
/* Finally, populate vtable */
- codec->base.handler.destroy = charset_ascii_codec_destroy;
- codec->base.handler.encode = charset_ascii_codec_encode;
- codec->base.handler.decode = charset_ascii_codec_decode;
- codec->base.handler.reset = charset_ascii_codec_reset;
-
- return (parserutils_charset_codec *) codec;
+ c->base.handler.destroy = charset_ascii_codec_destroy;
+ c->base.handler.encode = charset_ascii_codec_encode;
+ c->base.handler.decode = charset_ascii_codec_decode;
+ c->base.handler.reset = charset_ascii_codec_reset;
+
+ *codec = (parserutils_charset_codec *) c;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy a US-ASCII codec
*
* \param codec The codec to destroy
- */
-void charset_ascii_codec_destroy (parserutils_charset_codec *codec)
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error charset_ascii_codec_destroy (parserutils_charset_codec *codec)
{
UNUSED(codec);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/charset/codecs/codec_ext8.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/charset/codecs...
==============================================================================
--- trunk/libparserutils/src/charset/codecs/codec_ext8.c (original)
+++ trunk/libparserutils/src/charset/codecs/codec_ext8.c Sat Nov 8 17:08:30 2008
@@ -60,9 +60,11 @@
} charset_ext8_codec;
static bool charset_ext8_codec_handles_charset(const char *charset);
-static parserutils_charset_codec *charset_ext8_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw);
-static void charset_ext8_codec_destroy (parserutils_charset_codec *codec);
+static parserutils_error charset_ext8_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec);
+static parserutils_error charset_ext8_codec_destroy(
+ parserutils_charset_codec *codec);
static parserutils_error charset_ext8_codec_encode(
parserutils_charset_codec *codec,
const uint8_t **source, size_t *sourcelen,
@@ -119,12 +121,16 @@
* \param charset The charset to read from / write to
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to codec, or NULL on failure
- */
-parserutils_charset_codec *charset_ext8_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw)
-{
- charset_ext8_codec *codec;
+ * \param codec Pointer to location to receive codec
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhausion
+ */
+parserutils_error charset_ext8_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec)
+{
+ charset_ext8_codec *c;
uint16_t match = parserutils_charset_mibenum_from_name(
charset, strlen(charset));
uint32_t *table = NULL;
@@ -138,35 +144,40 @@
assert(table != NULL);
- codec = alloc(NULL, sizeof(charset_ext8_codec), pw);
- if (codec == NULL)
- return NULL;
-
- codec->table = table;
-
- codec->read_buf[0] = 0;
- codec->read_len = 0;
-
- codec->write_buf[0] = 0;
- codec->write_len = 0;
+ c = alloc(NULL, sizeof(charset_ext8_codec), pw);
+ if (c == NULL)
+ return PARSERUTILS_NOMEM;
+
+ c->table = table;
+
+ c->read_buf[0] = 0;
+ c->read_len = 0;
+
+ c->write_buf[0] = 0;
+ c->write_len = 0;
/* Finally, populate vtable */
- codec->base.handler.destroy = charset_ext8_codec_destroy;
- codec->base.handler.encode = charset_ext8_codec_encode;
- codec->base.handler.decode = charset_ext8_codec_decode;
- codec->base.handler.reset = charset_ext8_codec_reset;
-
- return (parserutils_charset_codec *) codec;
+ c->base.handler.destroy = charset_ext8_codec_destroy;
+ c->base.handler.encode = charset_ext8_codec_encode;
+ c->base.handler.decode = charset_ext8_codec_decode;
+ c->base.handler.reset = charset_ext8_codec_reset;
+
+ *codec = (parserutils_charset_codec *) c;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy an extended 8bit codec
*
* \param codec The codec to destroy
- */
-void charset_ext8_codec_destroy (parserutils_charset_codec *codec)
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error charset_ext8_codec_destroy (parserutils_charset_codec *codec)
{
UNUSED(codec);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/charset/codecs/codec_impl.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/charset/codecs...
==============================================================================
--- trunk/libparserutils/src/charset/codecs/codec_impl.h (original)
+++ trunk/libparserutils/src/charset/codecs/codec_impl.h Sat Nov 8 17:08:30 2008
@@ -25,7 +25,7 @@
void *alloc_pw; /**< private word */
struct {
- void (*destroy)(parserutils_charset_codec *codec);
+ parserutils_error (*destroy)(parserutils_charset_codec *codec);
parserutils_error (*encode)(parserutils_charset_codec *codec,
const uint8_t **source, size_t *sourcelen,
uint8_t **dest, size_t *destlen);
@@ -41,8 +41,9 @@
*/
typedef struct parserutils_charset_handler {
bool (*handles_charset)(const char *charset);
- parserutils_charset_codec *(*create)(const char *charset,
- parserutils_alloc alloc, void *pw);
+ parserutils_error (*create)(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec);
} parserutils_charset_handler;
#endif
Modified: trunk/libparserutils/src/charset/codecs/codec_utf16.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/charset/codecs...
==============================================================================
--- trunk/libparserutils/src/charset/codecs/codec_utf16.c (original)
+++ trunk/libparserutils/src/charset/codecs/codec_utf16.c Sat Nov 8 17:08:30 2008
@@ -45,9 +45,11 @@
} charset_utf16_codec;
static bool charset_utf16_codec_handles_charset(const char *charset);
-static parserutils_charset_codec *charset_utf16_codec_create(
- const char *charset, parserutils_alloc alloc, void *pw);
-static void charset_utf16_codec_destroy (parserutils_charset_codec *codec);
+static parserutils_error charset_utf16_codec_create(
+ const char *charset, parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec);
+static parserutils_error charset_utf16_codec_destroy(
+ parserutils_charset_codec *codec);
static parserutils_error charset_utf16_codec_encode(
parserutils_charset_codec *codec,
const uint8_t **source, size_t *sourcelen,
@@ -85,45 +87,54 @@
* \param charset The charset to read from / write to
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to codec, or NULL on failure
- */
-parserutils_charset_codec *charset_utf16_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw)
-{
- charset_utf16_codec *codec;
+ * \param codec Pointer to location to receive codec
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhausion
+ */
+parserutils_error charset_utf16_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec)
+{
+ charset_utf16_codec *c;
UNUSED(charset);
- codec = alloc(NULL, sizeof(charset_utf16_codec), pw);
- if (codec == NULL)
- return NULL;
-
- codec->inval_buf[0] = '\0';
- codec->inval_len = 0;
-
- codec->read_buf[0] = 0;
- codec->read_len = 0;
-
- codec->write_buf[0] = 0;
- codec->write_len = 0;
+ c = alloc(NULL, sizeof(charset_utf16_codec), pw);
+ if (c == NULL)
+ return PARSERUTILS_NOMEM;
+
+ c->inval_buf[0] = '\0';
+ c->inval_len = 0;
+
+ c->read_buf[0] = 0;
+ c->read_len = 0;
+
+ c->write_buf[0] = 0;
+ c->write_len = 0;
/* Finally, populate vtable */
- codec->base.handler.destroy = charset_utf16_codec_destroy;
- codec->base.handler.encode = charset_utf16_codec_encode;
- codec->base.handler.decode = charset_utf16_codec_decode;
- codec->base.handler.reset = charset_utf16_codec_reset;
-
- return (parserutils_charset_codec *) codec;
+ c->base.handler.destroy = charset_utf16_codec_destroy;
+ c->base.handler.encode = charset_utf16_codec_encode;
+ c->base.handler.decode = charset_utf16_codec_decode;
+ c->base.handler.reset = charset_utf16_codec_reset;
+
+ *codec = (parserutils_charset_codec *) c;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy a UTF-16 codec
*
* \param codec The codec to destroy
- */
-void charset_utf16_codec_destroy (parserutils_charset_codec *codec)
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error charset_utf16_codec_destroy (parserutils_charset_codec *codec)
{
UNUSED(codec);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/charset/codecs/codec_utf8.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/charset/codecs...
==============================================================================
--- trunk/libparserutils/src/charset/codecs/codec_utf8.c (original)
+++ trunk/libparserutils/src/charset/codecs/codec_utf8.c Sat Nov 8 17:08:30 2008
@@ -45,9 +45,11 @@
} charset_utf8_codec;
static bool charset_utf8_codec_handles_charset(const char *charset);
-static parserutils_charset_codec *charset_utf8_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw);
-static void charset_utf8_codec_destroy (parserutils_charset_codec *codec);
+static parserutils_error charset_utf8_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec);
+static parserutils_error charset_utf8_codec_destroy(
+ parserutils_charset_codec *codec);
static parserutils_error charset_utf8_codec_encode(
parserutils_charset_codec *codec,
const uint8_t **source, size_t *sourcelen,
@@ -86,45 +88,54 @@
* \param charset The charset to read from / write to
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to codec, or NULL on failure
- */
-parserutils_charset_codec *charset_utf8_codec_create(const char *charset,
- parserutils_alloc alloc, void *pw)
-{
- charset_utf8_codec *codec;
+ * \param codec Pointer to location to receive codec
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhausion
+ */
+parserutils_error charset_utf8_codec_create(const char *charset,
+ parserutils_alloc alloc, void *pw,
+ parserutils_charset_codec **codec)
+{
+ charset_utf8_codec *c;
UNUSED(charset);
- codec = alloc(NULL, sizeof(charset_utf8_codec), pw);
- if (codec == NULL)
- return NULL;
-
- codec->inval_buf[0] = '\0';
- codec->inval_len = 0;
-
- codec->read_buf[0] = 0;
- codec->read_len = 0;
-
- codec->write_buf[0] = 0;
- codec->write_len = 0;
+ c = alloc(NULL, sizeof(charset_utf8_codec), pw);
+ if (c == NULL)
+ return PARSERUTILS_NOMEM;
+
+ c->inval_buf[0] = '\0';
+ c->inval_len = 0;
+
+ c->read_buf[0] = 0;
+ c->read_len = 0;
+
+ c->write_buf[0] = 0;
+ c->write_len = 0;
/* Finally, populate vtable */
- codec->base.handler.destroy = charset_utf8_codec_destroy;
- codec->base.handler.encode = charset_utf8_codec_encode;
- codec->base.handler.decode = charset_utf8_codec_decode;
- codec->base.handler.reset = charset_utf8_codec_reset;
-
- return (parserutils_charset_codec *) codec;
+ c->base.handler.destroy = charset_utf8_codec_destroy;
+ c->base.handler.encode = charset_utf8_codec_encode;
+ c->base.handler.decode = charset_utf8_codec_decode;
+ c->base.handler.reset = charset_utf8_codec_reset;
+
+ *codec = (parserutils_charset_codec *) c;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy a UTF-8 codec
*
* \param codec The codec to destroy
- */
-void charset_utf8_codec_destroy (parserutils_charset_codec *codec)
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error charset_utf8_codec_destroy (parserutils_charset_codec *codec)
{
UNUSED(codec);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/input/filter.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/input/filter.c...
==============================================================================
--- trunk/libparserutils/src/input/filter.c (original)
+++ trunk/libparserutils/src/input/filter.c Sat Nov 8 17:08:30 2008
@@ -54,65 +54,74 @@
* \param int_enc Desired encoding of document
* \param alloc Function used to (de)allocate data
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to filter instance, or NULL on failure
- */
-parserutils_filter *parserutils_filter_create(const char *int_enc,
- parserutils_alloc alloc, void *pw)
-{
- parserutils_filter *filter;
-
- if (int_enc == NULL || alloc == NULL)
- return NULL;
-
- filter = alloc(NULL, sizeof(*filter), pw);
- if (!filter)
- return NULL;
-
-#ifdef WITH_ICONV_FILTER
- filter->cd = (iconv_t) -1;
- filter->int_enc = parserutils_charset_mibenum_from_name(
+ * \param filter Pointer to location to receive filter instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhausion,
+ * PARSERUTILS_BADENCODING if the encoding is unsupported
+ */
+parserutils_error parserutils_filter_create(const char *int_enc,
+ parserutils_alloc alloc, void *pw, parserutils_filter **filter)
+{
+ parserutils_filter *f;
+ parserutils_error error;
+
+ if (int_enc == NULL || alloc == NULL || filter == NULL)
+ return PARSERUTILS_BADPARM;
+
+ f = alloc(NULL, sizeof(parserutils_filter), pw);
+ if (f == NULL)
+ return PARSERUTILS_NOMEM;
+
+#ifdef WITH_ICONV_FILTER
+ f->cd = (iconv_t) -1;
+ f->int_enc = parserutils_charset_mibenum_from_name(
int_enc, strlen(int_enc));
- if (filter->int_enc == 0) {
- alloc(filter, 0, pw);
- return NULL;
- }
-#else
- filter->leftover = false;
- filter->pivot_left = NULL;
- filter->pivot_len = 0;
-#endif
-
- filter->alloc = alloc;
- filter->pw = pw;
-
- if (filter_set_defaults(filter) != PARSERUTILS_OK) {
- filter->alloc(filter, 0, pw);
- return NULL;
+ if (f->int_enc == 0) {
+ alloc(f, 0, pw);
+ return PARSERUTILS_BADENCODING;
+ }
+#else
+ f->leftover = false;
+ f->pivot_left = NULL;
+ f->pivot_len = 0;
+#endif
+
+ f->alloc = alloc;
+ f->pw = pw;
+
+ error = filter_set_defaults(f);
+ if (error != PARSERUTILS_OK) {
+ f->alloc(f, 0, pw);
+ return error;
}
#ifndef WITH_ICONV_FILTER
- filter->write_codec =
- parserutils_charset_codec_create(int_enc, alloc, pw);
- if (filter->write_codec == NULL) {
- if (filter->read_codec != NULL)
- parserutils_charset_codec_destroy(filter->read_codec);
- filter->alloc(filter, 0, pw);
- return NULL;
- }
-#endif
-
- return filter;
+ error = parserutils_charset_codec_create(int_enc, alloc, pw,
+ &f->write_codec);
+ if (error != PARSERUTILS_OK) {
+ if (f->read_codec != NULL)
+ parserutils_charset_codec_destroy(f->read_codec);
+ f->alloc(f, 0, pw);
+ return error;
+ }
+#endif
+
+ *filter = f;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy an input filter
*
* \param input Pointer to filter instance
- */
-void parserutils_filter_destroy(parserutils_filter *input)
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error parserutils_filter_destroy(parserutils_filter *input)
{
if (input == NULL)
- return;
+ return PARSERUTILS_BADPARM;
#ifdef WITH_ICONV_FILTER
if (input->cd != (iconv_t) -1)
@@ -127,7 +136,7 @@
input->alloc(input, 0, input->pw);
- return;
+ return PARSERUTILS_OK;
}
/**
@@ -354,6 +363,7 @@
parserutils_error filter_set_encoding(parserutils_filter *input,
const char *enc)
{
+ parserutils_error error;
const char *old_enc;
uint16_t mibenum;
@@ -384,10 +394,10 @@
if (input->read_codec != NULL)
parserutils_charset_codec_destroy(input->read_codec);
- input->read_codec = parserutils_charset_codec_create(enc, input->alloc,
- input->pw);
- if (input->read_codec == NULL)
- return PARSERUTILS_NOMEM;
+ error = parserutils_charset_codec_create(enc, input->alloc,
+ input->pw, &input->read_codec);
+ if (error != PARSERUTILS_OK)
+ return error;
#endif
input->settings.encoding = mibenum;
Modified: trunk/libparserutils/src/input/filter.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/input/filter.h...
==============================================================================
--- trunk/libparserutils/src/input/filter.h (original)
+++ trunk/libparserutils/src/input/filter.h Sat Nov 8 17:08:30 2008
@@ -35,10 +35,10 @@
/* Create an input filter */
-parserutils_filter *parserutils_filter_create(const char *int_enc,
- parserutils_alloc alloc, void *pw);
+parserutils_error parserutils_filter_create(const char *int_enc,
+ parserutils_alloc alloc, void *pw, parserutils_filter **filter);
/* Destroy an input filter */
-void parserutils_filter_destroy(parserutils_filter *input);
+parserutils_error parserutils_filter_destroy(parserutils_filter *input);
/* Configure an input filter */
parserutils_error parserutils_filter_setopt(parserutils_filter *input,
Modified: trunk/libparserutils/src/input/inputstream.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/input/inputstr...
==============================================================================
--- trunk/libparserutils/src/input/inputstream.c (original)
+++ trunk/libparserutils/src/input/inputstream.c Sat Nov 8 17:08:30 2008
@@ -51,104 +51,115 @@
* \param csdetect Charset detection function, or NULL
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data (may be NULL)
- * \return Pointer to stream instance, or NULL on failure
+ * \param stream Pointer to location to receive stream instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhaustion,
+ * PARSERUTILS_BADENCODING on unsupported encoding
*
* The value 0 is defined as being the lowest priority encoding source
* (i.e. the default fallback encoding). Beyond this, no further
* interpretation is made upon the encoding source.
*/
-parserutils_inputstream *parserutils_inputstream_create(const char *enc,
+parserutils_error parserutils_inputstream_create(const char *enc,
uint32_t encsrc, parserutils_charset_detect_func csdetect,
- parserutils_alloc alloc, void *pw)
-{
- parserutils_inputstream_private *stream;
-
- if (alloc == NULL)
- return NULL;
-
- stream = alloc(NULL, sizeof(parserutils_inputstream_private), pw);
- if (stream == NULL)
- return NULL;
-
- stream->raw = parserutils_buffer_create(alloc, pw);
- if (stream->raw == NULL) {
- alloc(stream, 0, pw);
- return NULL;
- }
-
- stream->public.utf8 = parserutils_buffer_create(alloc, pw);
- if (stream->public.utf8 == NULL) {
- parserutils_buffer_destroy(stream->raw);
- alloc(stream, 0, pw);
- return NULL;
- }
-
- stream->public.cursor = 0;
- stream->public.had_eof = false;
- stream->done_first_chunk = false;
-
- stream->input = parserutils_filter_create("UTF-8", alloc, pw);
- if (stream->input == NULL) {
- parserutils_buffer_destroy(stream->public.utf8);
- parserutils_buffer_destroy(stream->raw);
- alloc(stream, 0, pw);
- return NULL;
+ parserutils_alloc alloc, void *pw,
+ parserutils_inputstream **stream)
+{
+ parserutils_inputstream_private *s;
+ parserutils_error error;
+
+ if (alloc == NULL || stream == NULL)
+ return PARSERUTILS_BADPARM;
+
+ s = alloc(NULL, sizeof(parserutils_inputstream_private), pw);
+ if (s == NULL)
+ return PARSERUTILS_NOMEM;
+
+ error = parserutils_buffer_create(alloc, pw, &s->raw);
+ if (error != PARSERUTILS_OK) {
+ alloc(s, 0, pw);
+ return error;
+ }
+
+ error = parserutils_buffer_create(alloc, pw, &s->public.utf8);
+ if (error != PARSERUTILS_OK) {
+ parserutils_buffer_destroy(s->raw);
+ alloc(s, 0, pw);
+ return error;
+ }
+
+ s->public.cursor = 0;
+ s->public.had_eof = false;
+ s->done_first_chunk = false;
+
+ error = parserutils_filter_create("UTF-8", alloc, pw, &s->input);
+ if (error != PARSERUTILS_OK) {
+ parserutils_buffer_destroy(s->public.utf8);
+ parserutils_buffer_destroy(s->raw);
+ alloc(s, 0, pw);
+ return error;
}
if (enc != NULL) {
- parserutils_error error;
parserutils_filter_optparams params;
- stream->mibenum =
+ s->mibenum =
parserutils_charset_mibenum_from_name(enc, strlen(enc));
- if (stream->mibenum != 0) {
+ if (s->mibenum != 0) {
params.encoding.name = enc;
- error = parserutils_filter_setopt(stream->input,
+ error = parserutils_filter_setopt(s->input,
PARSERUTILS_FILTER_SET_ENCODING,
¶ms);
if (error != PARSERUTILS_OK &&
error != PARSERUTILS_INVALID) {
- parserutils_filter_destroy(stream->input);
- parserutils_buffer_destroy(stream->public.utf8);
- parserutils_buffer_destroy(stream->raw);
- alloc(stream, 0, pw);
- return NULL;
+ parserutils_filter_destroy(s->input);
+ parserutils_buffer_destroy(s->public.utf8);
+ parserutils_buffer_destroy(s->raw);
+ alloc(s, 0, pw);
+ return error;
}
- stream->encsrc = encsrc;
+ s->encsrc = encsrc;
}
} else {
- stream->mibenum = 0;
- stream->encsrc = 0;
- }
-
- stream->csdetect = csdetect;
-
- stream->alloc = alloc;
- stream->pw = pw;
-
- return (parserutils_inputstream *) stream;
+ s->mibenum = 0;
+ s->encsrc = 0;
+ }
+
+ s->csdetect = csdetect;
+
+ s->alloc = alloc;
+ s->pw = pw;
+
+ *stream = (parserutils_inputstream *) s;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy an input stream
*
* \param stream Input stream to destroy
- */
-void parserutils_inputstream_destroy(parserutils_inputstream *stream)
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error parserutils_inputstream_destroy(
+ parserutils_inputstream *stream)
{
parserutils_inputstream_private *s =
(parserutils_inputstream_private *) stream;
if (stream == NULL)
- return;
+ return PARSERUTILS_BADPARM;
parserutils_filter_destroy(s->input);
parserutils_buffer_destroy(s->public.utf8);
parserutils_buffer_destroy(s->raw);
s->alloc(s, 0, s->pw);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/utils/buffer.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/utils/buffer.c...
==============================================================================
--- trunk/libparserutils/src/utils/buffer.c (original)
+++ trunk/libparserutils/src/utils/buffer.c Sat Nov 8 17:08:30 2008
@@ -14,45 +14,57 @@
/**
* Create a memory buffer
*
- * \param alloc Memory (de)allocation function
- * \param pw Pointer to client-specific private data
- * \return Pointer to memory buffer, or NULL on memory exhaustion
+ * \param alloc Memory (de)allocation function
+ * \param pw Pointer to client-specific private data
+ * \param buffer Pointer to location to receive memory buffer
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhausion
*/
-parserutils_buffer *parserutils_buffer_create(parserutils_alloc alloc, void *pw)
+parserutils_error parserutils_buffer_create(parserutils_alloc alloc, void *pw,
+ parserutils_buffer **buffer)
{
- parserutils_buffer *buffer =
- alloc(NULL, sizeof(parserutils_buffer), pw);
+ parserutils_buffer *b;
- if (buffer == NULL)
- return NULL;
+ if (alloc == NULL || buffer == NULL)
+ return PARSERUTILS_BADPARM;
- buffer->data = alloc(NULL, DEFAULT_SIZE, pw);
- if (buffer->data == NULL) {
- alloc(buffer, 0, pw);
- return NULL;
+ b = alloc(NULL, sizeof(parserutils_buffer), pw);
+ if (b == NULL)
+ return PARSERUTILS_NOMEM;
+
+ b->data = alloc(NULL, DEFAULT_SIZE, pw);
+ if (b->data == NULL) {
+ alloc(b, 0, pw);
+ return PARSERUTILS_NOMEM;
}
- buffer->length = 0;
- buffer->allocated = DEFAULT_SIZE;
+ b->length = 0;
+ b->allocated = DEFAULT_SIZE;
- buffer->alloc = alloc;
- buffer->pw = pw;
+ b->alloc = alloc;
+ b->pw = pw;
- return buffer;
+ *buffer = b;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy a memory buffer
*
* \param buffer The buffer to destroy
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
*/
-void parserutils_buffer_destroy(parserutils_buffer *buffer)
+parserutils_error parserutils_buffer_destroy(parserutils_buffer *buffer)
{
if (buffer == NULL)
- return;
+ return PARSERUTILS_BADPARM;
buffer->alloc(buffer->data, 0, buffer->pw);
buffer->alloc(buffer, 0, buffer->pw);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/utils/dict.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/utils/dict.c?r...
==============================================================================
--- trunk/libparserutils/src/utils/dict.c (original)
+++ trunk/libparserutils/src/utils/dict.c Sat Nov 8 17:08:30 2008
@@ -104,10 +104,10 @@
return PARSERUTILS_OK;
}
} else {
- dict->table[index] = parserutils_rbtree_create(dict_cmp,
- dict->alloc, dict->pw);
- if (dict->table[index] == NULL)
- return PARSERUTILS_NOMEM;
+ error = parserutils_rbtree_create(dict_cmp,
+ dict->alloc, dict->pw, &dict->table[index]);
+ if (error != PARSERUTILS_OK)
+ return error;
}
entry = dict->alloc(NULL, sizeof(parserutils_dict_entry) + len,
Modified: trunk/libparserutils/src/utils/errors.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/utils/errors.c...
==============================================================================
--- trunk/libparserutils/src/utils/errors.c (original)
+++ trunk/libparserutils/src/utils/errors.c Sat Nov 8 17:08:30 2008
@@ -38,6 +38,9 @@
case PARSERUTILS_NEEDDATA:
result = "Insufficient data";
break;
+ case PARSERUTILS_BADENCODING:
+ result = "Unsupported encoding";
+ break;
}
return result;
@@ -64,6 +67,8 @@
return PARSERUTILS_FILENOTFOUND;
} else if (strncmp(str, "PARSERUTILS_NEEDDATA", len) == 0) {
return PARSERUTILS_NEEDDATA;
+ } else if (strncmp(str, "PARSERUTILS_BADENCODING", len) == 0) {
+ return PARSERUTILS_BADENCODING;
}
return PARSERUTILS_OK;
Modified: trunk/libparserutils/src/utils/rbtree.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/utils/rbtree.c...
==============================================================================
--- trunk/libparserutils/src/utils/rbtree.c (original)
+++ trunk/libparserutils/src/utils/rbtree.c Sat Nov 8 17:08:30 2008
@@ -92,26 +92,31 @@
* \param cmp Comparator routine for keys
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data
- * \return Pointer to tree instance, or NULL on memory exhaustion
- */
-parserutils_rbtree *parserutils_rbtree_create(parserutils_rbtree_cmp cmp,
- parserutils_alloc alloc, void *pw)
-{
- parserutils_rbtree *tree;
-
- if (cmp == NULL || alloc == NULL)
- return NULL;
-
- tree = alloc(NULL, sizeof(parserutils_rbtree), pw);
- if (tree == NULL)
- return NULL;
-
- tree->root = NULL;
- tree->cmp = cmp;
- tree->alloc = alloc;
- tree->pw = pw;
-
- return tree;
+ * \param tree Pointer to location to receive tree instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhaustion
+ */
+parserutils_error parserutils_rbtree_create(parserutils_rbtree_cmp cmp,
+ parserutils_alloc alloc, void *pw, parserutils_rbtree **tree)
+{
+ parserutils_rbtree *t;
+
+ if (cmp == NULL || alloc == NULL || tree == NULL)
+ return PARSERUTILS_BADPARM;
+
+ t = alloc(NULL, sizeof(parserutils_rbtree), pw);
+ if (t == NULL)
+ return PARSERUTILS_NOMEM;
+
+ t->root = NULL;
+ t->cmp = cmp;
+ t->alloc = alloc;
+ t->pw = pw;
+
+ *tree = t;
+
+ return PARSERUTILS_OK;
}
/**
@@ -120,12 +125,13 @@
* \param tree The tree to destroy
* \param destructor Routine to be called with key/value pairs to destroy
* \param pw Pointer to client-specific private data
- */
-void parserutils_rbtree_destroy(parserutils_rbtree *tree,
+ * \return PARSERUTILS_OK on success, appropriate error otherwise
+ */
+parserutils_error parserutils_rbtree_destroy(parserutils_rbtree *tree,
parserutils_rbtree_del destructor, void *pw)
{
if (tree == NULL)
- return;
+ return PARSERUTILS_BADPARM;
while (tree->root != NULL) {
#ifndef USE_DELETEMAX
@@ -142,6 +148,8 @@
}
tree->alloc(tree, 0, tree->pw);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/utils/rbtree.h
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/utils/rbtree.h...
==============================================================================
--- trunk/libparserutils/src/utils/rbtree.h (original)
+++ trunk/libparserutils/src/utils/rbtree.h Sat Nov 8 17:08:30 2008
@@ -19,9 +19,9 @@
typedef void (*parserutils_rbtree_print)(const void *key, const void *value,
int depth);
-parserutils_rbtree *parserutils_rbtree_create(parserutils_rbtree_cmp cmp,
- parserutils_alloc alloc, void *pw);
-void parserutils_rbtree_destroy(parserutils_rbtree *tree,
+parserutils_error parserutils_rbtree_create(parserutils_rbtree_cmp cmp,
+ parserutils_alloc alloc, void *pw, parserutils_rbtree **tree);
+parserutils_error parserutils_rbtree_destroy(parserutils_rbtree *tree,
parserutils_rbtree_del destructor, void *pw);
parserutils_error parserutils_rbtree_insert(parserutils_rbtree *tree,
Modified: trunk/libparserutils/src/utils/stack.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/utils/stack.c?...
==============================================================================
--- trunk/libparserutils/src/utils/stack.c (original)
+++ trunk/libparserutils/src/utils/stack.c Sat Nov 8 17:08:30 2008
@@ -32,49 +32,57 @@
* \param chunk_size Number of stack slots in a chunk
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data
- * \return Pointer to stack instance, or NULL on memory exhaustion
+ * \param stack Pointer to location to receive stack instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters
+ * PARSERUTILS_NOMEM on memory exhaustion
*/
-parserutils_stack *parserutils_stack_create(size_t item_size, size_t chunk_size,
- parserutils_alloc alloc, void *pw)
+parserutils_error parserutils_stack_create(size_t item_size, size_t chunk_size,
+ parserutils_alloc alloc, void *pw, parserutils_stack **stack)
{
- parserutils_stack *stack;
+ parserutils_stack *s;
- if (item_size == 0 || chunk_size == 0 || alloc == NULL)
- return NULL;
+ if (item_size == 0 || chunk_size == 0 || alloc == NULL || stack == NULL)
+ return PARSERUTILS_BADPARM;
- stack = alloc(NULL, sizeof(parserutils_stack), pw);
- if (stack == NULL)
- return NULL;
+ s = alloc(NULL, sizeof(parserutils_stack), pw);
+ if (s == NULL)
+ return PARSERUTILS_NOMEM;
- stack->items = alloc(NULL, item_size * chunk_size, pw);
- if (stack->items == NULL) {
- alloc(stack, 0, pw);
- return NULL;
+ s->items = alloc(NULL, item_size * chunk_size, pw);
+ if (s->items == NULL) {
+ alloc(s, 0, pw);
+ return PARSERUTILS_NOMEM;
}
- stack->item_size = item_size;
- stack->chunk_size = chunk_size;
- stack->items_allocated = chunk_size;
- stack->current_item = -1;
+ s->item_size = item_size;
+ s->chunk_size = chunk_size;
+ s->items_allocated = chunk_size;
+ s->current_item = -1;
- stack->alloc = alloc;
- stack->pw = pw;
+ s->alloc = alloc;
+ s->pw = pw;
- return stack;
+ *stack = s;
+
+ return PARSERUTILS_OK;
}
/**
* Destroy a stack instance
*
* \param stack The stack to destroy
+ * \return PARSERUTILS_OK on success, appropriate error otherwise.
*/
-void parserutils_stack_destroy(parserutils_stack *stack)
+parserutils_error parserutils_stack_destroy(parserutils_stack *stack)
{
if (stack == NULL)
- return;
+ return PARSERUTILS_BADPARM;
stack->alloc(stack->items, 0, stack->pw);
stack->alloc(stack, 0, stack->pw);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/src/utils/vector.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/src/utils/vector.c...
==============================================================================
--- trunk/libparserutils/src/utils/vector.c (original)
+++ trunk/libparserutils/src/utils/vector.c Sat Nov 8 17:08:30 2008
@@ -32,49 +32,59 @@
* \param chunk_size Number of vector slots in a chunk
* \param alloc Memory (de)allocation function
* \param pw Pointer to client-specific private data
- * \return Pointer to vector instance, or NULL on memory exhaustion
- */
-parserutils_vector *parserutils_vector_create(size_t item_size,
- size_t chunk_size, parserutils_alloc alloc, void *pw)
-{
- parserutils_vector *vector;
-
- if (item_size == 0 || chunk_size == 0 || alloc == NULL)
- return NULL;
-
- vector = alloc(NULL, sizeof(parserutils_vector), pw);
+ * \param vector Pointer to location to receive vector instance
+ * \return PARSERUTILS_OK on success,
+ * PARSERUTILS_BADPARM on bad parameters,
+ * PARSERUTILS_NOMEM on memory exhaustion
+ */
+parserutils_error parserutils_vector_create(size_t item_size,
+ size_t chunk_size, parserutils_alloc alloc, void *pw,
+ parserutils_vector **vector)
+{
+ parserutils_vector *v;
+
+ if (item_size == 0 || chunk_size == 0 || alloc == NULL ||
+ vector == NULL)
+ return PARSERUTILS_BADPARM;
+
+ v = alloc(NULL, sizeof(parserutils_vector), pw);
+ if (v == NULL)
+ return PARSERUTILS_NOMEM;
+
+ v->items = alloc(NULL, item_size * chunk_size, pw);
+ if (v->items == NULL) {
+ alloc(v, 0, pw);
+ return PARSERUTILS_NOMEM;
+ }
+
+ v->item_size = item_size;
+ v->chunk_size = chunk_size;
+ v->items_allocated = chunk_size;
+ v->current_item = -1;
+
+ v->alloc = alloc;
+ v->pw = pw;
+
+ *vector = v;
+
+ return PARSERUTILS_OK;
+}
+
+/**
+ * Destroy a vector instance
+ *
+ * \param vector The vector to destroy
+ * \return PARSERUTILS_OK on success, appropriate error otherwise.
+ */
+parserutils_error parserutils_vector_destroy(parserutils_vector *vector)
+{
if (vector == NULL)
- return NULL;
-
- vector->items = alloc(NULL, item_size * chunk_size, pw);
- if (vector->items == NULL) {
- alloc(vector, 0, pw);
- return NULL;
- }
-
- vector->item_size = item_size;
- vector->chunk_size = chunk_size;
- vector->items_allocated = chunk_size;
- vector->current_item = -1;
-
- vector->alloc = alloc;
- vector->pw = pw;
-
- return vector;
-}
-
-/**
- * Destroy a vector instance
- *
- * \param vector The vector to destroy
- */
-void parserutils_vector_destroy(parserutils_vector *vector)
-{
- if (vector == NULL)
- return;
+ return PARSERUTILS_BADPARM;
vector->alloc(vector->items, 0, vector->pw);
vector->alloc(vector, 0, vector->pw);
+
+ return PARSERUTILS_OK;
}
/**
Modified: trunk/libparserutils/test/cscodec-8859.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/cscodec-8859....
==============================================================================
--- trunk/libparserutils/test/cscodec-8859.c (original)
+++ trunk/libparserutils/test/cscodec-8859.c Sat Nov 8 17:08:30 2008
@@ -40,6 +40,7 @@
int main(int argc, char **argv)
{
+ parserutils_charset_codec *codec;
line_ctx ctx;
if (argc != 3) {
@@ -51,7 +52,7 @@
PARSERUTILS_OK);
assert(parserutils_charset_codec_create("NATS-SEFI-ADD",
- myrealloc, NULL) == NULL);
+ myrealloc, NULL, &codec) == PARSERUTILS_BADENCODING);
ctx.buflen = parse_filesize(argv[2]);
if (ctx.buflen == 0)
@@ -178,9 +179,9 @@
memcpy(enc_name, enc, end - enc);
enc_name[end - enc] = 0;
- ctx->codec = parserutils_charset_codec_create(enc_name,
- myrealloc, NULL);
- assert(ctx->codec != NULL);
+ assert(parserutils_charset_codec_create(enc_name,
+ myrealloc, NULL, &ctx->codec) ==
+ PARSERUTILS_OK);
ctx->hadenc = true;
}
Modified: trunk/libparserutils/test/cscodec-ext8.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/cscodec-ext8....
==============================================================================
--- trunk/libparserutils/test/cscodec-ext8.c (original)
+++ trunk/libparserutils/test/cscodec-ext8.c Sat Nov 8 17:08:30 2008
@@ -40,6 +40,7 @@
int main(int argc, char **argv)
{
+ parserutils_charset_codec *codec;
line_ctx ctx;
if (argc != 3) {
@@ -51,7 +52,7 @@
PARSERUTILS_OK);
assert(parserutils_charset_codec_create("NATS-SEFI-ADD",
- myrealloc, NULL) == NULL);
+ myrealloc, NULL, &codec) == PARSERUTILS_BADENCODING);
ctx.buflen = parse_filesize(argv[2]);
if (ctx.buflen == 0)
@@ -178,9 +179,9 @@
memcpy(enc_name, enc, end - enc);
enc_name[end - enc] = 0;
- ctx->codec = parserutils_charset_codec_create(enc_name,
- myrealloc, NULL);
- assert(ctx->codec != NULL);
+ assert(parserutils_charset_codec_create(enc_name,
+ myrealloc, NULL, &ctx->codec) ==
+ PARSERUTILS_OK);
ctx->hadenc = true;
}
Modified: trunk/libparserutils/test/cscodec-utf16.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/cscodec-utf16...
==============================================================================
--- trunk/libparserutils/test/cscodec-utf16.c (original)
+++ trunk/libparserutils/test/cscodec-utf16.c Sat Nov 8 17:08:30 2008
@@ -43,6 +43,7 @@
int main(int argc, char **argv)
{
+ parserutils_charset_codec *codec;
line_ctx ctx;
if (argc != 3) {
@@ -54,10 +55,10 @@
PARSERUTILS_OK);
assert(parserutils_charset_codec_create("NATS-SEFI-ADD",
- myrealloc, NULL) == NULL);
-
- ctx.codec = parserutils_charset_codec_create("UTF-16", myrealloc, NULL);
- assert(ctx.codec != NULL);
+ myrealloc, NULL, &codec) == PARSERUTILS_BADENCODING);
+
+ assert(parserutils_charset_codec_create("UTF-16", myrealloc, NULL,
+ &ctx.codec) == PARSERUTILS_OK);
ctx.buflen = parse_filesize(argv[2]);
if (ctx.buflen == 0)
Modified: trunk/libparserutils/test/cscodec-utf8.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/cscodec-utf8....
==============================================================================
--- trunk/libparserutils/test/cscodec-utf8.c (original)
+++ trunk/libparserutils/test/cscodec-utf8.c Sat Nov 8 17:08:30 2008
@@ -38,6 +38,7 @@
int main(int argc, char **argv)
{
+ parserutils_charset_codec *codec;
line_ctx ctx;
if (argc != 3) {
@@ -49,10 +50,10 @@
PARSERUTILS_OK);
assert(parserutils_charset_codec_create("NATS-SEFI-ADD",
- myrealloc, NULL) == NULL);
-
- ctx.codec = parserutils_charset_codec_create("UTF-8", myrealloc, NULL);
- assert(ctx.codec != NULL);
+ myrealloc, NULL, &codec) == PARSERUTILS_BADENCODING);
+
+ assert(parserutils_charset_codec_create("UTF-8", myrealloc, NULL,
+ &ctx.codec) == PARSERUTILS_OK);
ctx.buflen = parse_filesize(argv[2]);
if (ctx.buflen == 0)
Modified: trunk/libparserutils/test/filter.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/filter.c?rev=...
==============================================================================
--- trunk/libparserutils/test/filter.c (original)
+++ trunk/libparserutils/test/filter.c Sat Nov 8 17:08:30 2008
@@ -37,8 +37,8 @@
PARSERUTILS_OK);
/* Create input filter */
- input = parserutils_filter_create("UTF-8", myrealloc, NULL);
- assert(input);
+ assert(parserutils_filter_create("UTF-8", myrealloc, NULL, &input) ==
+ PARSERUTILS_OK);
/* Convert filter to UTF-8 encoding */
params.encoding.name = "UTF-8";
Modified: trunk/libparserutils/test/inputstream.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/inputstream.c...
==============================================================================
--- trunk/libparserutils/test/inputstream.c (original)
+++ trunk/libparserutils/test/inputstream.c Sat Nov 8 17:08:30 2008
@@ -40,9 +40,8 @@
assert(parserutils_initialise(argv[1], myrealloc, NULL) ==
PARSERUTILS_OK);
- stream = parserutils_inputstream_create("UTF-8", 1, NULL,
- myrealloc, NULL);
- assert(stream != NULL);
+ assert(parserutils_inputstream_create("UTF-8", 1, NULL,
+ myrealloc, NULL, &stream) == PARSERUTILS_OK);
fp = fopen(argv[2], "rb");
if (fp == NULL) {
Modified: trunk/libparserutils/test/rbtree.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/rbtree.c?rev=...
==============================================================================
--- trunk/libparserutils/test/rbtree.c (original)
+++ trunk/libparserutils/test/rbtree.c Sat Nov 8 17:08:30 2008
@@ -25,8 +25,8 @@
UNUSED(argc);
UNUSED(argv);
- tree = parserutils_rbtree_create(mycmp, myrealloc, NULL);
- assert(tree != NULL);
+ assert(parserutils_rbtree_create(mycmp, myrealloc, NULL, &tree) ==
+ PARSERUTILS_OK);
#define N 40000
#define G 307
Modified: trunk/libparserutils/test/regression/cscodec-segv.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/regression/cs...
==============================================================================
--- trunk/libparserutils/test/regression/cscodec-segv.c (original)
+++ trunk/libparserutils/test/regression/cscodec-segv.c Sat Nov 8 17:08:30 2008
@@ -24,8 +24,8 @@
assert(parserutils_charset_initialise(argv[1], myrealloc, NULL) ==
PARSERUTILS_OK);
- codec = parserutils_charset_codec_create("UTF-8", myrealloc, NULL);
- assert(codec != NULL);
+ assert(parserutils_charset_codec_create("UTF-8", myrealloc, NULL,
+ &codec) == PARSERUTILS_OK);
parserutils_charset_codec_destroy(codec);
Modified: trunk/libparserutils/test/regression/filter-segv.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/regression/fi...
==============================================================================
--- trunk/libparserutils/test/regression/filter-segv.c (original)
+++ trunk/libparserutils/test/regression/filter-segv.c Sat Nov 8 17:08:30 2008
@@ -26,8 +26,8 @@
assert(parserutils_initialise(argv[1], myrealloc, NULL) ==
PARSERUTILS_OK);
- input = parserutils_filter_create("UTF-8", myrealloc, NULL);
- assert(input);
+ assert(parserutils_filter_create("UTF-8", myrealloc, NULL, &input) ==
+ PARSERUTILS_OK);
parserutils_filter_destroy(input);
Modified: trunk/libparserutils/test/regression/stream-nomem.c
URL: http://source.netsurf-browser.org/trunk/libparserutils/test/regression/st...
==============================================================================
--- trunk/libparserutils/test/regression/stream-nomem.c (original)
+++ trunk/libparserutils/test/regression/stream-nomem.c Sat Nov 8 17:08:30 2008
@@ -52,9 +52,8 @@
assert(parserutils_initialise(argv[1], myrealloc, NULL) ==
PARSERUTILS_OK);
- stream = parserutils_inputstream_create("UTF-8", 0,
- NULL, myrealloc, NULL);
- assert(stream != NULL);
+ assert(parserutils_inputstream_create("UTF-8", 0,
+ NULL, myrealloc, NULL, &stream) == PARSERUTILS_OK);
assert(parserutils_inputstream_append(stream,
input_buffer, BUFFER_SIZE) == PARSERUTILS_OK);
14 years, 2 months
r5651 chris_y - in /trunk/netsurf/amiga: fetch_file.c fetch_file.h filetype.c resources/AdBlock.css.info resources/default.css.info
by netsurf@semichrome.net
Author: chris_y
Date: Sat Nov 8 17:06:40 2008
New Revision: 5651
URL: http://source.netsurf-browser.org?rev=5651&view=rev
Log:
Local file handling improvements (fetch_file is incomplete and not being used yet)
filetype.c has been changed to get the MIME type of a file from the MIMETYPE tooltype
of the icon or default icon for the file. The install script will set the basic of
these, and icons for default.css and AdBlock.css have been added to ensure these
always return the correct MIME type.
If the MIMETYPE tooltype is not found, the code will use datatypes.library to identify
the file and make a guess as to what the MIME type is.
Added:
trunk/netsurf/amiga/fetch_file.c (with props)
trunk/netsurf/amiga/fetch_file.h (with props)
trunk/netsurf/amiga/resources/AdBlock.css.info (with props)
trunk/netsurf/amiga/resources/default.css.info (with props)
Modified:
trunk/netsurf/amiga/filetype.c
Added: trunk/netsurf/amiga/fetch_file.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/fetch_file.c?rev=56...
==============================================================================
--- trunk/netsurf/amiga/fetch_file.c (added)
+++ trunk/netsurf/amiga/fetch_file.c Sat Nov 8 17:06:40 2008
@@ -1,0 +1,193 @@
+/*
+ * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf.
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Fetching of data from a file (implementation).
+ */
+
+#include <string.h>
+#include "content/fetch.h"
+#include "utils/log.h"
+#include "utils/url.h"
+#include <proto/dos.h>
+#include <proto/exec.h>
+
+/** Information for a single fetch. */
+struct ami_file_fetch_info {
+ struct fetch *fetch_handle; /**< The fetch handle we're parented by. */
+ BPTR fh; /** File handle */
+ bool only_2xx; /**< Only HTTP 2xx responses acceptable. */
+ char *path;
+ char *url; /**< URL of this fetch. */
+};
+
+static bool ami_fetch_file_initialise(const char *scheme);
+static void ami_fetch_file_finalise(const char *scheme);
+static void * ami_fetch_file_setup(struct fetch *parent_fetch, const char *url,
+ bool only_2xx, const char *post_urlenc,
+ struct form_successful_control *post_multipart,
+ const char **headers);
+static bool ami_fetch_file_start(void *vfetch);
+static void ami_fetch_file_abort(void *vf);
+static void ami_fetch_file_free(void *f);
+static void ami_fetch_file_poll(const char *scheme_ignored);
+
+/**
+ * Initialise the fetcher.
+ *
+ * Must be called once before any other function.
+ */
+
+void ami_fetch_file_register(void)
+{
+ if (!fetch_add_fetcher("file",
+ ami_fetch_file_initialise,
+ ami_fetch_file_setup,
+ ami_fetch_file_start,
+ ami_fetch_file_abort,
+ ami_fetch_file_free,
+ ami_fetch_file_poll,
+ ami_fetch_file_finalise)) {
+ LOG(("Unable to register Amiga fetcher for file:"));
+ }
+}
+
+
+/**
+ * Initialise a cURL fetcher.
+ */
+
+bool ami_fetch_file_initialise(const char *scheme)
+{
+ LOG(("Initialise Amiga fetcher for %s", scheme));
+ return true; /* Always succeeds */
+}
+
+
+/**
+ * Finalise a cURL fetcher
+ */
+
+void ami_fetch_file_finalise(const char *scheme)
+{
+ LOG(("Finalise Amiga fetcher %s", scheme));
+}
+
+
+/**
+ * Start fetching data for the given URL.
+ *
+ * The function returns immediately. The fetch may be queued for later
+ * processing.
+ *
+ * A pointer to an opaque struct curl_fetch_info is returned, which can be passed to
+ * fetch_abort() to abort the fetch at any time. Returns 0 if memory is
+ * exhausted (or some other fatal error occurred).
+ *
+ * The caller must supply a callback function which is called when anything
+ * interesting happens. The callback function is first called with msg
+ * FETCH_TYPE, with the Content-Type header in data, then one or more times
+ * with FETCH_DATA with some data for the url, and finally with
+ * FETCH_FINISHED. Alternatively, FETCH_ERROR indicates an error occurred:
+ * data contains an error message. FETCH_REDIRECT may replace the FETCH_TYPE,
+ * FETCH_DATA, FETCH_FINISHED sequence if the server sends a replacement URL.
+ *
+ * Some private data can be passed as the last parameter to fetch_start, and
+ * callbacks will contain this.
+ */
+
+void * ami_fetch_file_setup(struct fetch *parent_fetch, const char *url,
+ bool only_2xx, const char *post_urlenc,
+ struct form_successful_control *post_multipart,
+ const char **headers)
+{
+ struct ami_file_fetch_info *fetch;
+
+ fetch = AllocVec(sizeof (*fetch),MEMF_PRIVATE | MEMF_CLEAR);
+ if (!fetch)
+ return 0;
+
+ fetch->fetch_handle = parent_fetch;
+
+ LOG(("fetch %p, url '%s'", fetch, url));
+
+ /* construct a new fetch structure */
+ fetch->fh = 0;
+ fetch->only_2xx = only_2xx;
+// fetch->url = strdup(url);
+ fetch->path = url_to_path(url);
+
+ return fetch;
+}
+
+
+/**
+ * Dispatch a single job
+ */
+bool ami_fetch_file_start(void *vfetch)
+{
+ struct ami_file_fetch_info *fetch = (struct ami_file_fetch_info*)vfetch;
+
+ fetch->fh = FOpen(fetch->path,MODE_OLDFILE,0);
+
+ if(fetch->fh) return true;
+ else return false;
+}
+
+void ami_fetch_file_abort(void *vf)
+{
+ struct ami_file_fetch_info *fetch = (struct ami_file_fetch_info*)vf;
+
+ if (fetch->fh) {
+ FClose(fetch->fh);
+ fetch->fh = 0;
+// f->abort = true;
+ } else {
+ fetch_remove_from_queues(fetch->fetch_handle);
+ fetch_free(fetch->fetch_handle);
+ }
+}
+
+
+/**
+ * Free a fetch structure and associated resources.
+ */
+
+void ami_fetch_file_free(void *vf)
+{
+ struct ami_file_fetch_info *fetch = (struct ami_file_fetch_info*)vf;
+
+ if(fetch->fh)
+ {
+ FClose(fetch->fh);
+ }
+
+ FreeVec(fetch);
+}
+
+
+/**
+ * Do some work on current fetches.
+ *
+ * Must be called regularly to make progress on fetches.
+ */
+
+void ami_fetch_file_poll(const char *scheme_ignored)
+{
+}
+
Propchange: trunk/netsurf/amiga/fetch_file.c
------------------------------------------------------------------------------
amiga:protection = ----rwed ---- ----
Propchange: trunk/netsurf/amiga/fetch_file.c
------------------------------------------------------------------------------
svn:executable = *
Added: trunk/netsurf/amiga/fetch_file.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/fetch_file.h?rev=56...
==============================================================================
--- trunk/netsurf/amiga/fetch_file.h (added)
+++ trunk/netsurf/amiga/fetch_file.h Sat Nov 8 17:06:40 2008
@@ -1,0 +1,27 @@
+/*
+ * Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
+ *
+ * This file is part of NetSurf.
+ *
+ * NetSurf is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * NetSurf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \file
+ * Fetching of data from a URL (Registration).
+ */
+
+#ifndef AMIGA_FETCH_FILE_H
+#define AMIGA_FETCH_FILE_H
+
+void ami_fetch_file_register(void);
+#endif
Propchange: trunk/netsurf/amiga/fetch_file.h
------------------------------------------------------------------------------
amiga:protection = ----rwed ---- ----
Propchange: trunk/netsurf/amiga/fetch_file.h
------------------------------------------------------------------------------
svn:executable = *
Modified: trunk/netsurf/amiga/filetype.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/filetype.c?rev=5651...
==============================================================================
--- trunk/netsurf/amiga/filetype.c (original)
+++ trunk/netsurf/amiga/filetype.c Sat Nov 8 17:06:40 2008
@@ -1,5 +1,4 @@
/*
- * Copyright 2003 James Bursa <bursa(a)users.sourceforge.net>
* Copyright 2008 Chris Young <chris(a)unsatisfactorysoftware.co.uk>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
@@ -22,6 +21,10 @@
#include "content/fetch.h"
#include "utils/log.h"
#include "utils/utils.h"
+#include <proto/icon.h>
+#include <proto/dos.h>
+#include <proto/datatypes.h>
+#include <workbench/icon.h>
/**
* filetype -- determine the MIME type of a local file
@@ -29,24 +32,67 @@
const char *fetch_filetype(const char *unix_path)
{
- int l;
- LOG(("unix path %s", unix_path));
- l = strlen(unix_path);
- if (2 < l && strcasecmp(unix_path + l - 3, "css") == 0)
- return "text/css";
- if (2 < l && strcasecmp(unix_path + l - 3, "jpg") == 0)
- return "image/jpeg";
- if (3 < l && strcasecmp(unix_path + l - 4, "jpeg") == 0)
- return "image/jpeg";
- if (2 < l && strcasecmp(unix_path + l - 3, "gif") == 0)
- return "image/gif";
- if (2 < l && strcasecmp(unix_path + l - 3, "png") == 0)
- return "image/png";
- if (2 < l && strcasecmp(unix_path + l - 3, "jng") == 0)
- return "image/jng";
- if (2 < l && strcasecmp(unix_path + l - 3, "svg") == 0)
- return "image/svg";
- return "text/html";
+ static char mimetype[20];
+ STRPTR ttype = NULL;
+ struct DiskObject *dobj = NULL;
+ BPTR lock = 0;
+ struct DataTypeHeader *dth;
+ struct DataType *dtn;
+
+ /* First try getting a tooltype "MIMETYPE" and use that as the MIME type. Will fail over
+ to default icons if the file doesn't have a real icon. */
+
+ if(dobj = GetIconTags(unix_path,ICONGETA_FailIfUnavailable,FALSE,
+ TAG_DONE))
+ {
+ ttype = FindToolType(dobj->do_ToolTypes, "MIMETYPE");
+ if(ttype) strcpy(mimetype,ttype);
+ FreeDiskObject(dobj);
+ }
+
+ if(!mimetype)
+ {
+ /* If that didn't work, have a go at guessing it using datatypes.library. This isn't
+ accurate - the base names differ from those used by MIME and it relies on the
+ user having a datatype installed which can handle the file. */
+
+ if (lock = Lock (unix_path, ACCESS_READ))
+ {
+ if (dtn = ObtainDataTypeA (DTST_FILE, (APTR)lock, NULL))
+ {
+ dth = dtn->dtn_Header;
+
+ switch(dth->dth_GroupID)
+ {
+ case GID_SYSTEM:
+ sprintf(mimetype,"application/%s",dth->dth_BaseName);
+ break;
+ case GID_TEXT:
+ case GID_DOCUMENT:
+ sprintf(mimetype,"text/%s",dth->dth_BaseName);
+ break;
+ case GID_SOUND:
+ case GID_INSTRUMENT:
+ case GID_MUSIC:
+ sprintf(mimetype,"audio/%s",dth->dth_BaseName);
+ break;
+ case GID_PICTURE:
+ sprintf(mimetype,"image/%s",dth->dth_BaseName);
+ break;
+ case GID_ANIMATION:
+ case GID_MOVIE:
+ sprintf(mimetype,"video/%s",dth->dth_BaseName);
+ break;
+ }
+ ReleaseDataType(dtn);
+ }
+ UnLock(lock);
+ }
+ }
+
+ if(!mimetype) strcpy(mimetype,"text/plain"); /* If all else fails */
+
+ return mimetype;
}
Added: trunk/netsurf/amiga/resources/AdBlock.css.info
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/resources/AdBlock.c...
==============================================================================
Binary file - no diff available.
Propchange: trunk/netsurf/amiga/resources/AdBlock.css.info
------------------------------------------------------------------------------
amiga:protection = ----rw-d ---- ----
Propchange: trunk/netsurf/amiga/resources/AdBlock.css.info
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
Added: trunk/netsurf/amiga/resources/default.css.info
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/resources/default.c...
==============================================================================
Binary file - no diff available.
Propchange: trunk/netsurf/amiga/resources/default.css.info
------------------------------------------------------------------------------
amiga:protection = ----rw-d ---- ----
Propchange: trunk/netsurf/amiga/resources/default.css.info
------------------------------------------------------------------------------
svn:mime-type = application/octet-stream
14 years, 2 months
r5650 chris_y - in /trunk/netsurf/amiga: dist/Rexx/GetVideo.nsrx gui.c options.h schedule.c
by netsurf@semichrome.net
Author: chris_y
Date: Mon Nov 3 13:21:40 2008
New Revision: 5650
URL: http://source.netsurf-browser.org?rev=5650&view=rev
Log:
Minor fixes, changing some defaults to safer values, screen_modeid should now work.
Added screen_depth to stop it complaining when trying to BestModeID() a 32-bit screen
on a system that doesn't have one.
Modified:
trunk/netsurf/amiga/dist/Rexx/GetVideo.nsrx
trunk/netsurf/amiga/gui.c
trunk/netsurf/amiga/options.h
trunk/netsurf/amiga/schedule.c
Modified: trunk/netsurf/amiga/dist/Rexx/GetVideo.nsrx
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/dist/Rexx/GetVideo....
==============================================================================
--- trunk/netsurf/amiga/dist/Rexx/GetVideo.nsrx (original)
+++ trunk/netsurf/amiga/dist/Rexx/GetVideo.nsrx Mon Nov 3 13:21:40 2008
@@ -19,8 +19,5 @@
/* This script launches getvideo.rexx (Aminet:comm/www/getvideo.lha) */
options results
-address netsurf
-
geturl
-
address REXX 'rexx:getvideo.rexx' result 'save "ram:"'
Modified: trunk/netsurf/amiga/gui.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/gui.c?rev=5650&r1=5...
==============================================================================
--- trunk/netsurf/amiga/gui.c (original)
+++ trunk/netsurf/amiga/gui.c Mon Nov 3 13:21:40 2008
@@ -421,15 +421,15 @@
if ((!option_homepage_url) || (option_homepage_url[0] == '\0'))
option_homepage_url = (char *)strdup(NETSURF_HOMEPAGE);
- if(option_modeid)
- {
- id = option_modeid;
+ if((option_modeid) && (option_modeid[0] != '\0'))
+ {
+ id = strtoul(option_modeid,NULL,0);
}
else
{
id = p96BestModeIDTags(P96BIDTAG_NominalWidth,option_window_screen_width,
P96BIDTAG_NominalHeight,option_window_screen_height,
- P96BIDTAG_Depth,32);
+ P96BIDTAG_Depth,option_screen_depth);
if(id == INVALID_ID) die(messages_get("NoMode"));
}
@@ -444,7 +444,7 @@
scrn = OpenScreenTags(NULL,
SA_Width,option_window_screen_width,
SA_Height,option_window_screen_height,
- SA_Depth,32,
+ SA_Depth,option_screen_depth,
SA_DisplayID,id,
SA_Title,nsscreentitle,
SA_LikeWorkbench,TRUE,
Modified: trunk/netsurf/amiga/options.h
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/options.h?rev=5650&...
==============================================================================
--- trunk/netsurf/amiga/options.h (original)
+++ trunk/netsurf/amiga/options.h Mon Nov 3 13:21:40 2008
@@ -24,7 +24,8 @@
extern char *option_url_file;
extern char *option_hotlist_file;
extern bool option_use_wb;
-extern int option_modeid;
+extern char *option_modeid;
+extern int option_screen_depth;
extern char *option_theme;
extern bool option_no_iframes;
extern bool option_utf8_clipboard;
@@ -44,14 +45,15 @@
char *option_url_file = 0; \
char *option_hotlist_file = 0; \
bool option_use_wb = false; \
-int option_modeid = 0; \
+char *option_modeid = 0; \
+int option_screen_depth = 16; \
char *option_theme = 0; \
bool option_no_iframes = false; \
bool option_utf8_clipboard = false; \
bool option_context_menu = true; \
bool option_sticky_context_menu = true; \
-bool option_truecolour_mouse_pointers = true; \
-bool option_use_os_pointers = false; \
+bool option_truecolour_mouse_pointers = false; \
+bool option_use_os_pointers = true; \
bool option_force_tabs = false; \
bool option_new_tab_active = false; \
bool option_kiosk_mode = false; \
@@ -64,7 +66,8 @@
{ "url_file", OPTION_STRING, &option_url_file }, \
{ "hotlist_file", OPTION_STRING, &option_hotlist_file }, \
{ "use_workbench", OPTION_BOOL, &option_use_wb}, \
-{ "screen_modeid", OPTION_INTEGER, &option_modeid}, \
+{ "screen_modeid", OPTION_STRING, &option_modeid}, \
+{ "screen_depth", OPTION_INTEGER, &option_screen_depth}, \
{ "theme", OPTION_STRING, &option_theme}, \
{ "no_iframes", OPTION_BOOL, &option_no_iframes}, \
{ "clipboard_write_utf8", OPTION_BOOL, &option_utf8_clipboard}, \
Modified: trunk/netsurf/amiga/schedule.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/schedule.c?rev=5650...
==============================================================================
--- trunk/netsurf/amiga/schedule.c (original)
+++ trunk/netsurf/amiga/schedule.c Mon Nov 3 13:21:40 2008
@@ -95,8 +95,10 @@
node = (struct nsObject *)GetHead((struct List *)schedule_list);
- while(nnode=(struct nsObject *)GetSucc((struct Node *)node))
+ do
{
+ nnode=(struct nsObject *)GetSucc((struct Node *)node);
+
nscb = node->objstruct;
if(!nscb) continue;
@@ -105,8 +107,8 @@
ami_remove_timer_event(nscb);
DelObject(node);
}
- node=nnode;
- }
+
+ }while (node=nnode);
}
/**
14 years, 2 months
r5649 chris_y - in /trunk/netsurf/amiga: bitmap.c clipboard.c gui.c hotlist.c login.c object.c schedule.c tree.c
by netsurf@semichrome.net
Author: chris_y
Date: Sat Nov 1 19:21:49 2008
New Revision: 5649
URL: http://source.netsurf-browser.org?rev=5649&view=rev
Log:
Change memory allocations to MEMF_PRIVATE to enable paging on OS4.1.
Modified:
trunk/netsurf/amiga/bitmap.c
trunk/netsurf/amiga/clipboard.c
trunk/netsurf/amiga/gui.c
trunk/netsurf/amiga/hotlist.c
trunk/netsurf/amiga/login.c
trunk/netsurf/amiga/object.c
trunk/netsurf/amiga/schedule.c
trunk/netsurf/amiga/tree.c
Modified: trunk/netsurf/amiga/bitmap.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/bitmap.c?rev=5649&r...
==============================================================================
--- trunk/netsurf/amiga/bitmap.c (original)
+++ trunk/netsurf/amiga/bitmap.c Sat Nov 1 19:21:49 2008
@@ -34,10 +34,10 @@
{
struct bitmap *bitmap;
- bitmap = AllocVec(sizeof(struct bitmap),MEMF_CLEAR);
+ bitmap = AllocVec(sizeof(struct bitmap),MEMF_PRIVATE | MEMF_CLEAR);
if(bitmap)
{
- bitmap->pixdata = AllocVec(width*height*4*2,MEMF_CLEAR);
+ bitmap->pixdata = AllocVec(width*height*4*2,MEMF_PRIVATE | MEMF_CLEAR);
bitmap->width = width;
bitmap->height = height;
}
Modified: trunk/netsurf/amiga/clipboard.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/clipboard.c?rev=564...
==============================================================================
--- trunk/netsurf/amiga/clipboard.c (original)
+++ trunk/netsurf/amiga/clipboard.c Sat Nov 1 19:21:49 2008
@@ -63,7 +63,7 @@
ULONG rlen=0,error;
struct CSet cset;
char *clip;
- STRPTR readbuf = AllocVec(1024,MEMF_CLEAR);
+ STRPTR readbuf = AllocVec(1024,MEMF_PRIVATE | MEMF_CLEAR);
cset.CodeSet = 0;
Modified: trunk/netsurf/amiga/gui.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/gui.c?rev=5649&r1=5...
==============================================================================
--- trunk/netsurf/amiga/gui.c (original)
+++ trunk/netsurf/amiga/gui.c Sat Nov 1 19:21:49 2008
@@ -138,7 +138,7 @@
"Resources/Pointers/Progress",
"Resources/Pointers/Blank"};
-void ami_update_throbber(struct gui_window_2 *g);
+void ami_update_throbber(struct gui_window_2 *g,bool redraw);
void ami_update_buttons(struct gui_window_2 *);
void ami_scroller_hook(struct Hook *,Object *,struct IntuiMessage *);
uint32 ami_popup_hook(struct Hook *hook,Object *item,APTR reserved);
@@ -368,7 +368,7 @@
NULL,RGBFB_A8R8G8B8))
{
struct RenderInfo ri;
- UBYTE *throbber_tempmem = AllocVec(throbber_bmh->bmh_Width*throbber_height*4,MEMF_CLEAR);
+ UBYTE *throbber_tempmem = AllocVec(throbber_bmh->bmh_Width*throbber_height*4,MEMF_PRIVATE | MEMF_CLEAR);
throbber_rp.BitMap = throbber;
ri.Memory = throbber_tempmem;
ri.BytesPerRow = 4*throbber_bmh->bmh_Width;
@@ -747,6 +747,8 @@
switch(node->Type)
{
case AMINS_WINDOW:
+ ami_update_throbber(gwin,true);
+ // fall through
case AMINS_FRAME:
GetAttr(SPACE_AreaBox,gwin->gadgets[GID_BROWSER],(ULONG *)&bbox);
browser_window_reformat(gwin->bw,bbox->Width,bbox->Height);
@@ -787,7 +789,7 @@
ami_do_redraw(gwin);
if(gwin->throbber_frame)
- ami_update_throbber(gwin);
+ ami_update_throbber(gwin,false);
if(node->Type == AMINS_WINDOW)
{
@@ -834,7 +836,7 @@
if(appwinargs = appmsg->am_ArgList)
{
- if(filename = AllocVec(1024,MEMF_CLEAR))
+ if(filename = AllocVec(1024,MEMF_PRIVATE | MEMF_CLEAR))
{
if(appwinargs->wa_Lock)
{
@@ -968,6 +970,7 @@
ami_handle_msg();
ami_handle_appmsg();
+ ami_arexx_handle();
}
void gui_poll(bool active)
@@ -1208,7 +1211,7 @@
}
- gwin = AllocVec(sizeof(struct gui_window),MEMF_CLEAR);
+ gwin = AllocVec(sizeof(struct gui_window),MEMF_PRIVATE | MEMF_CLEAR);
if(!gwin)
{
@@ -1253,7 +1256,7 @@
return gwin;
}
- gwin->shared = AllocVec(sizeof(struct gui_window_2),MEMF_CLEAR);
+ gwin->shared = AllocVec(sizeof(struct gui_window_2),MEMF_PRIVATE | MEMF_CLEAR);
if(!gwin->shared)
{
@@ -1580,8 +1583,8 @@
gwin->shared->layerinfo = NewLayerInfo();
gwin->shared->rp.Layer = CreateUpfrontLayer(gwin->shared->layerinfo,gwin->shared->bm,0,0,scrn->Width-1,scrn->Height-1,0,NULL);
- gwin->shared->areabuf = AllocVec(100,MEMF_CLEAR);
- gwin->shared->rp.AreaInfo = AllocVec(sizeof(struct AreaInfo),MEMF_CLEAR);
+ gwin->shared->areabuf = AllocVec(100,MEMF_PRIVATE | MEMF_CLEAR);
+ gwin->shared->rp.AreaInfo = AllocVec(sizeof(struct AreaInfo),MEMF_PRIVATE | MEMF_CLEAR);
if((!gwin->shared->areabuf) || (!gwin->shared->rp.AreaInfo))
{
@@ -1591,8 +1594,8 @@
}
InitArea(gwin->shared->rp.AreaInfo,gwin->shared->areabuf,100/5);
- gwin->shared->rp.TmpRas = AllocVec(sizeof(struct TmpRas),MEMF_CLEAR);
- gwin->shared->tmprasbuf = AllocVec(scrn->Width*scrn->Height,MEMF_CLEAR);
+ gwin->shared->rp.TmpRas = AllocVec(sizeof(struct TmpRas),MEMF_PRIVATE | MEMF_CLEAR);
+ gwin->shared->tmprasbuf = AllocVec(scrn->Width*scrn->Height,MEMF_PRIVATE | MEMF_CLEAR);
if((!gwin->shared->tmprasbuf) || (!gwin->shared->rp.TmpRas))
{
@@ -2159,10 +2162,10 @@
if(ptrfile = Open(ptrs[i],MODE_OLDFILE))
{
int mx,my;
- UBYTE *pprefsbuf = AllocVec(1061,MEMF_CLEAR);
+ UBYTE *pprefsbuf = AllocVec(1061,MEMF_PRIVATE | MEMF_CLEAR);
Read(ptrfile,pprefsbuf,1061);
- mouseptrbm[i]=AllocVec(sizeof(struct BitMap),MEMF_CLEAR);
+ mouseptrbm[i]=AllocVec(sizeof(struct BitMap),MEMF_PRIVATE | MEMF_CLEAR);
InitBitMap(mouseptrbm[i],2,32,32);
mouseptrbm[i]->Planes[0] = AllocRaster(32,32);
mouseptrbm[i]->Planes[1] = AllocRaster(32,32);
@@ -2233,25 +2236,29 @@
g->shared->throbber_frame = 0;
}
-void ami_update_throbber(struct gui_window_2 *g)
+void ami_update_throbber(struct gui_window_2 *g,bool redraw)
{
struct IBox *bbox;
if(!g->gadgets[GID_THROBBER]) return;
- if(g->throbber_update_count < 1000)
- {
- g->throbber_update_count++;
- return;
- }
-
- g->throbber_update_count = 0;
+ if(!redraw)
+ {
+ if(g->throbber_update_count < 1000)
+ {
+ g->throbber_update_count++;
+ return;
+ }
+
+ g->throbber_update_count = 0;
+
+ g->throbber_frame++;
+ if(g->throbber_frame > (throbber_frames-1))
+ g->throbber_frame=1;
+
+ }
GetAttr(SPACE_AreaBox,g->gadgets[GID_THROBBER],(ULONG *)&bbox);
-
- g->throbber_frame++;
- if(g->throbber_frame > (throbber_frames-1))
- g->throbber_frame=1;
BltBitMapRastPort(throbber,throbber_width*g->throbber_frame,0,g->win->RPort,bbox->Left,bbox->Top,throbber_width,throbber_height,0x0C0);
}
@@ -2346,7 +2353,7 @@
}
else return NULL;
- dw = AllocVec(sizeof(struct gui_download_window),MEMF_CLEAR);
+ dw = AllocVec(sizeof(struct gui_download_window),MEMF_PRIVATE | MEMF_CLEAR);
dw->size = total_size;
dw->downloaded = 0;
Modified: trunk/netsurf/amiga/hotlist.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/hotlist.c?rev=5649&...
==============================================================================
--- trunk/netsurf/amiga/hotlist.c (original)
+++ trunk/netsurf/amiga/hotlist.c Sat Nov 1 19:21:49 2008
@@ -84,7 +84,7 @@
int i;
const struct url_data *data;
- *hotlist = AllocVec(sizeof(struct tree),MEMF_CLEAR);
+ *hotlist = AllocVec(sizeof(struct tree),MEMF_PRIVATE | MEMF_CLEAR);
hotlist_tree = *hotlist;
if (!hotlist_tree) {
Modified: trunk/netsurf/amiga/login.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/login.c?rev=5649&r1...
==============================================================================
--- trunk/netsurf/amiga/login.c (original)
+++ trunk/netsurf/amiga/login.c Sat Nov 1 19:21:49 2008
@@ -42,7 +42,7 @@
void gui_401login_open(struct browser_window *bw, struct content *c,
const char *realm)
{
- struct gui_login_window *lw = AllocVec(sizeof(struct gui_login_window),MEMF_CLEAR);
+ struct gui_login_window *lw = AllocVec(sizeof(struct gui_login_window),MEMF_PRIVATE | MEMF_CLEAR);
char *host;
url_host(c->url, &host);
Modified: trunk/netsurf/amiga/object.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/object.c?rev=5649&r...
==============================================================================
--- trunk/netsurf/amiga/object.c (original)
+++ trunk/netsurf/amiga/object.c Sat Nov 1 19:21:49 2008
@@ -27,7 +27,7 @@
struct MinList *objlist;
- objlist = (struct MinList *)AllocVec(sizeof(struct MinList),MEMF_CLEAR);
+ objlist = (struct MinList *)AllocVec(sizeof(struct MinList),MEMF_PRIVATE | MEMF_CLEAR);
NewMinList(objlist);
@@ -39,7 +39,7 @@
{
struct nsObject *dtzo;
- dtzo = (struct nsObject *)AllocVec(sizeof(struct nsObject),MEMF_CLEAR);
+ dtzo = (struct nsObject *)AllocVec(sizeof(struct nsObject),MEMF_PRIVATE | MEMF_CLEAR);
AddTail((struct List *)objlist,(struct Node *)dtzo);
Modified: trunk/netsurf/amiga/schedule.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/schedule.c?rev=5649...
==============================================================================
--- trunk/netsurf/amiga/schedule.c (original)
+++ trunk/netsurf/amiga/schedule.c Sat Nov 1 19:21:49 2008
@@ -42,7 +42,7 @@
if(!obj) return;
obj->objstruct_size = sizeof(struct nscallback);
- obj->objstruct = AllocVec(obj->objstruct_size,MEMF_CLEAR);
+ obj->objstruct = AllocVec(obj->objstruct_size,MEMF_PRIVATE | MEMF_CLEAR);
if(!obj->objstruct)
{
DelObject(obj);
@@ -63,7 +63,7 @@
GetSysTime(&tv);
AddTime(&nscb->tv,&tv); // now contains time when event occurs
#ifdef AMI_SCHEDULER_USES_TIMER
- if(nscb->treq = AllocVec(sizeof(struct timerequest),MEMF_CLEAR))
+ if(nscb->treq = AllocVec(sizeof(struct timerequest),MEMF_PRIVATE | MEMF_CLEAR))
{
*nscb->treq = *tioreq;
nscb->treq->tr_node.io_Command=TR_ADDREQUEST;
@@ -95,10 +95,8 @@
node = (struct nsObject *)GetHead((struct List *)schedule_list);
- do
+ while(nnode=(struct nsObject *)GetSucc((struct Node *)node))
{
- nnode=(struct nsObject *)GetSucc((struct Node *)node);
-
nscb = node->objstruct;
if(!nscb) continue;
@@ -107,7 +105,8 @@
ami_remove_timer_event(nscb);
DelObject(node);
}
- } while(node=nnode);
+ node=nnode;
+ }
}
/**
Modified: trunk/netsurf/amiga/tree.c
URL: http://source.netsurf-browser.org/trunk/netsurf/amiga/tree.c?rev=5649&r1=...
==============================================================================
--- trunk/netsurf/amiga/tree.c (original)
+++ trunk/netsurf/amiga/tree.c Sat Nov 1 19:21:49 2008
@@ -201,8 +201,8 @@
return;
}
- twin = AllocVec(sizeof(struct treeview_window),MEMF_CLEAR);
- twin->listbrowser_list = AllocVec(sizeof(struct List),MEMF_CLEAR);
+ twin = AllocVec(sizeof(struct treeview_window),MEMF_PRIVATE | MEMF_CLEAR);
+ twin->listbrowser_list = AllocVec(sizeof(struct List),MEMF_PRIVATE | MEMF_CLEAR);
static struct ColumnInfo columninfo[] =
{
14 years, 2 months