]> git.mdlowis.com Git - archive/tide-ocaml.git/commitdiff
Fixed scrolling and cleaned up buffer/cursor interface
authorMichael D. Lowis <mike.lowis@gentex.com>
Wed, 8 Nov 2017 14:09:13 +0000 (09:09 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Wed, 8 Nov 2017 14:09:13 +0000 (09:09 -0500)
docs/Buf.Cursor.html
docs/Buf.html
docs/Rope.html
docs/index_exceptions.html
docs/index_values.html
docs/type_Buf.Cursor.html
lib/buf.ml
lib/buf.mli
lib/rope.ml
lib/scrollmap.ml

index 8e5a261dbbdf8d8384444d8f675931c84ffe7a49..c9d7c7ea19dd4dd4b705db66e7f52fe7f2d580b8 100644 (file)
@@ -49,9 +49,9 @@
 
 <pre><span id="VALmake"><span class="keyword">val</span> make</span> : <code class="type"><a href="Buf.html#TYPEbuf">Buf.buf</a> -> int -> <a href="Buf.Cursor.html#TYPEcsr">csr</a></code></pre>
 <pre><span id="VALclone"><span class="keyword">val</span> clone</span> : <code class="type"><a href="Buf.Cursor.html#TYPEcsr">csr</a> -> <a href="Buf.Cursor.html#TYPEcsr">csr</a></code></pre>
-<pre><span id="VALiter"><span class="keyword">val</span> iter</span> : <code class="type">'a -> 'b -> 'c -> unit</code></pre>
-<pre><span id="VALoffset"><span class="keyword">val</span> offset</span> : <code class="type">'a -> <a href="Buf.Cursor.html#TYPEcsr">csr</a> -> int</code></pre>
+<pre><span id="VALoffset"><span class="keyword">val</span> offset</span> : <code class="type"><a href="Buf.Cursor.html#TYPEcsr">csr</a> -> int</code></pre>
 <pre><span id="VALgoto"><span class="keyword">val</span> goto</span> : <code class="type"><a href="Buf.html#TYPEbuf">Buf.buf</a> -> <a href="Buf.Cursor.html#TYPEcsr">csr</a> -> int -> unit</code></pre>
+<pre><span id="VALiter"><span class="keyword">val</span> iter</span> : <code class="type">(<a href="Buf.Cursor.html#TYPEcsr">csr</a> -> <a href="Rope.html#TYPErune">Rope.rune</a> -> bool) -> <a href="Buf.html#TYPEbuf">Buf.buf</a> -> <a href="Buf.Cursor.html#TYPEcsr">csr</a> -> unit</code></pre>
 <pre><span id="VALgetc"><span class="keyword">val</span> getc</span> : <code class="type"><a href="Buf.html#TYPEbuf">Buf.buf</a> -> <a href="Buf.Cursor.html#TYPEcsr">csr</a> -> <a href="Rope.html#TYPErune">Rope.rune</a></code></pre>
 <pre><span id="VALnextc"><span class="keyword">val</span> nextc</span> : <code class="type"><a href="Buf.html#TYPEbuf">Buf.buf</a> -> <a href="Buf.Cursor.html#TYPEcsr">csr</a> -> int</code></pre>
 <pre><span id="VALprevc"><span class="keyword">val</span> prevc</span> : <code class="type"><a href="Buf.html#TYPEbuf">Buf.buf</a> -> <a href="Buf.Cursor.html#TYPEcsr">csr</a> -> int</code></pre>
index 81f30d3b6162e1eed214299a3fd2ce7f1b249a10..d47d55586f4fc22b3b5d22becb93876019b3f8b2 100644 (file)
@@ -53,7 +53,6 @@
 
 <pre><span id="VALempty"><span class="keyword">val</span> empty</span> : <code class="type"><a href="Buf.html#TYPEbuf">buf</a></code></pre>
 <pre><span id="VALload"><span class="keyword">val</span> load</span> : <code class="type">string -> <a href="Buf.html#TYPEbuf">buf</a></code></pre>
-<pre><span id="VALiter"><span class="keyword">val</span> iter</span> : <code class="type">(<a href="Rope.html#TYPErune">Rope.rune</a> -> bool) -> <a href="Buf.html#TYPEbuf">buf</a> -> int -> unit</code></pre>
 <pre><span id="VALiteri"><span class="keyword">val</span> iteri</span> : <code class="type">(int -> <a href="Rope.html#TYPErune">Rope.rune</a> -> bool) -> <a href="Buf.html#TYPEbuf">buf</a> -> int -> unit</code></pre>
-<pre><span id="VALis_eol"><span class="keyword">val</span> is_eol</span> : <code class="type"><a href="Buf.html#TYPEbuf">buf</a> -> int -> bool</code></pre>
+<pre><span id="VALiter"><span class="keyword">val</span> iter</span> : <code class="type">(<a href="Rope.html#TYPErune">Rope.rune</a> -> bool) -> <a href="Buf.html#TYPEbuf">buf</a> -> int -> unit</code></pre>
 <pre><span class="keyword">module</span> <a href="Buf.Cursor.html">Cursor</a>: <code class="code">sig</code> <a href="Buf.Cursor.html">..</a> <code class="code">end</code></pre></body></html>
\ No newline at end of file
index ba5d84c4150ce9c2fbb95002cf17732c365df42d..33749d991f41d91700634a3a20579f5660d27144 100644 (file)
@@ -70,9 +70,6 @@
 <pre><span id="VALgetb"><span class="keyword">val</span> getb</span> : <code class="type"><a href="Rope.html#TYPEt">t</a> -> int -> char</code></pre>
 <pre><span id="VALgetc"><span class="keyword">val</span> getc</span> : <code class="type"><a href="Rope.html#TYPEt">t</a> -> int -> int</code></pre>
 <pre><span id="VALputc"><span class="keyword">val</span> putc</span> : <code class="type">'a -> 'b -> 'c -> 'a</code></pre>
-<pre><span id="EXCEPTIONBreak_loop"><span class="keyword">exception</span> Break_loop</span></pre>
-
-<pre><span id="VALiteri_leaf"><span class="keyword">val</span> iteri_leaf</span> : <code class="type">(int -> int -> bool) -> int -> string -> int -> int -> unit</code></pre>
 <pre><span id="VALiteri"><span class="keyword">val</span> iteri</span> : <code class="type">(int -> int -> bool) -> <a href="Rope.html#TYPEt">t</a> -> int -> unit</code></pre>
 <pre><span id="VALgets"><span class="keyword">val</span> gets</span> : <code class="type"><a href="Rope.html#TYPEt">t</a> -> int -> int -> string</code></pre>
 <pre><span id="VALputs"><span class="keyword">val</span> puts</span> : <code class="type"><a href="Rope.html#TYPEt">t</a> -> string -> int -> <a href="Rope.html#TYPEt">t</a></code></pre>
index d9c6c7e827cb879944d8c8d30d0894f63e07e4c7..79682f4a53d07631fc3ea77c93ef96e68f196d19 100644 (file)
@@ -24,8 +24,6 @@
 <tr><td align="left"><br>B</td></tr>
 <tr><td><a href="Rope.html#EXCEPTIONBad_rotation">Bad_rotation</a> [<a href="Rope.html">Rope</a>]</td>
 <td></td></tr>
-<tr><td><a href="Rope.html#EXCEPTIONBreak_loop">Break_loop</a> [<a href="Rope.html">Rope</a>]</td>
-<td></td></tr>
 <tr><td align="left"><br>O</td></tr>
 <tr><td><a href="Rope.html#EXCEPTIONOut_of_bounds">Out_of_bounds</a> [<a href="Rope.html">Rope</a>]</td>
 <td></td></tr>
index f4153976e7310206b83b888a128db49320ae84b5..e88a90c1abd59769d7cdcc268116bc89968195e7 100644 (file)
 <td></td></tr>
 <tr><td><a href="Buf.Cursor.html#VALis_eol">is_eol</a> [<a href="Buf.Cursor.html">Buf.Cursor</a>]</td>
 <td></td></tr>
-<tr><td><a href="Buf.html#VALis_eol">is_eol</a> [<a href="Buf.html">Buf</a>]</td>
-<td></td></tr>
 <tr><td><a href="Rope.html#VALis_eol">is_eol</a> [<a href="Rope.html">Rope</a>]</td>
 <td></td></tr>
 <tr><td><a href="Buf.Cursor.html#VALiter">iter</a> [<a href="Buf.Cursor.html">Buf.Cursor</a>]</td>
 <td></td></tr>
 <tr><td><a href="Rope.html#VALiteri">iteri</a> [<a href="Rope.html">Rope</a>]</td>
 <td></td></tr>
-<tr><td><a href="Rope.html#VALiteri_leaf">iteri_leaf</a> [<a href="Rope.html">Rope</a>]</td>
-<td></td></tr>
 <tr><td align="left"><br>J</td></tr>
 <tr><td><a href="Rope.html#VALjoin">join</a> [<a href="Rope.html">Rope</a>]</td>
 <td></td></tr>
index 6f5502566cb1448e9e8ba29f5e19b955d6887785..5bc2e2f6771234bb4ee8279fe4538e4cb4da60d6 100644 (file)
 &nbsp;&nbsp;<span class="keyword">type</span>&nbsp;t&nbsp;=&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr<br>
 &nbsp;&nbsp;<span class="keyword">val</span>&nbsp;make&nbsp;:&nbsp;<span class="constructor">Buf</span>.buf&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr<br>
 &nbsp;&nbsp;<span class="keyword">val</span>&nbsp;clone&nbsp;:&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr<br>
-&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;iter&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
-&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;offset&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;offset&nbsp;:&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int<br>
 &nbsp;&nbsp;<span class="keyword">val</span>&nbsp;goto&nbsp;:&nbsp;<span class="constructor">Buf</span>.buf&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;iter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Rope</span>.rune&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="constructor">Buf</span>.buf&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
 &nbsp;&nbsp;<span class="keyword">val</span>&nbsp;getc&nbsp;:&nbsp;<span class="constructor">Buf</span>.buf&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Rope</span>.rune<br>
 &nbsp;&nbsp;<span class="keyword">val</span>&nbsp;nextc&nbsp;:&nbsp;<span class="constructor">Buf</span>.buf&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int<br>
 &nbsp;&nbsp;<span class="keyword">val</span>&nbsp;prevc&nbsp;:&nbsp;<span class="constructor">Buf</span>.buf&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Buf</span>.<span class="constructor">Cursor</span>.csr&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int<br>
index f8a37f31e3c81f82348c664d2ed9b85e82a662f4..1219ee3c35d4cade02ee68186c63c42dcf8a0f61 100644 (file)
@@ -11,14 +11,11 @@ let empty =
 let load path =
   { path = path; rope = Rope.from_string (Misc.load_file path) }
 
-let iter fn buf i =
-  Rope.iteri (fun i c -> (fn c)) buf.rope i
-
 let iteri fn buf i =
   Rope.iteri fn buf.rope i
 
-let is_eol buf off =
-  Rope.is_eol buf.rope off
+let iter fn buf i =
+  iteri (fun i c -> (fn c)) buf i
 
 module Cursor = struct
   type csr = {
@@ -34,14 +31,15 @@ module Cursor = struct
   let clone csr =
     { start = csr.start; stop = csr.stop }
 
-  let iter fn buf csr = ()
-
-  let offset buf csr =
+  let offset csr =
     csr.stop
 
   let goto buf csr idx =
     csr.stop <- (Rope.limit_index buf.rope idx)
 
+  let iter fn buf csr =
+    Rope.iteri (fun i c -> csr.stop <- i; (fn csr c)) buf.rope csr.stop
+
   let getc buf csr =
     Rope.getc buf.rope csr.stop
 
index a5aa8bcbf4368b413bf4caffa73e35bf0811cf51..4bf4215e4693f489124b97ad983cc48ca66318b1 100644 (file)
@@ -5,31 +5,27 @@ val load : string -> t
 val iter : (int -> bool) -> t -> int -> unit
 val iteri : (int -> int -> bool) -> t -> int -> unit
 
-val is_eol : buf -> int -> bool
-
 module Cursor : sig
   type t
   val make : buf -> int -> t
   val clone : t -> t
-  val iter : (t -> bool) -> buf -> t -> unit
-  val offset : buf -> t -> int
+  val iter : (t -> int -> bool) -> buf -> t -> unit
+  val offset : t -> int
   val goto : buf -> t -> int -> unit
   val getc : buf -> t -> int
-  (*
+(*
   val putc : buf -> t -> int -> unit
   val gets : buf -> t -> string
   val puts : buf -> t -> string -> unit
-  *)
+*)
   val nextc : buf -> t -> int
   val prevc : buf -> t -> int
   val nextln : buf -> t -> int
   val prevln : buf -> t -> int
-
 (*
   val is_bol : buf -> t -> bool
   val to_eol : buf -> t -> int
 *)
-
   val is_eol : buf -> t -> bool
   val to_bol : buf -> t -> int
 end
index bb5ff3866a711de7f435d36c676147b17df4be4e..7752789c1302f61ed6da4c17b776e7b2f5fcacd9 100644 (file)
@@ -102,11 +102,17 @@ let putc rope i c = rope
 
 (******************************************************************************)
 
+(* inefficient form of iteri *)
+let rec iteri fn rope pos =
+  if pos < (length rope) && (fn pos (getc rope pos)) then
+    iteri fn rope (pos + 1)
+
+(* More efficient form of iteri?
 exception Break_loop
 
 let iteri_leaf fn pos str off len =
   let offset = pos - off in
-  for i = off to off + len - 1 do (* break loop when fn returns false *)
+  for i = off to off + len - 1 do
     if (fn (i + offset) (Char.code str.[i])) == false then
       raise Break_loop
   done
@@ -119,15 +125,6 @@ let rec iteri fn rope pos =
   | Node (l,r,_,_) ->
       iteri fn l pos;
       iteri fn r (pos + (length l))
-
-(*
-let rec iter_from fn rope pos =
-  if pos < (length rope) && (fn (getc rope pos)) then
-    iter_from fn rope (pos + 1)
-
-let rec iteri_from fn rope pos =
-  if pos < (length rope) && (fn pos (getc rope pos)) then
-    iteri_from fn rope (pos + 1)
 *)
 
 (******************************************************************************)
index 7db51d0c6e40e43e712296398e2b0cb6973a8dde..6cb8cd4baaa0fe1f4398a531cf2b384aa22c81c7 100644 (file)
@@ -11,25 +11,22 @@ let rec find_line lines off idx =
     idx
 
 let make buf width off =
-  let bcsr = Buf.Cursor.make buf off in
-  let dcsr = Draw.Cursor.make (width, 0) 0 0 in
-  let lines = ref [Buf.Cursor.to_bol buf bcsr] in
+  let csr = Draw.Cursor.make (width, 0) 0 0 in
+  (*let bol = Buf.goto StartOfLine buf off in*)
+  let bol = Buf.Cursor.to_bol buf (Buf.Cursor.make buf off) in
+  let lines = ref [bol] in
   let process_glyph i c =
-    let not_eol = ((Buf.is_eol buf i) == false) in
-    if (Draw.Cursor.next_glyph dcsr c) && not_eol then
+    let not_eol = (c != 0x0A) in
+    if (Draw.Cursor.next_glyph csr c) && not_eol then
       lines := i :: !lines;
     not_eol
   in
-  Buf.iteri process_glyph buf off;
+  Buf.iteri process_glyph buf bol;
   let lines = (Array.of_list (List.rev !lines)) in
-  print_string "map: ";
-  Array.iter (fun x -> Printf.printf "%d " x) lines;
-  print_endline "";
   let index = (find_line lines off ((Array.length lines) - 1)) in
   { width = width; lines = lines; index = index }
 
 let first map =
-  Printf.printf "first: %d\n" map.lines.(map.index);
   map.lines.(map.index)
 
 let bopl buf off =