about summary refs log tree commit diff stats
path: root/apps/subx-common.subx
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-09-04 21:29:42 -0700
committerKartik Agaram <vc@akkartik.com>2019-09-04 21:29:42 -0700
commit77c96940d566de15f941bf29f2b00fae0b3c9041 (patch)
tree55c9cafee8891d0ec786fd7d27d9e9ae4067ed4f /apps/subx-common.subx
parent57e74034f2589a4613e1c1d244a9c787250dccee (diff)
downloadmu-77c96940d566de15f941bf29f2b00fae0b3c9041.tar.gz
5623
Diffstat (limited to 'apps/subx-common.subx')
-rw-r--r--apps/subx-common.subx428
1 files changed, 0 insertions, 428 deletions
diff --git a/apps/subx-common.subx b/apps/subx-common.subx
index 72e625d2..7cce0d20 100644
--- a/apps/subx-common.subx
+++ b/apps/subx-common.subx
@@ -269,434 +269,6 @@ test-next-word-returns-empty-string-on-eof:
     5d/pop-to-ebp
     c3/return
 
-# update line->read to end of string literal surrounded by double quotes
-# line->read must start out at a double-quote
-skip-string:  # line : (address stream)
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # . save registers
-    50/push-eax
-    51/push-ecx
-    52/push-edx
-    # ecx = line
-    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         1/r32/ecx   8/disp8         .                 # copy *(ebp+8) to ecx
-    # eax = skip-string-in-slice(&line->data[line->read], &line->data[line->write])
-    # . . push &line->data[line->write]
-    8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .                         2/r32/edx   8/disp8         .                 # copy *(ecx+8) to edx
-    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx   .           2/r32/edx   0xc/disp8       .                 # copy ecx+edx+12 to edx
-    52/push-edx
-    # . . push &line->data[line->read]
-    8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .                         2/r32/edx   4/disp8         .                 # copy *(ecx+4) to edx
-    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx   .           2/r32/edx   0xc/disp8       .                 # copy ecx+edx+12 to edx
-    52/push-edx
-    # . . call
-    e8/call  skip-string-in-slice/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # line->read = eax - line->data
-    29/subtract                     3/mod/direct    0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # subtract ecx from eax
-    2d/subtract-from-eax  0xc/imm32
-    89/copy                         1/mod/*+disp8   1/rm32/ecx    .           .                         0/r32/eax   4/disp8         .                 # copy eax to *(ecx+4)
-$skip-string:end:
-    # . restore registers
-    5a/pop-to-edx
-    59/pop-to-ecx
-    58/pop-to-eax
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup
-    # . clear-stream(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  clear-stream/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # . write(_test-input-stream, "\"abc\" def")
-    # .                   indices:  0123 45
-    # . . push args
-    68/push  "\"abc\" def"/imm32
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  write/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # precondition: line->read == 0
-    # . . push args
-    68/push  "F - test-skip-string/precondition"/imm32
-    68/push  0/imm32
-    b8/copy-to-eax  _test-input-stream/imm32
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # skip-string(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  skip-string/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # check-ints-equal(line->read, 5, msg)
-    # . . push args
-    68/push  "F - test-skip-string"/imm32
-    68/push  5/imm32
-    b8/copy-to-eax  _test-input-stream/imm32
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string-ignores-spaces:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup
-    # . clear-stream(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  clear-stream/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # . write(_test-input-stream, "\"a b\"/yz")
-    # .                   indices:  0123 45
-    # . . push args
-    68/push  "\"a b\"/yz"/imm32
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  write/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # precondition: line->read == 0
-    # . . push args
-    68/push  "F - test-skip-string-ignores-spaces/precondition"/imm32
-    68/push  0/imm32
-    b8/copy-to-eax  _test-input-stream/imm32
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # skip-string(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  skip-string/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # check-ints-equal(line->read, 5, msg)
-    # . . push args
-    68/push  "F - test-skip-string-ignores-spaces"/imm32
-    68/push  5/imm32
-    b8/copy-to-eax  _test-input-stream/imm32
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string-ignores-escapes:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup
-    # . clear-stream(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  clear-stream/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # . write(_test-input-stream, "\"a\\\"b\"/yz")
-    # .                   indices:  01 2 34 56
-    # . . push args
-    68/push  "\"a\\\"b\"/yz"/imm32
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  write/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # precondition: line->read == 0
-    # . . push args
-    68/push  "F - test-skip-string-ignores-escapes/precondition"/imm32
-    68/push  0/imm32
-    b8/copy-to-eax  _test-input-stream/imm32
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # skip-string(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  skip-string/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # check-ints-equal(line->read, 6, msg)
-    # . . push args
-    68/push  "F - test-skip-string-ignores-escapes"/imm32
-    68/push  6/imm32
-    b8/copy-to-eax  _test-input-stream/imm32
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string-works-from-mid-stream:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup
-    # . clear-stream(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  clear-stream/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # . write(_test-input-stream, "0 \"a\\\"b\"/yz")
-    # .                   indices:  01 2 34 56
-    # . . push args
-    68/push  "0 \"a\\\"b\"/yz"/imm32
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  write/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # precondition: line->read == 2
-    b8/copy-to-eax  _test-input-stream/imm32
-    c7          0/subop/copy        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         2/imm32           # copy to *(eax+4)
-    # skip-string(_test-input-stream)
-    # . . push args
-    68/push  _test-input-stream/imm32
-    # . . call
-    e8/call  skip-string/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
-    # check-ints-equal(line->read, 8, msg)
-    # . . push args
-    68/push  "F - test-skip-string-works-from-mid-stream"/imm32
-    68/push  8/imm32
-    b8/copy-to-eax  _test-input-stream/imm32
-    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           4/disp8         .                 # push *(eax+4)
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-skip-string-in-slice:  # curr : (address byte), end : (address byte) -> new_curr/eax
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # . save registers
-    51/push-ecx
-    52/push-edx
-    53/push-ebx
-    # ecx = curr
-    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         1/r32/ecx   8/disp8         .                 # copy *(ebp+8) to ecx
-    # edx = end
-    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         2/r32/edx   0xc/disp8         .               # copy *(ebp+12) to edx
-    # eax = 0
-    31/xor                          3/mod/direct    0/rm32/eax    .           .             .           0/r32/eax   .               .                 # clear eax
-    # skip initial dquote
-    41/increment-ecx
-$skip-string-in-slice:loop:
-    # if (curr >= end) return curr
-    39/compare                      3/mod/direct    1/rm32/ecx    .           .             .           2/r32/edx   .               .                 # compare ecx with edx
-    73/jump-if-greater-unsigned-or-equal  $skip-string-in-slice:return-curr/disp8
-    # AL = *curr
-    8a/copy-byte                    0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/AL    .               .                 # copy byte at *ecx to AL
-$skip-string-in-slice:dquote:
-    # if (eax == '"') break
-    3d/compare-eax-and  0x22/imm32/double-quote
-    74/jump-if-equal  $skip-string-in-slice:break/disp8
-$skip-string-in-slice:check-for-escape:
-    # if (eax == '\') escape next char
-    3d/compare-eax-and  0x5c/imm32/backslash
-    75/jump-if-not-equal  $skip-string-in-slice:continue/disp8
-$skip-string-in-slice:escape:
-    41/increment-ecx
-$skip-string-in-slice:continue:
-    # ++curr
-    41/increment-ecx
-    eb/jump  $skip-string-in-slice:loop/disp8
-$skip-string-in-slice:break:
-    # skip final dquote
-    41/increment-ecx
-$skip-string-in-slice:return-curr:
-    # return curr
-    89/copy                         3/mod/direct    0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # copy ecx to eax
-$skip-string-in-slice:end:
-    # . restore registers
-    5b/pop-to-ebx
-    5a/pop-to-edx
-    59/pop-to-ecx
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string-in-slice:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup: (eax..ecx) = "\"abc\" def"
-    b8/copy-to-eax  "\"abc\" def"/imm32
-    8b/copy                         0/mod/indirect  0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # copy *eax to ecx
-    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx   .           1/r32/ecx   4/disp8         .                 # copy eax+ecx+4 to ecx
-    05/add-to-eax  4/imm32
-    # eax = skip-string-in-slice(eax, ecx)
-    # . . push args
-    51/push-ecx
-    50/push-eax
-    # . . call
-    e8/call  skip-string-in-slice/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # check-ints-equal(ecx-eax, 4, msg)  # number of chars remaining after the string literal
-    # . . push args
-    68/push  "F - test-skip-string-in-slice"/imm32
-    68/push  4/imm32
-    # . . push ecx-eax
-    29/subtract                     3/mod/direct    1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # subtract eax from ecx
-    51/push-ecx
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string-in-slice-ignores-spaces:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup: (eax..ecx) = "\"a b\"/yz"
-    b8/copy-to-eax  "\"a b\"/yz"/imm32
-    8b/copy                         0/mod/indirect  0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # copy *eax to ecx
-    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx   .           1/r32/ecx   4/disp8         .                 # copy eax+ecx+4 to ecx
-    05/add-to-eax  4/imm32
-    # eax = skip-string-in-slice(eax, ecx)
-    # . . push args
-    51/push-ecx
-    50/push-eax
-    # . . call
-    e8/call  skip-string-in-slice/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # check-ints-equal(ecx-eax, 3, msg)  # number of chars remaining after the string literal
-    # . . push args
-    68/push  "F - test-skip-string-in-slice-ignores-spaces"/imm32
-    68/push  3/imm32
-    # . . push ecx-eax
-    29/subtract                     3/mod/direct    1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # subtract eax from ecx
-    51/push-ecx
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string-in-slice-ignores-escapes:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup: (eax..ecx) = "\"a\\\"b\"/yz"
-    b8/copy-to-eax  "\"a\\\"b\"/yz"/imm32
-    8b/copy                         0/mod/indirect  0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # copy *eax to ecx
-    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx   .           1/r32/ecx   4/disp8         .                 # copy eax+ecx+4 to ecx
-    05/add-to-eax  4/imm32
-    # eax = skip-string-in-slice(eax, ecx)
-    # . . push args
-    51/push-ecx
-    50/push-eax
-    # . . call
-    e8/call  skip-string-in-slice/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # check-ints-equal(ecx-eax, 3, msg)  # number of chars remaining after the string literal
-    # . . push args
-    68/push  "F - test-skip-string-in-slice-ignores-escapes"/imm32
-    68/push  3/imm32
-    # . . push ecx-eax
-    29/subtract                     3/mod/direct    1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # subtract eax from ecx
-    51/push-ecx
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
-test-skip-string-in-slice-stops-at-end:
-    # . prolog
-    55/push-ebp
-    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
-    # setup: (eax..ecx) = "\"abc"  # unbalanced dquote
-    b8/copy-to-eax  "\"abc"/imm32
-    8b/copy                         0/mod/indirect  0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # copy *eax to ecx
-    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx   .           1/r32/ecx   4/disp8         .                 # copy eax+ecx+4 to ecx
-    05/add-to-eax  4/imm32
-    # eax = skip-string-in-slice(eax, ecx)
-    # . . push args
-    51/push-ecx
-    50/push-eax
-    # . . call
-    e8/call  skip-string-in-slice/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
-    # check-ints-equal(ecx-eax, 0, msg)  # skipped to end of slice
-    # . . push args
-    68/push  "F - test-skip-string-in-slice-stops-at-end"/imm32
-    68/push  0/imm32
-    # . . push ecx-eax
-    29/subtract                     3/mod/direct    1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # subtract eax from ecx
-    51/push-ecx
-    # . . call
-    e8/call  check-ints-equal/disp32
-    # . . discard args
-    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
-    # . epilog
-    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
-    5d/pop-to-ebp
-    c3/return
-
 # write an entire stream's contents to a buffered-file
 # ways to do this:
 #   - construct a 'maximal slice' and pass it to write-slice-buffered