From 85a3ee3e5bfe49f316a01140592d9ac174decf6e Mon Sep 17 00:00:00 2001
From: Chris Double <chris@bethia.(none)>
Date: Wed, 26 Mar 2008 16:43:03 +1300
Subject: [PATCH 1/9] Remove memoization in 'compile' word in pegs This creates
 issues when recompiling a an existing EBNF parser for reasons I've not yet
 tracked down. Disabling it slows things down but makes things work correctly
 till I investigate the issue.

---
 extra/peg/peg.factor | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/peg/peg.factor b/extra/peg/peg.factor
index 00271a9ad3..e9477dc408 100755
--- a/extra/peg/peg.factor
+++ b/extra/peg/peg.factor
@@ -28,7 +28,7 @@ GENERIC: (compile) ( parser -- quot )
     [ swap compiled-parsers get set-at ] keep
   ] if* ;
 
-MEMO: compile ( parser -- word )
+: compile ( parser -- word )
   H{ } clone compiled-parsers [ 
     [ compiled-parser ] with-compilation-unit 
   ] with-variable ;

From c793a381fe651b9d09e0b5689c20703de546aca2 Mon Sep 17 00:00:00 2001
From: Chris Double <chris@bethia.(none)>
Date: Wed, 26 Mar 2008 17:38:30 +1300
Subject: [PATCH 2/9] Add hook for packrat implementation

---
 extra/peg/peg.factor | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/extra/peg/peg.factor b/extra/peg/peg.factor
index e9477dc408..af26f888f1 100755
--- a/extra/peg/peg.factor
+++ b/extra/peg/peg.factor
@@ -17,6 +17,12 @@ SYMBOL: compiled-parsers
 
 GENERIC: (compile) ( parser -- quot )
 
+: run-parser ( input quot -- result )
+  #! Eventually this will be replaced with something that
+  #! can do packrat parsing by memoizing the results of
+  #! a parser. For now, it just calls the quotation.
+  call ; inline
+
 : compiled-parser ( parser -- word )
   #! Look to see if the given parser has been compiled.
   #! If not, compile it to a temporary word, cache it,
@@ -24,7 +30,7 @@ GENERIC: (compile) ( parser -- quot )
   dup compiled-parsers get at [
     nip
   ] [
-    dup (compile) define-temp 
+    dup (compile) [ run-parser ] curry define-temp 
     [ swap compiled-parsers get set-at ] keep
   ] if* ;
 

From bd33e2fef9e77195aefa384639978b33179aab45 Mon Sep 17 00:00:00 2001
From: Chris Double <chris@bethia.(none)>
Date: Thu, 27 Mar 2008 11:23:19 +1300
Subject: [PATCH 3/9] Fix cache to handle the case of 'f' being a valid cached
 value

---
 core/assocs/assocs.factor | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/core/assocs/assocs.factor b/core/assocs/assocs.factor
index ff0938e001..196ec614b7 100755
--- a/core/assocs/assocs.factor
+++ b/core/assocs/assocs.factor
@@ -134,11 +134,11 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc )
     (substitute) map ;
 
 : cache ( key assoc quot -- value )
-    2over at [
+    2over at* [
         >r 3drop r>
     ] [
-        pick rot >r >r call dup r> r> set-at
-    ] if* ; inline
+        drop pick rot >r >r call dup r> r> set-at
+    ] if ; inline
 
 : change-at ( key assoc quot -- )
     [ >r at r> call ] 3keep drop set-at ; inline

From 2614792254e590c280f9e5a9c69ba8146a7fa147 Mon Sep 17 00:00:00 2001
From: Chris Double <chris@bethia.(none)>
Date: Thu, 27 Mar 2008 11:23:58 +1300
Subject: [PATCH 4/9] Implement packrat algorithm

---
 extra/peg/peg.factor | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/extra/peg/peg.factor b/extra/peg/peg.factor
index af26f888f1..44a762cec2 100755
--- a/extra/peg/peg.factor
+++ b/extra/peg/peg.factor
@@ -3,7 +3,8 @@
 USING: kernel sequences strings namespaces math assocs shuffle 
        vectors arrays combinators.lib math.parser match
        unicode.categories sequences.lib compiler.units parser
