]> Repositorios git - scryer-prolog.git/commitdiff
accomodate \0\ in partial strings, print null as \0\ (#267, #526), update prolog...
authorMark Thom <[email protected]>
Tue, 19 May 2020 05:45:21 +0000 (23:45 -0600)
committerMark Thom <[email protected]>
Tue, 19 May 2020 05:45:34 +0000 (23:45 -0600)
Cargo.lock
Cargo.toml
src/prolog/heap_print.rs
src/prolog/machine/heap.rs
src/prolog/machine/machine_state_impl.rs
src/prolog/machine/partial_string.rs
src/prolog/machine/system_calls.rs

index be47e095e2fc4a16ecb5172fdb7390e7b6e3a31d..5af43295e9c642e236e843c3275bc3c0b467519b 100644 (file)
@@ -606,9 +606,9 @@ dependencies = [
 
 [[package]]
 name = "prolog_parser"
-version = "0.8.58"
+version = "0.8.59"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e90d34a4268bf5256d4e55f8ec920220aa96dc7ee779441b32f97635cba72aa9"
+checksum = "029a4682cf40923b8eb05c4b943d1d6be73775e7bf80bcb0866b5ef29abb0802"
 dependencies = [
  "lexical",
  "num-rug-adapter",
@@ -740,7 +740,7 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
 [[package]]
 name = "scryer-prolog"
-version = "0.8.122"
+version = "0.8.123"
 dependencies = [
  "cpu-time",
  "crossterm",
index e8f52cd7ead6cec334ba82fe89646ed080a4a63f..3f48283ce0813ab2e18a1ce3538b8b8abcd6abb2 100644 (file)
@@ -1,6 +1,6 @@
 [package]
 name = "scryer-prolog"
-version = "0.8.122"
+version = "0.8.123"
 authors = ["Mark Thom <[email protected]>"]
 build = "build.rs"
 repository = "https://github.com/mthom/scryer-prolog"
@@ -29,7 +29,7 @@ libc = "0.2.62"
 nix = "0.15.0"
 num-rug-adapter = { optional = true, version = "0.1.3" }
 ordered-float = "0.5.0"
-prolog_parser = { version = "0.8.58", default-features = false }
+prolog_parser = { version = "0.8.59", default-features = false }
 ref_thread_local = "0.0.0"
 rug = { version = "1.4.0", optional = true }
 rustyline = "6.0.0"
index ca462e02012f7a5501f5d4ed7e6f4fcb1b4494aa..ee92ff0c57c5144c3166358c8e89d536169b3e58 100644 (file)
@@ -160,7 +160,7 @@ fn char_to_string(is_quoted: bool, c: char) -> String {
         '\u{d8}' ..= '\u{f6}' => c.to_string(),
         '\u{f8}' ..= '\u{74f}' => c.to_string(),
         '\x20' ..= '\x7e' => c.to_string(),
-        _ => format!("\\x{:x}\\", c as u32),
+        _ => format!("\\{:x}\\", c as u32),
     }
 }
 
index 68d4a2f9f24a1aa0f1e8bf9acd053417d03d5190..91639423a964f8ad1222642212fd924df55c0d2e 100644 (file)
@@ -189,6 +189,10 @@ impl<T: RawBlockTraits> HeapTemplate<T> {
     #[inline]
     pub(crate)
     fn put_complete_string(&mut self, s: &str) -> Addr {
+        if s.is_empty() {
+            return Addr::EmptyList;
+        }
+
         let addr = self.allocate_pstr(s);
         self.pop();
 
@@ -316,20 +320,7 @@ impl<T: RawBlockTraits> HeapTemplate<T> {
     pub(crate)
     fn allocate_pstr(&mut self, src: &str) -> Addr {
         self.write_pstr(src)
-            .unwrap_or_else(|| {
-                let h = self.h();
-
-                self.push(HeapCellValue::PartialString(
-                    PartialString::empty(),
-                    true,
-                ));
-
-                self.push(HeapCellValue::Addr(
-                    Addr::HeapCell(h + 1)
-                ));
-
-                Addr::PStrLocation(h, 0)
-            })
+            .unwrap_or_else(|| Addr::EmptyList)
     }
 
     #[inline]
index ec06f9fc92915e968ef2da954eda048e7b10157c..a26c4cdec669f9ff7054dcfeb3bfe75b578760f9 100644 (file)
@@ -1492,9 +1492,13 @@ impl MachineState {
             &QueryInstruction::PutPartialString(_, ref string, reg, has_tail) => {
                 let pstr_addr =
                     if has_tail {
-                        let pstr_addr = self.heap.allocate_pstr(&string);
-                        self.heap.pop(); // the tail will be added by the next instruction.
-                        pstr_addr
+                        if !string.is_empty() {
+                            let pstr_addr = self.heap.allocate_pstr(&string);
+                            self.heap.pop(); // the tail will be added by the next instruction.
+                            pstr_addr
+                        } else {
+                            Addr::EmptyList
+                        }
                     } else {
                         self.heap.put_complete_string(&string)
                     };
index 2d821ac4aff2e8e455ccad970fb23e42791b7c3c..1413b37cca32fc1d12b760fde4985e931a38ba22 100644 (file)
@@ -37,8 +37,8 @@ fn scan_for_terminator<Iter: Iterator<Item = char>>(iter: Iter) -> usize {
     let mut terminator_idx = 0;
 
     for c in iter {
-        if c == '\u{0}' {
-            break;
+        if c == '\u{0}' && terminator_idx != 0 {
+            return terminator_idx;
         }
 
         terminator_idx += c.len_utf8();
@@ -98,37 +98,9 @@ impl PartialString {
         }
     }
 
-    #[inline]
-    pub(super)
-    fn empty() -> Self {
-        let mut pstr = PartialString {
-            buf: ptr::null(),
-            len: 0,
-            _marker: PhantomData,
-        };
-
-        unsafe {
-            let layout = alloc::Layout::from_size_align_unchecked(
-                '\u{0}'.len_utf8(),
-                mem::align_of::<u8>(),
-            );
-
-            pstr.buf = alloc::alloc(layout) as *const _;
-            pstr.len = '\u{0}'.len_utf8();
-
-            pstr.write_terminator_at(0);
-        }
-
-        pstr
-    }
-
     unsafe fn append_chars(mut self, src: &str) -> Option<(Self, &str)> {
         let terminator_idx = scan_for_terminator(src.chars());
 
-        if terminator_idx == 0 {
-            return None;
-        }
-
         let layout = alloc::Layout::from_size_align_unchecked(
             terminator_idx + '\u{0}'.len_utf8(),
             mem::align_of::<u8>(),
@@ -145,8 +117,8 @@ impl PartialString {
 
         self.write_terminator_at(terminator_idx);
 
-        Some(if terminator_idx != src.len() {
-            (self, &src[terminator_idx + '\u{0}'.len_utf8() ..])
+        Some(if terminator_idx != src.as_bytes().len() {
+            (self, &src[terminator_idx ..])
         } else {
             (self, "")
         })
@@ -211,9 +183,7 @@ impl PartialString {
 
     #[inline]
     pub fn at_end(&self, end_n: usize) -> bool {
-        unsafe {
-            ptr::read((self.buf as usize + end_n) as *const u8) == 0u8
-        }
+        end_n + 1 == self.len
     }
 
     #[inline]
index 47b36012a9aeb78919658f3f52d349d9c293a97e..6160e7dd7485e1c1ab28fad19a20401780fb602e 100644 (file)
@@ -1110,6 +1110,11 @@ impl MachineState {
 
                 let h = self.heap.h();
 
+                if atom.as_str().is_empty() {
+                    self.fail = true;
+                    return Ok(());
+                }
+
                 let pstr = self.heap.allocate_pstr(atom.as_str());
                 let pstr_tail = self.heap[h + 1].as_addr(h + 1);