about summary refs log tree commit diff
path: root/language/dynamic/command-line.e
blob: 8e2d812aaa04f84ce0050bccc1f74b18b76936b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
8 2 * allocate s" argument-scan-state" variable
: argument-scan-state-next-argument-handle ;
: argument-scan-state-n-remaining-arguments 8 + ;

~ (next argument handle, n remaining arguments --)
: save-argument-scan-state
  argument-scan-state argument-scan-state-n-remaining-arguments !
  argument-scan-state argument-scan-state-next-argument-handle ! ;
~ (-- next argument handle, n remaining arguments)
: restore-argument-scan-state
  argument-scan-state argument-scan-state-next-argument-handle @
  argument-scan-state argument-scan-state-n-remaining-arguments @ ;

~ (argument pointer -- *)
: process-command-line-argument
  dup find dup {
    ~ (argument pointer, entry pointer)
    swap drop
    interpreter-flags @ 0x01 & {
      dup entry-flags@ 1 &
      swap entry-to-execution-token swap
      { execute } { , } if-else
    } { entry-to-execution-token execute } if-else
  } {
    drop
    ~ (argument pointer)
    dup read-integer 0 = {
      ~ (argument pointer, integer value)
      interpreter-flags @ 0x01 & {
        x' lit , ,
        drop
      } {
        swap drop
      } if-else
    } {
      ~ (argument pointer)
      ." No such word: " emitstring newline
    } if-else
  } if-else ;

: process-command-line-arguments
  s0 @
  dup @
  swap 8 +
  swap
  ~ (next argument handle, n remaining arguments)
  dup {
    ~ Skip the executable name.
    1- swap 8 + swap

    { dup } {
      over @
      3unroll save-argument-scan-state

      process-command-line-argument

      restore-argument-scan-state
      1- swap 8 + swap
    } while
  } if 2drop ;