-       words quotations effects memoize accessors combinators.cleave ;
+       words quotations effects memoize accessors 
+       combinators.cleave locals ;
 IN: peg
 
 TUPLE: parse-result remaining ast ;
@@ -14,14 +15,22 @@ SYMBOL: ignore
   parse-result construct-boa ;
 
 SYMBOL: compiled-parsers
+SYMBOL: packrat
+SYMBOL: failed
 
 GENERIC: (compile) ( parser -- quot )
 
+:: run-packrat-parser ( input quot c -- result )
+  input slice? [ input slice-from ] [ 0 ] if
+  quot c [ drop H{ } clone ] cache 
+  [
+    drop input quot call  
+  ] cache* ; inline
+
 : run-parser ( input quot -- result )
-  #! Eventually this will be replaced with something that
-  #! can do packrat parsing by memoizing the results of
-  #! a parser. For now, it just calls the quotation.
-  call ; inline
+  #! If a packrat cache is available, use memoization for
+  #! packrat parsing, otherwise do a standard peg call.
+  packrat get [ run-packrat-parser ] [ call ] if* ; inline
 
 : compiled-parser ( parser -- word )
   #! Look to see if the given parser has been compiled.

From c0f4e3742746573a5ae93df138cd80bf078ad4b6 Mon Sep 17 00:00:00 2001
From: Chris Double <chris@bethia.(none)>
Date: Thu, 27 Mar 2008 12:58:53 +1300
Subject: [PATCH 5/9] Fix usage of cache in pegs

---
 extra/peg/peg.factor | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/extra/peg/peg.factor b/extra/peg/peg.factor
index 44a762cec2..dd0b11fce3 100755
--- a/extra/peg/peg.factor
+++ b/extra/peg/peg.factor
@@ -25,7 +25,7 @@ GENERIC: (compile) ( parser -- quot )
   quot c [ drop H{ } clone ] cache 
   [
     drop input quot call  
-  ] cache* ; inline
+  ] cache ; inline
 
 : run-parser ( input quot -- result )
   #! If a packrat cache is available, use memoization for

From 4684c9cacc1c740d908510e327946b2d7bcff8a0 Mon Sep 17 00:00:00 2001
From: erg <erg@ergbook.local>
Date: Wed, 26 Mar 2008 19:40:40 -0500
Subject: [PATCH 6/9] work on normalize-pathname add two failing unit tests

---
 core/io/backend/backend.factor   |  2 --
 core/io/files/files-tests.factor | 17 +++++++++++++++--
 core/io/files/files.factor       |  3 +++
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/core/io/backend/backend.factor b/core/io/backend/backend.factor
index 1595ecd576..8cfcbb71de 100755
--- a/core/io/backend/backend.factor
+++ b/core/io/backend/backend.factor
@@ -21,8 +21,6 @@ M: object normalize-directory ;
 
 HOOK: normalize-pathname io-backend ( str -- newstr )
 
-M: object normalize-pathname ;
-
 : set-io-backend ( io-backend -- )
     io-backend set-global init-io init-stdio ;
 
diff --git a/core/io/files/files-tests.factor b/core/io/files/files-tests.factor
index 36b32ea34c..51bf79e29c 100755
--- a/core/io/files/files-tests.factor
+++ b/core/io/files/files-tests.factor
@@ -1,6 +1,7 @@
 IN: io.files.tests
-USING: tools.test io.files io threads kernel continuations io.encodings.ascii
-io.files.unique sequences strings accessors ;
+USING: tools.test io.files io threads kernel continuations
+io.encodings.ascii io.files.unique sequences strings accessors
+io.encodings.utf8 ;
 
 [ ] [ "blahblah" temp-file dup exists? [ delete-directory ] [ drop ] if ] unit-test
 [ ] [ "blahblah" temp-file make-directory ] unit-test
@@ -130,6 +131,18 @@ io.files.unique sequences strings accessors ;
 
 [ t ] [ cwd "misc" resource-path [ ] with-directory cwd = ] unit-test
 
