From: Mark Thom Date: Wed, 5 Feb 2020 06:35:03 +0000 (-0700) Subject: prolog_parser version bump X-Git-Tag: v0.8.118~13 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=b71e8082d27fa13ec641525abf08289c4d8cda29;p=scryer-prolog.git prolog_parser version bump --- diff --git a/Cargo.lock b/Cargo.lock index 18f099d9..4cc8616b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 90e9e827..0b70510c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/src/prolog/read.rs b/src/prolog/read.rs index 95e6085d..ee753b4a 100644 --- a/src/prolog/read.rs +++ b/src/prolog/read.rs @@ -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, } 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 { 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 { - 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 + } + } } } diff --git a/src/prolog/toplevel.pl b/src/prolog/toplevel.pl index e58465ab..5de4f4b7 100644 --- a/src/prolog/toplevel.pl +++ b/src/prolog/toplevel.pl @@ -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),