#! perl

# Copyright (C) 2003-2007, The Perl Foundation.
# $Id: testsuite.pl 21232 2007-09-12 19:30:46Z paultcochrane $

# Relies on "testrun.pl" being setup correctly.
#
#

$tn = 0;
while (1) {
    {
        local $/ = "";
        $_ = <DATA>;
    }
    if ( /type / or /select/ ) {    # /function/
        print "Skipped\n";
        next;
    }
    last unless $_;
    last if /STOPPLEASE/;
    @c = m/^'\s*(.*)/gm;
    print join( "\n", @c ), "\n====================== $tn\n" if @c;
    $tn++;
    open( OF, ">", "_testsuite.bas" ) || die;
    print OF $_;
    close(OF);

    if ( !system("perl compile.pl _testsuite.bas") ) {
        system("perl testrun.pl > _output2");
        open( O, '>', "_output2" ) || die;
        print <O>;
        close(O);
        print "\n";
    }

}

__DATA__
input a$,
print a$

STOPPLEASE
' Expect 10
sub second(b() )
        b(5)=10
end sub
sub first(a() )
        call second(a())
end sub
dim t(),f()
call first(t())
print t(5)

' Keys test, "interesting"
dim a$(),b$()
b$("Key 1")="This is"
b$("Key 2")="an"
B$("Hi Mom!")="interesting"
B$(0)="development.
keys a$(), b$()
i=0
do
        t$=a$(i)
        print t$,
        print tab$(10),b$(t$)
        i=i+1
loop while t$ <> ""

' 5 and PI
dim a$(), m()
a$(1)="5"
print a$(1)
m(99)=3.14
print m(99)

' basic I/O  1..5
open "_testfile" for output as #3
for i=1 to 5
        print #3, i
next i
close #3
open "_testfile" for input as #5
for i = 1 to 5
        input #5,a$
        print a$,
next i
close #5
print

' Expect 5, 0, "Hello"
common i, a$
sub mysub
        print "In the sub\n"
        print i
        print j
        print a$
        print c$
end sub
j=2
i=5
a$="Hello"
c$="WRONG"
call mysub()


' Expect 10
sub second(b() )
        b(5)=10
end sub
sub first(a() )
        call second(a())
end sub
dim t(),f()
call first(t())
print t(5)


' Expect OK
y=59.7363
x=19.506
if ( y > 0 ) and (x > 0) then
        print "OK"
end if



' Passing string arrays, expect 99 and "Hello"
function foo(i, thing$())
        print i
        print thing$(10)
        foo=1
end function
dim fool$()
fool$(10)="Hello"
a=foo(99, fool$())

' String Arrays, expect "One"
dim g$()
g$(5)="One"
g$(6)="Two"
print g$(5)

' Evil BASIC bug, expect 55
dim B(1), z(1)
Z(54,6)=54
B(54)=1
Z1= 54
Z(Z1,6)= 54
B(Z(Z1,6))= 55
print B(Z(Z1,6))


' Comparison operator tests
if 4<5 then print "Ok" else print "Wrong"
if 5<5 then print "Wrong" else print "Ok"
if 6<5 then print "Wrong" else print "OK"
if 4<=5 then print "Ok" else print "Wrong"
if 5<=5 then print "Ok" else print "Wrong"
if 6<=5 then print "Wrong" else print "OK"
if 4=5 then print "Wrong" else print "Ok"
if 5=4 then print "Wrong" else print "Ok"
if 5=5 then print "Ok" else print "Wrong"
if 5>4 then print "Ok" else print "Wrong"
if 5>5 then print "Wrong" else print "Ok"
if 4>5 then print "Wrong" else print "OK"
if 5>=4 then print "Ok" else print "Wrong"
if 5>=5 then print "Ok" else print "Wrong"
if 4>=5 then print "Wrong" else print "OK"

' Exit for, count 1-3
for i=1 to 5
  if i=4 then exit for
  print i
next i

' Branch test, all OK in sequence
PRINT "1 in module-level code"
GOSUB Sub1
PRINT "ERR this line in main routine should be skipped"
Label1:
   PRINT "5 back in module-level code"
   END
Sub1:
   PRINT "2 in subroutine one"
   GOSUB Sub2
   PRINT "ERR this line in subroutine one should be skipped"
