]> Repositorios git - scryer-prolog.git/commitdiff
prolog_parser version bump
authorMark Thom <[email protected]>
Wed, 5 Feb 2020 06:35:03 +0000 (23:35 -0700)
committerMark Thom <[email protected]>
Wed, 5 Feb 2020 06:35:03 +0000 (23:35 -0700)
Cargo.lock
Cargo.toml
src/prolog/read.rs
src/prolog/toplevel.pl

index 18f099d98cba3c201ce2260c237e7ac8b91c096c..4cc8616b8f28a819b02fdf1246d27f3b5990ce86 100644 (file)
@@ -200,6 +200,11 @@ dependencies = [
  "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "memchr"
 version = "2.2.1"
@@ -311,13 +316,13 @@ dependencies = [
 
 [[package]]
 name = "prolog_parser"
-version = "0.8.38"
-source = "registry+https://github.com/rust-lang/crates.io-index"
+version = "0.8.39"
 dependencies = [
  "lexical 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-rug-adapter 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rug 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode_reader 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -447,13 +452,21 @@ dependencies = [
  "nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-rug-adapter 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "ordered-float 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "prolog_parser 0.8.38 (registry+https://github.com/rust-lang/crates.io-index)",
+ "prolog_parser 0.8.39",
  "ref_thread_local 0.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rug 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustyline 5.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
+[[package]]
+name = "smallvec"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "stackvector"
 version = "1.0.2"
@@ -513,6 +526,15 @@ name = "unicode-xid"
 version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "unicode_reader"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "unreachable"
 version = "1.0.0"
@@ -578,6 +600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum lexical-core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3e82e023e062f1d25f807ad182008fba1b46538e999f908a08cc0c29e084462e"
 "checksum libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "34fcd2c08d2f832f376f4173a231990fa5aef4e99fb569867318a227ef4c06ba"
 "checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7"
+"checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
 "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
 "checksum nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce"
 "checksum nix 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229"
@@ -590,7 +613,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum num-traits 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "443c53b3c3531dfcbfa499d8893944db78474ad7a1d87fa2d94d1a2231693ac6"
 "checksum ordered-float 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7eb5259643245d3f292c7a146b2df53bba24d7eab159410e648eb73dc164669d"
 "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
-"checksum prolog_parser 0.8.38 (registry+https://github.com/rust-lang/crates.io-index)" = "1eadd365fcf24386839dcdc886de41bdb6ecd1b85f0f69f10ae503a4e98274a4"
 "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1"
 "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
 "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
@@ -605,6 +627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
 "checksum rustyline 5.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4795e277e6e57dec9df62b515cd4991371daa80e8dc8d80d596e58722b89c417"
 "checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7"
+"checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6"
 "checksum stackvector 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c049c77bf85fbc036484c97b008276d539d9ebff9dfbde37b632ebcd5b8746b6"
 "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5"
 "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
@@ -613,6 +636,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 "checksum unicode-segmentation 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1967f4cdfc355b37fd76d2a954fb2ed3871034eb4f26d60537d88795cfc332a9"
 "checksum unicode-width 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7007dbd421b92cc6e28410fe7362e2e0a2503394908f417b68ec8d1c364c4e20"
 "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
+"checksum unicode_reader 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f886d405a2be65db804cb1088f969dbd99528a9eec9bcf941584b17de4cd3034"
 "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
 "checksum utf8parse 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8772a4ccbb4e89959023bc5b7cb8623a795caa7092d99f3aa9501b9484d4557d"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
index 90e9e827ce89ecac9ca49e0680e4bba799cf7cd3..0b70510cf09ae5e897fecd2860b8e59b948131e1 100644 (file)
@@ -24,7 +24,7 @@ libc = "0.2.62"
 nix = "0.15.0"
 num-rug-adapter = { optional = true, version = "0.1.1" }
 ordered-float = "0.5.0"
-prolog_parser = { version = "0.8.38", default-features = false }
+prolog_parser = { version = "0.8.39", default-features = false }
 ref_thread_local = "0.0.0"
 rug = { version = "1.4.0", optional = true }
 rustyline = "5.0.3"
index 95e6085deb1b08400fba87164e23b79e2af21aa3..ee753b4af2303d54b64768ce3cba04a320a77326 100644 (file)
@@ -29,7 +29,7 @@ pub mod readline {
     use prolog_parser::ast::*;
     use crate::prolog::rustyline::error::ReadlineError;
     use crate::prolog::rustyline::{Cmd, Editor, KeyPress};
-    use std::io::Read;
+    use std::io::{Cursor, Read};
 
     static mut PROMPT: bool = false;
 
@@ -48,68 +48,52 @@ pub mod readline {
 
     pub struct ReadlineStream {
         rl: Editor<()>,
-        pending_input: String,
+        pending_input: Cursor<String>,
     }
 
     impl ReadlineStream {
         fn input_stream(pending_input: String) -> Self {
             let mut rl = Editor::<()>::new();
             rl.bind_sequence(KeyPress::Tab, Cmd::Insert(1, "\t".to_string()));
-            ReadlineStream { rl, pending_input }
+            ReadlineStream { rl, pending_input: Cursor::new(pending_input) }
         }
 
         fn call_readline(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
             match self.rl.readline(get_prompt()) {
                 Ok(text) => {
-                    self.pending_input += &text;
+                    *self.pending_input.get_mut() = text;
+                    self.pending_input.set_position(0);
 
                     unsafe {
                         if PROMPT {
-                            self.rl.history_mut().add(&self.pending_input);
+                            self.rl.history_mut().add(self.pending_input.get_ref());
                             PROMPT = false;
                         }
                     }
 
-                    self.pending_input += "\n";
-                    Ok(self.write_to_buf(buf))
+                    *self.pending_input.get_mut() += "\n";
+                    self.pending_input.read(buf)
                 }
-                Err(ReadlineError::Eof) =>
-                    Ok(self.write_to_buf(buf)),
-                Err(e) =>
+                Err(ReadlineError::Eof) => {
+                    Ok(0)
+                }
+                Err(e) => {
                     Err(std::io::Error::new(std::io::ErrorKind::InvalidInput, e))
+                }
             }
         }
-
-        fn split_pending(&mut self, buf: &mut [u8], split_idx: usize) -> usize {
-            let (outgoing, _) = self.pending_input.split_at(split_idx);
-
-            for (idx, b) in outgoing.bytes().enumerate() {
-                buf[idx] = b;
-            }
-
-            outgoing.len()
-        }
-
-        fn write_to_buf(&mut self, buf: &mut [u8]) -> usize {
-            let split_idx = std::cmp::min(self.pending_input.len(), buf.len());
-            let output_len = self.split_pending(buf, split_idx);
-
-            if split_idx < self.pending_input.len() {
-                self.pending_input = self.pending_input[split_idx..].to_string();
-            } else {
-                self.pending_input.clear();
-            }
-
-            output_len
-        }
     }
 
     impl Read for ReadlineStream {
         fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
-            if self.pending_input.is_empty() {
-                self.call_readline(buf)
-            } else {
-                Ok(self.write_to_buf(buf))
+            match self.pending_input.read(buf) {
+                Ok(0) => {
+                    self.call_readline(buf)
+                }
+                result => {
+                    result
+                }
+                
             }
         }
     }
index e58465ab1c44b829d38ecfa28504437ef5e61d8a..5de4f4b7ecdfb9158be5110564ccb8a171991ac6 100644 (file)
@@ -14,7 +14,8 @@
 '$repl' :-
     catch('$read_and_match', E, '$print_exception'(E)),
     false. %% this is for GC, until we get actual GC.
-'$repl' :- '$repl'.
+'$repl' :-
+    '$repl'.
 
 '$read_and_match' :-
     '$read_query_term'(Term, VarList),