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 }
 }