NAME=avga # add global variable
FILE==
CMDS=<<EOF
avga foo int @ 0x100
avgl
avga bar char @ 0x1000
avgl
EOF
EXPECT=<<EOF
global int foo @ 0x100
global int foo @ 0x100
global char bar @ 0x1000
EOF
RUN

NAME=avgjl # output in json mode
FILE==
CMDS=<<EOF
avga foo int @ 0x100
avga bar char @ 0x1000
avglj
EOF
EXPECT=<<EOF
[{"name":"foo","type":"int","size":4,"addr":"0x100"},{"name":"bar","type":"char","size":1,"addr":"0x1000"}]
EOF
RUN

NAME=avgd # delete global variable
FILE==
CMDS=<<EOF
avga foo int @ 0x100
avga bar char @ 0x1000
avgl
avgd 0x100
avgl
avga foofoo int @ 0x100
avgl
avgd 0x102
avgl
EOF
EXPECT=<<EOF
global int foo @ 0x100
global char bar @ 0x1000
global char bar @ 0x1000
global int foofoo @ 0x100
global char bar @ 0x1000
global char bar @ 0x1000
EOF
RUN

NAME=avgn # rename global variable
FILE==
CMDS=<<EOF
avga foo int @ 0x100
avgl
avgn foo bar
avgl
EOF
EXPECT=<<EOF
global int foo @ 0x100
global int bar @ 0x100
EOF
RUN

NAME=avgt # retype global variable
FILE==
CMDS=<<EOF
avga foo int @ 0x100
avgl
avgt foo char
avgl
avgt foo "struct a { int a; char b; };"
avgl
avgt foo "struct { int a; char b; void (*c)(int a, char b); };"
avgl
avgt foo "union { int a; char b; };"
avgl
avgt foo "enum { A=0,B,C,D };"
avgl
avgt foo "enum foo { A=0,B,C,D };"
avgl
avgt foo "void (*a)(int a, char b);"
avgl
avgt foo "char *"
avgl
avgt foo "char [50]"
avgl
EOF
EXPECT=<<EOF
global int foo @ 0x100
global char foo @ 0x100
global struct a foo @ 0x100
global struct anonymous struct 0 foo @ 0x100
global union anonymous union 0 foo @ 0x100
global enum anonymous enum 0 foo @ 0x100
global enum foo foo @ 0x100
global void foo @ 0x100
global char * foo @ 0x100
global char [50] foo @ 0x100
EOF
RUN

NAME=avg array and pointer types
FILE==
CMDS=<<EOF
avga gptr "char *" @ 0x100
avga gpp "char **" @ 0x200
avga garr "int [8]" @ 0x300
avga gpa "int *[4]" @ 0x400
avgl
avglj
avgt gptr "void **"
avgt garr "char [3]"
avgl
EOF
EXPECT=<<EOF
global char * gptr @ 0x100
global char ** gpp @ 0x200
global int [8] garr @ 0x300
global int *[4] gpa @ 0x400
[{"name":"gptr","type":"char *","size":8,"addr":"0x100"},{"name":"gpp","type":"char **","size":8,"addr":"0x200"},{"name":"garr","type":"int [8]","size":32,"addr":"0x300"},{"name":"gpa","type":"int *[4]","size":32,"addr":"0x400"}]
global void ** gptr @ 0x100
global char ** gpp @ 0x200
global char [3] garr @ 0x300
global int *[4] gpa @ 0x400
EOF
RUN

NAME=avgl <non-existing-var>
FILE==
CMDS=<<EOF
avgl foo
EOF
EXPECT=
EXPECT_ERR=<<EOF
ERROR: Global variable 'foo' does not exist!
EOF
RUN

NAME=avgp - print global variable value
FILE==
CMDS=<<EOF
e asm.arch=x86
e asm.bits=64
wx 40102030405050230590909090
w alfdjsdfgkjdhfgkdghdfgdfg @ 0x20
avga foo int @ 0x10
avgp foo
avga boo char @ 0x0
avgp boo
avga goo "struct aaa { int a; char b; };" @ 0x5
avgp goo
avga qoo "enum qwe { A=0,B,C,D };" @ 0x15
avgp qoo
avga poo "char *" @ 0x25
avgp poo
avga xoo "char [5]" @ 0x30
avgp xoo
EOF
EXPECT=<<EOF
0x00000010 : int = 0 [LE]
0x00000000 : char = '@'
0x00000005 : a = 86200400 [LE]
0x00000009 : b = '.'
0x00000015 : qwe = 0x00000000 ; A
0x00000025 : char = (*0x68646a6b67666473)
0x00000030 : char = [ 'd', 'g', 'h', 'd', 'f' ]
EOF
RUN

NAME=avgc set, read and clear global variable constraints (#315)
FILE==
CMDS=<<EOF
avga foo int @ 0x100
avga bar char @ 0x1000
avgcs foo ">0,<=9"
avgc foo
avgcs bar "ge 5,lt 100"
avgcj bar
avgc
avgc- foo
avgc foo
echo cleared
EOF
EXPECT=<<EOF
> 0x0 && <= 0x9
[{"name":"bar","constraints":">= 0x5 && < 0x64","conditions":[{"cond":"ge","value":5},{"cond":"lt","value":100}]}]
foo: > 0x0 && <= 0x9
bar: >= 0x5 && < 0x64
cleared
EOF
RUN
