From 2a4afa22b11f6ac5f2dcb6a50386966db8de6a3f Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Sun, 15 Jan 2006 18:06:44 +0100 Subject: [PATCH 001/204] Minor simplification --- doc/tools/code2doc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/doc/tools/code2doc b/doc/tools/code2doc index 6513ffe7..f91ef8fd 100755 --- a/doc/tools/code2doc +++ b/doc/tools/code2doc @@ -21,14 +21,12 @@ usage($HELP) if $opt_h or @ARGV < 1; sub put_section { if ($title) { print "\n$title\n"; - $_ = $title; - s/[^-]/-/g; - print "$_\n" if not $indent; + $title =~ s/[^-]/-/g; + print "$title\n" if not $indent; } if ($body) { - $_ = $body; - s/#newline#/$indent/g; - print "$_\n"; + $body =~ s/#newline#/$indent/g; + print "$body\n"; } $title = $body = undef; } From 2748d043f9f88dc8a37acc2215383c8b20dbb713 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Sun, 15 Jan 2006 18:37:34 +0100 Subject: [PATCH 002/204] Autogenerate .vimrc files and put the master in config/vimrc This changes the init target to be idempotent: most importantly it will now never overwrite a Makefile if it exists. Additionally 'make init' will generate the .vimrc files. Yay, no more stupid 'added fairies' commits! ;) --- .gitignore | 1 + Makefile.lib | 11 ++++++++--- config/.vimrc | 2 -- config/m4/.vimrc | 2 -- .vimrc => config/vimrc | 2 ++ configure.in | 2 +- debian/.vimrc | 2 -- doc/.vimrc | 2 -- doc/man/.vimrc | 2 -- doc/man/man1/.vimrc | 2 -- doc/man/man5/.vimrc | 2 -- doc/tools/.vimrc | 2 -- po/.vimrc | 2 -- src/.vimrc | 2 -- src/bfu/.vimrc | 2 -- src/bookmarks/.vimrc | 2 -- src/bookmarks/backend/.vimrc | 2 -- src/cache/.vimrc | 2 -- src/config/.vimrc | 2 -- src/cookies/.vimrc | 2 -- src/dialogs/.vimrc | 2 -- src/document/.vimrc | 2 -- src/document/css/.vimrc | 2 -- src/document/dom/.vimrc | 2 -- src/document/html/.vimrc | 2 -- src/document/html/parser/.vimrc | 2 -- src/document/plain/.vimrc | 2 -- src/dom/.vimrc | 2 -- src/dom/css/.vimrc | 2 -- src/dom/sgml/.vimrc | 2 -- src/dom/sgml/docbook/.vimrc | 2 -- src/dom/test/.vimrc | 2 -- src/ecmascript/.vimrc | 2 -- src/ecmascript/spidermonkey/.vimrc | 2 -- src/encoding/.vimrc | 2 -- src/formhist/.vimrc | 2 -- src/globhist/.vimrc | 2 -- src/intl/.vimrc | 2 -- src/intl/gettext/.vimrc | 2 -- src/main/.vimrc | 2 -- src/mime/.vimrc | 2 -- src/mime/backend/.vimrc | 2 -- src/network/.vimrc | 2 -- src/network/ssl/.vimrc | 2 -- src/osdep/.vimrc | 2 -- src/osdep/beos/.vimrc | 2 -- src/osdep/os2/.vimrc | 2 -- src/osdep/riscos/.vimrc | 2 -- src/osdep/unix/.vimrc | 2 -- src/osdep/win32/.vimrc | 2 -- src/protocol/.vimrc | 2 -- src/protocol/auth/.vimrc | 2 -- src/protocol/bittorrent/.vimrc | 2 -- src/protocol/file/.vimrc | 2 -- src/protocol/finger/.vimrc | 2 -- src/protocol/ftp/.vimrc | 2 -- src/protocol/gopher/.vimrc | 2 -- src/protocol/http/.vimrc | 2 -- src/protocol/nntp/.vimrc | 2 -- src/protocol/rewrite/.vimrc | 2 -- src/protocol/smb/.vimrc | 2 -- src/scripting/.vimrc | 2 -- src/scripting/guile/.vimrc | 2 -- src/scripting/lua/.vimrc | 2 -- src/scripting/perl/.vimrc | 2 -- src/scripting/python/.vimrc | 2 -- src/scripting/ruby/.vimrc | 2 -- src/session/.vimrc | 2 -- src/terminal/.vimrc | 2 -- src/util/.vimrc | 2 -- src/viewer/.vimrc | 2 -- src/viewer/dump/.vimrc | 2 -- src/viewer/text/.vimrc | 2 -- 73 files changed, 12 insertions(+), 142 deletions(-) delete mode 100644 config/.vimrc delete mode 100644 config/m4/.vimrc rename .vimrc => config/vimrc (70%) delete mode 100644 debian/.vimrc delete mode 100644 doc/.vimrc delete mode 100644 doc/man/.vimrc delete mode 100644 doc/man/man1/.vimrc delete mode 100644 doc/man/man5/.vimrc delete mode 100644 doc/tools/.vimrc delete mode 100644 po/.vimrc delete mode 100644 src/.vimrc delete mode 100644 src/bfu/.vimrc delete mode 100644 src/bookmarks/.vimrc delete mode 100644 src/bookmarks/backend/.vimrc delete mode 100644 src/cache/.vimrc delete mode 100644 src/config/.vimrc delete mode 100644 src/cookies/.vimrc delete mode 100644 src/dialogs/.vimrc delete mode 100644 src/document/.vimrc delete mode 100644 src/document/css/.vimrc delete mode 100644 src/document/dom/.vimrc delete mode 100644 src/document/html/.vimrc delete mode 100644 src/document/html/parser/.vimrc delete mode 100644 src/document/plain/.vimrc delete mode 100644 src/dom/.vimrc delete mode 100644 src/dom/css/.vimrc delete mode 100644 src/dom/sgml/.vimrc delete mode 100644 src/dom/sgml/docbook/.vimrc delete mode 100644 src/dom/test/.vimrc delete mode 100644 src/ecmascript/.vimrc delete mode 100644 src/ecmascript/spidermonkey/.vimrc delete mode 100644 src/encoding/.vimrc delete mode 100644 src/formhist/.vimrc delete mode 100644 src/globhist/.vimrc delete mode 100644 src/intl/.vimrc delete mode 100644 src/intl/gettext/.vimrc delete mode 100644 src/main/.vimrc delete mode 100644 src/mime/.vimrc delete mode 100644 src/mime/backend/.vimrc delete mode 100644 src/network/.vimrc delete mode 100644 src/network/ssl/.vimrc delete mode 100644 src/osdep/.vimrc delete mode 100644 src/osdep/beos/.vimrc delete mode 100644 src/osdep/os2/.vimrc delete mode 100644 src/osdep/riscos/.vimrc delete mode 100644 src/osdep/unix/.vimrc delete mode 100644 src/osdep/win32/.vimrc delete mode 100644 src/protocol/.vimrc delete mode 100644 src/protocol/auth/.vimrc delete mode 100644 src/protocol/bittorrent/.vimrc delete mode 100644 src/protocol/file/.vimrc delete mode 100644 src/protocol/finger/.vimrc delete mode 100644 src/protocol/ftp/.vimrc delete mode 100644 src/protocol/gopher/.vimrc delete mode 100644 src/protocol/http/.vimrc delete mode 100644 src/protocol/nntp/.vimrc delete mode 100644 src/protocol/rewrite/.vimrc delete mode 100644 src/protocol/smb/.vimrc delete mode 100644 src/scripting/.vimrc delete mode 100644 src/scripting/guile/.vimrc delete mode 100644 src/scripting/lua/.vimrc delete mode 100644 src/scripting/perl/.vimrc delete mode 100644 src/scripting/python/.vimrc delete mode 100644 src/scripting/ruby/.vimrc delete mode 100644 src/session/.vimrc delete mode 100644 src/terminal/.vimrc delete mode 100644 src/util/.vimrc delete mode 100644 src/viewer/.vimrc delete mode 100644 src/viewer/dump/.vimrc delete mode 100644 src/viewer/text/.vimrc diff --git a/.gitignore b/.gitignore index 91840605..0d2802bd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ depcomp autom4te.cache stamp-h1 .deps +.vimrc elinks *.swp *.patch diff --git a/Makefile.lib b/Makefile.lib index b6c124af..8e2f90fe 100644 --- a/Makefile.lib +++ b/Makefile.lib @@ -78,9 +78,10 @@ INCLUDE_ALL=1 endif ifneq ($(findstring init,$(MAKECMDGOALS)),) -# FIXME: Detect when $(subdir)/Makefile is $(srcdir)/$(subdir)/Makefile -# and error out so the user won't overwrite the 'master' Makefiles. INCLUDE_ALL=1 +ifndef SRC +SRC = $(shell cd $(top_srcdir) && pwd) +endif endif ifdef INCLUDE_ALL @@ -131,9 +132,13 @@ all-default: $(OBJS) $(PROGS) $(MAN1) $(MAN5) init-recursive: init-default init-default: + @{ echo ':set runtimepath+=.'; \ + echo ':runtime $(SRC)/config/vimrc'; \ + } > .vimrc @$(foreach subdir,$(sort $(SUBDIRS)), \ $(MKINSTALLDIRS) $(subdir) >/dev/null; \ - echo 'include $(SRC)/$(RELPATH)/$(subdir)/Makefile' > $(subdir)/Makefile;) + test -e "$(subdir)/Makefile" \ + || echo 'include $(SRC)/$(RELPATH)/$(subdir)/Makefile' > $(subdir)/Makefile;) clean-default cleanall-default: @-test -z "$(CLEAN)" || $(RM) $(CLEAN) diff --git a/config/.vimrc b/config/.vimrc deleted file mode 100644 index b9796ce1..00000000 --- a/config/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../.vimrc diff --git a/config/m4/.vimrc b/config/m4/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/config/m4/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/.vimrc b/config/vimrc similarity index 70% rename from .vimrc rename to config/vimrc index 5b83db24..59c5edc2 100644 --- a/.vimrc +++ b/config/vimrc @@ -1,3 +1,5 @@ +" Master vimrc file for the ELinks project + :set shiftwidth=8 :set tabstop=8 :set softtabstop=0 diff --git a/configure.in b/configure.in index ea911848..616b305a 100644 --- a/configure.in +++ b/configure.in @@ -1348,9 +1348,9 @@ abs_srcdir="$(cd "$srcdir" && pwd)" # builddir is always absolute! if test "$abs_srcdir" != "$builddir"; then echo "include $abs_srcdir/Makefile" > "$builddir/Makefile" - "$MAKE" "SRC=$abs_srcdir" init fi +"$MAKE" "SRC=$abs_srcdir" init dnl =================================================================== dnl Configuration summary diff --git a/debian/.vimrc b/debian/.vimrc deleted file mode 100644 index b9796ce1..00000000 --- a/debian/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../.vimrc diff --git a/doc/.vimrc b/doc/.vimrc deleted file mode 100644 index b9796ce1..00000000 --- a/doc/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../.vimrc diff --git a/doc/man/.vimrc b/doc/man/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/doc/man/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/doc/man/man1/.vimrc b/doc/man/man1/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/doc/man/man1/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/doc/man/man5/.vimrc b/doc/man/man5/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/doc/man/man5/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/doc/tools/.vimrc b/doc/tools/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/doc/tools/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/po/.vimrc b/po/.vimrc deleted file mode 100644 index b9796ce1..00000000 --- a/po/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../.vimrc diff --git a/src/.vimrc b/src/.vimrc deleted file mode 100644 index b9796ce1..00000000 --- a/src/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../.vimrc diff --git a/src/bfu/.vimrc b/src/bfu/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/bfu/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/bookmarks/.vimrc b/src/bookmarks/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/bookmarks/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/bookmarks/backend/.vimrc b/src/bookmarks/backend/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/bookmarks/backend/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/cache/.vimrc b/src/cache/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/cache/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/config/.vimrc b/src/config/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/config/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/cookies/.vimrc b/src/cookies/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/cookies/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/dialogs/.vimrc b/src/dialogs/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/dialogs/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/document/.vimrc b/src/document/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/document/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/document/css/.vimrc b/src/document/css/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/document/css/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/document/dom/.vimrc b/src/document/dom/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/document/dom/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/document/html/.vimrc b/src/document/html/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/document/html/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/document/html/parser/.vimrc b/src/document/html/parser/.vimrc deleted file mode 100644 index be903491..00000000 --- a/src/document/html/parser/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../../.vimrc diff --git a/src/document/plain/.vimrc b/src/document/plain/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/document/plain/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/dom/.vimrc b/src/dom/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/dom/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/dom/css/.vimrc b/src/dom/css/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/dom/css/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/dom/sgml/.vimrc b/src/dom/sgml/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/dom/sgml/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/dom/sgml/docbook/.vimrc b/src/dom/sgml/docbook/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/dom/sgml/docbook/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/dom/test/.vimrc b/src/dom/test/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/dom/test/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/ecmascript/.vimrc b/src/ecmascript/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/ecmascript/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/ecmascript/spidermonkey/.vimrc b/src/ecmascript/spidermonkey/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/ecmascript/spidermonkey/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/encoding/.vimrc b/src/encoding/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/encoding/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/formhist/.vimrc b/src/formhist/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/formhist/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/globhist/.vimrc b/src/globhist/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/globhist/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/intl/.vimrc b/src/intl/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/intl/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/intl/gettext/.vimrc b/src/intl/gettext/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/intl/gettext/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/main/.vimrc b/src/main/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/main/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/mime/.vimrc b/src/mime/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/mime/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/mime/backend/.vimrc b/src/mime/backend/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/mime/backend/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/network/.vimrc b/src/network/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/network/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/network/ssl/.vimrc b/src/network/ssl/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/network/ssl/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/osdep/.vimrc b/src/osdep/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/osdep/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/osdep/beos/.vimrc b/src/osdep/beos/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/osdep/beos/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/osdep/os2/.vimrc b/src/osdep/os2/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/osdep/os2/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/osdep/riscos/.vimrc b/src/osdep/riscos/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/osdep/riscos/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/osdep/unix/.vimrc b/src/osdep/unix/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/osdep/unix/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/osdep/win32/.vimrc b/src/osdep/win32/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/osdep/win32/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/.vimrc b/src/protocol/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/protocol/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/protocol/auth/.vimrc b/src/protocol/auth/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/auth/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/bittorrent/.vimrc b/src/protocol/bittorrent/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/bittorrent/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/file/.vimrc b/src/protocol/file/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/file/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/finger/.vimrc b/src/protocol/finger/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/finger/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/ftp/.vimrc b/src/protocol/ftp/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/ftp/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/gopher/.vimrc b/src/protocol/gopher/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/gopher/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/http/.vimrc b/src/protocol/http/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/http/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/nntp/.vimrc b/src/protocol/nntp/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/nntp/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/rewrite/.vimrc b/src/protocol/rewrite/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/rewrite/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/protocol/smb/.vimrc b/src/protocol/smb/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/protocol/smb/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/scripting/.vimrc b/src/scripting/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/scripting/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/scripting/guile/.vimrc b/src/scripting/guile/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/scripting/guile/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/scripting/lua/.vimrc b/src/scripting/lua/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/scripting/lua/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/scripting/perl/.vimrc b/src/scripting/perl/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/scripting/perl/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/scripting/python/.vimrc b/src/scripting/python/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/scripting/python/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/scripting/ruby/.vimrc b/src/scripting/ruby/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/scripting/ruby/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/session/.vimrc b/src/session/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/session/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/terminal/.vimrc b/src/terminal/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/terminal/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/util/.vimrc b/src/util/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/util/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/viewer/.vimrc b/src/viewer/.vimrc deleted file mode 100644 index 284fcf0e..00000000 --- a/src/viewer/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../.vimrc diff --git a/src/viewer/dump/.vimrc b/src/viewer/dump/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/viewer/dump/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/viewer/text/.vimrc b/src/viewer/text/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/viewer/text/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc From 943f9d7185f4ab723e56afeb426464b30a909570 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Sun, 15 Jan 2006 18:49:44 +0100 Subject: [PATCH 003/204] Create .gitignore file when builddir != srcdir ... so that cg-status will not list files in the builddir when it is embedded in the srcdir. --- configure.in | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.in b/configure.in index 616b305a..cd1cda3f 100644 --- a/configure.in +++ b/configure.in @@ -1347,7 +1347,10 @@ AC_OUTPUT([ \ abs_srcdir="$(cd "$srcdir" && pwd)" # builddir is always absolute! if test "$abs_srcdir" != "$builddir"; then + # Bootstrap the Makefile creation echo "include $abs_srcdir/Makefile" > "$builddir/Makefile" + # Make cg-status ignore this build directory + echo "*" > "$builddir/.gitignore" fi "$MAKE" "SRC=$abs_srcdir" init From 6deb090b48a74c449dccbaccb7fa2e1f6c81b260 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Sun, 15 Jan 2006 19:14:10 +0100 Subject: [PATCH 004/204] Blast some more .vimrc files which for some strange reason was uncommitable --- src/terminal/graphics/.vimrc | 2 -- src/terminal/text/.vimrc | 2 -- src/viewer/graphics/.vimrc | 2 -- 3 files changed, 6 deletions(-) delete mode 100644 src/terminal/graphics/.vimrc delete mode 100644 src/terminal/text/.vimrc delete mode 100644 src/viewer/graphics/.vimrc diff --git a/src/terminal/graphics/.vimrc b/src/terminal/graphics/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/terminal/graphics/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/terminal/text/.vimrc b/src/terminal/text/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/terminal/text/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc diff --git a/src/viewer/graphics/.vimrc b/src/viewer/graphics/.vimrc deleted file mode 100644 index 18f65e47..00000000 --- a/src/viewer/graphics/.vimrc +++ /dev/null @@ -1,2 +0,0 @@ -:set runtimepath+=. -:runtime ../../../.vimrc From becf3b42abb7a931574768656b733025087d67df Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Sun, 15 Jan 2006 22:23:39 +0100 Subject: [PATCH 005/204] Create .vimrc files both during all and init Then make init doesn't have to always be run by configure. --- Makefile.lib | 11 ++++++----- configure.in | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Makefile.lib b/Makefile.lib index 8e2f90fe..fc7a40a2 100644 --- a/Makefile.lib +++ b/Makefile.lib @@ -126,15 +126,12 @@ CLEAN += $(PROG) $(OBJS) ############################################################################# # The main default rules -all-default: $(OBJS) $(PROGS) $(MAN1) $(MAN5) +all-default: $(OBJS) $(PROGS) $(MAN1) $(MAN5) .vimrc # Ensure that Makefiles in subdirs are created before we recursive into them init-recursive: init-default -init-default: - @{ echo ':set runtimepath+=.'; \ - echo ':runtime $(SRC)/config/vimrc'; \ - } > .vimrc +init-default: .vimrc @$(foreach subdir,$(sort $(SUBDIRS)), \ $(MKINSTALLDIRS) $(subdir) >/dev/null; \ test -e "$(subdir)/Makefile" \ @@ -166,6 +163,10 @@ ifdef MAN5 $(call ncmd,installdata,$(file),$(DESTDIR)$(mandir)/man5);) endif +.vimrc: $(top_srcdir)/Makefile.lib + @{ echo ':set runtimepath+=.'; \ + echo ':runtime $(top_srcdir)/config/vimrc'; \ + } > .vimrc ############################################################################## # Auto-testing infrastructure diff --git a/configure.in b/configure.in index cd1cda3f..e70b85e4 100644 --- a/configure.in +++ b/configure.in @@ -1349,12 +1349,12 @@ abs_srcdir="$(cd "$srcdir" && pwd)" if test "$abs_srcdir" != "$builddir"; then # Bootstrap the Makefile creation echo "include $abs_srcdir/Makefile" > "$builddir/Makefile" + "$MAKE" "SRC=$abs_srcdir" init + # Make cg-status ignore this build directory echo "*" > "$builddir/.gitignore" fi -"$MAKE" "SRC=$abs_srcdir" init - dnl =================================================================== dnl Configuration summary dnl =================================================================== From a892c84601fe7db59a072bc9c3e059b5cba3c097 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 00:18:39 +0100 Subject: [PATCH 006/204] Make it possible to build all-docs when $(builddir) != $(srcdir) --- doc/Makefile | 25 +++++++++++++++---------- doc/elinks.1.txt | 2 +- doc/elinks.conf.5.txt | 2 +- doc/elinkskeys.5.txt | 4 ++-- doc/installation.txt | 2 +- doc/tools/conf2doc | 3 ++- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index a421fb48..f5edabb2 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -12,6 +12,9 @@ docdir = $(datadir)/doc HTML_DIR = $(DESTDIR)$(docdir)/$(PACKAGE)/html PDF_DIR = $(DESTDIR)$(docdir)/$(PACKAGE)/pdf +ASCIIDOC_CONF = $(srcdir)asciidoc.conf +ASCIIDOC_FLAGS = -f $(ASCIIDOC_CONF) -a "builddir=$(CURDIR)/" + ############################################################################# # Build files @@ -108,7 +111,7 @@ quiet_cmd_help2doc = ' [$(LINK_COLOR)HELP2DOC$(END_COLOR)] $(RELPATH)$@' cmd_help2doc = $(LOCALES) $(HELP2DOC) $(ELINKS) $@ > $@ quiet_cmd_conf2doc = ' [$(LINK_COLOR)CONF2DOC$(END_COLOR)] $(RELPATH)$@' - cmd_conf2doc = $(LOCALES) $(CONF2DOC) > $@ + cmd_conf2doc = $(LOCALES) $(CONF2DOC) $(FEATURES) > $@ quiet_cmd_keys2doc = ' [$(LINK_COLOR)KEYS2DOC$(END_COLOR)] $(RELPATH)$@' cmd_keys2doc = $(LOCALES) $(KEYS2DOC) $(KBDBIND) $@ > $@ @@ -149,25 +152,27 @@ api: $(patsubst %.txt,%.html,$(API_TXT)) cmd_jw = $(JW) -b $(2) $< quiet_cmd_xmlto = ' [$(LINK_COLOR)XMLTO$(END_COLOR)] $(RELPATH)$@' - cmd_xmlto = $(XMLTO) $(3) $(2) $< + cmd_xmlto = $(XMLTO) -o $(call outdir) $(3) $(2) $< quiet_cmd_pod2html = ' [$(LINK_COLOR)POD2HTML$(END_COLOR)] $(RELPATH)$@' cmd_pod2html = $(POD2HTML) --outfile=$@ < $< quiet_cmd_asciidoc = ' [$(LINK_COLOR)ASCIIDOC$(END_COLOR)] $(RELPATH)$@' - cmd_asciidoc = $(ASCIIDOC) -f asciidoc.conf -b $(2) -d $(call doctype,$<) -o $@ $< + cmd_asciidoc = $(ASCIIDOC) $(ASCIIDOC_FLAGS) -b $(call backend) -d $(call doctype) -o $@ $< -# Based on filename in $(1) find out asciidoc doctype. -doctype = $(if $(findstring .1.,$(1)),manpage,$(if $(findstring .5.,$(1)),manpage,book)) +# Based on $@ find out asciidoc doctype or backend + xmlto output dir. +doctype = $(if $(findstring .1.,$@)$(findstring .5.,$@),manpage,book) +backend = $(if $(findstring .xml,$@),docbook,xhtml11) +outdir = $(if $(findstring -chunked,$@),$@,.) # Loosely track dependencies via asciidoc includes. -asciidoc_dep = sed -n 's@include::\(.*\)\[.*@$@: \1@p' < $< > .deps/$(@F).asciidoc +asciidoc_dep = sed -n 's/[{]builddir}//g;s@include::\(.*\)\[.*@$@: $< \1@p' < $< > .deps/$(@F).asciidoc -include .deps/*.asciidoc # Do a little post-processing of man pages. Inserting title headers and date. MAN_DATE = $(shell date -I) -man_desc = `sed -n 's/:Description:\s*\(.*\)/\1/p' < $(subst .xml,.txt,$<)` +man_desc = `sed -n 's/:Description:\s*\(.*\)/\1/p' < $(srcdir)$(subst .xml,.txt,$( $@.tmp && mv $@.tmp $@ @@ -175,11 +180,11 @@ man_hack = sed "s/^\(\.TH \"ELINKS[^\"]*\" [0-9] \).*/\1\"$(1)\" \"$(MAN_DATE)\" ############################################################################# # Build recipies -%.html: %.txt asciidoc.conf +%.html: %.txt $(ASCIIDOC_CONF) $(call cmd,asciidoc,xhtml11) @-$(call asciidoc_dep) -%.xml: %.txt asciidoc.conf +%.xml: %.txt $(ASCIIDOC_CONF) $(call cmd,asciidoc,docbook) @-$(call asciidoc_dep) @@ -192,7 +197,7 @@ man_hack = sed "s/^\(\.TH \"ELINKS[^\"]*\" [0-9] \).*/\1\"$(1)\" \"$(MAN_DATE)\" @$(call man_hack,$(call man_desc)) %.html-chunked: %.xml - $(call cmd,xmlto,html,-o $@) + $(call cmd,xmlto,html) %.pdf: %.xml $(call cmd,jw,pdf) diff --git a/doc/elinks.1.txt b/doc/elinks.1.txt index 0866fa49..060336f6 100644 --- a/doc/elinks.1.txt +++ b/doc/elinks.1.txt @@ -35,7 +35,7 @@ Most options can be set in the user interface or config file, so usually you do not need to care about them. Note that this list is roughly equivalent to the output of running ELinks with the option `--long-help`. -include::option-command.txt[] +include::{builddir}option-command.txt[] ENVIRONMENT VARIABLES --------------------- diff --git a/doc/elinks.conf.5.txt b/doc/elinks.conf.5.txt index 15394cf7..715d9027 100644 --- a/doc/elinks.conf.5.txt +++ b/doc/elinks.conf.5.txt @@ -56,7 +56,7 @@ Some sample settings: OPTIONS ------- -include::option-config.txt[] +include::{builddir}option-config.txt[] SEE ALSO -------- diff --git a/doc/elinkskeys.5.txt b/doc/elinkskeys.5.txt index d5323075..a59c1583 100644 --- a/doc/elinkskeys.5.txt +++ b/doc/elinkskeys.5.txt @@ -93,7 +93,7 @@ FIXME: KEYMAP ACTIONS -------------- -include::keymap-actions.txt[] +include::{builddir}keymap-actions.txt[] DEFAULT BINDINGS ---------------- @@ -101,7 +101,7 @@ DEFAULT BINDINGS The default bindings are shown below. Any bindings in `~/.elinks/elinks.conf` will override these. -include::keymap-defaults.txt[] +include::{builddir}keymap-defaults.txt[] AUTHOR ------ diff --git a/doc/installation.txt b/doc/installation.txt index c999f160..b8e076e7 100644 --- a/doc/installation.txt +++ b/doc/installation.txt @@ -71,6 +71,6 @@ include::small.txt[] include::ecmascript.txt[] -include::features.txt[] +include::{builddir}features.txt[] endif::installation-webpage[] diff --git a/doc/tools/conf2doc b/doc/tools/conf2doc index d8bff9f2..99034bb2 100755 --- a/doc/tools/conf2doc +++ b/doc/tools/conf2doc @@ -4,6 +4,7 @@ # Copyright (c) Jonas Fonseca , 2005 # +CONFFILE="$1" TMPFILE=$(mktemp import-features.conf.XXXXXX) || exit 1 strip_comment() @@ -53,7 +54,7 @@ __END__ fi } -cat ../features.conf | while read line; do +cat "$CONFFILE" | while read line; do case "$line" in "### "*) print_section From 4a2cde1c00cc0148bf543d1737c34522912dc40a Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 00:38:47 +0100 Subject: [PATCH 007/204] Introduce dom_stack_code enum and use it for push_dom_node() --- src/dom/select.c | 4 ++-- src/dom/sgml/parser.c | 18 ++++++++++++------ src/dom/stack.c | 13 +++++++------ src/dom/stack.h | 12 +++++++++++- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/dom/select.c b/src/dom/select.c index a0e5d764..ff84cbee 100644 --- a/src/dom/select.c +++ b/src/dom/select.c @@ -506,7 +506,7 @@ parse_dom_select(struct dom_select *select, struct dom_stack *stack, select->selector = select_node; } - if (!push_dom_node(stack, &select_node->node)) + if (push_dom_node(stack, &select_node->node) != DOM_STACK_CODE_OK) return DOM_ERR_INVALID_STATE; if (select_node->node.type != DOM_NODE_ELEMENT) @@ -1070,7 +1070,7 @@ select_dom_nodes(struct dom_select *select, struct dom_node *root) &dom_select_data_context_info); add_dom_stack_tracer(&select_data.stack, "select-match: "); - if (push_dom_node(&select_data.stack, &select->selector->node)) { + if (push_dom_node(&select_data.stack, &select->selector->node) == DOM_STACK_CODE_OK) { get_dom_stack_top(&select_data.stack)->immutable = 1; walk_dom_nodes(&stack, root); } diff --git a/src/dom/sgml/parser.c b/src/dom/sgml/parser.c index fce56a9e..411fa883 100644 --- a/src/dom/sgml/parser.c +++ b/src/dom/sgml/parser.c @@ -39,7 +39,10 @@ add_sgml_document(struct dom_stack *stack, struct dom_string *string) { struct dom_node *node = init_dom_node(DOM_NODE_DOCUMENT, string); - return node ? push_dom_node(stack, node) : NULL; + if (node && push_dom_node(stack, node) == DOM_STACK_CODE_OK) + return node; + + return NULL; } static inline struct dom_node * @@ -58,7 +61,7 @@ add_sgml_element(struct dom_stack *stack, struct dom_scanner_token *token) node_info = get_sgml_node_info(parser->info->elements, node); node->data.element.type = node_info->type; - if (!push_dom_node(stack, node)) + if (push_dom_node(stack, node) != DOM_STACK_CODE_OK) return NULL; state = get_dom_stack_top(stack); @@ -92,7 +95,7 @@ add_sgml_attribute(struct dom_stack *stack, if (valtoken && valtoken->type == SGML_TOKEN_STRING) node->data.attribute.quoted = 1; - if (!node || !push_dom_node(stack, node)) + if (!node || push_dom_node(stack, node) != DOM_STACK_CODE_OK) return; pop_dom_node(stack); @@ -119,7 +122,10 @@ add_sgml_proc_instruction(struct dom_stack *stack, struct dom_scanner_token *tar node->data.proc_instruction.type = DOM_PROC_INSTRUCTION; } - return push_dom_node(stack, node); + if (push_dom_node(stack, node) == DOM_STACK_CODE_OK) + return node; + + return NULL; } static inline void @@ -133,7 +139,7 @@ add_sgml_node(struct dom_stack *stack, enum dom_node_type type, struct dom_scann if (token->type == SGML_TOKEN_SPACE) node->data.text.only_space = 1; - if (push_dom_node(stack, node)) + if (push_dom_node(stack, node) == DOM_STACK_CODE_OK) pop_dom_node(stack); } @@ -403,7 +409,7 @@ parse_sgml(struct sgml_parser *parser, unsigned char *buf, size_t bufsize, } node = init_dom_node(DOM_NODE_TEXT, &source); - if (!node || !push_dom_node(&parser->parsing, node)) + if (!node || push_dom_node(&parser->parsing, node) != DOM_STACK_CODE_OK) return SGML_PARSER_CODE_MEM_ALLOC; pop_dom_node(&parser->parsing); diff --git a/src/dom/stack.c b/src/dom/stack.c index f41c1cb7..ba5a8d62 100644 --- a/src/dom/stack.c +++ b/src/dom/stack.c @@ -154,7 +154,7 @@ call_dom_stack_callbacks(struct dom_stack *stack, struct dom_stack_state *state, } } -struct dom_node * +enum dom_stack_code push_dom_node(struct dom_stack *stack, struct dom_node *node) { struct dom_stack_state *state; @@ -164,13 +164,13 @@ push_dom_node(struct dom_stack *stack, struct dom_node *node) assert(0 < node->type && node->type < DOM_NODES); if (stack->depth > DOM_STACK_MAX_DEPTH) { - return NULL; + return DOM_STACK_CODE_ERROR_MAX_DEPTH; } state = realloc_dom_stack_states(&stack->states, stack->depth); if (!state) { done_dom_node(node); - return NULL; + return DOM_STACK_CODE_ERROR_MEM_ALLOC; } state += stack->depth; @@ -181,7 +181,7 @@ push_dom_node(struct dom_stack *stack, struct dom_node *node) if (context->info->object_size && !realloc_dom_stack_state_objects(context, stack->depth)) { done_dom_node(node); - return NULL; + return DOM_STACK_CODE_ERROR_MEM_ALLOC; } } @@ -193,7 +193,7 @@ push_dom_node(struct dom_stack *stack, struct dom_node *node) stack->depth++; call_dom_stack_callbacks(stack, state, DOM_STACK_PUSH); - return node; + return DOM_STACK_CODE_OK; } void @@ -349,7 +349,8 @@ walk_dom_nodes(struct dom_stack *stack, struct dom_node *root) if (!context) return; - push_dom_node(stack, root); + if (push_dom_node(stack, root) != DOM_STACK_CODE_OK) + return; while (!dom_stack_is_empty(stack)) { struct dom_stack_state *state = get_dom_stack_top(stack); diff --git a/src/dom/stack.h b/src/dom/stack.h index 153654e0..09c21229 100644 --- a/src/dom/stack.h +++ b/src/dom/stack.h @@ -9,6 +9,16 @@ struct dom_stack; /* API Doc :: dom-stack */ +/** DOM stack code + * + * Codes used by the DOM stack to indicate states. + */ +enum dom_stack_code { + DOM_STACK_CODE_OK, /*: All is well */ + DOM_STACK_CODE_ERROR_MEM_ALLOC, /*: Memory allocation failure */ + DOM_STACK_CODE_ERROR_MAX_DEPTH, /*: Stack max depth reached */ +}; + /** DOM stack callback * * Used by contexts, for 'hooking' into the node traversing. */ @@ -230,7 +240,7 @@ void done_dom_stack_context(struct dom_stack *stack, struct dom_stack_context *c * * If an error occurs the node is released with ref:[done_dom_node] and NULL is * returned. Else the pushed node is returned. */ -struct dom_node *push_dom_node(struct dom_stack *stack, struct dom_node *node); +enum dom_stack_code push_dom_node(struct dom_stack *stack, struct dom_node *node); /** Pop the top stack state * From eecc22751d2c539ba60f187486bea2d8417905aa Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 00:55:58 +0100 Subject: [PATCH 008/204] Use dom_stack_code enum for dom_stack_callback_T --- src/document/dom/renderer.c | 50 +++++++++++++++++++++++++------------ src/dom/select.c | 14 ++++++++--- src/dom/sgml/parser.c | 8 ++++-- src/dom/stack.c | 16 +++++++++--- src/dom/stack.h | 3 ++- 5 files changed, 64 insertions(+), 27 deletions(-) diff --git a/src/document/dom/renderer.c b/src/document/dom/renderer.c index 24630723..18f44641 100644 --- a/src/document/dom/renderer.c +++ b/src/document/dom/renderer.c @@ -500,7 +500,7 @@ render_dom_node_enhanced_text(struct dom_renderer *renderer, struct dom_node *no } #endif -static void +enum dom_stack_code render_dom_node_source(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -513,15 +513,15 @@ render_dom_node_source(struct dom_stack *stack, struct dom_node *node, void *dat || node->type == DOM_NODE_CDATA_SECTION || node->type == DOM_NODE_COMMENT)) { render_dom_node_enhanced_text(renderer, node); - return; - } + } else #endif + render_dom_node_text(renderer, &renderer->styles[node->type], node); - render_dom_node_text(renderer, &renderer->styles[node->type], node); + return DOM_STACK_CODE_OK; } /* This callback is also used for rendering processing instruction nodes. */ -static void +static enum dom_stack_code render_dom_element_source(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -529,9 +529,11 @@ render_dom_element_source(struct dom_stack *stack, struct dom_node *node, void * assert(node && renderer && renderer->document); render_dom_node_text(renderer, &renderer->styles[node->type], node); + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code render_dom_element_end_source(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -544,7 +546,7 @@ render_dom_element_end_source(struct dom_stack *stack, struct dom_node *node, vo assert(node && renderer && renderer->document); if (!string || !length) - return; + return DOM_STACK_CODE_OK; if (check_dom_node_source(renderer, string, length)) { render_dom_flush(renderer, string); @@ -553,9 +555,11 @@ render_dom_element_end_source(struct dom_stack *stack, struct dom_node *node, vo } render_dom_text(renderer, &renderer->styles[node->type], string, length); + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code render_dom_attribute_source(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -620,9 +624,11 @@ render_dom_attribute_source(struct dom_stack *stack, struct dom_node *node, void render_dom_text(renderer, template, value, valuelen); } } + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code render_dom_cdata_source(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -639,9 +645,11 @@ render_dom_cdata_source(struct dom_stack *stack, struct dom_node *node, void *da } render_dom_node_text(renderer, &renderer->styles[node->type], node); + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code render_dom_document_end(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -652,6 +660,8 @@ render_dom_document_end(struct dom_stack *stack, struct dom_node *node, void *da if (check_dom_node_source(renderer, renderer->position, 0)) { render_dom_flush(renderer, renderer->end); } + + return DOM_STACK_CODE_OK; } static struct dom_stack_context_info dom_source_renderer_context_info = { @@ -693,7 +703,7 @@ static struct dom_stack_context_info dom_source_renderer_context_info = { /* DOM RSS Renderer */ -static void +enum dom_stack_code dom_rss_push_element(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -735,9 +745,11 @@ dom_rss_push_element(struct dom_stack *stack, struct dom_node *node, void *data) renderer->node = node; } + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code dom_rss_pop_element(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -776,9 +788,11 @@ dom_rss_pop_element(struct dom_stack *stack, struct dom_node *node, void *data) default: break; } + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code dom_rss_push_content(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_renderer *renderer = stack->current->data; @@ -788,7 +802,7 @@ dom_rss_push_content(struct dom_stack *stack, struct dom_node *node, void *data) assert(node && renderer && renderer->document); if (!renderer->node) - return; + return DOM_STACK_CODE_OK; if (node->type == DOM_NODE_ENTITY_REFERENCE) { string -= 1; @@ -800,6 +814,8 @@ dom_rss_push_content(struct dom_stack *stack, struct dom_node *node, void *data) } else { add_to_dom_string(&renderer->text, string, length); } + + return DOM_STACK_CODE_OK; } static struct dom_string * @@ -901,13 +917,13 @@ render_rss_item(struct dom_renderer *renderer, struct dom_node *item) } } -static void +enum dom_stack_code dom_rss_pop_document(struct dom_stack *stack, struct dom_node *root, void *data) { struct dom_renderer *renderer = stack->current->data; if (!renderer->channel) - return; + return DOM_STACK_CODE_OK; render_rss_item(renderer, renderer->channel); @@ -927,6 +943,8 @@ dom_rss_pop_document(struct dom_stack *stack, struct dom_node *root, void *data) mem_free_if(renderer->items); done_dom_node(root); + + return DOM_STACK_CODE_OK; } diff --git a/src/dom/select.c b/src/dom/select.c index ff84cbee..e1e4d548 100644 --- a/src/dom/select.c +++ b/src/dom/select.c @@ -897,7 +897,7 @@ match_element_selector(struct dom_select_node *selector, struct dom_node *node, #define get_dom_select_data(stack) ((stack)->current->data) /* Matches an element node being visited against the current selector stack. */ -static void +enum dom_stack_code dom_select_push_element(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_select_data *select_data = get_dom_select_data(stack); @@ -921,11 +921,13 @@ dom_select_push_element(struct dom_stack *stack, struct dom_node *node, void *da if (selector) push_dom_node(&select_data->stack, &selector->node); } + + return DOM_STACK_CODE_OK; } /* Ensures that nodes, no longer 'reachable' on the stack do not have any * states associated with them on the select data stack. */ -static void +enum dom_stack_code dom_select_pop_element(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_select_data *select_data = get_dom_select_data(stack); @@ -944,12 +946,14 @@ dom_select_pop_element(struct dom_stack *stack, struct dom_node *node, void *dat continue; } } + + return DOM_STACK_CODE_OK; } /* For now this is only for matching the ':contains()' pseudo-class. * Any node which can contain text and thus characters from the given * are handled in this common callback. */ -static void +enum dom_stack_code dom_select_push_text(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_select_data *select_data = get_dom_select_data(stack); @@ -961,7 +965,7 @@ dom_select_push_text(struct dom_stack *stack, struct dom_node *node, void *data) WDBG("Text node: %d chars", node->string.length); if (!text_sel) - return; + return DOM_STACK_CODE_OK; text = &text_sel->node.string; @@ -973,6 +977,8 @@ dom_select_push_text(struct dom_stack *stack, struct dom_node *node, void *data) default: ERROR("Unhandled type"); } + + return DOM_STACK_CODE_OK; } /* Context info for interacting with the DOM tree or stream stack. */ diff --git a/src/dom/sgml/parser.c b/src/dom/sgml/parser.c index 411fa883..26a021fa 100644 --- a/src/dom/sgml/parser.c +++ b/src/dom/sgml/parser.c @@ -432,7 +432,7 @@ struct sgml_parsing_state { size_t depth; }; -static void +enum dom_stack_code sgml_parsing_push(struct dom_stack *stack, struct dom_node *node, void *data) { struct sgml_parser *parser = get_sgml_parser(stack); @@ -448,9 +448,11 @@ sgml_parsing_push(struct dom_stack *stack, struct dom_node *node, void *data) SGML_STATE_TEXT, count_lines, complete, incremental, detect_errors); parser->code = parse_sgml_plain(&parser->stack, &parsing->scanner); + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code sgml_parsing_pop(struct dom_stack *stack, struct dom_node *node, void *data) { struct sgml_parser *parser = get_sgml_parser(stack); @@ -464,6 +466,8 @@ sgml_parsing_pop(struct dom_stack *stack, struct dom_node *node, void *data) } assert(parsing->depth == parser->stack.depth); + + return DOM_STACK_CODE_OK; } static struct dom_stack_context_info sgml_parsing_context_info = { diff --git a/src/dom/stack.c b/src/dom/stack.c index ba5a8d62..2197482f 100644 --- a/src/dom/stack.c +++ b/src/dom/stack.c @@ -489,7 +489,7 @@ static unsigned char indent_string[] = #define get_indent_offset(stack) \ ((stack)->depth < sizeof(indent_string)/2 ? (stack)->depth * 2 : sizeof(indent_string)) -static void +enum dom_stack_code dom_stack_trace_tree(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_string *value = &node->string; @@ -500,9 +500,11 @@ dom_stack_trace_tree(struct dom_stack *stack, struct dom_node *node, void *data) get_indent_offset(stack), indent_string, name->length, name->string, value->length, value->string); + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code dom_stack_trace_id_leaf(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_string value; @@ -523,9 +525,11 @@ dom_stack_trace_id_leaf(struct dom_stack *stack, struct dom_node *node, void *da if (is_dom_string_set(&value)) done_dom_string(&value); + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code dom_stack_trace_leaf(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_string *name; @@ -544,9 +548,11 @@ dom_stack_trace_leaf(struct dom_stack *stack, struct dom_node *node, void *data) if (is_dom_string_set(&value)) done_dom_string(&value); + + return DOM_STACK_CODE_OK; } -static void +enum dom_stack_code dom_stack_trace_branch(struct dom_stack *stack, struct dom_node *node, void *data) { struct dom_string *name; @@ -561,6 +567,8 @@ dom_stack_trace_branch(struct dom_stack *stack, struct dom_node *node, void *dat empty_string_or_(stack->current->data), get_indent_offset(stack), indent_string, id->length, id->string, name->length, name->string); + + return DOM_STACK_CODE_OK; } struct dom_stack_context_info dom_stack_trace_context_info = { diff --git a/src/dom/stack.h b/src/dom/stack.h index 09c21229..211c52b6 100644 --- a/src/dom/stack.h +++ b/src/dom/stack.h @@ -22,7 +22,8 @@ enum dom_stack_code { /** DOM stack callback * * Used by contexts, for 'hooking' into the node traversing. */ -typedef void (*dom_stack_callback_T)(struct dom_stack *, struct dom_node *, void *); +typedef enum dom_stack_code + (*dom_stack_callback_T)(struct dom_stack *, struct dom_node *, void *); #define DOM_STACK_MAX_DEPTH 4096 From 4e6b05394d0ee148c87ba98c2e2acb850ea30171 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 05:09:45 +0100 Subject: [PATCH 009/204] ADD DOM_STACK_CODE_FREE_NODE so callbacks can remove nodes when popping --- src/dom/stack.c | 19 ++++++++++++++----- src/dom/stack.h | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/dom/stack.c b/src/dom/stack.c index 2197482f..3597593c 100644 --- a/src/dom/stack.c +++ b/src/dom/stack.c @@ -129,10 +129,12 @@ enum dom_stack_action { DOM_STACK_POP, }; -static void +/* Returns whether the node should be freed with done_dom_node(). */ +static int call_dom_stack_callbacks(struct dom_stack *stack, struct dom_stack_state *state, enum dom_stack_action action) { + int free_node = 0; int i; for (i = 0; i < stack->contexts_size; i++) { @@ -148,10 +150,18 @@ call_dom_stack_callbacks(struct dom_stack *stack, struct dom_stack_state *state, void *data = get_dom_stack_state_data(context, state); stack->current = context; - callback(stack, state->node, data); + switch (callback(stack, state->node, data)) { + case DOM_STACK_CODE_FREE_NODE: + free_node = 1; + break; + default: + break; + } stack->current = NULL; } } + + return free_node; } enum dom_stack_code @@ -211,9 +221,8 @@ pop_dom_node(struct dom_stack *stack) if (state->immutable) return; - call_dom_stack_callbacks(stack, state, DOM_STACK_POP); - - if (stack->flags & DOM_STACK_FLAG_FREE_NODES) + if (call_dom_stack_callbacks(stack, state, DOM_STACK_POP) + || (stack->flags & DOM_STACK_FLAG_FREE_NODES)) done_dom_node(state->node); stack->depth--; diff --git a/src/dom/stack.h b/src/dom/stack.h index 211c52b6..996b2a00 100644 --- a/src/dom/stack.h +++ b/src/dom/stack.h @@ -15,6 +15,7 @@ struct dom_stack; */ enum dom_stack_code { DOM_STACK_CODE_OK, /*: All is well */ + DOM_STACK_CODE_FREE_NODE, /*: Free the (popped) node */ DOM_STACK_CODE_ERROR_MEM_ALLOC, /*: Memory allocation failure */ DOM_STACK_CODE_ERROR_MAX_DEPTH, /*: Stack max depth reached */ }; From 768f97c38e3c583372ad8f5642e88a0b2ebee04d Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 05:10:22 +0100 Subject: [PATCH 010/204] Add get_dom_node_prev() which gets the previous sibling of a DOM node --- src/dom/node.c | 35 ++++++++++++++++++++++++++++++----- src/dom/node.h | 3 +++ 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/dom/node.c b/src/dom/node.c index 7ac7e1b9..8d86a7a1 100644 --- a/src/dom/node.c +++ b/src/dom/node.c @@ -225,16 +225,15 @@ get_dom_node_map_entry(struct dom_node_list *list, enum dom_node_type type, return dom_node_list_bsearch(&search, list); } -int -get_dom_node_list_index(struct dom_node *parent, struct dom_node *node) +static int +get_dom_node_list_pos(struct dom_node_list *list, struct dom_node *node) { - struct dom_node_list **list = get_dom_node_list(parent, node); struct dom_node *entry; int i; - if (!list) return -1; + assert(list); - foreach_dom_node (*list, entry, i) { + foreach_dom_node (list, entry, i) { if (entry == node) return i; } @@ -242,6 +241,32 @@ get_dom_node_list_index(struct dom_node *parent, struct dom_node *node) return -1; } +int +get_dom_node_list_index(struct dom_node *parent, struct dom_node *node) +{ + struct dom_node_list **list = get_dom_node_list(parent, node); + + return list ? get_dom_node_list_pos(*list, node) : -1; +} + +struct dom_node * +get_dom_node_prev(struct dom_node *node) +{ + struct dom_node_list **list; + int index; + + assert(node->parent); + + list = get_dom_node_list(node->parent, node); + if (!list) return NULL; + + index = get_dom_node_list_pos(*list, node); + if (index > 0) + return (*list)->entries[index - 1]; + + return NULL; +} + /* Nodes */ struct dom_node * diff --git a/src/dom/node.h b/src/dom/node.h index 542b8930..3e5e94c8 100644 --- a/src/dom/node.h +++ b/src/dom/node.h @@ -243,6 +243,9 @@ int get_dom_node_list_index(struct dom_node *parent, struct dom_node *node); * @list is already sorted properly. */ int get_dom_node_map_index(struct dom_node_list *list, struct dom_node *node); +/* Returns the previous sibling to the node. */ +struct dom_node *get_dom_node_prev(struct dom_node *node); + /* Looks up the @node_map for a node matching the requested type and name. * The @subtype maybe be 0 indication unknown subtype and only name should be * tested else it will indicate either the element or attribute private From 6c85c0f00959424919e6cad10fa3ba6627fed2dd Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 05:12:34 +0100 Subject: [PATCH 011/204] Add DOM configuration inspired module It add support for normalizing a DOM document in various ways, such as removing comments, converting CDATA section nodes to text nodes, cleanup whitespace, etc. Use it in the RSS renderer to sanitize the text to be rendered. --- src/document/dom/renderer.c | 37 +---- src/dom/Makefile | 2 +- src/dom/configuration.c | 300 ++++++++++++++++++++++++++++++++++++ src/dom/configuration.h | 90 +++++++++++ 4 files changed, 399 insertions(+), 30 deletions(-) create mode 100644 src/dom/configuration.c create mode 100644 src/dom/configuration.h diff --git a/src/document/dom/renderer.c b/src/document/dom/renderer.c index 18f44641..10e034e9 100644 --- a/src/document/dom/renderer.c +++ b/src/document/dom/renderer.c @@ -22,6 +22,7 @@ #include "document/document.h" #include "document/dom/renderer.h" #include "document/renderer.h" +#include "dom/configuration.h" #include "dom/scanner.h" #include "dom/sgml/parser.h" #include "dom/sgml/rss/rss.h" @@ -703,6 +704,9 @@ static struct dom_stack_context_info dom_source_renderer_context_info = { /* DOM RSS Renderer */ +#define RSS_CONFIG_FLAGS \ + (DOM_CONFIG_NORMALIZE_WHITESPACE | DOM_CONFIG_NORMALIZE_CHARACTERS) + enum dom_stack_code dom_rss_push_element(struct dom_stack *stack, struct dom_node *node, void *data) { @@ -792,32 +796,6 @@ dom_rss_pop_element(struct dom_stack *stack, struct dom_node *node, void *data) return DOM_STACK_CODE_OK; } -enum dom_stack_code -dom_rss_push_content(struct dom_stack *stack, struct dom_node *node, void *data) -{ - struct dom_renderer *renderer = stack->current->data; - unsigned char *string = node->string.string; - int length = node->string.length; - - assert(node && renderer && renderer->document); - - if (!renderer->node) - return DOM_STACK_CODE_OK; - - if (node->type == DOM_NODE_ENTITY_REFERENCE) { - string -= 1; - length += 2; - } - - if (!is_dom_string_set(&renderer->text)) { - init_dom_string(&renderer->text, string, length); - } else { - add_to_dom_string(&renderer->text, string, length); - } - - return DOM_STACK_CODE_OK; -} - static struct dom_string * get_rss_node_text(struct dom_node *node) { @@ -955,9 +933,9 @@ static struct dom_stack_context_info dom_rss_renderer_context_info = { /* */ NULL, /* DOM_NODE_ELEMENT */ dom_rss_push_element, /* DOM_NODE_ATTRIBUTE */ NULL, - /* DOM_NODE_TEXT */ dom_rss_push_content, - /* DOM_NODE_CDATA_SECTION */ dom_rss_push_content, - /* DOM_NODE_ENTITY_REFERENCE */ dom_rss_push_content, + /* DOM_NODE_TEXT */ NULL, + /* DOM_NODE_CDATA_SECTION */ NULL, + /* DOM_NODE_ENTITY_REFERENCE */ NULL, /* DOM_NODE_ENTITY */ NULL, /* DOM_NODE_PROC_INSTRUCTION */ NULL, /* DOM_NODE_COMMENT */ NULL, @@ -1046,6 +1024,7 @@ render_dom_document(struct cache_entry *cached, struct document *document, } else if (doctype == SGML_DOCTYPE_RSS) { add_dom_stack_context(&parser->stack, &renderer, &dom_rss_renderer_context_info); + add_dom_config_normalizer(&parser->stack, RSS_CONFIG_FLAGS); } /* FIXME: When rendering this way we don't really care about the code. diff --git a/src/dom/Makefile b/src/dom/Makefile index 35a6b392..cdff0bab 100644 --- a/src/dom/Makefile +++ b/src/dom/Makefile @@ -2,7 +2,7 @@ top_builddir=../.. include $(top_builddir)/Makefile.config SUBDIRS = css sgml -OBJS = node.o select.o stack.o scanner.o +OBJS = configuration.o node.o select.o stack.o scanner.o SUBDIRS-$(CONFIG_DEBUG) += test diff --git a/src/dom/configuration.c b/src/dom/configuration.c new file mode 100644 index 00000000..f43690b8 --- /dev/null +++ b/src/dom/configuration.c @@ -0,0 +1,300 @@ +/* DOM Configuration */ + +#include "elinks.h" + +#include "dom/configuration.h" +#include "dom/node.h" +#include "dom/stack.h" +#include "dom/string.h" + + +static enum dom_stack_code +normalize_text_node_whitespace(struct dom_node *node) +{ + unsigned char buf[256]; + struct dom_string string = INIT_DOM_STRING(NULL, 0); + int count = 0, i = 0; + unsigned char *text = node->string.string; + + assert(node->type == DOM_NODE_TEXT); + + while (i < node->string.length) { + int j; + + for (j = 0; j < sizeof(buf) && i < node->string.length; i++) { + unsigned char data = text[i]; + + if (isspace(data)) { + if (count == 1) + continue; + + data = ' '; + count = 1; + + } else { + count = 0; + } + + buf[j++] = data; + } + + if (!add_to_dom_string(&string, buf, j)) { + done_dom_string(&string); + return DOM_STACK_CODE_ERROR_MEM_ALLOC; + } + } + + if (node->data.text.allocated) + done_dom_string(&node->string); + + set_dom_string(&node->string, string.string, string.length); + node->data.text.allocated = 1; + + return DOM_STACK_CODE_OK; + +} + +static enum dom_stack_code +append_node_text(struct dom_config *config, struct dom_node *node) +{ + struct dom_node *prev = get_dom_node_prev(node); + size_t length; + struct dom_string dest; + struct dom_string src; + int error = 0; + + copy_struct(&src, &node->string); + + if (!prev || prev->type != DOM_NODE_TEXT) { + /* Preserve text nodes with no one to append to. */ + if (node->type == DOM_NODE_TEXT) + return DOM_STACK_CODE_OK; + + prev = NULL; + set_dom_string(&dest, NULL, 0); + + } else { + if (prev->data.text.allocated) { + copy_struct(&dest, &prev->string); + } else { + set_dom_string(&dest, NULL, 0); + if (!add_to_dom_string(&dest, prev->string.string, prev->string.length)) + return DOM_STACK_CODE_ERROR_MEM_ALLOC; + set_dom_string(&prev->string, dest.string, dest.length); + prev->data.text.allocated = 1; + } + } + + length = dest.length; + + switch (node->type) { + case DOM_NODE_CDATA_SECTION: + case DOM_NODE_TEXT: + if (!add_to_dom_string(&dest, src.string, src.length)) + error = 1; + break; + + case DOM_NODE_ENTITY_REFERENCE: + /* FIXME: Until we will have uniform encoding at this point + * (UTF-8) we just add the entity reference unexpanded assuming + * that convert_string() will eventually do the work of + * expanding it. */ + if (!add_to_dom_string(&dest, "&", 1) + || !add_to_dom_string(&dest, src.string, src.length) + || !add_to_dom_string(&dest, ";", 1)) { + error = 1; + } + break; + + default: + INTERNAL("Cannot append from node %d", node->type); + } + + if (error) { + if (prev) + prev->string.length = length; + else + done_dom_string(&dest); + return DOM_STACK_CODE_ERROR_MEM_ALLOC; + } + + if (prev) { + copy_struct(&prev->string, &dest); + + if ((config->flags & DOM_CONFIG_NORMALIZE_WHITESPACE) + && node->type != DOM_NODE_ENTITY_REFERENCE) { + /* XXX: Ignore errors since we want to always + * free the appended node at this point. */ + normalize_text_node_whitespace(prev); + } + + return DOM_STACK_CODE_FREE_NODE; + + } else { + int was_cdata_section = node->type == DOM_NODE_CDATA_SECTION; + + node->type = DOM_NODE_TEXT; + memset(&node->data, 0, sizeof(node->data)); + node->data.text.allocated = 1; + copy_struct(&node->string, &dest); + + if ((config->flags & DOM_CONFIG_NORMALIZE_WHITESPACE) + && was_cdata_section) { + /* XXX: Ignore errors since we want to always ok the + * append. */ + normalize_text_node_whitespace(node); + } + + return DOM_STACK_CODE_OK; + } +} + +static enum dom_stack_code +dom_normalize_node_end(struct dom_stack *stack, struct dom_node *node, void *data) +{ + struct dom_config *config = stack->current->data; + enum dom_stack_code code = DOM_STACK_CODE_OK; + + switch (node->type) { + case DOM_NODE_ELEMENT: + if ((config->flags & DOM_CONFIG_UNKNOWN) + && !node->data.element.type) { + /* Drop elements that are not known from the built-in + * node info. */ + code = DOM_STACK_CODE_FREE_NODE; + } + break; + + case DOM_NODE_ATTRIBUTE: + if ((config->flags & DOM_CONFIG_UNKNOWN) + && !node->data.attribute.type) { + /* Drop elements that are not known from the built-in + * node info. */ + code = DOM_STACK_CODE_FREE_NODE; + } + break; + + case DOM_NODE_PROCESSING_INSTRUCTION: + if ((config->flags & DOM_CONFIG_UNKNOWN) + && !node->data.proc_instruction.type) { + /* Drop elements that are not known from the built-in + * node info. */ + code = DOM_STACK_CODE_FREE_NODE; + } + break; + + case DOM_NODE_TEXT: + if (config->flags & DOM_CONFIG_NORMALIZE_CHARACTERS) { + code = append_node_text(config, node); + + } else if (!(config->flags & DOM_CONFIG_ELEMENT_CONTENT_WHITESPACE) + && node->data.text.only_space) { + /* Discard all Text nodes that contain + * whitespaces in element content]. */ + code = DOM_STACK_CODE_FREE_NODE; + } + break; + + case DOM_NODE_COMMENT: + if (!(config->flags & DOM_CONFIG_COMMENTS)) { + /* Discard all comments. */ + code = DOM_STACK_CODE_FREE_NODE; + } + break; + + case DOM_NODE_CDATA_SECTION: + if (!(config->flags & DOM_CONFIG_CDATA_SECTIONS)) { + /* Transform CDATASection nodes into Text nodes. The new Text + * node is then combined with any adjacent Text node. */ + code = append_node_text(config, node); + } + break; + + case DOM_NODE_ENTITY_REFERENCE: + if (!(config->flags & DOM_CONFIG_ENTITIES)) { + /* Remove all EntityReference nodes from the document, + * putting the entity expansions directly in their place. Text + * nodes are normalized. Only unexpanded entity references are + * kept in the document. */ + code = append_node_text(config, node); + } + break; + + case DOM_NODE_DOCUMENT: + mem_free(config); + break; + + default: + break; + } + + return code; +} + +enum dom_stack_code +dom_normalize_text(struct dom_stack *stack, struct dom_node *node, void *data) +{ + struct dom_config *config = stack->current->data; + + if (config->flags & DOM_CONFIG_NORMALIZE_WHITESPACE) { + /* Normalize whitespace in the text. */ + return normalize_text_node_whitespace(node); + } + + return DOM_STACK_CODE_OK; +} + + +static struct dom_stack_context_info dom_config_normalizer_context = { + /* Object size: */ 0, + /* Push: */ + { + /* */ NULL, + /* DOM_NODE_ELEMENT */ NULL, + /* DOM_NODE_ATTRIBUTE */ NULL, + /* DOM_NODE_TEXT */ dom_normalize_text, + /* DOM_NODE_CDATA_SECTION */ NULL, + /* DOM_NODE_ENTITY_REFERENCE */ NULL, + /* DOM_NODE_ENTITY */ NULL, + /* DOM_NODE_PROC_INSTRUCTION */ NULL, + /* DOM_NODE_COMMENT */ NULL, + /* DOM_NODE_DOCUMENT */ NULL, + /* DOM_NODE_DOCUMENT_TYPE */ NULL, + /* DOM_NODE_DOCUMENT_FRAGMENT */ NULL, + /* DOM_NODE_NOTATION */ NULL, + }, + /* Pop: */ + { + /* */ NULL, + /* DOM_NODE_ELEMENT */ dom_normalize_node_end, + /* DOM_NODE_ATTRIBUTE */ dom_normalize_node_end, + /* DOM_NODE_TEXT */ dom_normalize_node_end, + /* DOM_NODE_CDATA_SECTION */ dom_normalize_node_end, + /* DOM_NODE_ENTITY_REFERENCE */ dom_normalize_node_end, + /* DOM_NODE_ENTITY */ dom_normalize_node_end, + /* DOM_NODE_PROC_INSTRUCTION */ dom_normalize_node_end, + /* DOM_NODE_COMMENT */ dom_normalize_node_end, + /* DOM_NODE_DOCUMENT */ dom_normalize_node_end, + /* DOM_NODE_DOCUMENT_TYPE */ dom_normalize_node_end, + /* DOM_NODE_DOCUMENT_FRAGMENT */ dom_normalize_node_end, + /* DOM_NODE_NOTATION */ dom_normalize_node_end, + } +}; + +struct dom_config * +add_dom_config_normalizer(struct dom_stack *stack, enum dom_config_flag flags) +{ + struct dom_config *config; + + config = mem_calloc(1, sizeof(*config)); + if (!config) return NULL; + + config->flags = flags; + + if (add_dom_stack_context(stack, config, &dom_config_normalizer_context)) + return config; + + mem_free(config); + + return NULL; +} diff --git a/src/dom/configuration.h b/src/dom/configuration.h new file mode 100644 index 00000000..267f4cc6 --- /dev/null +++ b/src/dom/configuration.h @@ -0,0 +1,90 @@ +#ifndef EL__DOM_CONFIGURATION_H +#define EL__DOM_CONFIGURATION_H + +struct dom_node; +struct dom_stack; + +/* API Doc :: dom-config */ + +/** DOM Configuration + * + * The DOMConfiguration interface represents the configuration of a document. + * Using the configuration, it is possible to change the behaviour of how + * document normalization is done, such as replacing the CDATASection nodes + * with Text nodes. + * + * Note: Parameters are similar to features and properties used in SAX2 [SAX]. + * + * The following list of parameters defined in the DOM: */ + +enum dom_config_flag { + /** "cdata-sections" + * + * The default is true and will keep CDATASection nodes in the + * document. When false, CDATASection nodes in the document are + * transformed into Text nodes. The new Text node is then combined with + * any adjacent Text node. */ + DOM_CONFIG_CDATA_SECTIONS = 1, + + /** "comments" + * + * If true (the default) keep Comment nodes in the document, else + * discard them. */ + DOM_CONFIG_COMMENTS = 2, + + /** "element-content-whitespace" + * + * The default is true and will keep all whitespaces in the document. + * When false, discard all Text nodes that contain only whitespaces. */ + DOM_CONFIG_ELEMENT_CONTENT_WHITESPACE = 4, + + /** "entities" + * + * When true (the default) keep EntityReference nodes in the document. + * When false, remove all EntityReference nodes from the document, + * putting the entity expansions directly in their place. Text nodes + * are normalized. Only unexpanded entity references are kept in the + * document. Note: This parameter does not affect Entity nodes. */ + DOM_CONFIG_ENTITIES = 8, + + /** "normalize-characters" + * + * The default is false, not to perform character normalization, else + * fully normalized the characters in the document as defined in + * appendix B of [XML 1.1]. */ + DOM_CONFIG_NORMALIZE_CHARACTERS = 16, + + /** "unknown" + * + * If false (default) nothing is done, else elements and attributes + * that are not known according to the built-in node info are + * discarded. */ + DOM_CONFIG_UNKNOWN = 32, + + /** "normalize-whitespace" + * + * If false (default) nothing is done, else all nodes are discarded + * once they have been traversed. */ + DOM_CONFIG_NORMALIZE_WHITESPACE = 64, +}; + +struct dom_error; + +struct dom_config { + enum dom_config_flag flags; /*: DOM configuration flags. */ + + /** FIXME: "error-handler" + * + * Contains an error handler. If an error is encountered in the + * document, this handler is called. When called, DOMError.relatedData + * will contain the closest node to where the error occurred. If the + * implementation is unable to determine the node where the error + * occurs, DOMError.relatedData will contain the Document node. + */ + void (*error_handler)(struct dom_config *, struct dom_error *); +}; + +struct dom_config * +add_dom_config_normalizer(struct dom_stack *stack, enum dom_config_flag flags); + +#endif From 1d52d67e506ca8a3fc45edbf99ae8614425ca1d3 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 07:11:02 +0100 Subject: [PATCH 012/204] Add get_dom_node_child() which searches for a node with given type --- src/document/dom/renderer.c | 43 ++++++------------------------------- src/dom/node.c | 42 ++++++++++++++++++++++++++++++++++++ src/dom/node.h | 18 +++++++++++----- 3 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/document/dom/renderer.c b/src/document/dom/renderer.c index 10e034e9..0f04574d 100644 --- a/src/document/dom/renderer.c +++ b/src/document/dom/renderer.c @@ -796,48 +796,17 @@ dom_rss_pop_element(struct dom_stack *stack, struct dom_node *node, void *data) return DOM_STACK_CODE_OK; } -static struct dom_string * -get_rss_node_text(struct dom_node *node) -{ - struct dom_node *child; - int index; - - if (!node->data.element.children) - return NULL; - - foreach_dom_node (node->data.element.children, child, index) { - if (child->type == DOM_NODE_TEXT) - return &child->string; - } - - return NULL; -} - -static struct dom_node * -get_rss_child(struct dom_node *parent, enum rss_element_type type) -{ - struct dom_node *node; - int index; - - if (!parent->data.element.children) - return NULL; - - foreach_dom_node (parent->data.element.children, node, index) { - if (node->type == DOM_NODE_ELEMENT - && type == node->data.element.type) - return node; - } - - return NULL; -} - static struct dom_string * get_rss_text(struct dom_node *node, enum rss_element_type type) { - node = get_rss_child(node, type); + node = get_dom_node_child(node, DOM_NODE_ELEMENT, type); - return node ? get_rss_node_text(node) : NULL; + if (!node) return NULL; + + node = get_dom_node_child(node, DOM_NODE_TEXT, 0); + + return node ? &node->string: NULL; } static void diff --git a/src/dom/node.c b/src/dom/node.c index 8d86a7a1..9995c223 100644 --- a/src/dom/node.c +++ b/src/dom/node.c @@ -267,6 +267,48 @@ get_dom_node_prev(struct dom_node *node) return NULL; } +struct dom_node * +get_dom_node_child(struct dom_node *parent, enum dom_node_type type, + int16_t subtype) +{ + struct dom_node_list **list; + struct dom_node *node; + int index; + + list = get_dom_node_list_by_type(parent, type); + if (!list) return NULL; + + foreach_dom_node (*list, node, index) { + if (node->type != type) + continue; + + if (!subtype) return node; + + switch (type) { + case DOM_NODE_ELEMENT: + if (node->data.element.type == subtype) + return node; + break; + + case DOM_NODE_ATTRIBUTE: + if (node->data.attribute.type == subtype) + return node; + break; + + case DOM_NODE_PROCESSING_INSTRUCTION: + if (node->data.attribute.type == subtype) + return node; + break; + + default: + return node; + } + } + + return NULL; +} + + /* Nodes */ struct dom_node * diff --git a/src/dom/node.h b/src/dom/node.h index 3e5e94c8..9f4d2cfb 100644 --- a/src/dom/node.h +++ b/src/dom/node.h @@ -246,6 +246,11 @@ int get_dom_node_map_index(struct dom_node_list *list, struct dom_node *node); /* Returns the previous sibling to the node. */ struct dom_node *get_dom_node_prev(struct dom_node *node); +/* Returns first text node of the element or NULL. */ +struct dom_node * +get_dom_node_child(struct dom_node *node, enum dom_node_type child_type, + int16_t child_subtype); + /* Looks up the @node_map for a node matching the requested type and name. * The @subtype maybe be 0 indication unknown subtype and only name should be * tested else it will indicate either the element or attribute private @@ -307,17 +312,17 @@ struct dom_string *get_dom_node_value(struct dom_node *node); /* Returns the name used for identifying the node type. */ struct dom_string *get_dom_node_type_name(enum dom_node_type type); -/* Based on the type of the parent and the node return a proper list +/* Based on the type of the parent and the node type return a proper list * or NULL. This is useful when adding a node to a parent node. */ static inline struct dom_node_list ** -get_dom_node_list(struct dom_node *parent, struct dom_node *node) +get_dom_node_list_by_type(struct dom_node *parent, enum dom_node_type type) { switch (parent->type) { case DOM_NODE_DOCUMENT: return &parent->data.document.children; case DOM_NODE_ELEMENT: - switch (node->type) { + switch (type) { case DOM_NODE_ATTRIBUTE: return &parent->data.element.map; @@ -326,7 +331,7 @@ get_dom_node_list(struct dom_node *parent, struct dom_node *node) } case DOM_NODE_DOCUMENT_TYPE: - switch (node->type) { + switch (type) { case DOM_NODE_ENTITY: return &parent->data.document_type.entities; @@ -338,7 +343,7 @@ get_dom_node_list(struct dom_node *parent, struct dom_node *node) } case DOM_NODE_PROCESSING_INSTRUCTION: - switch (node->type) { + switch (type) { case DOM_NODE_ATTRIBUTE: return &parent->data.proc_instruction.map; @@ -351,4 +356,7 @@ get_dom_node_list(struct dom_node *parent, struct dom_node *node) } } +#define get_dom_node_list(parent, node) \ + get_dom_node_list_by_type(parent, (node)->type) + #endif From bb9b4437fa6bc939749c2912702f1d788ba16763 Mon Sep 17 00:00:00 2001 From: Date: Mon, 16 Jan 2006 11:40:13 +0100 Subject: [PATCH 013/204] - FSP protocol --- Makefile.config.in | 1 + configure.in | 18 ++ features.conf | 7 + src/protocol/Makefile | 1 + src/protocol/fsp/Makefile | 6 + src/protocol/fsp/fsp.c | 341 ++++++++++++++++++++++++++++++++++++++ src/protocol/fsp/fsp.h | 16 ++ src/protocol/protocol.c | 5 + src/protocol/protocol.h | 1 + 9 files changed, 396 insertions(+) create mode 100644 src/protocol/fsp/Makefile create mode 100644 src/protocol/fsp/fsp.c create mode 100644 src/protocol/fsp/fsp.h diff --git a/Makefile.config.in b/Makefile.config.in index 583d8b15..c83fccf7 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -114,6 +114,7 @@ CONFIG_EXMODE = @CONFIG_EXMODE@ CONFIG_FASTMEM = @CONFIG_FASTMEM@ CONFIG_FINGER = @CONFIG_FINGER@ CONFIG_FORMHIST = @CONFIG_FORMHIST@ +CONFIG_FSP = @CONFIG_FSP@ CONFIG_FTP = @CONFIG_FTP@ CONFIG_GLOBHIST = @CONFIG_GLOBHIST@ CONFIG_GNUTLS = @CONFIG_GNUTLS@ diff --git a/configure.in b/configure.in index e70b85e4..80bb9d00 100644 --- a/configure.in +++ b/configure.in @@ -1132,6 +1132,24 @@ EL_ARG_DEPEND(CONFIG_CGI, cgi, [HAVE_SETENV_OR_PUTENV:yes], [Local CGI], EL_ARG_ENABLE(CONFIG_FINGER, finger, [Finger protocol], [ --enable-finger enable finger protocol support]) +dnl =================================================================== +dnl FSP protocol +dnl =================================================================== + +EL_ARG_ENABLE(CONFIG_FSP, fsp, [FSP protocol], + [ --enable-fsp enable FSP protocol support]) + +if test "x${enable_fsp}" != xno; then + AC_CHECK_HEADERS(fsplib.h, CONFIG_FSP=yes, CONFIG_FSP=no) + + if test "$CONFIG_FSP" = yes; then + AC_CHECK_LIB(fsplib, fsp_open_session, CONFIG_FSP=yes, CONFIG_FSP=no) + if test "$CONFIG_FSP" = yes; then + LIBS="$LIBS -lfsplib" + fi + fi +fi + EL_ARG_ENABLE(CONFIG_FTP, ftp, [FTP protocol], [ --disable-ftp disable ftp protocol support]) diff --git a/features.conf b/features.conf index e725316b..c19ce563 100644 --- a/features.conf +++ b/features.conf @@ -297,6 +297,13 @@ CONFIG_DATA=yes CONFIG_FINGER=no +### FSP protocol +# +# See: http://fsp.sourceforge.net/ +# +# Default: disabled + +CONFIG_FSP=no ### File Transfer Protocol Support # diff --git a/src/protocol/Makefile b/src/protocol/Makefile index 9c49a21c..f4e83fdb 100644 --- a/src/protocol/Makefile +++ b/src/protocol/Makefile @@ -3,6 +3,7 @@ include $(top_builddir)/Makefile.config SUBDIRS-$(CONFIG_BITTORRENT) += bittorrent SUBDIRS-$(CONFIG_FINGER) += finger +SUBDIRS-$(CONFIG_FSP) += fsp SUBDIRS-$(CONFIG_FTP) += ftp SUBDIRS-$(CONFIG_GOPHER) += gopher SUBDIRS-$(CONFIG_NNTP) += nntp diff --git a/src/protocol/fsp/Makefile b/src/protocol/fsp/Makefile new file mode 100644 index 00000000..87341f6e --- /dev/null +++ b/src/protocol/fsp/Makefile @@ -0,0 +1,6 @@ +top_builddir=../../.. +include $(top_builddir)/Makefile.config + +OBJS = fsp.o + +include $(top_srcdir)/Makefile.lib diff --git a/src/protocol/fsp/fsp.c b/src/protocol/fsp/fsp.c new file mode 100644 index 00000000..6f1d3d3c --- /dev/null +++ b/src/protocol/fsp/fsp.c @@ -0,0 +1,341 @@ +/* Internal FSP protocol implementation */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE /* Needed for asprintf() */ +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TIME_H +#include /* FreeBSD needs this before resource.h */ +#endif +#include /* FreeBSD needs this before resource.h */ +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include /* OS/2 needs this after sys/types.h */ +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "elinks.h" + +#include "cache/cache.h" +#include "config/options.h" +#include "intl/gettext/libintl.h" +#include "main/module.h" +#include "main/select.h" +#include "network/connection.h" +#include "network/socket.h" +#include "osdep/osdep.h" +#include "protocol/protocol.h" +#include "protocol/fsp/fsp.h" +#include "protocol/uri.h" +#include "util/memory.h" +#include "util/snprintf.h" +#include "util/string.h" + + +struct option_info fsp_options[] = { + INIT_OPT_TREE("protocol", N_("FSP"), + "fsp", 0, + N_("FSP specific options.")), + + INIT_OPT_BOOL("protocol.fsp", N_("Sort entries"), + "sort", 0, 1, + N_("Whether sort entries in directory listings.")), + + NULL_OPTION_INFO, +}; + +struct module fsp_protocol_module = struct_module( + /* name: */ N_("FSP"), + /* options: */ fsp_options, + /* hooks: */ NULL, + /* submodules: */ NULL, + /* data: */ NULL, + /* init: */ NULL, + /* done: */ NULL +); + + +struct fsp_info { + int init; +}; + +static void +fsp_error(unsigned char *error) +{ + puts(error); + exit(1); +} + +static int +compare(FSP_RDENTRY *a, FSP_RDENTRY *b) +{ + int res = ((b->type == FSP_RDTYPE_DIR) - (a->type == FSP_RDTYPE_DIR)); + + if (res) + return res; + return strcmp(a->name, b->name); +} + + +static void +sort_and_display_entries(FSP_DIR *dir) +{ + FSP_RDENTRY fentry, *fresult, *table = NULL; + int size = 0; + int i; + unsigned char dircolor[8]; + + if (get_opt_bool("document.browse.links.color_dirs")) { + color_to_string(get_opt_color("document.colors.dirs"), + (unsigned char *) &dircolor); + } else { + dircolor[0] = 0; + } + + while (!fsp_readdir_native(dir, &fentry, &fresult)) { + FSP_RDENTRY *new_table; + + if (!fresult) break; + if (!strcmp(fentry.name, ".")) + continue; + new_table = mem_realloc(table, (size + 1) * sizeof(*table)); + if (!new_table) + continue; + table = new_table; + memcpy(&table[size], &fentry, sizeof(fentry)); + size++; + } + qsort(table, size, sizeof(fentry), + (int (*)(const void *, const void *)) compare); + + for (i = 0; i < size; i++) { + printf("%10d\t", table[i].size, table[i].name); + if (fentry.type == FSP_RDTYPE_DIR && *dircolor) { + printf("", dircolor); + } + printf("%s", table[i].name); + if (fentry.type == FSP_RDTYPE_DIR && *dircolor) { + printf(""); + } + puts(""); + } +} + +static void +fsp_directory(FSP_SESSION *ses, struct uri *uri) +{ + struct string buf; + FSP_DIR *dir; + unsigned char *data = get_uri_string(uri, URI_DATA); + + if (!init_string(&buf)) + fsp_error("Out of memory"); + + add_to_string(&buf, "fsp://"); + if (uri->passwordlen) { + add_to_string(&buf, "u:"); + add_bytes_to_string(&buf, uri->password, uri->passwordlen); + add_char_to_string(&buf, '@'); + } + add_bytes_to_string(&buf, uri->host, uri->hostlen); + if (uri->portlen) { + add_char_to_string(&buf, ':'); + add_bytes_to_string(&buf, uri->port, uri->portlen); + } + add_char_to_string(&buf, '/'); + if (uri->datalen) { + add_bytes_to_string(&buf, uri->data, uri->datalen); + add_char_to_string(&buf, '/'); + } + + printf("%s" + "
", buf.source, buf.source);
+
+	dir = fsp_opendir(ses, data);
+	if (!dir) goto end;
+
+	if (get_opt_bool("protocol.fsp.sort")) {
+		sort_and_display_entries(dir);
+	} else {
+		FSP_RDENTRY fentry, *fresult;
+		unsigned char dircolor[8];
+
+		if (get_opt_bool("document.browse.links.color_dirs")) {
+			color_to_string(get_opt_color("document.colors.dirs"),
+				(unsigned char *) &dircolor);
+		} else {
+			dircolor[0] = 0;
+		}
+		
+		while (!fsp_readdir_native(dir, &fentry, &fresult)) {
+			if (!fresult) break;
+			printf("%10d\t", fentry.size, fentry.name);
+			if (fentry.type == FSP_RDTYPE_DIR && *dircolor) {
+				printf("", dircolor);
+			}
+			printf("%s", fentry.name);
+			if (fentry.type == FSP_RDTYPE_DIR && *dircolor) {
+				printf("");
+			}
+			puts("");
+		}
+		fsp_closedir(dir);
+	}
+end:
+	puts("
"); + fsp_close_session(ses); + exit(0); +} + +#define READ_SIZE 4096 + +static void +do_fsp(struct connection *conn) +{ + struct stat sb; + struct uri *uri = conn->uri; + unsigned char *host = get_uri_string(uri, URI_HOST); + unsigned char *password = get_uri_string(uri, URI_PASSWORD); + unsigned char *data = get_uri_string(uri, URI_DATA); + unsigned short port = (unsigned short)get_uri_port(uri); + FSP_SESSION *ses = fsp_open_session(host, port, password); + + if (!ses) + fsp_error("Session initialization failed."); + if (fsp_stat(ses, data, &sb)) + fsp_error("File not found."); + if (S_ISDIR(sb.st_mode)) + fsp_directory(ses, uri); + else { /* regular file */ + char buf[4096]; + FSP_FILE *file = fsp_fopen(ses, data, "r"); + int r; + + if (!file) + fsp_error("fsp_fopen error."); + + while ((r = fsp_fread(buf, 1, READ_SIZE, file)) > 0) + fwrite(buf, 1, r, stdout); + fsp_fclose(file); + fsp_close_session(ses); + exit(0); + } +} + +static void +fsp_got_data(struct socket *socket, struct read_buffer *rb) +{ + int len = rb->length; + struct connection *conn = socket->conn; + + if (len < 0) { + abort_connection(conn, -errno); + return; + } + if (len == 0) { + if (conn->from) + normalize_cache_entry(conn->cached, conn->from); + close_socket(socket); + abort_connection(conn, S_OK); + return; + } + + conn->socket->state = SOCKET_END_ONCLOSE; + conn->received += len; + if (add_fragment(conn->cached, conn->from, rb->data, len) == 1) + conn->tries = 0; + conn->from += len; + kill_buffer_data(rb, len); + read_from_socket(socket, rb, S_TRANS, fsp_got_data); +} + +#undef READ_SIZE + + +/* Close all non-terminal file descriptors. */ +static void +close_all_non_term_fd(void) +{ + int n; + int max = 1024; +#ifdef RLIMIT_NOFILE + struct rlimit lim; + + if (!getrlimit(RLIMIT_NOFILE, &lim)) + max = lim.rlim_max; +#endif + for (n = 3; n < max; n++) + close(n); +} + +void +fsp_protocol_handler(struct connection *conn) +{ + int fsp_pipe[2] = { -1, -1 }; + int cpid; + struct read_buffer *buf; + + if (c_pipe(fsp_pipe)) { + int s_errno = errno; + + if (fsp_pipe[0] >= 0) close(fsp_pipe[0]); + if (fsp_pipe[1] >= 0) close(fsp_pipe[1]); + abort_connection(conn, -s_errno); + return; + } + + conn->cached = get_cache_entry(conn->uri); + if (!conn->cached) { + abort_connection(conn, S_OUT_OF_MEM); + return; + } + conn->from = 0; + conn->unrestartable = 1; + + cpid = fork(); + if (cpid == -1) { + int s_errno = errno; + + close(fsp_pipe[0]); + close(fsp_pipe[1]); + retry_connection(conn, -s_errno); + return; + } + + if (!cpid) { + close(1); + dup2(fsp_pipe[1], 1); + close(0); + dup2(open("/dev/null", O_RDONLY), 0); + close(2); + dup2(open("/dev/null", O_RDONLY), 2); + close(fsp_pipe[0]); + + close_all_non_term_fd(); + do_fsp(conn); + + } else { + conn->socket->fd = fsp_pipe[0]; + close(fsp_pipe[1]); + buf = alloc_read_buffer(conn->socket); + if (!buf) { + close(fsp_pipe[0]); + abort_connection(conn, S_OUT_OF_MEM); + return; + } + read_from_socket(conn->socket, buf, S_CONN, fsp_got_data); + } +} diff --git a/src/protocol/fsp/fsp.h b/src/protocol/fsp/fsp.h new file mode 100644 index 00000000..b5b9087e --- /dev/null +++ b/src/protocol/fsp/fsp.h @@ -0,0 +1,16 @@ + +#ifndef EL__PROTOCOL_FSP_FSP_H +#define EL__PROTOCOL_FSP_FSP_H + +#include "main/module.h" +#include "protocol/protocol.h" + +extern struct module fsp_protocol_module; + +#ifdef CONFIG_FSP +extern protocol_handler_T fsp_protocol_handler; +#else +#define fsp_protocol_handler NULL +#endif + +#endif diff --git a/src/protocol/protocol.c b/src/protocol/protocol.c index 388b5b67..9ab10da8 100644 --- a/src/protocol/protocol.c +++ b/src/protocol/protocol.c @@ -31,6 +31,7 @@ #include "protocol/data.h" #include "protocol/file/file.h" #include "protocol/finger/finger.h" +#include "protocol/fsp/fsp.h" #include "protocol/ftp/ftp.h" #include "protocol/gopher/gopher.h" #include "protocol/http/http.h" @@ -57,6 +58,7 @@ static const struct protocol_backend protocol_backends[] = { { "data", 0, data_protocol_handler, 0, 0, 1, 0 }, { "file", 0, file_protocol_handler, 1, 0, 0, 0 }, { "finger", 79, finger_protocol_handler, 1, 1, 0, 0 }, + { "fsp", 21, fsp_protocol_handler, 1, 1, 0, 0 }, { "ftp", 21, ftp_protocol_handler, 1, 1, 0, 0 }, { "gopher", 70, gopher_protocol_handler, 1, 1, 0, 0 }, { "http", 80, http_protocol_handler, 1, 1, 0, 0 }, @@ -276,6 +278,9 @@ static struct module *protocol_submodules[] = { #ifdef CONFIG_FINGER &finger_protocol_module, #endif +#ifdef CONFIG_FSP + &fsp_protocol_module, +#endif #ifdef CONFIG_FTP &ftp_protocol_module, #endif diff --git a/src/protocol/protocol.h b/src/protocol/protocol.h index 614c2173..c39e794c 100644 --- a/src/protocol/protocol.h +++ b/src/protocol/protocol.h @@ -14,6 +14,7 @@ enum protocol { PROTOCOL_DATA, PROTOCOL_FILE, PROTOCOL_FINGER, + PROTOCOL_FSP, PROTOCOL_FTP, PROTOCOL_GOPHER, PROTOCOL_HTTP, From 04b253eef9884904e5b44194465fe28f5634a575 Mon Sep 17 00:00:00 2001 From: Date: Mon, 16 Jan 2006 11:45:17 +0100 Subject: [PATCH 014/204] Make PHP 5 happy. --- src/protocol/file/cgi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/protocol/file/cgi.c b/src/protocol/file/cgi.c index 67d8744a..30ed2a07 100644 --- a/src/protocol/file/cgi.c +++ b/src/protocol/file/cgi.c @@ -150,6 +150,7 @@ set_vars(struct connection *conn, unsigned char *script) if (env_set("SCRIPT_NAME", script, -1)) return -1; if (env_set("SCRIPT_FILENAME", script, -1)) return -1; if (env_set("PATH_TRANSLATED", script, -1)) return -1; + if (env_set("REDIRECT_STATUS", "1", -1)) return -1; /* From now on, just HTTP-like headers are being set. Missing variables * due to full environment are not a problem according to the CGI/1.1 From 8782b016594d6db1ade35865367de5f50d1d8643 Mon Sep 17 00:00:00 2001 From: Date: Mon, 16 Jan 2006 13:51:08 +0100 Subject: [PATCH 015/204] thisobj is for function object, self is for object --- src/ecmascript/see/form.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ecmascript/see/form.c b/src/ecmascript/see/form.c index ca8fd1b8..c650e555 100644 --- a/src/ecmascript/see/form.c +++ b/src/ecmascript/see/form.c @@ -350,7 +350,7 @@ js_input_click(struct SEE_interpreter *interp, struct SEE_object *self, struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; struct session *ses = doc_view->session; - struct js_input *input = (struct js_input *)thisobj; + struct js_input *input = (struct js_input *)self; struct form_state *fs = input->fs; struct form_control *fc; int linknum; @@ -384,7 +384,7 @@ js_input_focus(struct SEE_interpreter *interp, struct SEE_object *self, struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; struct session *ses = doc_view->session; - struct js_input *input = (struct js_input *)thisobj; + struct js_input *input = (struct js_input *)self; struct form_state *fs = input->fs; struct form_control *fc; int linknum; @@ -502,7 +502,7 @@ js_form_elems_item(struct SEE_interpreter *interp, struct SEE_object *self, struct view_state *vs = g->win->vs; struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; - struct js_form_elems *jsfe = (struct js_form_elems *)thisobj; + struct js_form_elems *jsfe = (struct js_form_elems *)self; struct js_form *parent_form = jsfe->parent; struct form_view *fv = parent_form->fv; struct form *form = find_form_by_form_view(document, fv); @@ -544,7 +544,7 @@ js_form_elems_namedItem(struct SEE_interpreter *interp, struct SEE_object *self, struct view_state *vs = g->win->vs; struct document_view *doc_view = vs->doc_view; struct document *document = doc_view->document; - struct js_form_elems *jsfe = (struct js_form_elems *)thisobj; + struct js_form_elems *jsfe = (struct js_form_elems *)self; struct js_form *parent_form = jsfe->parent; struct form_view *fv = parent_form->fv; struct form *form = find_form_by_form_view(document, fv); @@ -902,7 +902,7 @@ js_form_reset(struct SEE_interpreter *interp, struct SEE_object *self, struct global_object *g = (struct global_object *)interp; struct view_state *vs = g->win->vs; struct document_view *doc_view = vs->doc_view; - struct js_form *js_form = (struct js_form *)thisobj; + struct js_form *js_form = (struct js_form *)self; struct form_view *fv = js_form->fv; struct form *form = find_form_by_form_view(doc_view->document, fv); @@ -923,7 +923,7 @@ js_form_submit(struct SEE_interpreter *interp, struct SEE_object *self, struct view_state *vs = g->win->vs; struct document_view *doc_view = vs->doc_view; struct session *ses = doc_view->session; - struct js_form *js_form = (struct js_form *)thisobj; + struct js_form *js_form = (struct js_form *)self; struct form_view *fv = js_form->fv; struct form *form = find_form_by_form_view(doc_view->document, fv); From b8126ea9de737e2d8f7a544b3b54be202fd23126 Mon Sep 17 00:00:00 2001 From: Date: Mon, 16 Jan 2006 14:14:14 +0100 Subject: [PATCH 016/204] Introduced ecmascript submodules --- src/ecmascript/ecmascript.c | 18 +++++++++++++++++- src/ecmascript/see.c | 10 ++++++++++ src/ecmascript/see.h | 1 + src/ecmascript/spidermonkey.c | 10 ++++++++++ src/ecmascript/spidermonkey.h | 1 + 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/ecmascript/ecmascript.c b/src/ecmascript/ecmascript.c index 718786ff..8948eab0 100644 --- a/src/ecmascript/ecmascript.c +++ b/src/ecmascript/ecmascript.c @@ -24,6 +24,12 @@ #include "viewer/text/form.h" /* <-ecmascript_reset_state() */ #include "viewer/text/vs.h" +#ifdef CONFIG_ECMASCRIPT_SEE +#include "ecmascript/see.h" +#elif defined(CONFIG_SPIDERMONKEY) +#include "ecmascript/spidermonkey.h" +#endif + /* TODO: We should have some kind of ACL for the scripts - i.e. ability to * disallow the scripts to open new windows (or so that the windows are always @@ -133,11 +139,21 @@ ecmascript_timeout_dialog(struct terminal *term, int max_exec_time) } +static struct module *ecmascript_modules[] = { +#ifdef CONFIG_ECMASCRIPT_SEE + &see_module, +#elif defined(CONFIG_SPIDERMONKEY) + &spidermonkey_module, +#endif + NULL, +}; + + struct module ecmascript_module = struct_module( /* name: */ N_("ECMAScript"), /* options: */ ecmascript_options, /* events: */ NULL, - /* submodules: */ NULL, + /* submodules: */ ecmascript_modules, /* data: */ NULL, /* init: */ ecmascript_init, /* done: */ ecmascript_done diff --git a/src/ecmascript/see.c b/src/ecmascript/see.c index 6f203b40..4f353a79 100644 --- a/src/ecmascript/see.c +++ b/src/ecmascript/see.c @@ -240,3 +240,13 @@ see_eval_boolback(struct ecmascript_interpreter *interpreter, } return res; } + +struct module see_module = struct_module( + /* name: */ "SEE", + /* options: */ NULL, + /* events: */ NULL, + /* submodules: */ NULL, + /* data: */ NULL, + /* init: */ NULL, + /* done: */ NULL +); diff --git a/src/ecmascript/see.h b/src/ecmascript/see.h index 206be2cb..8d75c6e2 100644 --- a/src/ecmascript/see.h +++ b/src/ecmascript/see.h @@ -14,4 +14,5 @@ void see_eval(struct ecmascript_interpreter *interpreter, struct string *code); unsigned char *see_eval_stringback(struct ecmascript_interpreter *interpreter, struct string *code); int see_eval_boolback(struct ecmascript_interpreter *interpreter, struct string *code); +extern struct module see_module; #endif diff --git a/src/ecmascript/spidermonkey.c b/src/ecmascript/spidermonkey.c index 0f21054f..00ca51e9 100644 --- a/src/ecmascript/spidermonkey.c +++ b/src/ecmascript/spidermonkey.c @@ -376,3 +376,13 @@ spidermonkey_eval_boolback(struct ecmascript_interpreter *interpreter, return jsval_to_boolean(ctx, &rval); } + +struct module spidermonkey_module = struct_module( + /* name: */ "SpiderMonkey", + /* options: */ NULL, + /* events: */ NULL, + /* submodules: */ NULL, + /* data: */ NULL, + /* init: */ NULL, + /* done: */ NULL +); diff --git a/src/ecmascript/spidermonkey.h b/src/ecmascript/spidermonkey.h index a0241cd8..b9f2b635 100644 --- a/src/ecmascript/spidermonkey.h +++ b/src/ecmascript/spidermonkey.h @@ -14,4 +14,5 @@ void spidermonkey_eval(struct ecmascript_interpreter *interpreter, struct string unsigned char *spidermonkey_eval_stringback(struct ecmascript_interpreter *interpreter, struct string *code); int spidermonkey_eval_boolback(struct ecmascript_interpreter *interpreter, struct string *code); +extern struct module spidermonkey_module; #endif From 5a3f77fbe2dd2f0bce7f73cf8f5701561985425a Mon Sep 17 00:00:00 2001 From: Date: Mon, 16 Jan 2006 14:16:13 +0100 Subject: [PATCH 017/204] Removed obsolete CGI script. From now there is native FSP support. --- contrib/cgi/Makefile | 2 - contrib/cgi/README.FSP | 8 -- contrib/cgi/fspcgi.c | 172 ----------------------------------------- 3 files changed, 182 deletions(-) delete mode 100644 contrib/cgi/Makefile delete mode 100644 contrib/cgi/README.FSP delete mode 100644 contrib/cgi/fspcgi.c diff --git a/contrib/cgi/Makefile b/contrib/cgi/Makefile deleted file mode 100644 index 9881520a..00000000 --- a/contrib/cgi/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -fspcgi: fspcgi.o - $(CC) -o $@ $< -lfsplib diff --git a/contrib/cgi/README.FSP b/contrib/cgi/README.FSP deleted file mode 100644 index 537befc3..00000000 --- a/contrib/cgi/README.FSP +++ /dev/null @@ -1,8 +0,0 @@ -To use this CGI script you need to build fspcgi and copy the executable -to your cgi directory. In ELinks, you can then use this URL: - - file:///"path_to_fspcgi"?host:port/path_to_file_or_directory - -You can find more info about the FSP protocol at - - http://fsp.sourceforge.net/ diff --git a/contrib/cgi/fspcgi.c b/contrib/cgi/fspcgi.c deleted file mode 100644 index afbc5261..00000000 --- a/contrib/cgi/fspcgi.c +++ /dev/null @@ -1,172 +0,0 @@ -/* CGI script for FSP protocol support */ - -#include -#include -#include -#include -#include -#include -#include -#include - -char *pname, *query; - -struct fq { - char *password; - char *host; - char *path; - unsigned short port; -} data; - -static void -error(const char *str) -{ - printf("Content-Type: text/plain\r\nConnection: close\r\n\r\n"); - puts(str); - printf("%s\n", query); - exit(1); -} - -static void -process_directory(FSP_SESSION *ses) -{ - char buf[1024]; - FSP_DIR *dir; - /* TODO: password */ - - snprintf(buf, sizeof(buf), "file://%s?%s:%d%s/", pname, data.host, - data.port, data.path); - printf("Content-Type: text/html\r\n\r\n"); - printf("%s\n", buf); - dir = fsp_opendir(ses, data.path); - if (dir) { - FSP_RDENTRY fentry, *fresult; - - while (!fsp_readdir_native(dir, &fentry, &fresult)) { - if (!fresult) break; - printf("%s
\n", buf, fentry.name, fentry.name); - } - fsp_closedir(dir); - } - puts(""); - fsp_close_session(ses); - exit(0); -} - -static void -process_data(void) -{ - FSP_SESSION *ses = fsp_open_session(data.host, data.port, data.password); - struct stat sb; - - if (!ses) error("Session initialization failed."); - if (fsp_stat(ses, data.path, &sb)) error("File not found."); - if (S_ISDIR(sb.st_mode)) process_directory(ses); - else { /* regular file */ - char buf[4096]; - FSP_FILE *file = fsp_fopen(ses, data.path, "r"); - int r; - - if (!file) error("fsp_fopen error."); - printf("Content-Type: application/octet-stream\r\nContent-Length: %d\r\n" - "Connection: close\r\n\r\n", sb.st_size); - while ((r = fsp_fread(buf, 1, 4096, file)) > 0) fwrite(buf, 1, r, stdout); - fsp_fclose(file); - fsp_close_session(ses); - exit(0); - } -} - -static void -process_query(void) -{ - char *at = strchr(query, '@'); - char *colon; - char *slash; - - if (at) { - *at = '\0'; - data.password = strdup(query); - query = at + 1; - } - colon = strchr(query, ':'); - if (colon) { - *colon = '\0'; - data.host = strdup(query); - data.port = atoi(colon + 1); - slash = strchr(colon + 1, '/'); - if (slash) { - data.path = strdup(slash); - } else { - data.path = "/"; - } - } else { - data.port = 21; - slash = strchr(query, '/'); - if (slash) { - *slash = '\0'; - data.host = strdup(query); - *slash = '/'; - data.path = strdup(slash); - } else { - data.host = strdup(query); - data.path = "/"; - } - } - process_data(); -} - -static inline int -unhx(register unsigned char a) -{ - if (isdigit(a)) return a - '0'; - if (a >= 'a' && a <= 'f') return a - 'a' + 10; - if (a >= 'A' && a <= 'F') return a - 'A' + 10; - return -1; -} - -static void -decode_query(char *src) -{ - char *dst = src; - char c; - - do { - c = *src++; - - if (c == '%') { - int x1 = unhx(*src); - - if (x1 >= 0) { - int x2 = unhx(*(src + 1)); - - if (x2 >= 0) { - x1 = (x1 << 4) + x2; - if (x1 != 0) { /* don't allow %00 */ - c = (unsigned char) x1; - src += 2; - } - } - } - - } else if (c == '+') { - c = ' '; - } - - *dst++ = c; - } while (c != '\0'); -} - -int -main(int argc, char **argv) -{ - char *q = getenv("QUERY_STRING"); - - if (!q) return 1; - pname = argv[0]; - query = strdup(q); - if (!query) return 2; - decode_query(query); - process_query(); - return 0; -} From 6cd9a11fdca46601ba79c6cc74d2e46cc23a5820 Mon Sep 17 00:00:00 2001 From: Date: Mon, 16 Jan 2006 14:32:13 +0100 Subject: [PATCH 018/204] Use frame->name instead of target avoiding possible segfault. --- src/ecmascript/see/window.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ecmascript/see/window.c b/src/ecmascript/see/window.c index 462a2544..bfe37e35 100644 --- a/src/ecmascript/see/window.c +++ b/src/ecmascript/see/window.c @@ -117,10 +117,14 @@ static void delayed_goto_uri_frame(void *data) { struct delayed_open *deo = data; + struct frame *frame; assert(deo); - goto_uri_frame(deo->ses, deo->uri, deo->target, CACHE_MODE_NORMAL); + frame = ses_find_frame(deo->ses, deo->target); + if (frame) + goto_uri_frame(deo->ses, deo->uri, frame->name, CACHE_MODE_NORMAL); done_uri(deo->uri); + mem_free(deo->target); mem_free(deo); } @@ -326,11 +330,13 @@ js_window_open(struct SEE_interpreter *interp, struct SEE_object *self, deo->ses = ses; deo->uri = get_uri_reference(uri); deo->target = target; + /* target will be freed in delayed_goto_uri_frame */ register_bottom_half(delayed_goto_uri_frame, deo); goto end; } } + mem_free_if(target); if (!get_cmd_opt_bool("no-connect") && !get_cmd_opt_bool("no-home") && !get_cmd_opt_bool("anonymous") @@ -350,7 +356,6 @@ js_window_open(struct SEE_interpreter *interp, struct SEE_object *self, } end: - mem_free_if(target); done_uri(uri); } From 1082c85bd080a56a15819755ccd60c09d98941ae Mon Sep 17 00:00:00 2001 From: Miciah Dashiel Butler Masters Date: Mon, 16 Jan 2006 18:53:56 +0000 Subject: [PATCH 019/204] Fix GITweb smartprefix blob, tree, and history commands. --- contrib/smjs/smartprefixes_common.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contrib/smjs/smartprefixes_common.js b/contrib/smjs/smartprefixes_common.js index 1ea9af17..65f5fb05 100644 --- a/contrib/smjs/smartprefixes_common.js +++ b/contrib/smjs/smartprefixes_common.js @@ -58,7 +58,7 @@ function cvsweb (base, project, url) /* javascript:gitweb("http://pasky.or.cz/gitweb.cgi", "elinks.git", "%s"); */ function gitweb(base, project, url) { - var parts = url.match(/^(search|summary|shortlog|log|commit|commitdiff|tree|tag)(\s(.*))?/); + var parts = url.match(/^(search|summary|shortlog|log|blob|commit|commitdiff|history|tree|tag)(\s(.*))?/); var query = '?p=' + project; if (parts) { @@ -67,6 +67,8 @@ function gitweb(base, project, url) /* If the extra arg is not for searching assume it is an ID. */ if (parts[1] == 'search' && parts[3]) query += ';s=' + escape(parts[3]); + else if ((parts[1] == 'blob' || parts[1] == 'history' || parts[1] == 'tree') && parts[3]) + query += ';f=' + escape(parts[3]); else if (parts[3]) query += ';h=' + escape(parts[3]); From 7df751ab5967a3d770783537c0cb445b67f162c1 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 20:06:15 +0100 Subject: [PATCH 020/204] Paste the first few lines of fsp.sf.net into the FSP description --- features.conf | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/features.conf b/features.conf index c19ce563..061c5ddb 100644 --- a/features.conf +++ b/features.conf @@ -297,9 +297,17 @@ CONFIG_DATA=yes CONFIG_FINGER=no -### FSP protocol +### File Servive Protocol # -# See: http://fsp.sourceforge.net/ +# File Service Protocol (FSP) is a very lightweight UDP based protocol for +# transferring files. FSP has many benefits over FTP, mainly for running +# anonymous archives. FSP protocol is valuable in all kinds of environments +# because it is one of the only TCP/IP protocols that is not aggressive about +# bandwidth, while still being sufficiently fault tolerant. +# +# FSP is what anonymous FTP *should* be! +# +# See http://fsp.sourceforge.net/ for more info. # # Default: disabled From 1f68492d57279a6aa3479c79db105219d0cb1d82 Mon Sep 17 00:00:00 2001 From: Miciah Dashiel Butler Masters Date: Mon, 16 Jan 2006 19:18:33 +0000 Subject: [PATCH 021/204] Move delayed_goto_uri_frame to src/session/task.c Until the last change in src/ecmascript/see/window.c, the two copies of delayed_goto_uri_frame in src/ecmascript/spidermonkey/window.c and in src/ecmascript/see/window.c were identical. That change applies to both versions, so move the newer one to src/session/task.c and eliminate the duplication. Also move struct delayed_open to src/session/session.h. --- src/ecmascript/see/window.c | 22 ---------------------- src/ecmascript/spidermonkey/window.c | 17 ----------------- src/session/session.h | 7 +++++++ src/session/task.c | 15 +++++++++++++++ src/session/task.h | 1 + 5 files changed, 23 insertions(+), 39 deletions(-) diff --git a/src/ecmascript/see/window.c b/src/ecmascript/see/window.c index bfe37e35..fbf1b406 100644 --- a/src/ecmascript/see/window.c +++ b/src/ecmascript/see/window.c @@ -49,7 +49,6 @@ static struct js_window_object *js_get_global_object(void *); static struct js_window_object *js_try_resolve_frame(struct document_view *, unsigned char *); static void delayed_open(void *); -static void delayed_goto_uri_frame(void *); static void window_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); static void window_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); static int window_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); @@ -59,12 +58,6 @@ static void js_window_open(struct SEE_interpreter *, struct SEE_object *, struct void location_goto(struct document_view *, unsigned char *); -struct delayed_open { - struct session *ses; - struct uri *uri; - unsigned char *target; -}; - struct SEE_objectclass js_window_object_class = { NULL, window_get, @@ -113,21 +106,6 @@ delayed_open(void *data) mem_free(deo); } -static void -delayed_goto_uri_frame(void *data) -{ - struct delayed_open *deo = data; - struct frame *frame; - - assert(deo); - frame = ses_find_frame(deo->ses, deo->target); - if (frame) - goto_uri_frame(deo->ses, deo->uri, frame->name, CACHE_MODE_NORMAL); - done_uri(deo->uri); - mem_free(deo->target); - mem_free(deo); -} - static void diff --git a/src/ecmascript/spidermonkey/window.c b/src/ecmascript/spidermonkey/window.c index ad0017c1..1bac6eeb 100644 --- a/src/ecmascript/spidermonkey/window.c +++ b/src/ecmascript/spidermonkey/window.c @@ -289,12 +289,6 @@ window_alert(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval return JS_TRUE; } -struct delayed_open { - struct session *ses; - struct uri *uri; - unsigned char *target; -}; - static void delayed_open(void *data) { @@ -306,17 +300,6 @@ delayed_open(void *data) mem_free(deo); } -static void -delayed_goto_uri_frame(void *data) -{ - struct delayed_open *deo = data; - - assert(deo); - goto_uri_frame(deo->ses, deo->uri, deo->target, CACHE_MODE_NORMAL); - done_uri(deo->uri); - mem_free(deo); -} - static JSBool window_open(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { diff --git a/src/session/session.h b/src/session/session.h index 1d16faf6..bed30279 100644 --- a/src/session/session.h +++ b/src/session/session.h @@ -20,6 +20,13 @@ struct terminal; struct uri; struct window; +/* Used by delayed_open and delayed_goto_uri_frame. */ +struct delayed_open { + struct session *ses; + struct uri *uri; + unsigned char *target; +}; + enum remote_session_flags { SES_REMOTE_NEW_TAB = 1, SES_REMOTE_NEW_WINDOW = 2, diff --git a/src/session/task.c b/src/session/task.c index 5297ca90..81c8142a 100644 --- a/src/session/task.c +++ b/src/session/task.c @@ -662,6 +662,21 @@ goto_uri_frame(struct session *ses, struct uri *uri, follow_url(ses, uri, target, TASK_FORWARD, cache_mode, 1); } +void +delayed_goto_uri_frame(void *data) +{ + struct delayed_open *deo = data; + struct frame *frame; + + assert(deo); + frame = ses_find_frame(deo->ses, deo->target); + if (frame) + goto_uri_frame(deo->ses, deo->uri, frame->name, CACHE_MODE_NORMAL); + done_uri(deo->uri); + mem_free(deo->target); + mem_free(deo); +} + /* menu_func_T */ void map_selected(struct terminal *term, void *ld_, void *ses_) diff --git a/src/session/task.h b/src/session/task.h index e1a7c9a8..f61747bb 100644 --- a/src/session/task.h +++ b/src/session/task.h @@ -27,6 +27,7 @@ struct uri *get_hooked_uri(unsigned char *uristring, struct session *ses, unsign void goto_uri(struct session *ses, struct uri *uri); void goto_uri_frame(struct session *, struct uri *, unsigned char *, enum cache_mode); +void delayed_goto_uri_frame(void *); void goto_url(struct session *, unsigned char *); void goto_url_with_hook(struct session *, unsigned char *); int goto_url_home(struct session *ses); From 466bb18be09d2024257b46f01dcbbfa3f5190714 Mon Sep 17 00:00:00 2001 From: Miciah Dashiel Butler Masters Date: Mon, 16 Jan 2006 19:28:03 +0000 Subject: [PATCH 022/204] Move delayed_open to src/terminal/tab.c The two copies of delayed_open in src/ecmascript/spidermonkey/window.c and in src/ecmascript/see/window.c are identical, so move them to src/terminal/tab.c and eliminate the duplication. --- src/ecmascript/see/window.c | 13 ------------- src/ecmascript/spidermonkey/window.c | 11 ----------- src/terminal/tab.c | 11 +++++++++++ src/terminal/tab.h | 1 + 4 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/ecmascript/see/window.c b/src/ecmascript/see/window.c index fbf1b406..51cfa45e 100644 --- a/src/ecmascript/see/window.c +++ b/src/ecmascript/see/window.c @@ -48,7 +48,6 @@ static struct js_window_object *js_get_global_object(void *); static struct js_window_object *js_try_resolve_frame(struct document_view *, unsigned char *); -static void delayed_open(void *); static void window_get(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *); static void window_put(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *, struct SEE_value *, int); static int window_canput(struct SEE_interpreter *, struct SEE_object *, struct SEE_string *); @@ -95,18 +94,6 @@ js_try_resolve_frame(struct document_view *doc_view, unsigned char *id) } -static void -delayed_open(void *data) -{ - struct delayed_open *deo = data; - - assert(deo); - open_uri_in_new_tab(deo->ses, deo->uri, 0, 0); - done_uri(deo->uri); - mem_free(deo); -} - - static void window_get(struct SEE_interpreter *interp, struct SEE_object *o, diff --git a/src/ecmascript/spidermonkey/window.c b/src/ecmascript/spidermonkey/window.c index 1bac6eeb..3661caf0 100644 --- a/src/ecmascript/spidermonkey/window.c +++ b/src/ecmascript/spidermonkey/window.c @@ -289,17 +289,6 @@ window_alert(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval return JS_TRUE; } -static void -delayed_open(void *data) -{ - struct delayed_open *deo = data; - - assert(deo); - open_uri_in_new_tab(deo->ses, deo->uri, 0, 0); - done_uri(deo->uri); - mem_free(deo); -} - static JSBool window_open(JSContext *ctx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { diff --git a/src/terminal/tab.c b/src/terminal/tab.c index 02b8409f..94db8135 100644 --- a/src/terminal/tab.c +++ b/src/terminal/tab.c @@ -239,6 +239,17 @@ open_uri_in_new_tab(struct session *ses, struct uri *uri, int in_background, init_session(based ? ses : NULL, ses->tab->term, uri, in_background); } +void +delayed_open(void *data) +{ + struct delayed_open *deo = data; + + assert(deo); + open_uri_in_new_tab(deo->ses, deo->uri, 0, 0); + done_uri(deo->uri); + mem_free(deo); +} + void open_current_link_in_new_tab(struct session *ses, int in_background) { diff --git a/src/terminal/tab.h b/src/terminal/tab.h index 2fa38bd5..2fbc6e72 100644 --- a/src/terminal/tab.h +++ b/src/terminal/tab.h @@ -25,6 +25,7 @@ void close_all_tabs_but_current(struct session *ses); ((win)->type != WINDOW_NORMAL && (win) != get_current_tab((win->term))) void open_uri_in_new_tab(struct session *ses, struct uri *uri, int in_background, int based); +void delayed_open(void *); void open_current_link_in_new_tab(struct session *ses, int in_background); void move_current_tab(struct session *ses, int direction); From 9e592e2131463659aaa8c3a1598b4d615e8cd5b2 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 22:03:31 +0100 Subject: [PATCH 023/204] A few changes to improve configuration of FSP - Use EL_ARG_DEPENDS(), the other way ended up in undefined symbols errors with --enable-fsp and no fsplib. - Also check for -lfsp in addition to -lfsplib. - This could probably also use a --with-fsplib or something to specify the path, had problems with that too, because fsplib-0.7 installed into /usr/local, ... --- configure.in | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/configure.in b/configure.in index 80bb9d00..48b52614 100644 --- a/configure.in +++ b/configure.in @@ -1136,20 +1136,25 @@ dnl =================================================================== dnl FSP protocol dnl =================================================================== -EL_ARG_ENABLE(CONFIG_FSP, fsp, [FSP protocol], - [ --enable-fsp enable FSP protocol support]) - if test "x${enable_fsp}" != xno; then - AC_CHECK_HEADERS(fsplib.h, CONFIG_FSP=yes, CONFIG_FSP=no) + AC_CHECK_HEADERS(fsplib.h, HAVE_FSPLIB=yes, HAVE_FSPLIB=no) - if test "$CONFIG_FSP" = yes; then - AC_CHECK_LIB(fsplib, fsp_open_session, CONFIG_FSP=yes, CONFIG_FSP=no) - if test "$CONFIG_FSP" = yes; then + if test "$HAVE_FSPLIB" = yes; then + AC_CHECK_LIB(fsplib, fsp_open_session, HAVE_FSPLIB=yes, HAVE_FSPLIB=no) + if test "$HAVE_FSPLIB" = yes; then LIBS="$LIBS -lfsplib" + else + AC_CHECK_LIB(fsp, fsp_open_session, HAVE_FSPLIB=yes, HAVE_FSPLIB=no) + if test "$HAVE_FSPLIB" = yes; then + LIBS="$LIBS -lfsp" + fi fi fi fi +EL_ARG_DEPEND(CONFIG_FSP, fsp, [HAVE_FSPLIB:yes], [FSP protocol], + [ --enable-fsp enable FSP protocol support]) + EL_ARG_ENABLE(CONFIG_FTP, ftp, [FTP protocol], [ --disable-ftp disable ftp protocol support]) From 20c9b6a94159d3e8e3c7bde51e6b2fc62034c933 Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 22:12:32 +0100 Subject: [PATCH 024/204] Fix typo in the FSP conf title --- features.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features.conf b/features.conf index 061c5ddb..f05ed006 100644 --- a/features.conf +++ b/features.conf @@ -297,7 +297,7 @@ CONFIG_DATA=yes CONFIG_FINGER=no -### File Servive Protocol +### File Service Protocol # # File Service Protocol (FSP) is a very lightweight UDP based protocol for # transferring files. FSP has many benefits over FTP, mainly for running From 0955086a6f9e8728e49e7ced13b224056959751e Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 23:32:27 +0100 Subject: [PATCH 025/204] Move close_all_non_term_fd() shared by SMB and FSP to protocol/common Stick a note near the OBJS sorting that it is there also to filter out duplicates, which are now occuring with SMB and FSP compiled in. --- Makefile.lib | 3 ++- src/protocol/Makefile | 2 ++ src/protocol/fsp/fsp.c | 26 ++------------------------ src/protocol/smb/smb.c | 25 ++----------------------- 4 files changed, 8 insertions(+), 48 deletions(-) diff --git a/Makefile.lib b/Makefile.lib index fc7a40a2..a064af6e 100644 --- a/Makefile.lib +++ b/Makefile.lib @@ -93,7 +93,8 @@ endif ############################################################################# # Internal build rules -# All files in $(OBJS) and any $(subdir)/lib.o are linked into lib.o +# All files in $(OBJS) and any $(subdir)/lib.o are linked into lib.o. +# Sort them to filter out duplicated and get uniform order. LIB_O_DEPS = \ $(sort $(filter-out $(LIB_O_NAME),$(OBJS))) \ $(foreach subdir,$(sort $(SUBDIRS)),$(wildcard $(subdir)/$(LIB_O_NAME))) diff --git a/src/protocol/Makefile b/src/protocol/Makefile index f4e83fdb..6f4af60e 100644 --- a/src/protocol/Makefile +++ b/src/protocol/Makefile @@ -13,6 +13,8 @@ SUBDIRS-$(CONFIG_URI_REWRITE) += rewrite SUBDIRS = auth file http OBJS-$(CONFIG_DATA) += data.o +OBJS-$(CONFIG_FSP) += common.o +OBJS-$(CONFIG_SMB) += common.o OBJS = about.o date.o header.o protocol.o proxy.o uri.o user.o diff --git a/src/protocol/fsp/fsp.c b/src/protocol/fsp/fsp.c index 6f1d3d3c..26aaa61b 100644 --- a/src/protocol/fsp/fsp.c +++ b/src/protocol/fsp/fsp.c @@ -13,13 +13,6 @@ #include #include #include -#ifdef HAVE_SYS_TIME_H -#include /* FreeBSD needs this before resource.h */ -#endif -#include /* FreeBSD needs this before resource.h */ -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif #ifdef HAVE_FCNTL_H #include /* OS/2 needs this after sys/types.h */ #endif @@ -37,6 +30,7 @@ #include "network/connection.h" #include "network/socket.h" #include "osdep/osdep.h" +#include "protocol/common.h" #include "protocol/protocol.h" #include "protocol/fsp/fsp.h" #include "protocol/uri.h" @@ -265,22 +259,6 @@ fsp_got_data(struct socket *socket, struct read_buffer *rb) #undef READ_SIZE -/* Close all non-terminal file descriptors. */ -static void -close_all_non_term_fd(void) -{ - int n; - int max = 1024; -#ifdef RLIMIT_NOFILE - struct rlimit lim; - - if (!getrlimit(RLIMIT_NOFILE, &lim)) - max = lim.rlim_max; -#endif - for (n = 3; n < max; n++) - close(n); -} - void fsp_protocol_handler(struct connection *conn) { @@ -326,7 +304,7 @@ fsp_protocol_handler(struct connection *conn) close_all_non_term_fd(); do_fsp(conn); - + } else { conn->socket->fd = fsp_pipe[0]; close(fsp_pipe[1]); diff --git a/src/protocol/smb/smb.c b/src/protocol/smb/smb.c index 3d37af96..62550e31 100644 --- a/src/protocol/smb/smb.c +++ b/src/protocol/smb/smb.c @@ -12,13 +12,7 @@ #include #include #include -#ifdef HAVE_SYS_TIME_H -#include /* FreeBSD needs this before resource.h */ -#endif -#include /* FreeBSD needs this before resource.h */ -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif +#include #ifdef HAVE_FCNTL_H #include /* OS/2 needs this after sys/types.h */ #endif @@ -36,6 +30,7 @@ #include "network/connection.h" #include "network/socket.h" #include "osdep/osdep.h" +#include "protocol/common.h" #include "protocol/protocol.h" #include "protocol/smb/smb.h" #include "protocol/uri.h" @@ -525,22 +520,6 @@ bye: } -/* Close all non-terminal file descriptors. */ -static void -close_all_non_term_fd(void) -{ - int n; - int max = 1024; -#ifdef RLIMIT_NOFILE - struct rlimit lim; - - if (!getrlimit(RLIMIT_NOFILE, &lim)) - max = lim.rlim_max; -#endif - for (n = 3; n < max; n++) - close(n); -} - void smb_protocol_handler(struct connection *conn) { From bb12fbca378484d0098f9752d112c87a4338676b Mon Sep 17 00:00:00 2001 From: Jonas Fonseca Date: Mon, 16 Jan 2006 23:42:17 +0100 Subject: [PATCH 026/204] Add protocol/common files ;) --- src/protocol/common.c | 37 +++++++++++++++++++++++++++++++++++++ src/protocol/common.h | 7 +++++++ 2 files changed, 44 insertions(+) create mode 100644 src/protocol/common.c create mode 100644 src/protocol/common.h diff --git a/src/protocol/common.c b/src/protocol/common.c new file mode 100644 index 00000000..2195a9d1 --- /dev/null +++ b/src/protocol/common.c @@ -0,0 +1,37 @@ +/* Shared protocol functions */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_SYS_TIME_H +#include /* FreeBSD needs this before resource.h */ +#endif +#include /* FreeBSD needs this before resource.h */ +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#include "elinks.h" + +#include "protocol/common.h" + + +/* Close all non-terminal file descriptors. */ +void +close_all_non_term_fd(void) +{ + int n; + int max = 1024; +#ifdef RLIMIT_NOFILE + struct rlimit lim; + + if (!getrlimit(RLIMIT_NOFILE, &lim)) + max = lim.rlim_max; +#endif + for (n = 3; n < max; n++) + close(n); +} diff --git a/src/protocol/common.h b/src/protocol/common.h new file mode 100644 index 00000000..1f43b790 --- /dev/null +++ b/src/protocol/common.h @@ -0,0 +1,7 @@ +#ifndef EL__PROTOCOL_COMMON_H +#define EL__PROTOCOL_COMMON_H + +/* Close all non-terminal file descriptors. */ +void close_all_non_term_fd(void); + +#endif From 8fe86eac0b732f63edace9956e546245e87539c6 Mon Sep 17 00:00:00 2001 From: Laurent MONIN Date: Mon, 16 Jan 2006 23:50:34 +0100 Subject: [PATCH 027/204] Typo fix. --- src/protocol/fsp/fsp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/protocol/fsp/fsp.c b/src/protocol/fsp/fsp.c index 26aaa61b..92ebef3c 100644 --- a/src/protocol/fsp/fsp.c +++ b/src/protocol/fsp/fsp.c @@ -46,7 +46,7 @@ struct option_info fsp_options[] = { INIT_OPT_BOOL("protocol.fsp", N_("Sort entries"), "sort", 0, 1, - N_("Whether sort entries in directory listings.")), + N_("Whether to sort entries in directory listings.")), NULL_OPTION_INFO, }; From 491654975da6f63607bafa73a94d583eb63744c1 Mon Sep 17 00:00:00 2001 From: Laurent MONIN Date: Mon, 16 Jan 2006 23:51:02 +0100 Subject: [PATCH 028/204] Trim trailing whitespaces. --- src/protocol/fsp/fsp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/protocol/fsp/fsp.c b/src/protocol/fsp/fsp.c index 92ebef3c..62817060 100644 --- a/src/protocol/fsp/fsp.c +++ b/src/protocol/fsp/fsp.c @@ -173,7 +173,7 @@ fsp_directory(FSP_SESSION *ses, struct uri *uri) } else { dircolor[0] = 0; } - + while (!fsp_readdir_native(dir, &fentry, &fresult)) { if (!fresult) break; printf("%10d\t", fentry.size, fentry.name); @@ -304,7 +304,7 @@ fsp_protocol_handler(struct connection *conn) close_all_non_term_fd(); do_fsp(conn); - + } else { conn->socket->fd = fsp_pipe[0]; close(fsp_pipe[1]); From 3cb9af2f41d652287e1e514ab54e9ff8df809165 Mon Sep 17 00:00:00 2001 From: Laurent MONIN Date: Tue, 17 Jan 2006 00:04:10 +0100 Subject: [PATCH 029/204] French translation was updated. --- po/fr.po | 77 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/po/fr.po b/po/fr.po index 00dafd7e..5a237a2b 100644 --- a/po/fr.po +++ b/po/fr.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: ELinks 0.12.GIT\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2006-01-10 23:00+0100\n" -"PO-Revision-Date: 2006-01-10 23:01+0100\n" +"POT-Creation-Date: 2006-01-17 00:01+0100\n" +"PO-Revision-Date: 2006-01-17 00:02+0100\n" "Last-Translator: Laurent Monin \n" "Language-Team: French \n" "MIME-Version: 1.0\n" @@ -33,7 +33,7 @@ msgstr "Pressez espace pour d #: src/bfu/msgbox.c:189 src/config/dialogs.c:57 src/config/dialogs.c:391 #: src/cookies/dialogs.c:354 src/dialogs/edit.c:97 src/dialogs/info.c:133 #: src/dialogs/options.c:210 src/dialogs/options.c:290 src/mime/dialogs.c:129 -#: src/protocol/auth/dialogs.c:110 src/protocol/protocol.c:231 +#: src/protocol/auth/dialogs.c:110 src/protocol/protocol.c:233 #: src/scripting/lua/core.c:377 src/scripting/lua/core.c:457 #: src/session/session.c:792 src/viewer/text/search.c:1593 msgid "~OK" @@ -187,7 +187,7 @@ msgid "Digital clock in the status bar." msgstr "Horloge digitale dans la barre de status." #: src/bfu/leds.c:77 src/bfu/leds.c:94 src/config/options.inc:1118 -#: src/config/options.inc:1125 src/ecmascript/ecmascript.c:39 +#: src/config/options.inc:1125 src/ecmascript/ecmascript.c:45 #: src/globhist/globhist.c:63 src/mime/backend/mailcap.c:93 #: src/mime/backend/mimetypes.c:52 src/network/ssl/ssl.c:80 msgid "Enable" @@ -1796,7 +1796,7 @@ msgid "Description" msgstr "Description" #: src/config/dialogs.c:320 src/protocol/bittorrent/dialogs.c:594 -#: src/protocol/protocol.c:225 src/session/session.c:282 +#: src/protocol/protocol.c:227 src/session/session.c:282 #: src/session/session.c:954 src/viewer/text/textarea.c:331 #: src/viewer/text/textarea.c:338 msgid "Error" @@ -5358,31 +5358,31 @@ msgstr "" "Laisser à \"\" pour utiliser le style initial du document." #. name: -#: src/ecmascript/ecmascript.c:35 src/ecmascript/ecmascript.c:137 +#: src/ecmascript/ecmascript.c:41 src/ecmascript/ecmascript.c:153 msgid "ECMAScript" msgstr "ECMAScript" -#: src/ecmascript/ecmascript.c:37 +#: src/ecmascript/ecmascript.c:43 msgid "ECMAScript options." msgstr "Options d'ECMAScript." -#: src/ecmascript/ecmascript.c:41 +#: src/ecmascript/ecmascript.c:47 msgid "Whether to run those scripts inside of documents." msgstr "Exécuter ou non ces scripts présents dans les documents." -#: src/ecmascript/ecmascript.c:43 +#: src/ecmascript/ecmascript.c:49 msgid "Script error reporting" msgstr "Rapport d'erreur de script" -#: src/ecmascript/ecmascript.c:45 +#: src/ecmascript/ecmascript.c:51 msgid "Open a message box when a script reports an error." msgstr "Ouvrir une boîte de message quand un script produit une erreur." -#: src/ecmascript/ecmascript.c:47 +#: src/ecmascript/ecmascript.c:53 msgid "Ignore