722 - split at substring, and assorted helpers

This commit is contained in:
Kartik K. Agaram 2015-02-08 15:02:33 -08:00
parent ebce8e116d
commit 47da2141be
2 changed files with 120 additions and 1 deletions

51
mu.arc
View File

@ -2232,11 +2232,32 @@
(reply result:string-address-array-address)
)
(init-fn split-first-at-substring/variant:split-first ; string text, string delim -> string first, string rest
(default-space:space-address <- new space:literal 30:literal)
(text:string-address <- next-input)
(delim:string-address <- next-input)
; empty string? return empty strings
(len:integer <- length text:string-address/deref)
{ begin
(empty?:boolean <- equal len:integer 0:literal)
(break-unless empty?:boolean)
(x:string-address <- new "")
(y:string-address <- new "")
(reply x:string-address y:string-address)
}
(idx:integer <- find-substring text:string-address delim:string-address 0:literal)
(x:string-address <- string-copy text:string-address 0:literal idx:integer)
(k:integer <- length delim:string-address/deref)
(idx:integer <- add idx:integer k:integer)
(y:string-address <- string-copy text:string-address idx:integer len:integer)
(reply x:string-address y:string-address)
)
(init-fn split-first ; string text, character delim -> string first, string rest
(default-space:space-address <- new space:literal 30:literal)
(text:string-address <- next-input)
(delim:character <- next-input)
; empty string? return empty array
; empty string? return empty strings
(len:integer <- length text:string-address/deref)
{ begin
(empty?:boolean <- equal len:integer 0:literal)
@ -2263,6 +2284,10 @@
;? ($print (("-" literal))) ;? 1
;? ($print end:integer) ;? 1
;? ($print (("\n" literal))) ;? 1
; if end is out of bounds, trim it
(len:integer <- length buf:string-address/deref)
(end:integer <- min len:integer end:integer)
; allocate space for result
(len:integer <- subtract end:integer start:integer)
(result:string-address <- new string:literal len:integer)
; copy start..end into result[curr-result]
@ -2284,6 +2309,30 @@
(reply result:string-address)
)
(init-fn min
(default-space:space-address <- new space:literal 30:literal)
(x:integer <- next-input)
(y:integer <- next-input)
{ begin
(return-x?:boolean <- less-than x:integer y:integer)
(break-if return-x?:boolean)
(reply y:integer)
}
(reply x:integer)
)
(init-fn max
(default-space:space-address <- new space:literal 30:literal)
(x:integer <- next-input)
(y:integer <- next-input)
{ begin
(return-x?:boolean <- greater-than x:integer y:integer)
(break-if return-x?:boolean)
(reply y:integer)
}
(reply x:integer)
)
(init-fn init-stream
(default-space:space-address <- new space:literal 30:literal)
(in:string-address <- next-input)

View File

@ -4541,6 +4541,76 @@
(~memory-contains-array memory*.3 "b"))
(prn "F - 'split-first' cuts string at first occurrence of delimiter"))
(reset)
(new-trace "string-split-first-at-substring")
(add-code
'((function main [
(1:string-address <- new "a//b")
(2:string-address <- new "//")
(3:string-address 4:string-address <- split-first-at-substring 1:string-address 2:string-address)
])))
(run 'main)
(each routine completed-routines*
(aif rep.routine!error (prn "error - " it)))
;? (prn int-canon.memory*) ;? 1
(when (or (~memory-contains-array memory*.3 "a")
(~memory-contains-array memory*.4 "b"))
(prn "F - 'split-first-at-substring' is like split-first but with a string delimiter"))
(reset)
(new-trace "string-copy")
(add-code
'((function main [
(1:string-address <- new "abc")
(2:string-address <- string-copy 1:string-address 1:literal 3:literal)
])))
(run 'main)
(each routine completed-routines*
(aif rep.routine!error (prn "error - " it)))
(when (~memory-contains-array memory*.2 "bc")
(prn "F - 'string-copy' returns a copy of a substring"))
(reset)
(new-trace "string-copy-out-of-bounds")
(add-code
'((function main [
(1:string-address <- new "abc")
(2:string-address <- string-copy 1:string-address 2:literal 4:literal)
])))
(run 'main)
(each routine completed-routines*
(aif rep.routine!error (prn "error - " it)))
(when (~memory-contains-array memory*.2 "c")
(prn "F - 'string-copy' stops at bounds"))
(reset)
(new-trace "string-copy-out-of-bounds-2")
(add-code
'((function main [
(1:string-address <- new "abc")
(2:string-address <- string-copy 1:string-address 3:literal 3:literal)
])))
(run 'main)
(each routine completed-routines*
(aif rep.routine!error (prn "error - " it)))
(when (~memory-contains-array memory*.2 "")
(prn "F - 'string-copy' returns empty string when range is out of bounds"))
(reset)
(new-trace "min")
(add-code
'((function main [
(1:integer <- min 3:literal 4:literal)
])))
(run 'main)
(each routine completed-routines*
(aif rep.routine!error (prn "error - " it)))
;? (prn int-canon.memory*) ;? 1
(when (~is memory*.1 3)
(prn "F - 'min' returns smaller of two numbers"))
;? (quit) ;? 2
(reset)
(new-trace "integer-to-decimal-string")
(add-code