+[ t ] [
+    temp-directory [ "hi" "test41" utf8 set-file-contents ] with-directory
+    temp-directory "test41" append-path utf8 file-contents "hi41" =
+] unit-test
+
+[ t ] [
+    temp-directory [
+        "test43" utf8 <file-writer> [ "hi43" write ] with-stream
+    ] with-directory
+    temp-directory "test43" append-path utf8 file-contents "hi43" =
+] unit-test
+
 [ ] [ "append-test" temp-file dup exists? [ delete-file ] [ drop ] if ] unit-test
 
 [ ] [ "append-test" temp-file ascii <file-appender> dispose ] unit-test
diff --git a/core/io/files/files.factor b/core/io/files/files.factor
index 6500bdb387..64d8e25ee2 100755
--- a/core/io/files/files.factor
+++ b/core/io/files/files.factor
@@ -272,6 +272,9 @@ DEFER: copy-tree-into
 
 : temp-file ( name -- path ) temp-directory prepend-path ;
 
+M: object normalize-pathname ( path -- path' )
+    current-directory get prepend-path ;
+
 ! Pathname presentations
 TUPLE: pathname string ;
 

From e2f3888389e846843ff8bab2e1cec0f6cd589303 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Wed, 26 Mar 2008 20:42:24 -0500
Subject: [PATCH 7/9] UI listener fix

---
 extra/ui/gadgets/scrollers/scrollers.factor |  5 +++--
 extra/ui/tools/listener/listener.factor     | 15 +++++++++++++--
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/extra/ui/gadgets/scrollers/scrollers.factor b/extra/ui/gadgets/scrollers/scrollers.factor
index 98951b74e3..7966f4e206 100755
--- a/extra/ui/gadgets/scrollers/scrollers.factor
+++ b/extra/ui/gadgets/scrollers/scrollers.factor
@@ -3,13 +3,14 @@
 USING: arrays ui.gadgets
 ui.gadgets.viewports ui.gadgets.frames ui.gadgets.grids
 ui.gadgets.theme ui.gadgets.sliders ui.gestures kernel math
-namespaces sequences models combinators math.vectors ;
+namespaces sequences models combinators math.vectors
+tuples ;
 IN: ui.gadgets.scrollers
 
 TUPLE: scroller viewport x y follows ;
 
 : find-scroller ( gadget -- scroller/f )
-    [ scroller? ] find-parent ;
+    [ [ scroller? ] is? ] find-parent ;
 
 : scroll-up-page scroller-y -1 swap slide-by-page ;
 
diff --git a/extra/ui/tools/listener/listener.factor b/extra/ui/tools/listener/listener.factor
index 75401b3861..7db0d63f45 100755
--- a/extra/ui/tools/listener/listener.factor
+++ b/extra/ui/tools/listener/listener.factor
@@ -6,7 +6,8 @@ kernel models namespaces parser quotations sequences ui.commands
 ui.gadgets ui.gadgets.editors ui.gadgets.labelled
 ui.gadgets.panes ui.gadgets.buttons ui.gadgets.scrollers
 ui.gadgets.tracks ui.gestures ui.operations vocabs words
-prettyprint listener debugger threads boxes concurrency.flags ;
+prettyprint listener debugger threads boxes concurrency.flags
+math arrays ;
 IN: ui.tools.listener
 
 TUPLE: listener-gadget input output stack ;
@@ -23,9 +24,19 @@ TUPLE: listener-gadget input output stack ;
 : <listener-input> ( listener -- gadget )
     listener-gadget-output <pane-stream> <interactor> ;
 
+TUPLE: input-scroller ;
+
+: <input-scroller> ( interactor -- scroller )
+    <scroller>
+    input-scroller construct-empty
+    [ set-gadget-delegate ] keep ;
+
+M: input-scroller pref-dim*
+    drop { 0 100 } ;
+
 : listener-input, ( -- )
     g <listener-input> g-> set-listener-gadget-input
-    <scroller> "Input" <labelled-gadget> f track, ;
+    <input-scroller> "Input" <labelled-gadget> f track, ;
 
 : welcome. ( -- )
    "If this is your first time with Factor, please read the " print

From 24466cfc57cd1e7cda29130fef91288e22963f16 Mon Sep 17 00:00:00 2001
From: erg <erg@ergbook.local>
Date: Wed, 26 Mar 2008 22:39:16 -0500
Subject: [PATCH 8/9] normalize-pathname all ova tha place

---
 core/io/files/files-tests.factor             |  7 ++-----
 core/io/files/files.factor                   |  6 +++---
 extra/io/unix/files/files.factor             |  4 ++--
 extra/io/unix/launcher/launcher-tests.factor | 14 +++++++++++++-
 extra/io/unix/launcher/launcher.factor       |  5 +++--
 extra/io/windows/files/files.factor          |  5 ++++-
 extra/io/windows/windows.factor              |  2 +-
 7 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/core/io/files/files-tests.factor b/core/io/files/files-tests.factor
index 51bf79e29c..bb8e997c68 100755
--- a/core/io/files/files-tests.factor
+++ b/core/io/files/files-tests.factor
@@ -132,15 +132,12 @@ io.encodings.utf8 ;
 [ t ] [ cwd "misc" resource-path [ ] with-directory cwd = ] unit-test
 
 [ t ] [
-    temp-directory [ "hi" "test41" utf8 set-file-contents ] with-directory
+    temp-directory [ "hi41" "test41" utf8 set-file-contents ] with-directory
     temp-directory "test41" append-path utf8 file-contents "hi41" =
 ] unit-test
 
 [ t ] [
-    temp-directory [
-        "test43" utf8 <file-writer> [ "hi43" write ] with-stream
-    ] with-directory
-    temp-directory "test43" append-path utf8 file-contents "hi43" =
+    temp-directory [ "test41" file-info size>> ] with-directory 4 =
 ] unit-test
 
 [ ] [ "append-test" temp-file dup exists? [ delete-file ] [ drop ] if ] unit-test
diff --git a/core/io/files/files.factor b/core/io/files/files.factor
index 64d8e25ee2..78f1612cb8 100755
--- a/core/io/files/files.factor
+++ b/core/io/files/files.factor
@@ -13,13 +13,13 @@ HOOK: (file-writer) io-backend ( path -- stream )
 HOOK: (file-appender) io-backend ( path -- stream )
 
 : <file-reader> ( path encoding -- stream )
-    swap (file-reader) swap <decoder> ;
+    swap normalize-pathname (file-reader) swap <decoder> ;
 
 : <file-writer> ( path encoding -- stream )
-    swap (file-writer) swap <encoder> ;
+    swap normalize-pathname (file-writer) swap <encoder> ;
 
 : <file-appender> ( path encoding -- stream )
-    swap (file-appender) swap <encoder> ;
+    swap normalize-pathname (file-appender) swap <encoder> ;
 
 : file-lines ( path encoding -- seq )
     <file-reader> lines ;
diff --git a/extra/io/unix/files/files.factor b/extra/io/unix/files/files.factor
index 1e7d682314..2888231e20 100755
--- a/extra/io/unix/files/files.factor
+++ b/extra/io/unix/files/files.factor
@@ -94,7 +94,7 @@ M: unix-io copy-file ( from to -- )
     \ file-info construct-boa ;
 
 M: unix-io file-info ( path -- info )
-    stat* stat>file-info ;
+    normalize-pathname stat* stat>file-info ;
 
 M: unix-io link-info ( path -- info )
-    lstat* stat>file-info ;
+    normalize-pathname lstat* stat>file-info ;
diff --git a/extra/io/unix/launcher/launcher-tests.factor b/extra/io/unix/launcher/launcher-tests.factor
index 9e19245d01..7e527196be 100755
--- a/extra/io/unix/launcher/launcher-tests.factor
+++ b/extra/io/unix/launcher/launcher-tests.factor
@@ -1,7 +1,7 @@
 IN: io.unix.launcher.tests
 USING: io.files tools.test io.launcher arrays io namespaces
 continuations math io.encodings.binary io.encodings.ascii
-accessors kernel sequences ;
+accessors kernel sequences io.encodings.utf8 ;
 
 [ ] [
     [ "launcher-test-1" temp-file delete-file ] ignore-errors
@@ -95,3 +95,15 @@ accessors kernel sequences ;
         +replace-environment+ >>environment-mode
     ascii <process-stream> lines
 ] unit-test
+
+[ "hi\n" ] [
+    temp-directory [
+        [ "aloha" delete-file ] ignore-errors
+        <process>
+            { "echo" "hi" } >>command
+            "aloha" >>stdout
+        try-process
+    ] with-directory
+    temp-directory "aloha" append-path
+    utf8 file-contents
+] unit-test
diff --git a/extra/io/unix/launcher/launcher.factor b/extra/io/unix/launcher/launcher.factor
index 0cbb78b881..1292f2cacf 100755
--- a/extra/io/unix/launcher/launcher.factor
+++ b/extra/io/unix/launcher/launcher.factor
@@ -37,7 +37,8 @@ USE: unix
     2nip reset-fd ;
 
 : redirect-file ( obj mode fd -- )
-    >r file-mode open dup io-error r> redirect-fd ;
+    >r >r normalize-pathname r> file-mode
+    open dup io-error r> redirect-fd ;
 
 : redirect-closed ( obj mode fd -- )
     >r >r drop "/dev/null" r> r> redirect-file ;
@@ -67,9 +68,9 @@ USE: unix
 
 : spawn-process ( process -- * )
     [
-        current-directory get cd
         setup-priority
         setup-redirection
+        current-directory get cd
         dup pass-environment? [
             dup get-environment set-os-envs
         ] when
diff --git a/extra/io/windows/files/files.factor b/extra/io/windows/files/files.factor
index 094014fac6..b4513f7da8 100755
--- a/extra/io/windows/files/files.factor
+++ b/extra/io/windows/files/files.factor
@@ -89,4 +89,7 @@ SYMBOLS: +read-only+ +hidden+ +system+
     ] if ;
 
 M: windows-nt-io file-info ( path -- info )
-    get-file-information-stat ;
+    normalize-pathname get-file-information-stat ;
+
+M: windows-nt-io link-info ( path -- info )
+    file-info ;
diff --git a/extra/io/windows/windows.factor b/extra/io/windows/windows.factor
index dac55664a4..635a992777 100755
--- a/extra/io/windows/windows.factor
+++ b/extra/io/windows/windows.factor
@@ -51,7 +51,7 @@ M: win32-file close-handle ( handle -- )
 ! Clean up resources (open handle) if add-completion fails
 : open-file ( path access-mode create-mode flags -- handle )
     [
-        >r >r >r normalize-pathname r>
+        >r >r
         share-mode security-attributes-inherit r> r> CreateFile-flags f CreateFile
         dup invalid-handle? dup close-later
         dup add-completion

From 5bab5de16d64a49e9157f4e9835a185cd3638c02 Mon Sep 17 00:00:00 2001
From: erg <erg@ergbook.local>
Date: Wed, 26 Mar 2008 22:47:13 -0500
Subject: [PATCH 9/9] make directory work inside with-directory

---
 core/io/backend/backend.factor   | 4 ++--
 core/io/files/files-tests.factor | 6 ++++++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/core/io/backend/backend.factor b/core/io/backend/backend.factor
index 8cfcbb71de..151dbc7df7 100755
--- a/core/io/backend/backend.factor
+++ b/core/io/backend/backend.factor
@@ -17,10 +17,10 @@ HOOK: io-multiplex io-backend ( ms -- )
 
 HOOK: normalize-directory io-backend ( str -- newstr )
 
-M: object normalize-directory ;
-
 HOOK: normalize-pathname io-backend ( str -- newstr )
 
+M: object normalize-directory normalize-pathname ;
+
 : set-io-backend ( io-backend -- )
     io-backend set-global init-io init-stdio ;
 
diff --git a/core/io/files/files-tests.factor b/core/io/files/files-tests.factor
index bb8e997c68..369ecc6868 100755
--- a/core/io/files/files-tests.factor
+++ b/core/io/files/files-tests.factor
@@ -83,6 +83,12 @@ io.encodings.utf8 ;
     "delete-tree-test" temp-file delete-tree
 ] unit-test
 
+[ { { "kernel" t } } ] [
+    "core" resource-path [
+        "." directory [ first "kernel" = ] subset
+    ] with-directory
+] unit-test
+
 [ ] [
     "copy-tree-test/a/b/c" temp-file make-directories
 ] unit-test