Mercurial > repos > tabletprog
diff modules/string.tp @ 171:869399ff7faa
Merge
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 13 Aug 2013 22:01:00 -0700 |
parents | 38140b7dbe3d |
children | 5b830147c1cd |
line wrap: on
line diff
--- a/modules/string.tp Tue Aug 13 21:58:03 2013 -0700 +++ b/modules/string.tp Tue Aug 13 22:01:00 2013 -0700 @@ -76,6 +76,64 @@ intret } + parseHex32 <- { + num <- 0u32 + cur <- 0 + a <- uint32: ("a" byte: 0) + A <- uint32: ("A" byte: 0) + f <- uint32: ("f" byte: 0) + F <- uint32: ("F" byte: 0) + zero <- "0" byte: 0 + nine <- "9" byte: 0 + while: { cur < byte_length} do: { + b <- uint32: (byte: cur) + cur <- cur + 1 + if: b >= zero && b <= nine { + num <- num * 16 + (b - zero) + } else: { + if: b >= a && b <= f { + num <- num * 16 + (b - a) + 10u32 + } else: { + if: b >= A && b <= F { + num <- num * 16 + (b - A) + 10u32 + } else: { + cur <- byte_length + } + } + } + } + num + } + + parseHex64 <- { + num <- 0u64 + cur <- 0 + a <- uint64: ("a" byte: 0) + A <- uint64: ("A" byte: 0) + f <- uint64: ("f" byte: 0) + F <- uint64: ("F" byte: 0) + zero <- "0" byte: 0 + nine <- "9" byte: 0 + while: { cur < byte_length} do: { + b <- uint64: (byte: cur) + cur <- cur + 1 + if: b >= zero && b <= nine { + num <- num * 16 + (b - zero) + } else: { + if: b >= a && b <= f { + num <- num * 16 + (b - a) + 10u64 + } else: { + if: b >= A && b <= F { + num <- num * 16 + (b - A) + 10u64 + } else: { + cur <- byte_length + } + } + } + } + num + } + llMessage: hash withVars: { intret <- (obj_int32 ptr) i <- uint32_t @@ -94,16 +152,17 @@ intret } - llMessage: find:else withVars: { + llMessage: find:startingAt:else withVars: { intret <- obj_int32 ptr oneedle <- object ptr + startpos <- obj_int32 ptr ifNotFound <- object ptr sneedle <- string ptr i <- uint32_t notFound <- uint32_t - } andCode: :oneedle :ifNotFound { + } andCode: :oneedle :startpos :ifNotFound { sneedle <- mcall: string 1 oneedle - i <- 0 + i <- startpos num notFound <- 1 while: { notFound && i + (sneedle bytes) <= bytes} do: { if: (memcmp: data + i (sneedle data) (sneedle bytes)) = 0 { @@ -121,6 +180,10 @@ } } + find:else <- :toFind :orElse { + find: toFind startingAt: 0 else: orElse + } + llMessage: from:withLength withVars: { from <- obj_int32 ptr tocopy <- obj_int32 ptr @@ -182,5 +245,34 @@ pieces append: self } + trim <- { + l <- length + start <- 0 + space <- " " byte: 0 + tab <- "\t" byte: 0 + nl <- "\n" byte: 0 + cr <- "\r" byte: 0 + + while: { + if: start < l { + b <- byte: start + b = space || b = tab || b = nl || b = cr + } + } do: { + start <- start + 1 + } + end <- l + while: { + if: end > 0 { + b <- byte: end + b = space || b = tab || b = nl || b = cr + } + } do: { + end <- end + 1 + } + from: start withLength: (end - start) + } + isInteger? <- { false } + isString? <- { true } }