pavone@88: #{ pavone@88: llProperty: len withType: uint32_t pavone@88: llProperty: bytes withType: uint32_t pavone@88: llProperty: data withType: (char ptr) pavone@147: pavone@88: llMessage: length withVars: { pavone@88: intret <- (obj_int32 ptr) pavone@88: } andCode: { pavone@88: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@88: intret num!: len pavone@88: intret pavone@88: } pavone@147: pavone@88: llMessage: byte_length withVars: { pavone@88: intret <- (obj_int32 ptr) pavone@88: } andCode: { pavone@88: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@88: intret num!: bytes pavone@88: intret pavone@88: } pavone@147: pavone@88: llMessage: EQ_ withVars: { pavone@88: argb <- (string ptr) pavone@88: } andCode: :argb { pavone@88: if: len = (argb len) && bytes = (argb bytes) && (not: (memcmp: data (argb data) bytes)) { pavone@88: true pavone@88: } pavone@88: } pavone@147: pavone@243: llMessage: compareSub withVars: { pavone@243: argb <- string ptr pavone@243: myoff <- obj_int32 ptr pavone@243: boff <- obj_int32 ptr pavone@243: clen <- obj_int32 ptr pavone@243: intret <- obj_int32 ptr pavone@243: } andCode: :argb myoff boff clen { pavone@243: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@243: intret num!: (memcmp: data + (myoff num) (argb data) + (boff num) (clen num)) pavone@243: intret pavone@243: } pavone@243: pavone@88: llMessage: NEQ_ withVars: { pavone@88: argb <- (string ptr) pavone@88: } andCode: :argb { pavone@88: if: len != (argb len) || bytes != (argb bytes) || (memcmp: data (argb data) bytes) { pavone@88: true pavone@88: } pavone@88: } pavone@147: pavone@88: llMessage: print withVars: {} andCode: { pavone@88: fwrite: data 1 bytes stdout pavone@88: self pavone@88: } pavone@147: pavone@88: llMessage: string withVars: {} andCode: { pavone@88: self pavone@88: } pavone@147: pavone@88: llMessage: CAT_ withVars: { pavone@88: argbo <- (object ptr) pavone@88: argb <- (string ptr) pavone@88: out <- (string ptr) pavone@88: } andCode: :argbo { pavone@88: argb <- mcall: string 1 argbo pavone@88: out <- make_object: (addr_of: string_meta) NULL 0 pavone@88: out bytes!: bytes + (argb bytes) pavone@88: out len!: len + (argb len) pavone@88: out data!: (GC_MALLOC_ATOMIC: (out bytes) + 1) pavone@88: memcpy: (out data) data bytes pavone@88: memcpy: (out data) + bytes (argb data) (argb bytes) + 1 pavone@88: out pavone@88: } pavone@147: pavone@88: llMessage: byte withVars: { pavone@88: index <- (obj_int32 ptr) pavone@88: intret <- (obj_int32 ptr) pavone@88: } andCode: :index { pavone@88: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@88: intret num!: (if: (index num) < bytes { data get: (index num) } else: {0}) pavone@88: intret pavone@88: } pavone@147: pavone@88: llMessage: int32 withVars: { pavone@88: intret <- (obj_int32 ptr) pavone@88: } andCode: { pavone@88: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@88: intret num!: (atoi: data) pavone@88: intret pavone@88: } pavone@147: pavone@158: parseHex32 <- { pavone@158: num <- 0u32 pavone@158: cur <- 0 pavone@158: a <- uint32: ("a" byte: 0) pavone@158: A <- uint32: ("A" byte: 0) pavone@158: f <- uint32: ("f" byte: 0) pavone@158: F <- uint32: ("F" byte: 0) pavone@158: zero <- "0" byte: 0 pavone@158: nine <- "9" byte: 0 pavone@158: while: { cur < byte_length} do: { pavone@158: b <- uint32: (byte: cur) pavone@158: cur <- cur + 1 pavone@158: if: b >= zero && b <= nine { pavone@158: num <- num * 16 + (b - zero) pavone@158: } else: { pavone@158: if: b >= a && b <= f { pavone@158: num <- num * 16 + (b - a) + 10u32 pavone@158: } else: { pavone@158: if: b >= A && b <= F { pavone@158: num <- num * 16 + (b - A) + 10u32 pavone@158: } else: { pavone@158: cur <- byte_length pavone@158: } pavone@158: } pavone@158: } pavone@158: } pavone@158: num pavone@158: } pavone@158: pavone@158: parseHex64 <- { pavone@158: num <- 0u64 pavone@158: cur <- 0 pavone@158: a <- uint64: ("a" byte: 0) pavone@158: A <- uint64: ("A" byte: 0) pavone@158: f <- uint64: ("f" byte: 0) pavone@158: F <- uint64: ("F" byte: 0) pavone@158: zero <- "0" byte: 0 pavone@158: nine <- "9" byte: 0 pavone@158: while: { cur < byte_length} do: { pavone@158: b <- uint64: (byte: cur) pavone@158: cur <- cur + 1 pavone@158: if: b >= zero && b <= nine { pavone@158: num <- num * 16 + (b - zero) pavone@158: } else: { pavone@158: if: b >= a && b <= f { pavone@158: num <- num * 16 + (b - a) + 10u64 pavone@158: } else: { pavone@158: if: b >= A && b <= F { pavone@158: num <- num * 16 + (b - A) + 10u64 pavone@158: } else: { pavone@158: cur <- byte_length pavone@158: } pavone@158: } pavone@158: } pavone@158: } pavone@158: num pavone@158: } pavone@158: pavone@88: llMessage: hash withVars: { pavone@88: intret <- (obj_int32 ptr) pavone@88: i <- uint32_t pavone@88: } andCode: { pavone@88: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@88: intret num!: 0 pavone@88: if: bytes { pavone@88: intret num!: (data get: 0) * 128 pavone@88: i <- 0 pavone@88: while: { i < bytes } do: { pavone@88: intret num!: (1000003 * (intret num)) xor (data get: i) pavone@88: i <- i + 1 pavone@88: } pavone@88: intret num!: (intret num) xor bytes pavone@88: } pavone@88: intret pavone@88: } pavone@147: pavone@154: llMessage: find:startingAt:else withVars: { pavone@150: intret <- obj_int32 ptr pavone@150: oneedle <- object ptr pavone@154: startpos <- obj_int32 ptr pavone@150: ifNotFound <- object ptr pavone@150: sneedle <- string ptr pavone@150: i <- uint32_t pavone@150: notFound <- uint32_t pavone@154: } andCode: :oneedle :startpos :ifNotFound { pavone@150: sneedle <- mcall: string 1 oneedle pavone@154: i <- startpos num pavone@150: notFound <- 1 pavone@150: while: { notFound && i + (sneedle bytes) <= bytes} do: { pavone@150: if: (memcmp: data + i (sneedle data) (sneedle bytes)) = 0 { pavone@150: notFound <- 0 pavone@150: } else: { pavone@150: i <- i + 1 pavone@150: } pavone@150: } pavone@150: if: notFound { pavone@150: ccall: ifNotFound 0 pavone@150: } else: { pavone@150: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@150: intret num!: i pavone@150: intret pavone@150: } pavone@150: } pavone@150: pavone@154: find:else <- :toFind :orElse { pavone@154: find: toFind startingAt: 0 else: orElse pavone@154: } pavone@154: pavone@151: llMessage: from:withLength withVars: { pavone@151: from <- obj_int32 ptr pavone@151: tocopy <- obj_int32 ptr pavone@151: ret <- string ptr pavone@151: start <- int32_t pavone@151: clampedLen <- int32_t pavone@151: } andCode: :from :tocopy { pavone@151: start <- from num pavone@151: if: start < 0 { pavone@151: start <- bytes + start pavone@151: } pavone@151: if: start > bytes { pavone@151: start <- bytes pavone@151: } pavone@151: clampedLen <- tocopy num pavone@151: if: start + clampedLen > bytes { pavone@151: clampedLen <- bytes - start pavone@151: } pavone@151: ret <- make_object: (addr_of: string_meta) NULL 0 pavone@151: ret data!: (GC_MALLOC_ATOMIC: clampedLen + 1) pavone@151: memcpy: (ret data) data + start clampedLen pavone@151: ret len!: clampedLen pavone@151: ret bytes!: clampedLen pavone@151: ret pavone@151: } pavone@151: pavone@151: from <- :start { pavone@151: from: start withLength: length pavone@151: } pavone@151: pavone@152: partitionOn <- :delim { pavone@152: pos <- find: delim else: { -1 } pavone@152: if: pos >= 0 { pavone@152: _before <- from: 0 withLength: pos pavone@152: _after <- from: (pos + (delim length)) pavone@152: #{ pavone@152: before <- _before pavone@152: after <- _after pavone@152: } pavone@152: } else: { pavone@152: _before <- self pavone@152: #{ pavone@152: before <- _before pavone@152: after <- "" pavone@152: } pavone@152: } pavone@152: } pavone@152: pavone@152: splitOn <- :delim { pavone@152: pos <- 0 pavone@152: pieces <- #[] pavone@152: while: { pavone@152: pos <- find: delim else: { -1 } pavone@152: pos >= 0 pavone@152: } do: { pavone@152: pieces append: (from: 0 withLength: pos) pavone@152: self <- from: pos + (delim length) pavone@152: } pavone@152: pieces append: self pavone@152: } pavone@152: pavone@259: ltrim <- { pavone@259: l <- length pavone@259: start <- 0 pavone@259: space <- " " byte: 0 pavone@259: tab <- "\t" byte: 0 pavone@259: nl <- "\n" byte: 0 pavone@259: cr <- "\r" byte: 0 pavone@259: pavone@259: while: { pavone@259: if: start < l { pavone@259: b <- byte: start pavone@259: b = space || b = tab || b = nl || b = cr pavone@259: } pavone@259: } do: { pavone@259: start <- start + 1 pavone@259: } pavone@259: from: start pavone@259: } pavone@259: pavone@157: trim <- { pavone@157: l <- length pavone@157: start <- 0 pavone@157: space <- " " byte: 0 pavone@157: tab <- "\t" byte: 0 pavone@157: nl <- "\n" byte: 0 pavone@157: cr <- "\r" byte: 0 pavone@157: pavone@157: while: { pavone@157: if: start < l { pavone@157: b <- byte: start pavone@157: b = space || b = tab || b = nl || b = cr pavone@157: } pavone@157: } do: { pavone@157: start <- start + 1 pavone@157: } pavone@157: end <- l pavone@157: while: { pavone@157: if: end > 0 { pavone@157: b <- byte: end pavone@157: b = space || b = tab || b = nl || b = cr pavone@157: } pavone@157: } do: { pavone@157: end <- end + 1 pavone@157: } pavone@157: from: start withLength: (end - start) pavone@157: } pavone@157: pavone@147: isInteger? <- { false } pavone@154: isString? <- { true } pavone@243: isBasicString? <- { true } pavone@88: }