changeset 158:38140b7dbe3d

Add parseHex32 and parseHex64 to string objects
author Mike Pavone <pavone@retrodev.com>
date Sat, 10 Aug 2013 15:20:38 -0700
parents 55e0dca7d3d7
children d81de309a51f
files modules/string.tp samples/stringops.tp
diffstat 2 files changed, 61 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/modules/string.tp	Sat Aug 10 15:06:56 2013 -0700
+++ b/modules/string.tp	Sat Aug 10 15:20:38 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
--- a/samples/stringops.tp	Sat Aug 10 15:06:56 2013 -0700
+++ b/samples/stringops.tp	Sat Aug 10 15:20:38 2013 -0700
@@ -17,5 +17,8 @@
 		res <- "foobarbaz" partitionOn: "bar"
 		print: "Before: " . (res before) . "\n"
 		print: "After: " . (res after) . "\n"
+
+		print: (string: ("12abcDEF" parseHex32)) . "\n"
+		print: (string: ("FFFFFFFFFF" parseHex64)) . "\n"
 	}
 }