Label2:
   PRINT "4 back in subroutine one"
   RETURN Label1
Sub2:
   PRINT "3 in subroutine two"
   RETURN Label2   'Cannot return from here to main
                   'program - only to SUB1.
' Exit tests
sub mysub(b,c)
        print "Print me"
        exit sub
        print "Don't print me"
end sub
function foo$
        foo$="Right one"
        exit function
        foo$="Wrong one"
end function
call mysub( 78, 80)
t$=foo$
print t$
t=0
do
        print "This is right"
        exit do
        print "This is wrong"
        t=t+1
loop until t>1

' Mathmagic
dim m(1), ba(1)
fa=-1
m0=48100
m=48000
w=-19
t=3
m(t)=-100
ba(fa+1)=9
w=w+M(T)+INT(M(T) * BA(FA + 1) / (BA(FA + 1) + 1) * (M0 - M) * .0001)
print w

' INT madness.  0, 0, 0, -1, -1, 3
print int(.8),
print int(.3),
print int(0),
print int(-.8),
print int(-.3),
print int(3.14)

' Simple subs, Made it here
sub mysub()
        print "Made it here"
end sub
call mysub()

' Arguments.  Expect 2 and 4
sub twice(a)
        print a
        a=a*2
end sub
t=2
call twice t
print t

' Passing arrays, twice, expect 12
function aftwo(y())
        print y(4)
end function
function arrfunc(x())
        u=aftwo(x())
        arrfunc=55
end function
dim g(10)
g(5)=666
g(4)=12
a=g(5)+0
y=arrfunc(g())

' Passing arrays (expect 12)
function arrfunc(x())
        print x(4)
        arrfunc=55
end function
dim g(10)
g(4)=12
y=arrfunc(g())

' Function Array scopes, expect 4, 5.6
function mine(a)
        dim t(6)
        s=32
        t(3)=2
        mine=a*2
        print t(3)*2
end function
dim t(7)
z=55
t(3)=5.6
a=mine(5)
print t(3)

1740 print "Branched"
        end
' Logical Operators
print "      AND   OR    XOR   EQV   IMP   a & ! b"
for i = 0 to 1
for j = 0 to 1
print i; j;
if i and j then a$="True  " else a$="False "
if i or  j then b$="True  " else b$="False "
if i eqv j then d$="True  " else d$="False "
if i imp j then e$="True  " else e$="False "
if i and not j then f$="True   " else f$="False "
print a$;b$;c$;d$;e$;f$
next j,i

' Function Array scopes, expect 4, 5.6
function mine(a)
        dim t(6)
        t(3)=2
        mine=a*2
        print t(3)*2
end function
dim t(7)
t(3)=5.6
a=mine(5)
print t(3)

' Unary minus goodness
Dim t7(1),w(10)
w=20
w(2)=5
t7(0)=0
w=w-(T7(0) * T7(0) * 12)
' Expect 20
print w
' Expect -20
print -w
' Expect -5
print -w(2)
' Expect 3
print 5-2
' Expect 3 also
print 5+-2
' Expect 0
print 6-abs(-6)


' Some register confusion, expect .PTFCDR
Dim c(10), a$(10), u(10)
510 FOR I = 0 TO 6
520 READ A$(I), U(I)
    print A$(I);
530 NEXT I
540 DATA ".",0,"P",100,"T",500,"F",350
550 DATA "C",325,"D",900,"R",20000

' Read/data  Hello World -
10 read a$
print a$
if a$ = "-" then end
goto 10
100 data "Hello", "World", "-", 56.6

' Compilation bug, expect "Ok"
i$="N"
if i$="N" then goto 35
end
35 print "Ok"
end

' Compilation bug, expect "Ok"
dim s(1)
goto 10
INPUT S(0, 1), S(0, 2), S(0, 3), S(0, 4)
10 print "Ok"
end

' Odd bug in static strings.  Expect "Ok"
dim O(1)
IF E$ <> "O" THEN 5030
print "Wrong!"
end
5030 print "Ok"
        end

' Equals bug, should print = greeting
dim a$(1)
a$(2)="World"
a$="Hello"
A$ = A$ + "=" + A$(2)
print a$


' Do/While/Loop stuff.  All 5
a=0
do while a<5
        a=a+1
loop
print a
a=0
do until a>4
        a=a+1
loop
print a
a=0
do
        a=a+1
loop while a<5
print a
a=0
do
        a=a+1
loop until a>4
print a


' Swap
a$="Hello"
b$="Goodbye"
print a$,b$
swap a$,b$
print a$,b$

' Bubble sort cities
TRUE=1
FALSE=0
DIM A$(4)
A$(1) = "New York"
A$(2) = "Boston"
A$(3) = "Chicago"
A$(4) = "Seattle"
Max = 4 'UBOUND(A$)
Exchange=TRUE           ' Force first pass through the array.
WHILE Exchange          ' Sort until no elements are exchanged.
   Exchange=FALSE
   ' Compare the array elements by pairs. When two are exchanged,
   ' force another pass by setting Exchange to TRUE.
   FOR I = 2 TO Max
      IF A$(I-1) > A$(I) THEN
         Exchange = TRUE
         B$=A$(I-1)
         A$(I-1)=A$(I)
         A$(I)=B$
         ' SWAP A$(I - 1), A$(I)
      END IF
   NEXT
WEND
 ' CLS
FOR I = 1 TO 4
   PRINT A$(I)
NEXT I
END

' mid/left/right  2-9, 1-5, 6-0
t$="1234567890"
print mid$(t$, 2, 8)
print left$(t$, 5)
print right$(t$, 5)
' instr
s1$="The longer string"
found$="longer"
bogus$="not"
print "Found  (5): ", instr(s1$, found$)
print "Bogus  (0): ", instr(s1$, bogus$)
print "Null   (1): ", instr(s1$, "")
print "Start (11): ", instr(6, s1$, " ")
print "Inval  (0): ", instr(4, bogus$, "t")
' instr() tests
s1$="Mixed case"
print ucase$(s1$);" Upper"
print lcase$(s1$);" Lower"
a$="   Flush   "
print ">";ltrim$(a$)
print rtrim$(a$);"<"
' A's and -'s
print string$(10,75-10)
print string$(20, "-")

' ON..GOTO   200! and then Oats..
t=2
on t goto 100, 200, 300
print "No match\n"
FIN:
for i = 1 to 3
        on i gosub oats, peas, beans
next i
print
end
100 print "100!"
    goto FIN
200 print "200!"
    goto FIN
300 print "300!"
    goto FIN
oats:
        print "Oats",
        return
peas:
        print "Peas",
        return
beans:
        print "Beans",
        return

' Truth
s$="Hello"
if s$ then print "This is true" else print "Oops (string)"
s$=""
if s$ then print "Should not happen (string)"
i%=0
if i% then print "Should not happen (int)"
i%=54
if i% then print "This is true" else print "Oops (int)"
i=0
if i then print "Should not happen (flo)"
i=55
if i then print "This is true" else print "Oops (flo)"

' Expect OK
if 2 > 1 then
        print "Ok"
else
        print "All is not right"
end if

' Count from 9 to 0, print 5
dim y(10)
i=10
tloop:
        y(i)=i
        i=i-1
        print i
        if i then goto tloop
print y(5)


' Column alignment
print "Hello";tab$(15);"World"
print "Foo";tab$(15);"Stuff"
print "I am the very model of a modern";tab$(15);"More"
print "Hello","Again",d
dim c$(1)
for i = 1 to 20 : read c$(i) : next
print
for i = 1 to 20 step 4
  print c$(i);tab$(12);c$(i+1);tab$(22);c$(i+2);tab$(32);c$(i+3)
next
print
data "ABANDON","CHART","COMPUTER"
data "DAMAGES","DESTRUCT","DOCK","IDLE","IMPULSE","LRSCAN","NAVIGATE","PHASERS","QUIT"
data "SHIELDS","SOS","SRSCAN","STATUS","TORPEDO","TRANSFER","VISUAL","WARP"

' Random number distribution
randomize timer
max=10
dim a(max)
for i = 0 to 100
        b=rnd*max+1
        a(b)=a(b)+1
next i
for i = 1 to max
        print ,
        for j = 0 to a(i)
                print "*";
        next j
        print
next i

' Trig
w=15
dim a$(w)
for i = 0 to (22/7)*2 step 0.40
        for j = 1 to w*2
                a$(j)=" "
        next j
        a$(w+w*sin(i)+1)="*"
        a$(w+w*cos(i)+1)="+"
        for j = 1 to w*2
                print a$(j);
        next j
        print
next i

' Expect Correct
DIM A(1,1)
RO=1
IF A(RO,5)=0 THEN GOSUB 20: REM GOO
   end
20 print "Correct"
   return

' Expect Hello A World
print "Hello " + chr$(65);
print " World"

' Expect 21 and "Correct"
print 1+int(20)
if t = 6 then
        print "Hi"
elseif t=1 then
        print "Wrong"
else
        print "Correct"
end if
if p$ = "Hello" then print "Whoa"

' Count by .5's and True! after 3
for t=1 to 10 step 0.5
print t,
print sqr(t),
if t=3 then print "True!"
next t


' Expect OK
if 2 > 1 then
        print "Ok"
else
        print "All is not right"
end if

' Three random numbers
print str$(rnd)
print str$(rnd())
print str$(rnd(1))


' Expect Hello A World
print "Hello " + chr$(65);
print " World"

' Expect nothing
Dim A(10)
z=3
c=c+a(z)

' String function, whoa
function a$
        a$="Whoa"
end function
print a$


' Changed ref'd var from 5 to 12
function myfunc(a)
        print a
        a=12
        myfunc=80
end function
z=5
T=myfunc(z)
print z

' Basic Hello
a$="Hello"
print a$

' Simplest function, return 10
function twice(number)
        twice=2*number
end function
a=twice(5)
print a


' Expect -7
t%=-7
print t%

' Expect 9
print (2+3*5-(6+abs(0-3)))+1


' Expect a Hello, World!
print "Hello, ";        ' COmment
print "World!"

' Expect Correct
DIM A(1,1)
RO=1
IF A(RO,5)=0 THEN GOSUB 20: REM GOO
   end
20 print "Correct"
   return


' Expect Correct
t=0
g=0
if t then
        print "Wrong"
else
        if g then
                print "Wrong again"
        else
                print "Correct"
        end if
end if

' Expect Correct
t=0
g=0
if t then
        ' t is false, don't go here.
        print "Mistake"
elseif g then
        print "Also a mistake"
else
        print "Correct"
end if

' Simple variable assignment, expect 7
a=0
b=7
a=b
print a

' Expect rough PI
print 22/7

' Expect 6.00000
t=6
print t

' Expect -7
t%=-7
print t%

' Expect 7
t%=7
print t%*1

' Also expect 7
t%=7
print 1*t%

' Expect correct
t=0
if t then print "Wrong" else print "Correct"

' Expect correct
t=0
if t then
        print "Wrong"
else
        print "Correct"
end if

' Expect correct
t=1
if t then
        print "Correct"
else
        print "Wrong"
end if

' Factorial of 5 is 120
function factorial(a)
        if a then factorial=a*factorial(a-1) else factorial=1
end function
T=factorial(5)
print T!

' Correct and factorial of 4 is 24
function factorial(a)
        if a then factorial=a*factorial(a-1) else factorial=1
end function
t=0
g=0
if t then
        print "Mistake"
elseif g then
        print "Also a mistake"
else
        print "Correct now 24"
        print factorial(4)
end if

' Changed ref'd var from 5 to 12
function myfunc(a)
        print a
        a=12
        myfunc=80
end function
z=5
T=myfunc(z)
print z

' Basic Hello
a$="Hello"
print a$

' Concatenation greeting
a$="Hello,"
b$=" world!"
c$=a$+b$
print c$

' String function, whoa
function a$
        a$="Whoa"
end function
print a$

' String reference, no way
function a$(u$)
        u$="No way"
        a$="Hello"
end function
t$="Not me"
e$=a$(t$)
print t$

' references to references, expect 99
function last(t)
        t=99
        last=0
end function
function middle(s)
        middle=last(s)
end function
function start(r)
        start=middle(r)
end function
h=12
y=start(h)
print h

' Basic structure  6, Hello and PI
type newtype
        foo as integer
        bar as string
        narf as double
end type
dim t as newtype
t.foo=6
t.bar="Hello"
t.narf=3.1415
print t.foo
print t.bar
print t.narf

' Variable-depth structure references
type first
        foo as integer
        bar as string
end type
type second
        other as first
        narf as integer
        pnext as first
end type
type third
        number as integer
        start as second
end type
dim t as first
dim u as second
dim v as third
' Results in 6, 15, and "Hello"
t.foo=6
print t.foo
u.other.foo=15
print u.other.foo
v.start.pnext.bar="Hello"
print v.start.pnext.bar

' Member functions, give 0 and 3 (modified)
type first
        foo as integer
        bar as string
end type
type second
        other as first
        narf as double
        pnext as first
end type
type third
        number as integer
        start as second
end type
dim y as third
t=y.start.narf+3
print y.start.narf
print t

' Deep-copy of structures, 34 (NOT 99)
type first
        foo as integer
        bar as string
end type
type second
        link as first
end type
type third
        poit as integer
        fwd as second
end type
dim x as third
dim y as third
dim k as second
x.fwd.link.foo=34
y.fwd=x.fwd
x.fwd.link.foo=99
print y.fwd.link.foo

' Structure assignment torture
' Expect: 99, 1, "user-type first"
type first
        foo as integer
        bar as string
end type
type second
        other as first
        narf as integer
        pnext as first
end type
dim x as second
dim y as second
dim t as first
x.other.foo=1
x.other.bar="one"
x.narf=99
x.pnext.foo=2
x.pnext.bar="two"
y=x
print y.narf
t=x.other
print t.foo
print t

' Passing structures
' Expect:  100, 12 and 103
type first
        foo as integer
        bar as string
end type
function mine (a, b, c as first)
        a=12
        b=99
        c.foo=103
        mine=100
end function
dim z as first
z.foo=13
print mine(foo,20,z)
print foo
print z.foo

' Should print 100, 103
type first
        foo as integer
        bar as string
end type
type second
        pointer as first
        number as integer
end type
function mine (a, b, q as first)
        q.foo=103
        mine=100
end function
dim z as second
z.number=13
z.pointer.foo=12
print mine(foo,20,z.pointer)
print z.pointer.foo

' Array access, 132
type first
        foo as integer
        bar as string
end type
dim y(5)
y(3)=66
dim u(5) as first
print y(3)*2

' Array structure access, 56/0
type first
        foo as integer
        bar as string
end type
dim u(5) as first
u(2).foo=56
print u(2).foo

' Array assignment, 78
dim y(5)
y(1)=78
print y(1)

' Casting with arrays, 5.00000
dim y!(10)
j=2
i%=5.34
y!(i)=i%
print y!(i)

' Count from 9 to 0, print 5
dim y(10)
i=10
tloop:
        y(i)=i
        i=i-1
        print i
        if i then goto tloop
print y(5)

' Truth
s$="Hello"
if s$ then print "This is true" else print "Oops (string)"
s$=""
if s$ then print "Should not happen (string)"
i%=0
if i% then print "Should not happen (int)"
i%=54
if i% then print "This is true" else print "Oops (int)"
i=0
if i then print "Should not happen (flo)"
i=55
if i then print "This is true" else print "Oops (flo)"

' Passing arrays (expect 12)
function arrfunc(x())
        print x(4)
        arrfunc=55
end function
dim g(10)
g(5)=666
g(4)=12
a=g(5)+0
y=arrfunc(g())

' Passing arrays, twice, expect 12
function aftwo(y())
        print y(4)
end function
function arrfunc(x())
        u=aftwo(x())
        arrfunc=55
end function
dim g(10)
g(5)=666
g(4)=12
a=g(5)+0
y=arrfunc(g())

' For loops, by two and backwards
for i = 0 to 10 step 2
        print i,
next i
print
for i = 10 to 3 step -1
        print i
next i
print

' For loops.  3..6 nested in 1..3
function foo
        for y=3 to 6
        print y,
        next y
        foo=99
end function
for t%=1 to 3
  h=foo()
  print "    ", t%
next t%

' Swap
a$="Hello"
b$="Goodbye"
print a$,b$
swap a$,b$
print a$,b$


' Anti-crawling, gives 0
function foo
        print y
        foo=99
end function
y=66.66
u=foo()

