diff --git a/TODO.FACTOR.txt b/TODO.FACTOR.txt index a893eae6c2..b50f4d59a0 100644 --- a/TODO.FACTOR.txt +++ b/TODO.FACTOR.txt @@ -2,7 +2,6 @@ - if external factor is down, don't add tons of random shit to the dictionary -- plugin: type "re" in edit word dialog --> hang - word preview for parsing words + ui: diff --git a/factor/ExternalFactor.java b/factor/ExternalFactor.java index 2cf9de7fa9..17a70e73a3 100644 --- a/factor/ExternalFactor.java +++ b/factor/ExternalFactor.java @@ -133,8 +133,17 @@ public class ExternalFactor extends VocabularyLookup int responseLength = in.readInt(); byte[] response = new byte[responseLength]; - in.readFully(response); + int n = 0; + while (n < response.length) + { + int count = in.read(response,n,response.length - n); + if (count < 0) + throw new EOFException(); + System.err.println(new String(response,n,count)); + n += count; + } + String responseStr = new String(response,"ASCII"); return responseStr; } diff --git a/library/io/buffer.factor b/library/io/buffer.factor index cc1b674d48..eb54cd9a09 100644 --- a/library/io/buffer.factor +++ b/library/io/buffer.factor @@ -6,27 +6,30 @@ strings ; TUPLE: buffer size ptr fill pos ; -: imalloc ( size -- address ) - "int" "libc" "malloc" [ "ulong" ] alien-invoke ; +: malloc ( size -- address ) + "ulong" "libc" "malloc" [ "ulong" ] alien-invoke ; -: ifree ( address -- ) +: free ( address -- ) "void" "libc" "free" [ "ulong" ] alien-invoke ; -: irealloc ( address size -- address ) - "int" "libc" "realloc" [ "ulong" "ulong" ] alien-invoke ; +: realloc ( address size -- address ) + "ulong" "libc" "realloc" [ "ulong" "ulong" ] alien-invoke ; -: imemcpy ( dst src size -- ) +: memcpy ( dst src size -- ) "void" "libc" "memcpy" [ "ulong" "ulong" "ulong" ] alien-invoke ; +: check-ptr ( ptr -- ptr ) + dup 0 = [ "Out of memory" throw ] when ; + C: buffer ( size -- buffer ) 2dup set-buffer-size - swap imalloc swap [ set-buffer-ptr ] keep + swap malloc check-ptr swap [ set-buffer-ptr ] keep 0 swap [ set-buffer-fill ] keep 0 swap [ set-buffer-pos ] keep ; : buffer-free ( buffer -- ) #! Frees the C memory associated with the buffer. - dup buffer-ptr ifree 0 swap set-buffer-ptr ; + dup buffer-ptr free 0 swap set-buffer-ptr ; : buffer-contents ( buffer -- string ) #! Returns the current contents of the buffer. @@ -67,22 +70,29 @@ C: buffer ( size -- buffer ) #! Returns the amount of data that may be added to the buffer. dup buffer-size swap buffer-fill - ; +: eof? ( buffer -- ? ) buffer-fill 0 = ; + +: buffer-extend ( length buffer -- ) + #! Increases the size of the buffer by length. + 2dup buffer-ptr swap realloc check-ptr + over set-buffer-ptr set-buffer-size ; + : check-overflow ( string buffer -- ) - buffer-capacity swap length < [ - "Buffer overflow" throw - ] when ; + over length over buffer-capacity > [ + dup eof? [ + >r length r> buffer-extend + ] [ + "Buffer overflow" throw + ] ifte + ] [ + 2drop + ] ifte ; : >buffer ( string buffer -- ) 2dup check-overflow [ dup buffer-ptr swap buffer-fill + string>memory ] 2keep [ buffer-fill swap length + ] keep set-buffer-fill ; -: buffer-extend ( length buffer -- ) - #! Increases the size of the buffer by length. - [ buffer-size + dup ] keep [ buffer-ptr swap ] keep - >r irealloc r> - [ set-buffer-ptr ] keep set-buffer-size ; - : n>buffer ( count buffer -- ) #! Increases the fill pointer by count. [ buffer-fill + ] keep set-buffer-fill ; @@ -97,7 +107,7 @@ C: buffer ( size -- buffer ) : buffer-append ( buffer buffer -- ) #! Append first buffer to second buffer. - 2dup buffer-end over buffer-ptr rot buffer-fill imemcpy + 2dup buffer-end over buffer-ptr rot buffer-fill memcpy >r buffer-fill r> n>buffer ; : buffer-set ( string buffer -- ) diff --git a/library/test/io/io.factor b/library/test/io/io.factor index a39d168fb9..9166e62423 100644 --- a/library/test/io/io.factor +++ b/library/test/io/io.factor @@ -1,10 +1,5 @@ IN: temporary -USE: namespaces -USE: parser -USE: streams -USE: test -USE: stdio -USE: math +USING: math parser stdio streams strings test ; [ 4 ] [ "/library/test/io/no-trailing-eol.factor" run-resource ] unit-test @@ -52,3 +47,5 @@ USE: math [ -1 read ] unit-test-fails [ "" ] [ 0 read ] unit-test + +[ ] [ "123" write 9000 CHAR: x fill write flush ] unit-test diff --git a/library/unix/io.factor b/library/unix/io.factor index bc7e411945..f2da188ab0 100644 --- a/library/unix/io.factor +++ b/library/unix/io.factor @@ -185,8 +185,6 @@ C: reader ( handle -- reader ) drop ] ifte ; -: eof? ( buffer -- ? ) buffer-fill 0 = ; - TUPLE: read-line-task ; C: read-line-task ( port -- task ) @@ -295,8 +293,8 @@ C: writer ( fd -- writer ) #! If the buffer is empty and the string is too long, #! extend the buffer. dup pending-error - dup eof? >r 2dup buffer-capacity > r> and [ - buffer-extend t + dup eof? [ + 2drop t ] [ [ buffer-fill + ] keep buffer-capacity <= ] ifte ;