slack: parse users
This commit is contained in:
parent
ca356b9618
commit
6477c46465
|
@ -9,7 +9,7 @@ type user {
|
||||||
id: (handle array byte)
|
id: (handle array byte)
|
||||||
name: (handle array byte)
|
name: (handle array byte)
|
||||||
real-name: (handle array byte)
|
real-name: (handle array byte)
|
||||||
avatar: (handle image)
|
avatar: image
|
||||||
}
|
}
|
||||||
|
|
||||||
type item {
|
type item {
|
||||||
|
@ -162,12 +162,83 @@ fn user-record? record: (addr stream byte) -> _/eax: boolean {
|
||||||
return 0/false
|
return 0/false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse-user record: (addr stream byte), users: (addr array user), user-idx: int {
|
fn parse-user record: (addr stream byte), _users: (addr array user), user-idx: int {
|
||||||
|
var users/esi: (addr array user) <- copy _users
|
||||||
|
var offset/eax: (offset user) <- compute-offset users, user-idx
|
||||||
|
var user/esi: (addr user) <- index users, offset
|
||||||
|
#
|
||||||
|
var s-storage: (stream byte 0x40)
|
||||||
|
var s/ecx: (addr stream byte) <- address s-storage
|
||||||
|
#
|
||||||
|
rewind-stream record
|
||||||
|
var paren/eax: byte <- read-byte record
|
||||||
|
compare paren, 0x28/open-paren
|
||||||
|
{
|
||||||
|
break-if-=
|
||||||
|
abort "parse-user: ("
|
||||||
|
}
|
||||||
|
# user id
|
||||||
|
skip-chars-matching-whitespace record
|
||||||
|
var double-quote/eax: byte <- read-byte record
|
||||||
|
compare double-quote, 0x22/double-quote
|
||||||
|
{
|
||||||
|
break-if-=
|
||||||
|
abort "parse-user: id"
|
||||||
|
}
|
||||||
|
next-json-string record, s
|
||||||
|
var dest/eax: (addr handle array byte) <- get user, id
|
||||||
|
stream-to-array s, dest
|
||||||
|
# user name
|
||||||
|
skip-chars-matching-whitespace record
|
||||||
|
var double-quote/eax: byte <- read-byte record
|
||||||
|
compare double-quote, 0x22/double-quote
|
||||||
|
{
|
||||||
|
break-if-=
|
||||||
|
abort "parse-user: name"
|
||||||
|
}
|
||||||
|
next-json-string record, s
|
||||||
|
var dest/eax: (addr handle array byte) <- get user, name
|
||||||
|
stream-to-array s, dest
|
||||||
|
# real name
|
||||||
|
skip-chars-matching-whitespace record
|
||||||
|
var double-quote/eax: byte <- read-byte record
|
||||||
|
compare double-quote, 0x22/double-quote
|
||||||
|
{
|
||||||
|
break-if-=
|
||||||
|
abort "parse-user: real-name"
|
||||||
|
}
|
||||||
|
next-json-string record, s
|
||||||
|
var dest/eax: (addr handle array byte) <- get user, real-name
|
||||||
|
stream-to-array s, dest
|
||||||
|
# avatar
|
||||||
|
skip-chars-matching-whitespace record
|
||||||
|
var open-bracket/eax: byte <- read-byte record
|
||||||
|
compare open-bracket, 0x5b/open-bracket
|
||||||
|
{
|
||||||
|
break-if-=
|
||||||
|
abort "parse-user: avatar"
|
||||||
|
}
|
||||||
|
skip-chars-matching-whitespace record
|
||||||
|
var c/eax: byte <- peek-byte record
|
||||||
|
{
|
||||||
|
compare c, 0x5d/close-bracket
|
||||||
|
break-if-=
|
||||||
|
var dest/eax: (addr image) <- get user, avatar
|
||||||
|
initialize-image dest, record
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse-item record: (addr stream byte), channels: (addr array channel), items: (addr array item), item-idx: int {
|
fn parse-item record: (addr stream byte), channels: (addr array channel), items: (addr array item), item-idx: int {
|
||||||
|
rewind-stream record
|
||||||
|
var paren/eax: byte <- read-byte record
|
||||||
|
compare paren, 0x28/open-paren
|
||||||
|
{
|
||||||
|
break-if-=
|
||||||
|
abort "parse-item: ("
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# includes trailing double quote
|
||||||
fn slurp-json-string in: (addr stream byte), out: (addr stream byte) {
|
fn slurp-json-string in: (addr stream byte), out: (addr stream byte) {
|
||||||
# open quote is already slurped
|
# open quote is already slurped
|
||||||
{
|
{
|
||||||
|
@ -175,7 +246,7 @@ fn slurp-json-string in: (addr stream byte), out: (addr stream byte) {
|
||||||
var eof?/eax: boolean <- stream-empty? in
|
var eof?/eax: boolean <- stream-empty? in
|
||||||
compare eof?, 0/false
|
compare eof?, 0/false
|
||||||
break-if-=
|
break-if-=
|
||||||
abort "slurp-json-string: truncated"
|
abort "next-json-string: truncated"
|
||||||
}
|
}
|
||||||
var c/eax: byte <- read-byte in
|
var c/eax: byte <- read-byte in
|
||||||
{
|
{
|
||||||
|
@ -195,3 +266,32 @@ fn slurp-json-string in: (addr stream byte), out: (addr stream byte) {
|
||||||
loop
|
loop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# drops trailing double quote
|
||||||
|
fn next-json-string in: (addr stream byte), out: (addr stream byte) {
|
||||||
|
# open quote is already read
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var eof?/eax: boolean <- stream-empty? in
|
||||||
|
compare eof?, 0/false
|
||||||
|
break-if-=
|
||||||
|
abort "slurp-json-string: truncated"
|
||||||
|
}
|
||||||
|
var c/eax: byte <- read-byte in
|
||||||
|
compare c, 0x22/double-quote
|
||||||
|
break-if-=
|
||||||
|
{
|
||||||
|
var c-int/eax: int <- copy c
|
||||||
|
append-byte out, c-int
|
||||||
|
}
|
||||||
|
compare c, 0x5c/backslash
|
||||||
|
{
|
||||||
|
break-if-!=
|
||||||
|
# read next byte raw
|
||||||
|
c <- read-byte in
|
||||||
|
var c-int/eax: int <- copy c
|
||||||
|
append-byte out, c-int
|
||||||
|
}
|
||||||
|
loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue