REM Random structure generator
ON ERROR CLOSE#0 : PRINT REPORT$ : END
nStruct% = 200
tempFile$ = @tmp$ + "randomStructures.bbc"
F% = OPENOUT(tempFile$)
PROC_writeAsTok(F%, "DIM pFrmt%(" + STR$ nStruct% + ")")
FOR Struct% = 1 TO nStruct%
Name$ = "Struct" + STR$ Struct%
Struct$ = FN_generateStruct(Name$)
PROC_writeAsTok(F%, "DIM " + Struct$)
PROC_writeAsTok(F%, "pFrmt%(" + STR$ Struct% + ") = !^" + Name$ + "{}")
NEXT
PROC_writeAsTok(F%, "nStruct% = " + STR$ nStruct%)
RESTORE +1
DATA "FOR I% = 1 TO nStruct%"
DATA "IF NOT FN_structFormatAsAssumed(pFrmt%(I%)) PRINT "" GLOBAL Struct"";I%;"" not as expected!"""
DATA "NEXT"
DATA "PRINT ""Finished checking "";nStruct%;"" GLOBAL structures"""
DATA "PROC_localStructs"
DATA "END"
DATA "DEF FN_structFormatAsAssumed(P%)"
DATA "LOCAL L%, A%"
DATA "P% += 4"
DATA "REPEAT"
DATA "L% = LEN $$(P% + 4)"
DATA "IF ?(P% + 3 + L%) == &7B THEN"
DATA "A% = !(P% + 5 + L%)"
DATA "IF ?(P% + 1 + L%) == &69 THEN"
DATA "IF A% <> P% + 13 + L% : =FALSE"
DATA "ELSE"
DATA "IF A% == P% + 13 + L% : =FALSE"
DATA "ENDIF"
DATA "IF NOT FN_structFormatAsAssumed(A%) : =FALSE"
DATA "ENDIF"
DATA "P% = !P%"
DATA "UNTIL P% == 0"
DATA "=TRUE"
DATA ""
REPEAT
READ Line$
PROC_writeAsTok(F%, Line$)
UNTIL Line$ == ""
PROC_writeAsTok(F%, "DEF PROC_localStructs")
PROC_writeAsTok(F%, "LOCAL pfrmt%(), I%")
PROC_writeAsTok(F%, "DIM pfrmt%(" + STR$ nStruct% + ")")
FOR Struct% = 1 TO nStruct%
Name$ = "struct" + STR$ Struct%
PROC_writeAsTok(F%, "LOCAL " + Name$ + "{}")
Struct$ = FN_generateStruct(Name$)
PROC_writeAsTok(F%, "DIM " + Struct$)
PROC_writeAsTok(F%, "pfrmt%(" + STR$ Struct% + ") = !^" + Name$ + "{}")
NEXT
RESTORE +1
DATA "FOR I% = 1 TO nStruct%"
DATA "IF NOT FN_structFormatAsAssumed(pfrmt%(I%)) PRINT "" LOCAL Struct"";I%;"" not as expected!"""
DATA "NEXT"
DATA "PRINT ""Finished checking "";nStruct%;"" LOCAL structures"""
DATA "ENDPROC"
DATA ""
REPEAT
READ Line$
PROC_writeAsTok(F%, Line$)
UNTIL Line$ == ""
BPUT#F%,0
BPUT#F%,&FF
BPUT#F%,&FF
CLOSE#F%
SYS "ShellExecute", @hwnd%, "open", tempFile$, 0, 0, 1
END
DEF FN_generateStruct(name$)
LOCAL s$, M%, N%, L%
REPEAT
s$ = name$ + "{"
N% = RND(10) : REM number of members
FOR M% = 1 TO N%
REPEAT
T% = RND(9) : REM member type
UNTIL Struct% > 1 OR T% <> 2
IF T% > 2 s$ += CHR$(96 + M%)
CASE T% OF
WHEN 1 : s$ += FN_generateStruct("i" + CHR$(96 + M%))
WHEN 2 : s$ += "p" + CHR$(96 + M%) + "{}=Struct" + STR$(FN_rnd(Struct% - 1)) + "{}"
WHEN 3 : s$ += "&"
WHEN 4 : s$ += "%"
WHEN 5 : s$ += "$"
WHEN 6 : s$ += "%%"
WHEN 7 : s$ += "#"
WHEN 8 : s$ += "(1)"
ENDCASE
s$ += ","
IF LEN s$ > 247 s$ = LEFT$(s$, L%) : EXIT FOR
L% = LEN s$
NEXT
UNTIL L%
=LEFT$(s$) + "}"
DEF PROC_writeAsTok(F%, a$)
LOCAL A%
PRINT a$
A% = EVAL("0:" + a$)
a$ = $(!332 + 2)
IF LEN a$ > 251 ERROR 100, "Line too long"
BPUT#F%, LEN a$ + 4
BPUT#F%, 0
BPUT#F%, 0
BPUT#F%, a$;
BPUT#F%, &D
ENDPROC
DEF FN_rnd(N%)
IF N% < 2 : =1
=RND(N%)