' Bubble sort cities
TRUE=1
FALSE=0
DIM A$(4)
A$(1) = "New York"
A$(2) = "Boston"
A$(3) = "Chicago"
A$(4) = "Seattle"
Max = 4 'UBOUND(A$)
Exchange=TRUE           ' Force first pass through the array.
WHILE Exchange          ' Sort until no elements are exchanged.
   Exchange=FALSE
   ' Compare the array elements by pairs. When two are exchanged,
   ' force another pass by setting Exchange to TRUE.
   FOR I = 2 TO Max
      IF A$(I-1) > A$(I) THEN
         Exchange = TRUE
         B$=A$(I-1)
         A$(I-1)=A$(I)
         A$(I)=B$
         ' SWAP A$(I - 1), A$(I)
      END IF
   NEXT
WEND
 ' CLS
FOR I = 1 TO 4
   PRINT A$(I)
NEXT I
END

' Do/While/Loop stuff.  All 5
a=0
do while a<5
        a=a+1
loop
print a
a=0
do until a>4
        a=a+1
loop
print a
a=0
do
        a=a+1
loop while a<5
print a
a=0
do
        a=a+1
loop until a>4
print a

' Branch test, all OK in sequence
PRINT "1 in module-level code"
GOSUB Sub1
PRINT "ERR this line in main routine should be skipped"
Label1:
   PRINT "5 back in module-level code"
   END
Sub1:
   PRINT "2 in subroutine one"
   GOSUB Sub2
   PRINT "ERR this line in subroutine one should be skipped"
Label2:
   PRINT "4 back in subroutine one"
   RETURN Label1
Sub2:
   PRINT "3 in subroutine two"
   RETURN Label2   'Cannot return from here to main
                   'program - only to SUB1.
' Exit tests
sub mysub(b,c)
        print "Print me"
        exit sub
        print "Don't print me"
end sub
function foo$
        foo$="Right one"
        exit function
        foo$="Wrong one"
end function
call mysub 78, 80
t$=foo$
print t$
t=0
do
        print "This is right"
        exit do
        print "This is wrong"
        t=t+1
loop until t>1

' Function test:  A, 3, 90
print chr$(65)
print int(3.1415)
print asc("Z")

' Logical Operators (not NOT)
print "      AND   OR    XOR   EQV   IMP"
for i = 0 to 1
for j = 0 to 1
print i; j;
if i and j then a$="True  " else a$="False "
if i or  j then b$="True  " else b$="False "
if i xor j then c$="True  " else c$="False "
if i eqv j then d$="True  " else d$="False "
if i imp j then e$="True  " else e$="False "
print a$;b$;c$;d$;e$
next j,i

' Select-case (all positive)
t=50
select case t
case 10
        print "Wrong"
case 50
        select case g
        case 6
                print "Wrong again!"
        case 0
                print "Right (nest)!"
        end select
        print "Ongoing (right also)"
end select
select case t*1+0
case 1 to 10, t*2, >100
        print "Wrong 1!"
case 49 to 49, t*2, g
        print "Wrong 2!"
case t
        print "Ok!"
end select
select case h
case 99
        print "Wrong 3!"
case <5
        print "Ok!"
case <10   ' Fallthrough
        print "Ok (not!)"
end select
select case h
case 1
        print "Nothing!"
case 2
        print "Wrong-o!"
case else
        print "Right!"
end select
a$="one"
select case a$
case "zero"
        print "Bzzt"
case "two"
        print "not"
case "one"
        print "Correct!"
end select

' mid/left/right  2-9, 1-5, 6-0
t$="1234567890"
print mid$(t$, 2, 8)
print left$(t$, 5)
print right$(t$, 5)
' instr
s1$="The longer string"
found$="longer"
bogus$="not"
print "Found  (5): ", instr(s1$, found$)
print "Bogus  (0): ", instr(s1$, bogus$)
print "Null   (1): ", instr(s1$, "")
print "Start (11): ", instr(6, s1$, " ")
print "Inval  (0): ", instr(4, bogus$, "t")
' instr() tests
s1$="Mixed case"
print ucase$(s1$);" Upper"
print lcase$(s1$);" Lower"
a$="   Flush   "
print ">";ltrim$(a$)
print rtrim$(a$);"<"
' A's and -'s
print string$(10,75-10)
print string$(20, "-")

' Read, data, restore
' Numbers, symbols in two rows and then two rows of identical numbers
type foo
        first as integer
end type
dim y as foo
read a,b,y.first
read a$,t$,d$
print a,b,y.first
print a$,t$,d$
for i=1 to 5
        read h
        print h,
next i
print
restore 20
for i=1 to 5
        read h
        print h,
next i
print
data 56, -78, 12.3, "Foo", lol, +#^
20 data 10,20,30,40,50

' basic I/O  1..5
open "_testfile" for output as #3
for i=1 to 5
        print #3, i
next i
close #3
open "_testfile" for input as #2
for i = 1 to 5
        input #2,a$
        print a$,
next i
close #2
print

' ON..GOTO   200! and then Oats..
t=2
on t goto 100, 200, 300
print "No match\n"
FIN:
for i = 1 to 3
        on i gosub oats, peas, beans
next i
print
end
100 print "100!"
    goto FIN
200 print "200!"
    goto FIN
300 print "300!"
    goto FIN
oats:
        print "Oats",
        return
peas:
        print "Peas",
        return
beans:
        print "Beans",
        return

' Random number distribution
randomize timer
max=10
dim a(max)
for i = 0 to 100
        b=rnd*max+1
        a(b)=a(b)+1
next i
for i = 1 to max
        print ,
        for j = 0 to a(i)
                print "*";
        next j
        print
next i

' Square roots and sgn
print 10,sqr(10)
print 32767,sqr(32767)
print 0,sqr(0)
print 0.5,sqr(0.5)
print 2,sqr(2)
for i = -1 to 1
        print "Sign of ";i;" is ",sgn(i)
next i


' "shared" Whoa, 66666, Goodbye, 909090, 101010
type struct
        first as integer
end type
sub foo
        shared thing$
        shared narf as struct
        shared bar()
        shared lot$()
        shared poit() as struct
        thing$="Whoa"
        bar(5)=66666
        lot$(2)="Goodbye"
        narf.first=909090
        poit(4).first=101010
end sub
dim narf as struct
dim bar(1)
dim lot$(1)
dim poit(1) as struct
dim h$(1)
thing$="Hello"
bar(5)=55555
lot$(2)="Aloha"
narf.first=999
poit(4).first=111111
call foo()
print thing$,
print bar(5),
print lot$(2),
print narf.first,
print poit(4).first

' ADD bug, Return OK
function foo$
        foo$="Return OK"
        a$="Blah"
end function
print foo$()

' Some assembly required
print "Hello, world"
_STARTASM
        print "Include me in the assembly.\n"
_ENDASM
print "Goodbye, world"

' Column alignment
print "Hello";tab$(15);"World"
print "Foo";tab$(15);"Stuff"
print "I am the very model of a modern";tab$(15);"More"
print "Hello","Again",d
dim c$(1)
for i = 1 to 20 : read c$(i) : next
print
for i = 1 to 20 step 4
  print c$(i);tab$(12);c$(i+1);tab$(22);c$(i+2);tab$(32);c$(i+3)
next
print
data "ABANDON","CHART","COMPUTER"
data "DAMAGES","DESTRUCT","DOCK","IDLE","IMPULSE","LRSCAN","NAVIGATE","PHASERS","QUIT"
data "SHIELDS","SOS","SRSCAN","STATUS","TORPEDO","TRANSFER","VISUAL","WARP"

' Nested if/else bug
bump=1
LOOPY:
        if bump < -1 then goto LAST
        if bump < 1 then
                if bump = 0 then
                        print "Second"
                else
                        print "Third"
                end if
        end if
        print "First, and every"
        bump=bump-1
        goto LOOPY
LAST:
        print "All done"

' Mystery typeshift bug (OK)
type foo
        first as integer
end type
dim a as foo
print a.first=x
print a.first
print "OK"

' Default case fallthrough
t=3
select case t
        case 1
                print "One"
        case 2
                print "Two"
        case 3
                print "Correct"
        case else
                print "WRONG!"
end select
print "All done."


# Local Variables:
# mode: cperl
# cperl-indent-level: 4
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4:


syntax highlighted by Code2HTML, v. 0.9.1