summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/examplefiles/BOM.js1
-rw-r--r--tests/examplefiles/bigtest.nsi308
-rw-r--r--tests/examplefiles/ca65_example284
-rw-r--r--tests/examplefiles/cbmbas_example9
-rw-r--r--tests/examplefiles/classes.dylan91
-rw-r--r--tests/examplefiles/example.cob3556
-rw-r--r--tests/examplefiles/example.monkey152
-rw-r--r--tests/examplefiles/example.reg19
-rw-r--r--tests/examplefiles/hello.smali40
-rw-r--r--tests/examplefiles/inet_pton6.dg71
-rw-r--r--tests/examplefiles/metagrammar.treetop455
-rw-r--r--tests/examplefiles/minehunt.qml112
-rw-r--r--tests/examplefiles/nanomsg.intr95
-rw-r--r--tests/examplefiles/phpMyAdmin.spec163
-rw-r--r--tests/examplefiles/pytb_test3.pytb4
-rw-r--r--tests/examplefiles/robotframework.txt39
-rw-r--r--tests/examplefiles/rust_example.rs892
-rw-r--r--tests/examplefiles/test2.pypylog120
-rw-r--r--tests/examplefiles/unix-io.lid37
-rw-r--r--tests/old_run.py2
-rw-r--r--tests/run.py2
-rw-r--r--tests/test_basic_api.py4
-rw-r--r--tests/test_clexer.py2
-rw-r--r--tests/test_cmdline.py2
-rw-r--r--tests/test_examplefiles.py4
-rw-r--r--tests/test_html_formatter.py2
-rw-r--r--tests/test_latex_formatter.py2
-rw-r--r--tests/test_perllexer.py2
-rw-r--r--tests/test_regexlexer.py2
-rw-r--r--tests/test_token.py2
-rw-r--r--tests/test_using_api.py2
-rw-r--r--tests/test_util.py9
32 files changed, 5763 insertions, 722 deletions
diff --git a/tests/examplefiles/BOM.js b/tests/examplefiles/BOM.js
new file mode 100644
index 00000000..930599c1
--- /dev/null
+++ b/tests/examplefiles/BOM.js
@@ -0,0 +1 @@
+/* There is a BOM at the beginning of this file. */ \ No newline at end of file
diff --git a/tests/examplefiles/bigtest.nsi b/tests/examplefiles/bigtest.nsi
new file mode 100644
index 00000000..62f5211c
--- /dev/null
+++ b/tests/examplefiles/bigtest.nsi
@@ -0,0 +1,308 @@
+; bigtest.nsi
+;
+; This script attempts to test most of the functionality of the NSIS exehead.
+
+;--------------------------------
+
+!ifdef HAVE_UPX
+!packhdr tmp.dat "upx\upx -9 tmp.dat"
+!endif
+
+!ifdef NOCOMPRESS
+SetCompress off
+!endif
+
+;--------------------------------
+
+Name "BigNSISTest"
+Caption "NSIS Big Test"
+Icon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico"
+OutFile "bigtest.exe"
+
+SetDateSave on
+SetDatablockOptimize on
+CRCCheck on
+SilentInstall normal
+BGGradient 000000 800000 FFFFFF
+InstallColors FF8080 000030
+XPStyle on
+
+InstallDir "$PROGRAMFILES\NSISTest\BigNSISTest"
+InstallDirRegKey HKLM "Software\NSISTest\BigNSISTest" "Install_Dir"
+
+CheckBitmap "${NSISDIR}\Contrib\Graphics\Checks\classic-cross.bmp"
+
+LicenseText "A test text, make sure it's all there"
+LicenseData "bigtest.nsi"
+
+RequestExecutionLevel admin
+
+;--------------------------------
+
+Page license
+Page components
+Page directory
+Page instfiles
+
+UninstPage uninstConfirm
+UninstPage instfiles
+
+;--------------------------------
+
+!ifndef NOINSTTYPES ; only if not defined
+ InstType "Most"
+ InstType "Full"
+ InstType "More"
+ InstType "Base"
+ ;InstType /NOCUSTOM
+ ;InstType /COMPONENTSONLYONCUSTOM
+!endif
+
+AutoCloseWindow false
+ShowInstDetails show
+
+;--------------------------------
+
+Section "" ; empty string makes it hidden, so would starting with -
+
+ ; write reg info
+ StrCpy $1 "POOOOOOOOOOOP"
+ DetailPrint "I like to be able to see what is going on (debug) $1"
+ WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "Install_Dir" "$INSTDIR"
+
+ ; write uninstall strings
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "DisplayName" "BigNSISTest (remove only)"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest" "UninstallString" '"$INSTDIR\bt-uninst.exe"'
+
+ SetOutPath $INSTDIR
+ File /a "silent.nsi"
+ CreateDirectory "$INSTDIR\MyProjectFamily\MyProject" ; 2 recursively create a directory for fun.
+ WriteUninstaller "bt-uninst.exe"
+
+ Nop ; for fun
+
+SectionEnd
+
+Section "TempTest"
+
+SectionIn 1 2 3
+ Start: MessageBox MB_OK "Start:"
+
+ MessageBox MB_YESNO "Goto MyLabel" IDYES MyLabel
+
+ MessageBox MB_OK "Right before MyLabel:"
+
+ MyLabel: MessageBox MB_OK "MyLabel:"
+
+ MessageBox MB_OK "Right after MyLabel:"
+
+ MessageBox MB_YESNO "Goto Start:?" IDYES Start
+
+SectionEnd
+
+SectionGroup /e SectionGroup1
+
+Section "Test Registry/INI functions"
+
+SectionIn 1 4 3
+
+ WriteRegStr HKLM SOFTWARE\NSISTest\BigNSISTest "StrTest_INSTDIR" "$INSTDIR"
+ WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0xDEADBEEF" 0xdeadbeef
+ WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_123456" 123456
+ WriteRegDword HKLM SOFTWARE\NSISTest\BigNSISTest "DwordTest_0123" 0123
+ WriteRegBin HKLM SOFTWARE\NSISTest\BigNSISTest "BinTest_deadbeef01f00dbeef" "DEADBEEF01F00DBEEF"
+ StrCpy $8 "$SYSDIR\IniTest"
+ WriteINIStr "$INSTDIR\test.ini" "MySection" "Value1" $8
+ WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value1" $8
+ WriteINIStr "$INSTDIR\test.ini" "MySectionIni" "Value2" $8
+ WriteINIStr "$INSTDIR\test.ini" "IniOn" "Value1" $8
+
+ Call MyFunctionTest
+
+ DeleteINIStr "$INSTDIR\test.ini" "IniOn" "Value1"
+ DeleteINISec "$INSTDIR\test.ini" "MySectionIni"
+
+ ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1"
+ StrCmp $1 "" INIDelSuccess
+ MessageBox MB_OK "DeleteINISec failed"
+ INIDelSuccess:
+
+ ClearErrors
+ ReadRegStr $1 HKCR "software\microsoft" xyz_cc_does_not_exist
+ IfErrors 0 NoError
+ MessageBox MB_OK "could not read from HKCR\software\microsoft\xyz_cc_does_not_exist"
+ Goto ErrorYay
+ NoError:
+ MessageBox MB_OK "read '$1' from HKCR\software\microsoft\xyz_cc_does_not_exist"
+ ErrorYay:
+
+SectionEnd
+
+Section "Test CreateShortCut"
+
+ SectionIn 1 2 3
+
+ Call CSCTest
+
+SectionEnd
+
+SectionGroup Group2
+
+Section "Test Branching"
+
+ BeginTestSection:
+ SectionIn 1 2 3
+
+ SetOutPath $INSTDIR
+
+ IfFileExists "$INSTDIR\LogicLib.nsi" 0 BranchTest69
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to overwrite $INSTDIR\LogicLib.nsi?" IDNO NoOverwrite ; skipped if file doesn't exist
+
+ BranchTest69:
+
+ SetOverwrite ifnewer ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS
+
+ NoOverwrite:
+
+ File "LogicLib.nsi" ; skipped if answered no
+ SetOverwrite try ; NOT AN INSTRUCTION, NOT COUNTED IN SKIPPINGS
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to skip the rest of this section?" IDYES EndTestBranch
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to go back to the beginning of this section?" IDYES BeginTestSection
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to hide the installer and wait five seconds?" IDNO NoHide
+
+ HideWindow
+ Sleep 5000
+ BringToFront
+
+ NoHide:
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to call the function 5 times?" IDNO NoRecurse
+
+ StrCpy $1 "x"
+
+ LoopTest:
+
+ Call myfunc
+ StrCpy $1 "x$1"
+ StrCmp $1 "xxxxxx" 0 LoopTest
+
+ NoRecurse:
+
+ EndTestBranch:
+
+SectionEnd
+
+SectionGroupEnd
+
+Section "Test CopyFiles"
+
+ SectionIn 1 2 3
+
+ SetOutPath $INSTDIR\cpdest
+ CopyFiles "$WINDIR\*.ini" "$INSTDIR\cpdest" 0
+
+SectionEnd
+
+SectionGroupEnd
+
+Section "Test Exec functions" TESTIDX
+
+ SectionIn 1 2 3
+
+ SearchPath $1 notepad.exe
+
+ MessageBox MB_OK "notepad.exe=$1"
+ Exec '"$1"'
+ ExecShell "open" '"$INSTDIR"'
+ Sleep 500
+ BringToFront
+
+SectionEnd
+
+Section "Test ActiveX control registration"
+
+ SectionIn 2
+
+ UnRegDLL "$SYSDIR\spin32.ocx"
+ Sleep 1000
+ RegDLL "$SYSDIR\spin32.ocx"
+ Sleep 1000
+
+SectionEnd
+
+;--------------------------------
+
+Function "CSCTest"
+
+ CreateDirectory "$SMPROGRAMS\Big NSIS Test"
+ SetOutPath $INSTDIR ; for working directory
+ CreateShortCut "$SMPROGRAMS\Big NSIS Test\Uninstall BIG NSIS Test.lnk" "$INSTDIR\bt-uninst.exe" ; use defaults for parameters, icon, etc.
+ ; this one will use notepad's icon, start it minimized, and give it a hotkey (of Ctrl+Shift+Q)
+ CreateShortCut "$SMPROGRAMS\Big NSIS Test\silent.nsi.lnk" "$INSTDIR\silent.nsi" "" "$WINDIR\notepad.exe" 0 SW_SHOWMINIMIZED CONTROL|SHIFT|Q
+ CreateShortCut "$SMPROGRAMS\Big NSIS Test\TheDir.lnk" "$INSTDIR\" "" "" 0 SW_SHOWMAXIMIZED CONTROL|SHIFT|Z
+
+FunctionEnd
+
+Function myfunc
+
+ StrCpy $2 "MyTestVar=$1"
+ MessageBox MB_OK "myfunc: $2"
+
+FunctionEnd
+
+Function MyFunctionTest
+
+ ReadINIStr $1 "$INSTDIR\test.ini" "MySectionIni" "Value1"
+ StrCmp $1 $8 NoFailedMsg
+ MessageBox MB_OK "WriteINIStr failed"
+
+ NoFailedMsg:
+
+FunctionEnd
+
+Function .onSelChange
+
+ SectionGetText ${TESTIDX} $0
+ StrCmp $0 "" e
+ SectionSetText ${TESTIDX} ""
+ Goto e2
+e:
+ SectionSetText ${TESTIDX} "TextInSection"
+e2:
+
+FunctionEnd
+
+;--------------------------------
+
+; Uninstaller
+
+UninstallText "This will uninstall example2. Hit next to continue."
+UninstallIcon "${NSISDIR}\Contrib\Graphics\Icons\nsis1-uninstall.ico"
+
+Section "Uninstall"
+
+ DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\BigNSISTest"
+ DeleteRegKey HKLM "SOFTWARE\NSISTest\BigNSISTest"
+ Delete "$INSTDIR\silent.nsi"
+ Delete "$INSTDIR\LogicLib.nsi"
+ Delete "$INSTDIR\bt-uninst.exe"
+ Delete "$INSTDIR\test.ini"
+ Delete "$SMPROGRAMS\Big NSIS Test\*.*"
+ RMDir "$SMPROGRAMS\BiG NSIS Test"
+
+ MessageBox MB_YESNO|MB_ICONQUESTION "Would you like to remove the directory $INSTDIR\cpdest?" IDNO NoDelete
+ Delete "$INSTDIR\cpdest\*.*"
+ RMDir "$INSTDIR\cpdest" ; skipped if no
+ NoDelete:
+
+ RMDir "$INSTDIR\MyProjectFamily\MyProject"
+ RMDir "$INSTDIR\MyProjectFamily"
+ RMDir "$INSTDIR"
+
+ IfFileExists "$INSTDIR" 0 NoErrorMsg
+ MessageBox MB_OK "Note: $INSTDIR could not be removed!" IDOK 0 ; skipped if file doesn't exist
+ NoErrorMsg:
+
+SectionEnd
diff --git a/tests/examplefiles/ca65_example b/tests/examplefiles/ca65_example
new file mode 100644
index 00000000..67c6313e
--- /dev/null
+++ b/tests/examplefiles/ca65_example
@@ -0,0 +1,284 @@
+;--------------------------------------
+; Lychrel numbers.
+;
+; :author: Marc 'BlackJack' Rintsch
+; :date: 2008-03-07
+; :version: 0.1
+;
+; Prints all `Lychrel numbers`_ between 1 and 100000.
+;
+; The numbers are stored as array of "digits" in little endian
+; order. Each digit is a byte with a value between 0 and 9.
+;
+; Runtime on C64: 00:21:01
+;
+; .. _Lychrel numbers: http://en.wikipedia.org/wiki/Lychrel_number
+;
+; .. cl65 -l -tnone -C simple.cfg lychrel.s -o lychrel.prg
+;--------------------------------------
+
+;--------------------------------------
+; External addresses.
+;--------------------------------------
+ chrout = $ffd2
+
+;--------------------------------------
+; Constants.
+;--------------------------------------
+ TO = 100000
+ TO_DIGITS = 10
+ ITERATIONS = 100
+ MAX_DIGITS = TO_DIGITS + ITERATIONS
+
+;--------------------------------------
+; Global variables.
+;--------------------------------------
+.zeropage
+;
+; Length of the currently tested `n` in digits.
+;
+n_length:
+ .res 1
+;
+; Length of the number(s) `xa` and `xb` while testing.
+;
+length:
+ .res 1
+
+.bss
+;
+; Number to be tested as digits i.e. bytes with values between
+; 0 and 9. The length is stored in `n_length`.
+;
+n:
+ .res TO_DIGITS
+;
+; Space for calculating the reversed and added values.
+; In the `main` code the current number is copied into `xa`
+; and then repeatedly `reverse_add`\ed to itself with the
+; result of that adding stored in `xb`.
+;
+xa:
+ .res MAX_DIGITS
+xb:
+ .res MAX_DIGITS
+
+;--------------------------------------
+; BASIC header.
+;--------------------------------------
+.code
+ .word 0800h ; Load address.
+ .byte 0
+ .word @line_end
+ .word 2008 ; Line number.
+ .byte $9e ; SYS token.
+ .byte "2080 " ; SYS argument.
+ .byte "LYCHREL NUMBERS/BJ"
+@line_end:
+ .byte 0, 0, 0 ; Line and program end marker.
+
+;--------------------------------------
+; Main program.
+;--------------------------------------
+.proc main
+
+.zeropage
+;
+; Three byte counter for `TO` iterations (100000 = $0186a0).
+;
+i:
+ .res 3
+
+.code
+;
+; Clear and set `n` and `i` to 1.
+;
+ lda #0 ; n := 0; n := 1; i := 1
+ sta i+1
+ sta i+2
+ ldx #TO_DIGITS
+clear_n:
+ sta n-1,x
+ dex
+ bne clear_n
+ inx
+ stx i
+ stx n
+ stx n_length
+
+mainloop:
+ jsr is_lychrel
+ bcc no_lychrel
+ jsr print_n
+no_lychrel:
+ jsr increase_n
+
+ inc i ; INC(i)
+ bne skip
+ inc i+1
+ bne skip
+ inc i+2
+skip:
+ lda i
+ cmp #<TO
+ bne mainloop
+ lda i+1
+ cmp #>TO
+ bne mainloop
+ lda i+2
+ cmp #^TO
+ bne mainloop
+
+ rts
+.endproc
+
+;--------------------------------------
+; Print `n` and a trailing newline.
+;
+; :in: `n_length`, `n`
+;--------------------------------------
+.proc print_n
+ ldy n_length
+L1:
+ lda n-1,y
+ ora #%110000 ; = '0'
+ jsr chrout
+ dey
+ bne L1
+
+ lda #13
+ jmp chrout
+.endproc
+
+;--------------------------------------
+; Increase `n` by one.
+;
+; This procedure expects n[n_length] == 0 in case the number gets
+; one digit longer.
+;
+; :in: `n`, `n_length`
+; :out: `n`, `n_length`
+;--------------------------------------
+.proc increase_n
+ ldx #0
+L1:
+ inc n,x ; Increase digit.
+ lda n,x
+ cmp #10 ; If "carry", store 0 and go to next digit.
+ bne return
+ lda #0
+ sta n,x
+ inx
+ bne L1
+return:
+ cpx n_length ; If "carry" after last digit, increase length.
+ bcc skip
+ inc n_length
+skip:
+ rts
+.endproc
+
+;--------------------------------------
+; Tests if `n` is a Lychrel number.
+;
+; :in: `n`, `n_length`
+; :out: C is set if yes, cleared otherwise.
+; :uses: `length`, `xa`, `xb`
+;--------------------------------------
+.proc is_lychrel
+.zeropage
+i:
+ .res 1
+
+.code
+ ldx n_length ; xa := n; length := n_length
+ stx length
+L1:
+ lda n-1,x
+ sta xa-1,x
+ dex
+ bne L1
+
+ lda #ITERATIONS ; i := ITERATIONS
+ sta i
+L2:
+ jsr reverse_add
+ jsr is_palindrome
+ bne no_palindrome
+ clc
+ rts
+no_palindrome:
+ ldx length ; a := b
+L3:
+ lda xb-1,x
+ sta xa-1,x
+ dex
+ bne L3
+
+ dec i ; Loop body end.
+ bne L2
+
+ sec
+ rts
+.endproc
+
+;--------------------------------------
+; Add the reverse to `xa` to itself and store the result in `xb`.
+;
+; :in: `length`, `xa`
+; :out: `length`, `xb`
+;--------------------------------------
+.proc reverse_add
+.code
+ ldx #0
+ ldy length
+ clc
+L1:
+ lda xa,x
+ adc xa-1,y
+
+ cmp #10
+ bcc no_adjust
+ sbc #10
+no_adjust:
+ sta xb,x
+
+ dey
+ inx
+ txa ; ``eor`` instead of ``cpx`` to keep the carry flag
+ eor length ; of the addition above.
+ bne L1
+
+ bcc no_carry
+ lda #1
+ sta xb,x
+ inc length
+no_carry:
+ rts
+.endproc
+
+;--------------------------------------
+; Checks if `xb` is a palindrome.
+;
+; :in: `length`, `xb`
+; :out: Z flag set if `xb` is a palindrome, cleared otherwise.
+;--------------------------------------
+.proc is_palindrome
+.code
+ ldx #0
+ lda length
+ tay
+ lsr
+ sta L1+1 ; Self modifying code!
+L1:
+ cpx #0 ; <<< 0 replaced by (`length` / 2).
+ beq return
+ lda xb,x
+ cmp xb-1,y
+ bne return
+ dey
+ inx
+ bne L1
+return:
+ rts
+.endproc
diff --git a/tests/examplefiles/cbmbas_example b/tests/examplefiles/cbmbas_example
new file mode 100644
index 00000000..8d8ded9e
--- /dev/null
+++ b/tests/examplefiles/cbmbas_example
@@ -0,0 +1,9 @@
+10 rem cbm basic v2 example
+20 rem comment with keywords: for, data
+30 dim a$(20)
+35 rem the typical space efficient form of leaving spaces out:
+40 fort=0to15:poke646,t:print"{revers on} ";:next
+50 geta$:ifa$=chr$(0):goto40
+55 rem it is legal to omit the closing " on line end
+60 print"{white}":print"bye...
+70 end
diff --git a/tests/examplefiles/classes.dylan b/tests/examplefiles/classes.dylan
index 6dd55ff2..7bb88faa 100644
--- a/tests/examplefiles/classes.dylan
+++ b/tests/examplefiles/classes.dylan
@@ -1,12 +1,26 @@
+module: sample
+comment: for make sure that does not highlight per word.
+ and it continues on to the next line.
+
define class <car> (<object>)
slot serial-number :: <integer> = unique-serial-number();
- slot model-name :: <string>,
+ constant slot model-name :: <string>,
required-init-keyword: model:;
- slot has-sunroof? :: <boolean>,
+ each-subclass slot has-sunroof? :: <boolean>,
init-keyword: sunroof?:,
init-value: #f;
+ keyword foo:;
+ required keyword bar:;
end class <car>;
+define class <flying-car> (<car>)
+end class <flying-car>;
+
+let flying-car = make(<flying-car>);
+let car? :: <car?> = #f;
+let prefixed-car :: <vehicles/car> = #f;
+let model :: <car-911> = #f;
+
define constant $empty-string = "";
define constant $escaped-backslash = '\\';
define constant $escaped-single-quote = '\'';
@@ -31,10 +45,79 @@ define method foo() => _ :: <boolean>;
#t
end method;
-define method \+()
-end;
+define method \+
+ (offset1 :: <time-offset>, offset2 :: <time-offset>)
+ => (sum :: <time-offset>)
+ let sum = offset1.total-seconds + offset2.total-seconds;
+ make(<time-offset>, total-seconds: sum);
+end method \+;
+
+define method bar ()
+ 1 | 2 & 3
+end
+
+if (bar)
+ 1
+elseif (foo)
+ 2
+else
+ 3
+end if;
+
+select (foo by instance?)
+ <integer> => 1
+ otherwise => 3
+end select;
+
+/* multi
+ line
+ comment
+*/
+
+/* multi line comments
+ /* can be */
+ nested */
define constant $symbol = #"hello";
define variable *vector* = #[3.5, 5]
define constant $list = #(1, 2);
define constant $pair = #(1 . "foo")
+
+let octal-number = #o238;
+let hex-number = #x3890ADEF;
+let binary-number = #b1010;
+let float-exponent = 3.5e10;
+
+block (return)
+ with-lock (lock)
+ return();
+ end;
+exception (e :: <error>)
+ format-out("Oh no");
+cleanup
+ return();
+afterwards
+ format-out("Hello");
+end;
+
+define macro repeat
+ { repeat ?:body end }
+ => { block (?=stop!)
+ local method again() ?body; again() end;
+ again();
+ end }
+end macro repeat;
+
+define macro with-decoded-seconds
+ {
+ with-decoded-seconds
+ (?max:variable, ?min:variable, ?sec:variable = ?time:expression)
+ ?:body
+ end
+ }
+ => {
+ let (?max, ?min, ?sec) = decode-total-seconds(?time);
+ ?body
+ }
+end macro;
+
diff --git a/tests/examplefiles/example.cob b/tests/examplefiles/example.cob
new file mode 100644
index 00000000..3f65e498
--- /dev/null
+++ b/tests/examplefiles/example.cob
@@ -0,0 +1,3556 @@
+ IDENTIFICATION DIVISION.
+ PROGRAM-ID. OCic.
+ *****************************************************************
+ ** This program provides a Textual User Interface (TUI) to the **
+ ** process of compiling and (optionally) executing an OpenCOBOL**
+ ** program. **
+ ** **
+ ** This programs execution syntax is as follows: **
+ ** **
+ ** ocic <program-path-and-filename> [ <switch>... ] **
+ ** **
+ ** Once executed, a display screen will be presented showing **
+ ** the compilation options that will be used. The user will **
+ ** have the opportunity to change options, specify new ones **
+ ** and specify any program execution arguments to be used if **
+ ** you select the "Execute" option. When you press the Enter **
+ ** key the program will be compiled. **
+ ** **
+ ** The SCREEN SECTION contains an image of the screen. **
+ ** **
+ ** The "010-Parse-Args" section in the PROCEDURE DIVISION has **
+ ** documentation on switches and their function. **
+ *****************************************************************
+ ** **
+ ** AUTHOR: GARY L. CUTLER **
+ ** CutlerGL@gmail.com **
+ ** Copyright (C) 2009-2010, Gary L. Cutler, GPL **
+ ** **
+ ** DATE-WRITTEN: June 14, 2009 **
+ ** **
+ *****************************************************************
+ ** Note: Depending on which extended DISPLAY handler you're **
+ ** using (PDCurses, Curses, ...), you may need to un- **
+ ** comment any source lines tagged with "SCROLL" in cols **
+ ** 1-6 in order to have error messages scroll properly **
+ ** in the OCic shell window. **
+ *****************************************************************
+ ** DATE CHANGE DESCRIPTION **
+ ** ====== ==================================================== **
+ ** GC0609 Don't display compiler messages file if compilation **
+ ** Is successful. Also don't display messages if the **
+ ** output file is busy (just put a message on the **
+ ** screen, leave the OC screen up & let the user fix **
+ ** the problem & resubmit. **
+ ** GC0709 When 'EXECUTE' is selected, a 'FILE BUSY' error will **
+ ** still cause the (old) executable to be launched. **
+ ** Also, the 'EXTRA SWITCHES' field is being ignored. **
+ ** Changed the title bar to lowlighted reverse video & **
+ ** the message area to highlighted reverse-video. **
+ ** GC0809 Add a SPACE in from of command-line args when **
+ ** executing users program. Add a SPACE after the **
+ ** -ftraceall switch when building cobc command. **
+ ** GC0909 Convert to work on Cygwin/Linux as well as MinGW **
+ ** GC0310 Virtualized the key codes for S-F1 thru S-F7 as they **
+ ** differ depending upon whether PDCurses or NCurses is **
+ ** being used. **
+ ** GC0410 Introduced the cross-reference and source listing **
+ ** features. Also fixed a bug in @EXTRA switch proces- **
+ ** sing where garbage will result if more than the **
+ ** @EXTRA switch is specified. **
+ *****************************************************************
+ ENVIRONMENT DIVISION.
+ CONFIGURATION SECTION.
+ REPOSITORY.
+ FUNCTION ALL INTRINSIC.
+ INPUT-OUTPUT SECTION.
+ FILE-CONTROL.
+ SELECT Bat-File ASSIGN TO Bat-File-Name
+ ORGANIZATION IS LINE SEQUENTIAL.
+
+ SELECT Cobc-Output ASSIGN TO Cobc-Output-File
+ ORGANIZATION IS LINE SEQUENTIAL.
+
+ SELECT Source-Code ASSIGN TO File-Name
+ ORGANIZATION IS LINE SEQUENTIAL
+ FILE STATUS IS FSM-Status.
+ DATA DIVISION.
+ FILE SECTION.
+ FD Bat-File.
+ 01 Bat-File-Rec PIC X(2048).
+
+ FD Cobc-Output.
+ 01 Cobc-Output-Rec PIC X(256).
+
+ FD Source-Code.
+ 01 Source-Code-Record PIC X(80).
+
+ WORKING-STORAGE SECTION.
+ COPY screenio.
+
+ 01 Bat-File-Name PIC X(256).
+
+GC0909 01 Cmd PIC X(512).
+
+ 01 Cobc-Cmd PIC X(256).
+
+ 01 Cobc-Output-File PIC X(256).
+
+ 01 Command-Line-Args PIC X(256).
+
+ 01 Config-File PIC X(12).
+
+GC0310 01 Config-Keys.
+GC0310 05 CK-S-F1 PIC 9(4).
+GC0310 05 CK-S-F2 PIC 9(4).
+GC0310 05 CK-S-F3 PIC 9(4).
+GC0310 05 CK-S-F4 PIC 9(4).
+GC0310 05 CK-S-F5 PIC 9(4).
+GC0310 05 CK-S-F6 PIC 9(4).
+GC0310 05 CK-S-F7 PIC 9(4).
+
+GC0909 01 Dir-Char PIC X(1).
+
+ 01 Dummy PIC X(1).
+
+ 01 Env-TEMP PIC X(256).
+
+ 01 File-Name.
+ 05 FN-Char OCCURS 256 TIMES PIC X(1).
+
+ 01 File-Status-Message.
+ 05 FILLER PIC X(13) VALUE 'Status Code: '.
+ 05 FSM-Status PIC 9(2).
+ 05 FILLER PIC X(11) VALUE ', Meaning: '.
+ 05 FSM-Msg PIC X(25).
+
+ 01 Flags.
+ 05 F-Compilation-Succeeded PIC X(1).
+ 88 88-Compile-OK VALUE 'Y'.
+GC0909 88 88-Compile-OK-Warn VALUE 'W'.
+ 88 88-Compile-Failed VALUE 'N'.
+GC0609 05 F-Complete PIC X(1).
+GC0609 88 88-Complete VALUE 'Y'.
+GC0609 88 88-Not-Complete VALUE 'N'.
+GC0809 05 F-IDENT-DIVISION PIC X(1).
+GC0809 88 88-1st-Prog-Complete VALUE 'Y'.
+GC0809 88 88-More-To-1st-Prog VALUE 'N'.
+ 05 F-LINKAGE-SECTION PIC X(1).
+ 88 88-Compile-As-Subpgm VALUE 'Y'.
+ 88 88-Compile-As-Mainpgm VALUE 'N'.
+ 05 F-No-Switch-Changes PIC X(1).
+ 88 88-No-Switch-Changes VALUE 'Y'.
+ 88 88-Switch-Changes VALUE 'N'.
+GC0709 05 F-Output-File-Busy PIC X(1).
+GC0709 88 88-Output-File-Busy VALUE 'Y'.
+GC0709 88 88-Output-File-Avail VALUE 'N'.
+GC0809 05 F-Source-Record-Type PIC X(1).
+GC0809 88 88-Source-Rec-Linkage VALUE 'L'.
+GC0809 88 88-Source-Rec-Ident VALUE 'I'.
+GC0809 88 88-Source-Rec-IgnoCOB-COLOR-RED VALUE ' '.
+ 05 F-Switch-Error PIC X(1).
+ 88 88-Switch-Is-Bad VALUE 'Y'.
+ 88 88-Switch-Is-Good VALUE 'N'.
+
+GC0909 01 Horizontal-Line PIC X(80).
+GC0909
+ 01 I USAGE BINARY-LONG.
+
+ 01 J USAGE BINARY-LONG.
+
+GC0909 01 MS USAGE BINARY-LONG.
+
+GC0909 01 ML USAGE BINARY-LONG.
+
+ 01 OC-Compiled PIC XXXX/XX/XXBXX/XX.
+
+GC0909 01 OS-Type USAGE BINARY-LONG.
+GC0909 88 OS-Unknown VALUE 0.
+GC0909 88 OS-Windows VALUE 1.
+GC0909 88 OS-Cygwin VALUE 2.
+GC0909 88 OS-UNIX VALUE 3.
+
+GC0909 01 OS-Type-Literal PIC X(7).
+
+ 01 Output-Message PIC X(80).
+
+ 01 Path-Delimiter PIC X(1).
+
+ 01 Prog-Folder PIC X(256).
+
+ 01 Prog-Extension PIC X(30).
+
+ 01 Prog-File-Name PIC X(40).
+
+ 01 Prog-Name PIC X(31).
+
+ 78 Selection-Char VALUE '>'.
+
+ 01 Switch-Display.
+ 05 SD-Switch-And-Value PIC X(19).
+ 05 FILLER PIC X(1).
+ 05 SD-Description PIC X(60).
+
+ 01 Switch-Keyword PIC X(12).
+GC0410 88 Switch-Is-CONFIG VALUE '@CONFIG', '@C'.
+GC0410 88 Switch-Is-DEBUG VALUE '@DEBUG', '@D'.
+GC0410 88 Switch-Is-DLL VALUE '@DLL'.
+GC0410 88 Switch-Is-EXECUTE VALUE '@EXECUTE', '@E'.
+GC0410 88 Switch-Is-EXTRA VALUE '@EXTRA', '@EX'.
+GC0410 88 Switch-Is-NOTRUNC VALUE '@NOTRUNC', '@N'.
+GC0410 88 Switch-Is-TRACE VALUE '@TRACE', '@T'.
+GC0410 88 Switch-Is-SOURCE VALUE '@SOURCE', '@S'.
+GC0410 88 Switch-Is-XREF VALUE '@XREF', '@X'.
+
+ 01 Switch-Keyword-And-Value PIC X(256).
+
+ 01 Switch-Value.
+ 05 SV-1 PIC X(1).
+ 05 FILLER PIC X(255).
+ 01 Switch-Value-Alt REDEFINES Switch-Value
+ PIC X(256).
+ 88 Valid-Config-Filename
+ VALUE 'BS2000', 'COBOL85', 'COBOL2002', 'DEFAULT',
+ 'IBM', 'MF', 'MVS'.
+
+ 01 Switches.
+ 05 S-ARGS PIC X(75) VALUE SPACES.
+ 05 S-CfgS.
+ 10 S-Cfg-BS2000 PIC X(1) VALUE ' '.
+ 10 S-Cfg-COBOL85 PIC X(1) VALUE ' '.
+ 10 S-Cfg-COBOL2002 PIC X(1) VALUE ' '.
+ 10 S-Cfg-DEFAULT PIC X(1) VALUE Selection-Char.
+ 10 S-Cfg-IBM PIC X(1) VALUE ' '.
+ 10 S-Cfg-MF PIC X(1) VALUE ' '.
+ 10 S-Cfg-MVS PIC X(1) VALUE ' '.
+ 05 S-EXTRA PIC X(75) VALUE SPACES.
+ 05 S-Yes-No-Switches.
+ 10 S-DEBUG PIC X(1) VALUE 'N'.
+ 10 S-DLL PIC X(1) VALUE 'N'.
+GC0410 10 S-XREF PIC X(1) VALUE 'N'.
+GC0410 10 S-SOURCE PIC X(1) VALUE 'N'.
+ 10 S-EXECUTE PIC X(1) VALUE 'N'.
+ 10 S-NOTRUNC PIC X(1) VALUE 'Y'.
+ 10 S-SUBROUTINE PIC X(1) VALUE 'A'.
+ 10 S-TRACE PIC X(1) VALUE 'N'.
+ 10 S-TRACEALL PIC X(1) VALUE 'N'.
+
+ 01 Tally USAGE BINARY-LONG.
+
+ SCREEN SECTION.
+ *>
+ *> Here is the layout of the OCic screen.
+ *>
+ *> Note that this program can utilize the traditional PC line-drawing characters,
+ *> if they are available.
+ *>
+ *> If this program is run on Windows, it must run with codepage 437 activated to
+ *> display the line-drawing characters. With a native Windows build or a
+ *> Windows/MinGW build, one could use the command "chcp 437" to set that codepage
+ *> for display within a Windows console window (that should be the default, though).
+ *> With a Windows/Cygwin build, set the environment variable CYGWIN to a value of
+ *> "codepage:oem" (this cannot be done from within the program though - you will
+ *> have to use the "Computer/Advanced System Settings/Environment Variables" (Vista or
+ *> Windows 7) function to define the variable. XP Users: use "My Computer/Properties/
+ *> Advanced/Environment Variables".
+ *>
+ *> To use OCic without the line-drawing characters, comment-out the first set of
+ *> 78 "LD" items and uncomment the second.
+ *>
+ *> The following sample screen layout shows how the screen looks with line-drawing
+ *> characters disabled.
+ *>
+ *>===================================================================================
+ *> OCic (2010/04/02 11:36) - OpenCOBOL V1.1 Interactive Compilation Windows 01
+ *> +-----------------------------------------------------------------------------+ 02
+ *> | Program: OCic F-Key: Select Opt | 03
+ *> | Folder: E:\OpenCOBOL\Samples Enter: Compile | 04
+ *> | Filename: OCic.cbl Esc: Quit | 05
+ *> +-----------------------------------------------------------------------------+ 06
+ *> On/Off Switches: Configuration: 07
+ *> +---------------------------------------------------------+-------------------+ 08
+ *> | F1 Compile debug lines F8 Produce source listing | S-F1 BS2000 | 09
+ *> | F2 Always make DLLs F9 Produce xref listing | S-F2 COBOL85 | 10
+ *> | F3 Pgm is a SUBROUTINE | S-F3 COBOL2002 | 11
+ *> | F4 Execute if compile OK | S-F4 > Default | 12
+ *> | F5 > No COMP/BINARY trunc | S-F5 IBM | 13
+ *> | F6 Trace procedures | S-F6 MicroFocus | 14
+ *> | F7 Trace proc + stmnts | S-F7 MVS | 15
+ *> +---------------------------------------------------------+-------------------+ 16
+ *> Additional "cobc" Switches (if any): 17
+ *> +-----------------------------------------------------------------------------+ 18
+ *> | -O2________________________________________________________________________ | 19
+ *> +-----------------------------------------------------------------------------+ 20
+ *> Program Execution Arguments (if any): 21
+ *> +-----------------------------------------------------------------------------+ 22
+ *> | ___________________________________________________________________________ | 23
+ *> +-----------------------------------------------------------------------------+ 24
+ *> OCic Copyright (C) 2009-2010, Gary L. Cutler, GPL 25
+ *>===================================================================================
+ *>12345678901234567890123456789012345678901234567890123456789012345678901234567890
+ *> 1 2 3 4 5 6 7 8
+ *>
+ *> USE THESE CHARS FOR LINE-DRAWING IF YOU HAVE ACCESS TO PC-DOS CODEPAGE 437:
+ *>
+ 78 LD-UL-Corner VALUE X"DA".
+ 78 LD-LL-Corner VALUE X"C0".
+ 78 LD-UR-Corner VALUE X"BF".
+ 78 LD-LR-Corner VALUE X"D9".
+ 78 LD-Upper-T VALUE X"C2".
+ 78 LD-Lower-T VALUE X"C1".
+ 78 LD-Horiz-Line VALUE X"C4".
+ 78 LD-Vert-Line VALUE X"B3".
+ *>
+ *> USE THESE CHARS FOR LINE-DRAWING IF YOU DO NOT HAVE ACCESS TO PC-DOS CODEPAGE 437:
+ *>
+ *> 78 LD-UL-Corner VALUE '+'.
+ *> 78 LD-LL-Corner VALUE '+'.
+ *> 78 LD-UR-Corner VALUE '+'.
+ *> 78 LD-LR-Corner VALUE '+'.
+ *> 78 LD-Upper-T VALUE '+'.
+ *> 78 LD-Lower-T VALUE '+'.
+ *> 78 LD-Horiz-Line VALUE '-'.
+ *> 78 LD-Vert-Line VALUE '|'.
+ *>
+ 01 Blank-Screen LINE 1 COLUMN 1 BLANK SCREEN.
+
+ 01 Switches-Screen BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-WHITE AUTO.
+ *>
+ *> GENERAL SCREEN FRAMEWORK
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-BLUE HIGHLIGHT.
+ 05 LINE 02 COL 02 VALUE LD-UL-Corner.
+ 05 PIC X(77) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-UR-Corner.
+
+ 05 LINE 03 COL 02 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 04 COL 02 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 05 COL 02 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 06 COL 02 VALUE LD-LL-Corner.
+ 05 PIC X(77) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-LR-Corner.
+
+ 05 LINE 08 COL 02 VALUE LD-UL-Corner.
+ 05 PIC X(57) FROM Horizontal-Line.
+ 05 COL 60 VALUE LD-Upper-T.
+ 05 PIC X(19) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-UR-Corner.
+
+ 05 LINE 09 COL 02 VALUE LD-Vert-Line.
+ 05 COL 60 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 10 COL 02 VALUE LD-Vert-Line.
+ 05 COL 60 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 11 COL 02 VALUE LD-Vert-Line.
+ 05 COL 60 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 12 COL 02 VALUE LD-Vert-Line.
+ 05 COL 60 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 13 COL 02 VALUE LD-Vert-Line.
+ 05 COL 60 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 14 COL 02 VALUE LD-Vert-Line.
+ 05 COL 60 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 15 COL 02 VALUE LD-Vert-Line.
+ 05 COL 60 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 16 COL 02 VALUE LD-LL-Corner.
+ 05 PIC X(57) FROM Horizontal-Line.
+ 05 COL 60 VALUE LD-Lower-T.
+ 05 PIC X(19) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-LR-Corner.
+
+ 05 LINE 18 COL 02 VALUE LD-UL-Corner.
+ 05 PIC X(77) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-UR-Corner.
+
+ 05 LINE 19 COL 02 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 20 COL 02 VALUE LD-LL-Corner.
+ 05 PIC X(77) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-LR-Corner.
+
+ 05 LINE 22 COL 02 VALUE LD-UL-Corner.
+ 05 PIC X(77) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-UR-Corner.
+
+ 05 LINE 23 COL 02 VALUE LD-Vert-Line.
+ 05 COL 80 VALUE LD-Vert-Line.
+
+ 05 LINE 24 COL 02 VALUE LD-LL-Corner.
+ 05 PIC X(77) FROM Horizontal-Line.
+ 05 COL 80 VALUE LD-LR-Corner.
+ *>
+ *> TOP AND BOTTOM LINES
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLUE BLINK
+ FOREGROUND-COLOR COB-COLOR-WHITE HIGHLIGHT.
+GC0410 05 LINE 01 COL 01 VALUE ' OCic ('.
+GC0410 05 PIC X(16) FROM OC-Compiled.
+GC0410 05 VALUE ') OpenCOBOL V1.1 06FEB2009 ' &
+GC0410 'Interactive Compilation '.
+GC0410 05 LINE 25 COL 01 PIC X(81) FROM Output-Message.
+ *>
+ *> LABELS
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-CYAN HIGHLIGHT.
+ 05 LINE 07 COL 04 VALUE 'On/Off Switches:'.
+ 05 COL 62 VALUE 'Configuration:'.
+ 05 LINE 17 COL 04 VALUE 'Additional "cobc" Switches (if any
+ - '):'.
+ 05 LINE 21 COL 04 VALUE 'Program Execution Arguments (if an
+ - 'y):'.
+ *>
+ *> TOP SECTION BACKGROUND
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-CYAN LOWLIGHT.
+ 05 LINE 03 COL 04 VALUE 'Program: '.
+ 05 LINE 04 COL 04 VALUE 'Folder: '.
+ 05 LINE 05 COL 04 VALUE 'Filename: '.
+
+ 05 LINE 03 COL 62 VALUE 'F-Key: Select Opt'.
+ 05 LINE 04 COL 62 VALUE 'Enter: Compile '.
+ 05 LINE 05 COL 62 VALUE 'Esc: Quit '.
+ *>
+ *> TOP SECTION PROGRAM INFO
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-WHITE HIGHLIGHT.
+ 05 LINE 03 COL 14 PIC X(47) FROM Prog-Name.
+ 05 LINE 04 COL 14 PIC X(47) FROM Prog-Folder.
+ 05 LINE 05 COL 14 PIC X(47) FROM Prog-File-Name.
+ *>
+ *> MIDDLE LEFT SECTION F-KEYS
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-WHITE HIGHLIGHT.
+ 05 LINE 09 COL 04 VALUE 'F1'.
+ 05 LINE 10 COL 04 VALUE 'F2'.
+ 05 LINE 11 COL 04 VALUE 'F3'.
+ 05 LINE 12 COL 04 VALUE 'F4'.
+ 05 LINE 13 COL 04 VALUE 'F5'.
+ 05 LINE 14 COL 04 VALUE 'F6'.
+ 05 LINE 15 COL 04 VALUE 'F7'.
+ 05 LINE 09 COL 32 VALUE 'F8'.
+ 05 LINE 10 COL 32 VALUE 'F9'.
+ *>
+ *> MIDDLE LEFT SECTION SWITCHES
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-RED HIGHLIGHT.
+ 05 LINE 09 COL 07 PIC X(1) FROM S-DEBUG.
+ 05 LINE 10 COL 07 PIC X(1) FROM S-DLL.
+ 05 LINE 11 COL 07 PIC X(1) FROM S-SUBROUTINE.
+ 05 LINE 12 COL 07 PIC X(1) FROM S-EXECUTE.
+ 05 LINE 13 COL 07 PIC X(1) FROM S-NOTRUNC.
+ 05 LINE 14 COL 07 PIC X(1) FROM S-TRACE.
+ 05 LINE 15 COL 07 PIC X(1) FROM S-TRACEALL.
+ 05 LINE 09 COL 35 PIC X(1) FROM S-SOURCE.
+ 05 LINE 10 COL 35 PIC X(1) FROM S-XREF.
+ *>
+ *> MIDDLE LEFT SECTION BACKGROUND
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-CYAN LOWLIGHT.
+ 05 LINE 09 COL 09 VALUE 'Compile debug lines '.
+ 05 LINE 10 COL 09 VALUE 'Always make DLLs '.
+ 05 LINE 11 COL 09 VALUE 'Pgm is a SUBROUTINE '.
+ 05 LINE 12 COL 09 VALUE 'Execute if compile OK '.
+ 05 LINE 13 COL 09 VALUE 'No COMP/BINARY trunc '.
+ 05 LINE 14 COL 09 VALUE 'Trace procedures '.
+ 05 LINE 15 COL 09 VALUE 'Trace proc + stmnts '.
+ 05 LINE 09 COL 37 VALUE 'Produce source listing'.
+ 05 LINE 10 COL 37 VALUE 'Produce xref listing '.
+ *>
+ *> MIDDLE RIGHT SECTION F-KEYS
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-WHITE HIGHLIGHT.
+ 05 LINE 09 COL 62 VALUE 'S-F1'.
+ 05 LINE 10 COL 62 VALUE 'S-F2'.
+ 05 LINE 11 COL 62 VALUE 'S-F3'.
+ 05 LINE 12 COL 62 VALUE 'S-F4'.
+ 05 LINE 13 COL 62 VALUE 'S-F5'.
+ 05 LINE 14 COL 62 VALUE 'S-F6'.
+ 05 LINE 15 COL 62 VALUE 'S-F7'.
+ *>
+ *> MIDDLE RIGHT SECTION SWITCHES
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-RED HIGHLIGHT.
+ 05 LINE 09 COL 67 PIC X(1) FROM S-Cfg-BS2000.
+ 05 LINE 10 COL 67 PIC X(1) FROM S-Cfg-COBOL85.
+ 05 LINE 11 COL 67 PIC X(1) FROM S-Cfg-COBOL2002.
+ 05 LINE 12 COL 67 PIC X(1) FROM S-Cfg-DEFAULT.
+ 05 LINE 13 COL 67 PIC X(1) FROM S-Cfg-IBM.
+ 05 LINE 14 COL 67 PIC X(1) FROM S-Cfg-MF.
+ 05 LINE 15 COL 67 PIC X(1) FROM S-Cfg-MVS.
+ *>
+ *> MIDDLE RIGHT SECTION BACKGROUND
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-CYAN LOWLIGHT.
+ 05 LINE 09 COL 69 VALUE 'BS2000 '.
+ 05 LINE 10 COL 69 VALUE 'COBOL85 '.
+ 05 LINE 11 COL 69 VALUE 'COBOL2002 '.
+ 05 LINE 12 COL 69 VALUE 'Default '.
+ 05 LINE 13 COL 69 VALUE 'IBM '.
+ 05 LINE 14 COL 69 VALUE 'MicroFocus'.
+ 05 LINE 15 COL 69 VALUE 'MVS '.
+ *>
+ *> FREE-FORM OPTIONS FIELDS
+ *>
+ 03 BACKGROUND-COLOR COB-COLOR-BLACK
+ FOREGROUND-COLOR COB-COLOR-WHITE HIGHLIGHT.
+ 05 LINE 19 COL 04 PIC X(75) USING S-EXTRA.
+ 05 LINE 23 COL 04 PIC X(75) USING S-ARGS.
+ /
+ PROCEDURE DIVISION.
+ *****************************************************************
+ ** Legend to procedure names: **
+ ** **
+ ** 00x-xxx All MAIN driver procedures **
+ ** 0xx-xxx All GLOBAL UTILITY procedures **
+ ** 1xx-xxx All INITIALIZATION procedures **
+ ** 2xx-xxx All CORE PROCESSING procedures **
+ ** 9xx-xxx All TERMINATION procedures **
+ *****************************************************************
+ DECLARATIVES.
+ 000-File-Error SECTION.
+ USE AFTER STANDARD ERROR PROCEDURE ON Source-Code.
+ 000-Handle-Error.
+ COPY FileStat-Msgs
+ REPLACING STATUS BY FSM-Status
+ MSG BY FSM-Msg.
+ MOVE SPACES TO Output-Message
+ IF FSM-Status = 35
+ DISPLAY
+ 'File not found: "'
+ TRIM(File-Name,TRAILING)
+ '"'
+ END-DISPLAY
+ ELSE
+ DISPLAY
+ 'Error accessing file: "'
+ TRIM(File-Name,TRAILING)
+ '"'
+ END-DISPLAY
+ END-IF
+ GOBACK
+ .
+ END DECLARATIVES.
+ /
+ 000-Main SECTION.
+
+ PERFORM 100-Initialization
+GC0609 SET 88-Not-Complete TO TRUE
+GC0609 PERFORM UNTIL 88-Complete
+GC0609 PERFORM 200-Let-User-Set-Switches
+GC0609 PERFORM 210-Run-Compiler
+GC0410 IF (88-Compile-OK OR 88-Compile-OK-Warn)
+GC0410 AND (S-XREF NOT = SPACE OR S-SOURCE NOT = SPACE)
+GC0410 PERFORM 220-Make-Listing
+GC0410 END-IF
+GC0709 IF (S-EXECUTE NOT = SPACES)
+GC0709 AND (88-Output-File-Avail)
+GC0609 PERFORM 230-Run-Program
+GC0609 END-IF
+GC0609 END-PERFORM
+ .
+
+ 009-Done.
+ PERFORM 900-Terminate
+ .
+ * -- Control will NOT return
+ /
+ 010-Parse-Args SECTION.
+ *****************************************************************
+ ** Process a sequence of KEYWORD=VALUE items. These are items **
+ ** specified on the command-line to provide the initial **
+ ** options shown selected on the screen. When integrating **
+ ** OCic into an edirot or framework, include these switches on **
+ ** the ocic.exe command the editor/framework executes. Any **
+ ** underlined choice is the default value for that switch. **
+ ** **
+ ** @CONFIG=BS2000|COBOL85|COBOL2002|DEFAULT|IBM|MF|MVS **
+ ** ======= **
+ ** This switch specifies the default cobc compiler configura- **
+ ** tion file to be used **
+ ** **
+ ** @DEBUG=YES|NO **
+ ** == **
+ ** This switch specifies whether (YES) or not (NO) debugging **
+ ** lines (those with a "D" in column 7) will be compiled. **
+ ** **
+ ** @DLL=YES|NO **
+ ** == **
+ ** Use this switch to force ALL compiled programs to be built **
+ ** as DLLs ("@DLL=YES"). When main programs are built as DLLs **
+ ** they must be executed using the cobcrun utility. When **
+ ** "@DLL=NO" is in effect, main programs are generated as **
+ ** actual "exe" files and only subprograms will be generated **
+ ** as DLLs. **
+ ** **
+ ** @EXECUTE=YES|NO **
+ ** == **
+ ** This switch specifies whether ("@EXECUTE=YES") or not **
+ ** ("@EXECUTE=NO") the program will be executed after it is **
+ ** successfully compiled. **
+ ** **
+ ** @EXTRA=extra cobc argument(s) **
+ ** **
+ ** This switch allows you to specify additional cobc arguments **
+ ** that aren't managed by the other OC switches. If used, **
+ ** this must be the last switch specified on the command line, **
+ ** as everything that follows the "=" will be placed on the **
+ ** cobc command generated by OC. **
+ ** **
+ ** @NOTRUNC=YES|NO **
+ ** === **
+ ** This switch specifies whether (YES) or not (NO) the sup- **
+ ** pression of binary field truncation will occur. If a PIC **
+ ** 99 COMP field (one byte of storage), for example, is given **
+ ** the value 123, it may have its value truncated to 23 when **
+ ** DISPLAYed. Regardless of the NOTRUNC setting, internally **
+ ** the full precision of the field (allowing a maximum value **
+ ** of 255) will be preserved. Even though truncation - if it **
+ ** does occur - would appear to have a minimal disruption on **
+ ** program operation, it has a significant effect on program **
+ ** run-time speed. **
+ ** **
+ ** @TRACE=YES|NO|ALL **
+ ** == **
+ ** This switch controls whether or not code will be added to **
+ ** the object program to produce execution-time logic traces. **
+ ** A specification of "@TRACE=NO" means no such code will be **
+ ** produced. By specifying "@TRACE=YES", code will be genera- **
+ ** ted to display procedure names as they are entered. A **
+ ** "@TRACE=ALL" specification will generate not only procedure **
+ ** traces (as "@TRACE=YES" would) but also statement-level **
+ ** traces too! All trace output is written to STDERR, so **
+ ** adding a "2>file" to the execution of the program will pipe **
+ ** the trace output to a file. You may find it valuable to **
+ ** add your own DISPLAY statements to the debugging output via **
+ ** "DISPLAY xx UPON SYSERR" The SYSERR device corresponds to **
+ ** the Windows or UNIX STDERR device and will therefore honor **
+ ** any "2>file" placed at the end of your program's execution. **
+ ** Add a "D" in column 7 and you can control the generation or **
+ ** ignoring of these DISPLAY statements via the "@DEBUG" **
+ ** switch. **
+ ** **
+GC0410** @SOURCE=YES|NO **
+GC0410** == **
+GC0410** Use this switch to produce a source listing of the program, **
+GC0410** PROVIDED it compiles without errors. **
+ ** **
+GC0410** @XREF=YES|NO **
+GC0410** == **
+GC0410** Use this switch to produce a cross-reference listing of the **
+GC0410** program, PROVIDED it compiles without errors. **
+ *****************************************************************
+
+ 011-Init.
+ MOVE 1 TO I
+ .
+
+ 012-Extract-Kwd-And-Value.
+ PERFORM UNTIL I NOT < LENGTH(Command-Line-Args)
+ MOVE I TO J
+ UNSTRING Command-Line-Args
+ DELIMITED BY ALL SPACES
+ INTO Switch-Keyword-And-Value
+ WITH POINTER I
+ END-UNSTRING
+ IF Switch-Keyword-And-Value NOT = SPACES
+ UNSTRING Switch-Keyword-And-Value
+ DELIMITED BY '='
+ INTO Switch-Keyword, Switch-Value
+ END-UNSTRING
+ PERFORM 030-Process-Keyword
+ END-IF
+ END-PERFORM
+ .
+
+ 019-Done.
+ EXIT.
+
+ *****************************************************************
+ ** Since this program uses the SCREEN SECTION, it cannot do **
+ ** conventional console DISPLAY operations. This routine **
+ ** (which, I admit, is like using an H-bomb to hunt rabbits) **
+ ** will submit an "ECHO" command to the system to simulate a **
+ ** DISPLAY. **
+ *****************************************************************
+ 021-Build-And-Issue-Command.
+ DISPLAY
+ Output-Message
+ END-DISPLAY
+ .
+
+ 029-Done.
+ EXIT.
+ /
+ 030-Process-Keyword SECTION.
+ *****************************************************************
+ ** Process a single KEYWORD=VALUE item. **
+ *****************************************************************
+
+ 031-Init.
+ MOVE UPPER-CASE(Switch-Keyword) TO Switch-Keyword
+ SET 88-Switch-Is-Good TO TRUE
+ .
+
+ 032-Process.
+ EVALUATE TRUE
+ WHEN Switch-Is-EXTRA
+GC0410 MOVE J TO I
+ UNSTRING Command-Line-Args DELIMITED BY '='
+ INTO Dummy, S-EXTRA
+GC0410 WITH POINTER I
+GC0410 END-UNSTRING
+ MOVE LENGTH(Command-Line-Args) TO I
+ WHEN Switch-Is-CONFIG
+ MOVE 'CONFIG' TO Switch-Keyword
+ MOVE UPPER-CASE(Switch-Value)
+ TO Switch-Value
+ EVALUATE Switch-Value
+ WHEN 'BS2000'
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-BS2000
+ WHEN 'COBOL85'
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-COBOL85
+ WHEN 'COBOL2002'
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-COBOL2002
+ WHEN 'DEFAULT'
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-DEFAULT
+ WHEN 'IBM'
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-IBM
+ WHEN 'MF'
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-MF
+ WHEN 'MVS'
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-MVS
+ WHEN OTHER
+ MOVE 'An invalid /CONFIG switch value ' &
+ 'was specified on the command line ' &
+ '- ignored'
+ TO Output-Message
+ END-EVALUATE
+ WHEN Switch-Is-DEBUG
+ MOVE 'DEBUG' TO Switch-Keyword
+ MOVE UPPER-CASE(Switch-Value)
+ TO Switch-Value
+ PERFORM 040-Process-Yes-No-Value
+ IF 88-Switch-Is-Good
+ MOVE SV-1 TO S-DEBUG
+ END-IF
+GC0410 WHEN Switch-Is-DLL
+GC0410 MOVE 'DLL' TO Switch-Keyword
+GC0410 MOVE UPPER-CASE(Switch-Value)
+GC0410 TO Switch-Value
+GC0410 PERFORM 040-Process-Yes-No-Value
+GC0410 IF 88-Switch-Is-Good
+GC0410 MOVE SV-1 TO S-DLL
+GC0410 END-IF
+ WHEN Switch-Is-EXECUTE
+ MOVE 'EXECUTE' TO Switch-Keyword
+ MOVE UPPER-CASE(Switch-Value)
+ TO Switch-Value
+ PERFORM 040-Process-Yes-No-Value
+ IF 88-Switch-Is-Good
+ MOVE SV-1 TO S-EXECUTE
+ END-IF
+ WHEN Switch-Is-NOTRUNC
+ MOVE 'NOTRUNC' TO Switch-Keyword
+ MOVE UPPER-CASE(Switch-Value)
+ TO Switch-Value
+ PERFORM 040-Process-Yes-No-Value
+ IF 88-Switch-Is-Good
+ MOVE SV-1 TO S-NOTRUNC
+ END-IF
+GC0410 WHEN Switch-Is-SOURCE
+GC0410 MOVE 'SOURCE' TO Switch-Keyword
+GC0410 MOVE UPPER-CASE(Switch-Value)
+GC0410 TO Switch-Value
+GC0410 PERFORM 050-Process-Yes-No-All
+GC0410 IF 88-Switch-Is-Good
+GC0410 MOVE SV-1 TO S-SOURCE
+GC0410 END-IF
+ WHEN Switch-Is-TRACE
+ MOVE 'TRACE' TO Switch-Keyword
+ MOVE UPPER-CASE(Switch-Value)
+ TO Switch-Value
+ PERFORM 050-Process-Yes-No-All
+ IF 88-Switch-Is-Good
+ MOVE SV-1 TO S-TRACE
+ END-IF
+GC0410 WHEN Switch-Is-XREF
+GC0410 MOVE 'XREF' TO Switch-Keyword
+GC0410 MOVE UPPER-CASE(Switch-Value)
+GC0410 TO Switch-Value
+GC0410 PERFORM 050-Process-Yes-No-All
+GC0410 IF 88-Switch-Is-Good
+GC0410 MOVE SV-1 TO S-XREF
+GC0410 END-IF
+ WHEN OTHER
+ MOVE SPACES TO Output-Message
+ STRING '"'
+ TRIM(Switch-Keyword)
+ '" is not a valid switch ' &
+ '- ignored'
+ DELIMITED SIZE
+ INTO Output-Message
+ END-STRING
+ SET 88-Switch-Is-Bad TO TRUE
+ END-EVALUATE
+ .
+
+ 039-Done.
+ EXIT.
+ /
+ 040-Process-Yes-No-Value SECTION.
+ *****************************************************************
+ ** Process a switch value of YES or NO **
+ *****************************************************************
+
+ 042-Process.
+ EVALUATE SV-1
+ WHEN 'Y'
+ MOVE 'YES' TO Switch-Value
+ WHEN 'N'
+ MOVE 'NO' To Switch-Value
+ WHEN OTHER
+ MOVE SPACES TO Output-Message
+ STRING '*ERROR: "' TRIM(Switch-Value)
+ '" is not a valid value for the "'
+ TRIM(Switch-Keyword) '" switch'
+ DELIMITED SPACES
+ INTO Output-Message
+ END-STRING
+ SET 88-Switch-Is-Bad TO TRUE
+ END-EVALUATE
+ .
+
+ 049-Done.
+ EXIT.
+ /
+ 050-Process-Yes-No-All SECTION.
+ *****************************************************************
+ ** Process a switch value of YES, NO or ALL **
+ *****************************************************************
+
+ 052-Process.
+ IF SV-1 = 'A'
+ MOVE 'ALL' TO Switch-Value
+ ELSE
+ PERFORM 040-Process-Yes-No-Value
+ END-IF
+ .
+
+ 059-Done.
+ EXIT.
+ /
+ 060-Process-Yes-No-Auto SECTION.
+ *****************************************************************
+ ** Process a switch value of YES, NO or AUTO **
+ *****************************************************************
+
+ 061-Init.
+ IF SV-1 = 'A'
+ PERFORM 070-Find-LINKAGE-SECTION
+ IF 88-Compile-As-Subpgm
+ MOVE 'Y' TO Switch-Value
+ ELSE
+ MOVE 'N' TO Switch-Value
+ END-IF
+ ELSE
+ PERFORM 040-Process-Yes-No-Value
+ END-IF
+ .
+ /
+ 070-Find-LINKAGE-SECTION SECTION.
+ *****************************************************************
+ ** Determine if the program being compiled is a MAIN program **
+ *****************************************************************
+
+ 071-Init.
+ OPEN INPUT Source-Code
+ SET 88-Compile-As-Mainpgm TO TRUE
+ SET 88-More-To-1st-Prog TO TRUE
+ PERFORM UNTIL 88-1st-Prog-Complete
+ READ Source-Code AT END
+ CLOSE Source-Code
+ EXIT SECTION
+ END-READ
+ CALL 'CHECKSOURCE' USING Source-Code-Record
+ F-Source-Record-Type
+ END-CALL
+ IF 88-Source-Rec-Ident
+ SET 88-1st-Prog-Complete TO TRUE
+ END-IF
+ END-PERFORM
+ .
+
+ 072-Process-Source.
+ SET 88-Source-Rec-IgnoCOB-COLOR-RED TO TRUE
+ PERFORM UNTIL 88-Source-Rec-Linkage
+ OR 88-Source-Rec-Ident
+ READ Source-Code AT END
+ CLOSE Source-Code
+ EXIT SECTION
+ END-READ
+ CALL 'CHECKSOURCE' USING Source-Code-Record
+ F-Source-Record-Type
+ END-CALL
+ END-PERFORM
+ CLOSE Source-Code
+ IF 88-Source-Rec-Linkage
+ SET 88-Compile-As-Subpgm TO TRUE
+ END-IF
+ .
+
+ 079-Done.
+ EXIT.
+ /
+ 100-Initialization SECTION.
+ *****************************************************************
+ ** Perform all program-wide initialization operations **
+ *****************************************************************
+
+
+GC0909 101-Determine-OS-Type.
+GC0909 CALL 'GETOSTYPE'
+GC0909 END-CALL
+GC0909 MOVE RETURN-CODE TO OS-Type
+GC0909 EVALUATE TRUE
+GC0909 WHEN OS-Unknown
+GC0909 MOVE '\' TO Dir-Char
+GC0909 MOVE 'Unknown' TO OS-Type-Literal
+GC0310 MOVE COB-SCR-F11 TO CK-S-F1
+GC0310 MOVE COB-SCR-F12 TO CK-S-F2
+GC0310 MOVE COB-SCR-F13 TO CK-S-F3
+GC0310 MOVE COB-SCR-F14 TO CK-S-F4
+GC0310 MOVE COB-SCR-F15 TO CK-S-F5
+GC0310 MOVE COB-SCR-F16 TO CK-S-F6
+GC0310 MOVE COB-SCR-F17 TO CK-S-F7
+GC0909 WHEN OS-Windows
+GC0909 MOVE '\' TO Dir-Char
+GC0909 MOVE 'Windows' TO OS-Type-Literal
+GC0310 MOVE COB-SCR-F13 TO CK-S-F1
+GC0310 MOVE COB-SCR-F14 TO CK-S-F2
+GC0310 MOVE COB-SCR-F15 TO CK-S-F3
+GC0310 MOVE COB-SCR-F16 TO CK-S-F4
+GC0310 MOVE COB-SCR-F17 TO CK-S-F5
+GC0310 MOVE COB-SCR-F18 TO CK-S-F6
+GC0310 MOVE COB-SCR-F19 TO CK-S-F7
+GC0909 WHEN OS-Cygwin
+GC0909 MOVE '/' TO Dir-Char
+GC0410 MOVE 'Cygwin' TO OS-Type-Literal
+GC0310 MOVE COB-SCR-F11 TO CK-S-F1
+GC0310 MOVE COB-SCR-F12 TO CK-S-F2
+GC0310 MOVE COB-SCR-F13 TO CK-S-F3
+GC0310 MOVE COB-SCR-F14 TO CK-S-F4
+GC0310 MOVE COB-SCR-F15 TO CK-S-F5
+GC0310 MOVE COB-SCR-F16 TO CK-S-F6
+GC0310 MOVE COB-SCR-F17 TO CK-S-F7
+GC0909 WHEN OS-UNIX
+GC0909 MOVE '/' TO Dir-Char
+GC0410 MOVE 'UNIX ' TO OS-Type-Literal
+GC0310 MOVE COB-SCR-F11 TO CK-S-F1
+GC0310 MOVE COB-SCR-F12 TO CK-S-F2
+GC0310 MOVE COB-SCR-F13 TO CK-S-F3
+GC0310 MOVE COB-SCR-F14 TO CK-S-F4
+GC0310 MOVE COB-SCR-F15 TO CK-S-F5
+GC0310 MOVE COB-SCR-F16 TO CK-S-F6
+GC0310 MOVE COB-SCR-F17 TO CK-S-F7
+GC0909 END-EVALUATE
+GC0909 .
+
+ 102-Set-Environment-Vars.
+ SET ENVIRONMENT 'COB_SCREEN_EXCEPTIONS' TO 'Y'
+ SET ENVIRONMENT 'COB_SCREEN_ESC' TO 'Y'
+ .
+
+ 103-Generate-Cobc-Output-Fn.
+ ACCEPT Env-TEMP
+ FROM ENVIRONMENT "TEMP"
+ END-ACCEPT
+ MOVE SPACES TO Cobc-Output-File
+ STRING TRIM(Env-TEMP,TRAILING)
+GC0909 Dir-Char
+GC0909 'OC-Messages.TXT'
+ DELIMITED SIZE
+ INTO Cobc-Output-File
+ END-STRING
+ .
+
+ 104-Generate-Banner-Line-Info.
+ MOVE WHEN-COMPILED (1:12) TO OC-Compiled
+ INSPECT OC-Compiled
+ REPLACING ALL '/' BY ':'
+ AFTER INITIAL SPACE
+ .
+
+ 105-Establish-Switch-Settings.
+ ACCEPT Command-Line-Args
+ FROM COMMAND-LINE
+ END-ACCEPT
+ MOVE TRIM(Command-Line-Args, Leading)
+ TO Command-Line-Args
+ MOVE 0 TO Tally
+GC0410 INSPECT Command-Line-Args TALLYING Tally FOR ALL '@'
+ IF Tally = 0
+ MOVE Command-Line-Args TO File-Name
+ MOVE SPACES TO Command-Line-Args
+ ELSE
+GC0410 UNSTRING Command-Line-Args DELIMITED BY '@'
+ INTO File-Name, Dummy
+ END-UNSTRING
+ INSPECT Command-Line-Args
+GC0410 REPLACING FIRST '@' BY LOW-VALUES
+ UNSTRING Command-Line-Args
+ DELIMITED BY LOW-VALUES
+ INTO Dummy, Cmd
+ END-UNSTRING
+ MOVE SPACES TO Command-Line-Args
+GC0410 STRING '@' Cmd DELIMITED SIZE
+ INTO Command-Line-Args
+ END-STRING
+ END-IF
+ IF File-Name = SPACES
+ DISPLAY
+ 'No program filename was specified'
+ END-DISPLAY
+ PERFORM 900-Terminate
+ END-IF
+ PERFORM 010-Parse-Args
+ IF S-SUBROUTINE = 'A'
+ MOVE 'S' TO Switch-Keyword
+ MOVE 'A' TO Switch-Value
+ PERFORM 070-Find-LINKAGE-SECTION
+ IF 88-Compile-As-Subpgm
+ MOVE 'Y' TO S-SUBROUTINE
+ ELSE
+ MOVE 'N' TO S-SUBROUTINE
+ END-IF
+ END-IF
+ INSPECT S-Yes-No-Switches REPLACING ALL 'Y' BY Selection-Char
+ INSPECT S-Yes-No-Switches REPLACING ALL 'N' BY ' '
+ .
+
+ 106-Determine-Folder-Path.
+ Move 256 TO I
+GC0909 IF OS-Cygwin AND File-Name (2:1) = ':'
+GC0909 MOVE '\' TO Dir-Char
+GC0909 END-IF
+ PERFORM UNTIL I = 0 OR FN-Char (I) = Dir-Char
+ SUBTRACT 1 FROM I
+ END-PERFORM
+ IF I = 0
+ MOVE SPACES TO Prog-Folder
+ MOVE File-Name TO Prog-File-Name
+ ELSE
+ MOVE '*' TO FN-Char (I)
+ UNSTRING File-Name DELIMITED BY '*'
+ INTO Prog-Folder
+ Prog-File-Name
+ END-UNSTRING
+ MOVE Dir-Char TO FN-Char (I)
+ END-IF
+ UNSTRING Prog-File-Name DELIMITED BY '.'
+ INTO Prog-Name, Prog-Extension
+ END-UNSTRING
+ IF Prog-Folder = SPACES
+ ACCEPT Prog-Folder
+ FROM ENVIRONMENT 'CD'
+ END-ACCEPT
+GC0909 ELSE
+GC0909 CALL "CBL_CHANGE_DIR"
+GC0909 USING TRIM(Prog-Folder,TRAILING)
+GC0909 END-CALL
+ END-IF
+GC0909 IF OS-Cygwin AND File-Name (2:1) = ':'
+GC0909 MOVE '/' TO Dir-Char
+GC0909 END-IF
+ .
+
+GC0909 107-Other.
+GC0909 MOVE ALL LD-Horiz-Line TO Horizontal-Line.
+GC0410 MOVE CONCATENATE(' OCic for ',
+GC0410 TRIM(OS-Type-Literal,Trailing),
+GC0410 ' Copyright (C) 2009-2010, Gary L. Cutler,',
+GC0410 ' GPL')
+GC0410 TO Output-Message.
+GC0909 .
+GC0909
+ 109-Done.
+ EXIT.
+ /
+ 200-Let-User-Set-Switches SECTION.
+ *****************************************************************
+ ** Show the user the current switch settings and allow them to **
+ ** be changed. **
+ *****************************************************************
+
+ 201-Init.
+ SET 88-Switch-Changes TO TRUE
+ .
+
+ 202-Show-And-Change-Switches.
+ PERFORM UNTIL 88-No-Switch-Changes
+ ACCEPT
+ Switches-Screen
+ END-ACCEPT
+ IF COB-CRT-STATUS > 0
+ EVALUATE COB-CRT-STATUS
+ WHEN COB-SCR-F1
+ IF S-DEBUG = SPACE
+ MOVE Selection-Char TO S-DEBUG
+ ELSE
+ MOVE ' ' TO S-DEBUG
+ END-IF
+ WHEN COB-SCR-F2
+ IF S-DLL = SPACE
+ MOVE Selection-Char TO S-DLL
+ ELSE
+ MOVE ' ' TO S-DLL
+ END-IF
+ WHEN COB-SCR-F3
+ IF S-SUBROUTINE = SPACE
+ MOVE Selection-Char TO S-SUBROUTINE
+ MOVE ' ' TO S-EXECUTE
+ ELSE
+ MOVE ' ' TO S-SUBROUTINE
+ END-IF
+ WHEN COB-SCR-F4
+ IF S-EXECUTE = SPACE
+ AND S-SUBROUTINE = SPACE
+ MOVE Selection-Char TO S-EXECUTE
+ ELSE
+ MOVE ' ' TO S-EXECUTE
+ END-IF
+ WHEN COB-SCR-F5
+ IF S-NOTRUNC = SPACE
+ MOVE Selection-Char TO S-NOTRUNC
+ ELSE
+ MOVE ' ' TO S-NOTRUNC
+ END-IF
+ WHEN COB-SCR-F6
+ IF S-TRACE = SPACE
+ MOVE Selection-Char TO S-TRACE
+ MOVE ' ' TO S-TRACEALL
+ ELSE
+ MOVE ' ' TO S-TRACE
+ END-IF
+ WHEN COB-SCR-F7
+ IF S-TRACEALL = SPACE
+ MOVE Selection-Char TO S-TRACEALL
+ MOVE ' ' TO S-TRACE
+ ELSE
+ MOVE ' ' TO S-TRACEALL
+ END-IF
+GC0410 WHEN COB-SCR-F8
+GC0410 IF S-SOURCE = SPACE
+GC0410 MOVE Selection-Char TO S-SOURCE
+GC0410 ELSE
+GC0410 MOVE ' ' TO S-SOURCE
+GC0410 END-IF
+GC0410 WHEN COB-SCR-F9
+GC0410 IF S-XREF = SPACE
+GC0410 MOVE Selection-Char TO S-XREF
+GC0410 ELSE
+GC0410 MOVE ' ' TO S-XREF
+GC0410 END-IF
+ WHEN COB-SCR-ESC
+ PERFORM 900-Terminate
+GC0310 WHEN CK-S-F1
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-BS2000
+GC0310 WHEN CK-S-F2
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-COBOL85
+GC0310 WHEN CK-S-F3
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-COBOL2002
+GC0310 WHEN CK-S-F4
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-DEFAULT
+GC0310 WHEN CK-S-F5
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-IBM
+GC0310 WHEN CK-S-F6
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-MF
+GC0310 WHEN CK-S-F7
+ MOVE SPACES TO S-CfgS
+ MOVE Selection-Char TO S-Cfg-MVS
+ WHEN OTHER
+ MOVE 'An unsupported key was pressed'
+ TO Output-Message
+ END-EVALUATE
+ ELSE
+ SET 88-No-Switch-Changes TO TRUE
+ END-IF
+ END-PERFORM
+ .
+
+ 209-Done.
+ EXIT.
+ /
+ 210-Run-Compiler SECTION.
+ *****************************************************************
+ ** Run the compiler using the switch settings we've prepared. **
+ *****************************************************************
+
+ 211-Init.
+ MOVE SPACES TO Cmd
+ Cobc-Cmd
+ Output-Message
+ DISPLAY
+ Switches-Screen
+ END-DISPLAY
+ MOVE 1 TO I
+ EVALUATE TRUE
+ WHEN S-Cfg-BS2000 NOT = SPACES
+ MOVE 'bs2000' TO Config-File
+ WHEN S-Cfg-COBOL85 NOT = SPACES
+ MOVE 'cobol85' TO Config-File
+ WHEN S-Cfg-COBOL2002 NOT = SPACES
+ MOVE 'cobol2002' TO Config-File
+ WHEN S-Cfg-IBM NOT = SPACES
+ MOVE 'ibm' TO Config-File
+ WHEN S-Cfg-MF NOT = SPACES
+ MOVE 'mf' TO Config-File
+ WHEN S-Cfg-MVS NOT = SPACES
+ MOVE 'mvs' TO Config-File
+ WHEN OTHER
+ MOVE 'default' TO Config-File
+ END-EVALUATE
+ .
+
+ 212-Build-Compile-Command.
+GC0909 MOVE SPACES TO Cobc-Cmd
+GC0909 STRING 'cobc -std='
+GC0909 TRIM(Config-File,TRAILING)
+GC0909 ' '
+GC0909 INTO Cobc-Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+ IF S-SUBROUTINE NOT = ' '
+ STRING '-m '
+ DELIMITED SIZE INTO Cobc-Cmd
+ WITH POINTER I
+ END-STRING
+ ELSE
+ STRING '-x '
+ DELIMITED SIZE INTO Cobc-Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ IF S-DEBUG NOT = ' '
+ STRING '-fdebugging-line '
+ DELIMITED SIZE INTO Cobc-Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ IF S-NOTRUNC NOT = ' '
+ STRING '-fnotrunc '
+ DELIMITED SIZE INTO Cobc-Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ IF S-TRACEALL NOT = ' '
+GC0809 STRING '-ftraceall '
+ DELIMITED SIZE INTO Cobc-Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ IF S-TRACE NOT = ' '
+ STRING '-ftrace '
+ DELIMITED SIZE INTO Cobc-Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+
+GC0709 IF S-EXTRA > SPACES
+GC0709 STRING ' '
+GC0709 TRIM(S-Extra,TRAILING)
+GC0709 ' '
+GC0709 DELIMITED SIZE INTO Cobc-Cmd
+GC0709 WITH POINTER I
+GC0709 END-STRING
+GC0709 END-IF
+GC0909 STRING TRIM(Prog-File-Name,TRAILING)
+GC0909 DELIMITED SIZE INTO Cobc-Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+ .
+
+ 213-Run-Compiler.
+GC0410 MOVE ' Compiling...' TO Output-Message
+GC0410 DISPLAY
+GC0410 Switches-Screen
+GC0410 END-DISPLAY
+GC0609 SET 88-Output-File-Avail TO TRUE
+ MOVE SPACES TO Cmd
+ STRING TRIM(Cobc-Cmd,TRAILING)
+ ' 2>'
+ TRIM(Cobc-Output-File,TRAILING)
+ DELIMITED SIZE
+ INTO Cmd
+ END-STRING
+ CALL 'SYSTEM'
+ USING TRIM(Cmd,TRAILING)
+ END-CALL
+GC0909 IF RETURN-CODE = 0
+GC0909 SET 88-Compile-OK TO TRUE
+GC0909 ELSE
+GC0909 SET 88-Compile-Failed TO TRUE
+GC0909 END-IF
+GC0909 IF 88-Compile-OK
+GC0909 OPEN INPUT Cobc-Output
+GC0909 READ Cobc-Output
+GC0909 AT END
+GC0909 CONTINUE
+GC0909 NOT AT END
+GC0909 SET 88-Compile-OK-Warn TO TRUE
+GC0909 END-READ
+GC0909 CLOSE Cobc-Output
+GC0909 END-IF
+GC0909 MOVE SPACES TO Output-Message
+ IF 88-Compile-OK
+GC0909 MOVE ' Compilation Was Successful' TO Output-Message
+GC0909 DISPLAY
+GC0909 Switches-Screen
+GC0909 END-DISPLAY
+GC0909 CALL 'C$SLEEP'
+GC0909 USING 2
+GC0909 END-CALL
+GC0909 MOVE SPACES TO Output-Message
+GC0609 SET 88-Complete TO TRUE
+ ELSE
+GC0909 DISPLAY
+GC0909 Blank-Screen
+GC0909 END-DISPLAY
+GC0909 IF 88-Compile-OK-Warn
+GC0909 DISPLAY ' Compilation was successful, but ' &
+GC0909 'warnings were generated:'
+SCROLL* AT LINE 24 COLUMN 1
+SCROLL* WITH SCROLL UP 1 LINE
+GC0909 END-DISPLAY
+GC0909 ELSE
+GC0909 DISPLAY 'Compilation Failed:'
+SCROLL* AT LINE 24 COLUMN 1
+SCROLL* WITH SCROLL UP 1 LINE
+GC0909 END-DISPLAY
+GC0909 END-IF
+GC0609 SET 88-Compile-Failed TO TRUE
+GC0609 SET 88-Complete TO TRUE
+GC0909 DISPLAY ' '
+SCROLL* AT LINE 24 COLUMN 1
+SCROLL* WITH SCROLL UP 1 LINE
+GC0909 END-DISPLAY
+GC0909 OPEN INPUT Cobc-Output
+GC0909 PERFORM FOREVER
+GC0909 READ Cobc-Output AT END
+GC0909 EXIT PERFORM
+GC0909 END-READ
+GC0909 DISPLAY TRIM(Cobc-Output-Rec,TRAILING)
+SCROLL* AT LINE 24 COLUMN 1
+SCROLL* WITH SCROLL UP 1 LINE
+GC0909 END-DISPLAY
+GC0909 END-PERFORM
+GC0909 CLOSE Cobc-Output
+GC0909 DISPLAY ' '
+SCROLL* AT LINE 24 COLUMN 1
+SCROLL* WITH SCROLL UP 2 LINES
+GC0909 END-DISPLAY
+GC0909 DISPLAY 'Press ENTER to close:'
+SCROLL* AT LINE 24 COLUMN 1
+SCROLL* WITH SCROLL UP 1 LINE
+GC0909 END-DISPLAY
+GC0909 ACCEPT Dummy
+GC0909 FROM CONSOLE
+GC0909 END-ACCEPT
+GC0909 DISPLAY
+GC0909 Blank-Screen
+GC0909 END-DISPLAY
+ END-IF
+ .
+
+ 219-Done.
+ IF 88-Compile-Failed
+ PERFORM 900-Terminate
+ END-IF
+ .
+ /
+GC0410 220-Make-Listing SECTION.
+GC0410*****************************************************************
+GC0410** Generate a source and/or xref listing using XREF **
+GC0410*****************************************************************
+GC0410
+GC0410 221-Init.
+GC0410 MOVE ' Generating cross-reference listing...'
+GC0410 TO Output-Message
+GC0410 DISPLAY
+GC0410 Switches-Screen
+GC0410 END-DISPLAY
+GC0410 CALL "CBL_DELETE_FILE"
+GC0410 USING CONCATENATE(TRIM(Prog-Name,Trailing),".lst")
+GC0410 END-CALL
+GC0410 MOVE 0 TO RETURN-CODE
+GC0410 .
+GC0410
+GC0410 213-Run-OCXref.
+GC0410 MOVE SPACES TO Output-Message
+GC0410 CALL 'LISTING'
+GC0410 USING S-SOURCE
+GC0410 S-XREF
+GC0410 File-Name
+GC0410 ON EXCEPTION
+GC0410 MOVE ' LISTING module is not available'
+GC0410 TO Output-Message
+GC0410 MOVE 1 TO RETURN-CODE
+GC0410 END-CALL
+GC0410 IF RETURN-CODE = 0
+GC0410 MOVE ' Listing generated'
+GC0410 TO Output-Message
+GC0410 IF OS-Windows OR OS-Cygwin
+GC0410 MOVE SPACES TO Cmd
+GC0410 STRING
+GC0410 'cmd /c '
+GC0410 TRIM(Prog-Name,TRAILING)
+GC0410 '.lst'
+GC0410 DELIMITED SIZE INTO Cmd
+GC0410 END-STRING
+GC0410 CALL 'SYSTEM'
+GC0410 USING TRIM(Cmd,TRAILING)
+GC0410 END-CALL
+GC0410 END-IF
+GC0410 ELSE
+GC0410 IF Output-Message = SPACES
+GC0410 MOVE ' Listing generation failed'
+GC0410 TO Output-Message
+GC0410 END-IF
+GC0410 END-IF
+GC0410 DISPLAY
+GC0410 Switches-Screen
+GC0410 END-DISPLAY
+GC0410 CALL 'C$SLEEP'
+GC0410 USING 2
+GC0410 END-CALL
+GC0410 .
+ /
+ 230-Run-Program SECTION.
+ *****************************************************************
+ ** Run the compiled program **
+ *****************************************************************
+
+ 232-Build-Command.
+GC0909 MOVE SPACES TO Cmd
+GC0909 MOVE 1 TO I
+ IF S-SUBROUTINE NOT = ' '
+ OR S-DLL NOT = ' '
+ STRING 'cobcrun ' DELIMITED SIZE
+ INTO Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ IF Prog-Folder NOT = SPACES
+GC0909 IF OS-Cygwin AND Prog-Folder (2:1) = ':'
+GC0909 STRING '/cygdrive/'
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 STRING LOWER-CASE(Prog-Folder (1:1))
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 PERFORM VARYING J FROM 3 BY 1
+GC0909 UNTIL J > LENGTH(TRIM(Prog-Folder))
+GC0909 IF Prog-Folder (J:1) = '\'
+GC0909 STRING '/'
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 ELSE
+GC0909 STRING Prog-Folder (J:1)
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 END-IF
+GC0909 END-PERFORM
+GC0909 ELSE
+GC0410 STRING '"' TRIM(Prog-Folder,TRAILING)
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 END-IF
+GC0909 STRING Dir-Char
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 ELSE
+GC0909 IF OS-Cygwin OR OS-UNIX
+GC0909 STRING './'
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 END-IF
+ END-IF
+GC0909 STRING TRIM(Prog-Name,TRAILING)
+GC0909 INTO Cmd
+GC0909 WITH POINTER I
+GC0909 END-STRING
+GC0909 IF S-SUBROUTINE = ' '
+GC0909 AND S-DLL NOT = ' '
+GC0909 STRING '.exe' DELIMITED SIZE
+ INTO Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ IF S-ARGS NOT = SPACES
+GC0809 STRING ' ' TRIM(S-ARGS,TRAILING)
+ INTO Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ IF OS-Unknown OR OS-Windows
+GC0410 STRING '"&&pause'
+ INTO Cmd
+ WITH POINTER I
+ END-STRING
+ ELSE
+ STRING ';echo "Press ENTER to close...";read'
+ INTO Cmd
+ WITH POINTER I
+ END-STRING
+ END-IF
+ .
+
+ 233-Run-Program.
+GC0909 DISPLAY
+GC0909 Blank-Screen
+GC0909 END-DISPLAY
+
+ CALL 'SYSTEM'
+ USING TRIM(Cmd,TRAILING)
+ END-CALL
+ PERFORM 900-Terminate
+ .
+
+ 239-Done.
+ EXIT.
+ /
+ 900-Terminate SECTION.
+ *****************************************************************
+ ** Display a message and halt the program **
+ *****************************************************************
+
+ 901-Display-Message.
+GC0909 IF Output-Message > SPACES
+GC0909 DISPLAY
+GC0909 Switches-Screen
+GC0909 END-DISPLAY
+GC0909 CALL 'C$SLEEP'
+GC0909 USING 2
+GC0909 END-CALL
+GC0909 END-IF
+ DISPLAY
+ Blank-Screen
+ END-DISPLAY
+ .
+
+ 909-Done.
+ GOBACK
+ .
+
+ END PROGRAM OCic.
+
+ IDENTIFICATION DIVISION.
+ PROGRAM-ID. GETOSTYPE.
+ *****************************************************************
+ ** This subprogram determine the OS type the program is run- **
+ ** ning under, passing that result back in RETURN-CODE as fol- **
+ ** lows: **
+ ** **
+ ** 0: Cannot be determined **
+ ** 1: Native Windows or Windows/MinGW **
+ ** 2: Cygwin **
+ ** 3: UNIX/Linux/MacOS **
+ *****************************************************************
+ ** DATE CHANGE DESCRIPTION **
+ ** ====== ==================================================== **
+ ** GC0909 Initial coding. **
+ *****************************************************************
+ ENVIRONMENT DIVISION.
+ CONFIGURATION SECTION.
+ REPOSITORY.
+ FUNCTION ALL INTRINSIC.
+ DATA DIVISION.
+ WORKING-STORAGE SECTION.
+ 01 Env-Path PIC X(1024).
+ 01 Tally USAGE BINARY-LONG.
+ PROCEDURE DIVISION.
+ 000-Main SECTION.
+ 010-Get-TEMP-Var.
+ MOVE SPACES TO Env-Path
+ ACCEPT Env-Path
+ FROM ENVIRONMENT "PATH"
+ ON EXCEPTION
+ MOVE 0 TO RETURN-CODE
+ GOBACK
+ END-ACCEPT
+ IF Env-Path = SPACES
+ MOVE 0 TO RETURN-CODE
+ ELSE
+ MOVE 0 TO Tally
+ INSPECT Env-Path
+ TALLYING Tally FOR ALL ";"
+ IF Tally = 0 *> Must be some form of UNIX
+ MOVE 0 TO Tally
+ INSPECT Env-Path
+ TALLYING TALLY FOR ALL "/cygdrive/"
+ IF Tally = 0 *> UNIX/MacOS
+ MOVE 3 TO RETURN-CODE
+ ELSE *> Cygwin
+ MOVE 2 TO RETURN-CODE
+ END-IF
+ ELSE *> Assume Windows[/MinGW]
+ MOVE 1 TO RETURN-CODE
+ END-IF
+ END-IF
+ GOBACK
+ .
+ END PROGRAM GETOSTYPE.
+
+ IDENTIFICATION DIVISION.
+ PROGRAM-ID. CHECKSOURCE.
+ *****************************************************************
+ ** This subprogram will scan a line of source code it is given **
+ ** looking for "LINKAGE SECTION" or "IDENTIFICATION DIVISION". **
+ ** **
+ ** ****NOTE**** ****NOTE**** ****NOTE**** ****NOTE*** **
+ ** **
+ ** These two strings must be found IN THEIR ENTIRETY within **
+ ** the 1st 80 columns of program source records, and cannot **
+ ** follow either a "*>" sequence OR a "*" in col 7. **
+ *****************************************************************
+ ** DATE CHANGE DESCRIPTION **
+ ** ====== ==================================================== **
+ ** GC0809 Initial coding. **
+ *****************************************************************
+ ENVIRONMENT DIVISION.
+ CONFIGURATION SECTION.
+ REPOSITORY.
+ FUNCTION ALL INTRINSIC.
+ DATA DIVISION.
+ WORKING-STORAGE SECTION.
+ 01 Compressed-Src.
+ 05 CS-Char OCCURS 80 TIMES PIC X(1).
+
+ 01 Flags.
+ 05 F-Found-SPACE PIC X(1).
+ 88 88-Skipping-SPACE VALUE 'Y'.
+ 88 88-Not-Skipping-SPACE VALUE 'N'.
+
+ 01 I USAGE BINARY-CHAR.
+
+ 01 J USAGE BINARY-CHAR.
+ LINKAGE SECTION.
+ 01 Argument-1.
+ 02 A1-Char OCCURS 80 TIMES PIC X(1).
+
+ 01 Argument-2 PIC X(1).
+ 88 88-A2-LINKAGE-SECTION VALUE 'L'.
+ 88 88-A2-IDENTIFICATION-DIVISION VALUE 'I'.
+ 88 88-A2-Nothing-Special VALUE ' '.
+ PROCEDURE DIVISION USING Argument-1, Argument-2.
+ 000-Main SECTION.
+
+ 010-Initialize.
+ SET 88-A2-Nothing-Special TO TRUE
+ IF A1-Char (7) = '*'
+ GOBACK
+ END-IF
+ .
+
+ 020-Compress-Multiple-SPACES.
+ SET 88-Not-Skipping-SPACE TO TRUE
+ MOVE 0 TO J
+ MOVE SPACES TO Compressed-Src
+ PERFORM VARYING I FROM 1 BY 1
+ UNTIL I > 80
+ IF A1-Char (I) = SPACE
+ IF 88-Not-Skipping-SPACE
+ ADD 1 TO J
+ MOVE UPPER-CASE(A1-Char (I)) TO CS-Char (J)
+ SET 88-Skipping-SPACE TO TRUE
+ END-IF
+ ELSE
+ SET 88-Not-Skipping-SPACE TO TRUE
+ ADD 1 TO J
+ MOVE A1-Char (I) TO CS-Char (J)
+ END-IF
+ END-PERFORM
+ .
+
+ 030-Scan-Compressed-Src.
+ PERFORM VARYING I FROM 1 BY 1
+ UNTIL I > 66
+ EVALUATE TRUE
+ WHEN CS-Char (I) = '*'
+ IF Compressed-Src (I : 2) = '*>'
+ GOBACK
+ END-IF
+ WHEN (CS-Char (I) = 'L') AND (I < 66)
+ IF Compressed-Src (I : 15) = 'LINKAGE SECTION'
+ SET 88-A2-LINKAGE-SECTION TO TRUE
+ GOBACK
+ END-IF
+ WHEN (CS-Char (I) = 'I') AND (I < 58)
+ IF Compressed-Src (I : 23) = 'IDENTIFICATION ' &
+ 'DIVISION'
+ SET 88-A2-IDENTIFICATION-DIVISION TO TRUE
+ GOBACK
+ END-IF
+ END-EVALUATE
+ END-PERFORM
+ .
+
+ 099-Never-Found-Either-One.
+ GOBACK
+ .
+ END PROGRAM CHECKSOURCE.
+
+ IDENTIFICATION DIVISION.
+ PROGRAM-ID. LISTING.
+ *****************************************************************
+ ** This subprogram generates a cross-reference listing of an **
+ ** OpenCOBOL program. **
+ ** **
+ ** Linkage: CALL "LISTING" USING <source> **
+ ** <xref> **
+ ** <filename> **
+ ** **
+ ** Where: **
+ ** <source> is a PIC X(1) flag indicating **
+ ** whether or not a source listing **
+ ** should be produced (space=NO, **
+ ** non-space=yes) **
+ ** <xref> is a PIC X(1) flag indicating **
+ ** whether or not an xref listing **
+ ** should be produced (space=NO, **
+ ** non-space=yes) **
+ ** <filename> is the [path]filename of the **
+ ** program being listed and/or **
+ ** xreffed in a PIC X(256) form. **
+ *****************************************************************
+ ** **
+ ** AUTHOR: GARY L. CUTLER **
+ ** CutlerGL@gmail.com **
+ ** Copyright (C) 2010, Gary L. Cutler, GPL **
+ ** **
+ ** DATE-WRITTEN: April 1, 2010 **
+ ** **
+ *****************************************************************
+ ** DATE CHANGE DESCRIPTION **
+ ** ====== ==================================================== **
+ ** GC0410 Initial coding **
+ ** GC0710 Handle duplicate data names (i.e. "CORRESPONDING" or **
+ ** qualified items) better; ignore "END PROGRAM" recs **
+ ** so program name doesn't appear in listing. **
+ *****************************************************************
+ ENVIRONMENT DIVISION.
+ CONFIGURATION SECTION.
+ REPOSITORY.
+ FUNCTION ALL INTRINSIC.
+ INPUT-OUTPUT SECTION.
+ FILE-CONTROL.
+ SELECT Expand-Code ASSIGN TO Expanded-Src-Filename
+ ORGANIZATION IS LINE SEQUENTIAL.
+ SELECT Report-File ASSIGN TO Report-Filename
+ ORGANIZATION IS LINE SEQUENTIAL.
+ SELECT Sort-File ASSIGN TO DISK.
+ SELECT Source-Code ASSIGN TO Src-Filename
+ ORGANIZATION IS LINE SEQUENTIAL.
+ DATA DIVISION.
+ FILE SECTION.
+ FD Expand-Code.
+ 01 Expand-Code-Rec.
+ 05 ECR-1 PIC X.
+ 05 ECR-2-256 PIC X(256).
+ 01 Expand-Code-Rec-Alt.
+ 05 ECR-1-128 PIC X(128).
+ 05 ECR-129-256 PIC X(128).
+
+ FD Report-File.
+ 01 Report-Rec PIC X(135).
+
+ SD Sort-File.
+ 01 Sort-Rec.
+ 05 SR-Prog-ID PIC X(15).
+ 05 SR-Token-UC PIC X(32).
+ 05 SR-Token PIC X(32).
+ 05 SR-Section PIC X(15).
+ 05 SR-Line-No-Def PIC 9(6).
+ 05 SR-Reference.
+ 10 SR-Line-No-Ref PIC 9(6).
+ 10 SR-Ref-Flag PIC X(1).
+
+ FD Source-Code.
+ 01 Source-Code-Rec.
+GC0410 05 SCR-1-128.
+GC0410 10 FILLER PIC X(6).
+GC0410 10 SCR-7 PIC X(1).
+GC0410 10 FILLER PIC X(121).
+ 05 SCR-129-256 PIC X(128).
+
+ WORKING-STORAGE SECTION.
+ 78 Line-Nos-Per-Rec VALUE 8.
+
+ 01 Cmd PIC X(256).
+
+ 01 Delim PIC X(2).
+
+ 01 Detail-Line-S.
+ 05 DLS-Line-No PIC ZZZZZ9.
+ 05 FILLER PIC X(1).
+ 05 DLS-Statement PIC X(128).
+
+ 01 Detail-Line-X.
+ 05 DLX-Prog-ID PIC X(15).
+ 05 FILLER PIC X(1).
+ 05 DLX-Token PIC X(32).
+ 05 FILLER PIC X(1).
+ 05 DLX-Line-No-Def PIC ZZZZZ9.
+ 05 FILLER PIC X(1).
+ 05 DLX-Section PIC X(15).
+ 05 FILLER PIC X(1).
+ 05 DLX-Reference OCCURS Line-Nos-Per-Rec TIMES.
+ 10 DLX-Line-No-Ref PIC ZZZZZ9.
+ 10 DLX-Ref-Flag PIC X(1).
+ 10 FILLER PIC X(1).
+
+ 01 Dummy PIC X(1).
+
+ 01 Env-TEMP PIC X(256).
+
+ 01 Expanded-Src-Filename PIC X(256).
+
+ 01 Filename PIC X(256).
+
+ 01 Flags.
+GC0710 05 F-Duplicate PIC X(1).
+ 05 F-First-Record PIC X(1).
+ 05 F-In-Which-Pgm PIC X(1).
+ 88 In-Main-Module VALUE 'M'.
+ 88 In-Copybook VALUE 'C'.
+ 05 F-Last-Token-Ended-Sent PIC X(1).
+ 05 F-Processing-PICTURE PIC X(1).
+ 05 F-Token-Ended-Sentence PIC X(1).
+GC0710 05 F-Verb-Has-Been-Found PIC X(1).
+
+ 01 Group-Indicators.
+ 05 GI-Prog-ID PIC X(15).
+ 05 GI-Token PIC X(32).
+
+ 01 Heading-1S.
+ 05 FILLER PIC X(125) VALUE
+ "OpenCOBOL 1.1 06FEB2009 Source Listing - " &
+ "OCic Copyright (C) 2009-2010, Gary L. Cutler, GPL".
+ 05 H1S-Date PIC 9999/99/99.
+
+ 01 Heading-1X.
+ 05 FILLER PIC X(125) VALUE
+ "OpenCOBOL 1.1 06FEB2009 Cross-Reference Listing - " &
+ "OCic Copyright (C) 2009-2010, Gary L. Cutler, GPL".
+ 05 H1X-Date PIC 9999/99/99.
+
+ 01 Heading-2 PIC X(135).
+
+ 01 Heading-4S PIC X(16) VALUE
+ "Line Statement".
+
+ 01 Heading-4X PIC X(96) VALUE
+ "PROGRAM-ID Identifier/Register/Function Defn Wher
+ - "e Defined References (* = Updated)".
+
+ 01 Heading-5S PIC X(135) VALUE
+ "====== =====================================================
+ - "============================================================
+ - "===============".
+
+ 01 Heading-5X PIC X(135) VALUE
+ "=============== ================================ ====== ====
+ - "=========== ================================================
+ - "===============".
+
+ 01 Held-Reference PIC X(100).
+
+ 01 I USAGE BINARY-LONG.
+
+ 01 J USAGE BINARY-LONG.
+
+ 01 Lines-Left USAGE BINARY-LONG.
+
+ 01 Lines-Per-Page USAGE BINARY-LONG.
+
+ 01 Lines-Per-Page-ENV PIC X(256).
+
+ 01 Num-UserNames USAGE BINARY-LONG.
+
+ 01 PIC-X10 PIC X(10).
+
+ 01 PIC-X32 PIC X(32).
+
+ 01 PIC-X256 PIC X(256).
+
+ 01 Program-Path PIC X(256).
+
+ 01 Report-Filename PIC X(256).
+
+ 01 Reserved-Words.
+ 05 FILLER PIC X(33) VALUE "IABS".
+ 05 FILLER PIC X(33) VALUE "VACCEPT".
+ 05 FILLER PIC X(33) VALUE " ACCESS".
+ 05 FILLER PIC X(33) VALUE "IACOS".
+ 05 FILLER PIC X(33) VALUE " ACTIVE-CLASS".
+ 05 FILLER PIC X(33) VALUE "VADD".
+ 05 FILLER PIC X(33) VALUE " ADDRESS".
+ 05 FILLER PIC X(33) VALUE " ADVANCING".
+ 05 FILLER PIC X(33) VALUE "KAFTER".
+ 05 FILLER PIC X(33) VALUE " ALIGNED".
+ 05 FILLER PIC X(33) VALUE " ALL".
+ 05 FILLER PIC X(33) VALUE "VALLOCATE".
+ 05 FILLER PIC X(33) VALUE " ALPHABET".
+ 05 FILLER PIC X(33) VALUE " ALPHABETIC".
+ 05 FILLER PIC X(33) VALUE " ALPHABETIC-LOWER".
+ 05 FILLER PIC X(33) VALUE " ALPHABETIC-UPPER".
+ 05 FILLER PIC X(33) VALUE " ALPHANUMERIC".
+ 05 FILLER PIC X(33) VALUE " ALPHANUMERIC-EDITED".
+ 05 FILLER PIC X(33) VALUE " ALSO".
+ 05 FILLER PIC X(33) VALUE "VALTER".
+ 05 FILLER PIC X(33) VALUE " ALTERNATE".
+ 05 FILLER PIC X(33) VALUE " AND".
+ 05 FILLER PIC X(33) VALUE "IANNUITY".
+ 05 FILLER PIC X(33) VALUE " ANY".
+ 05 FILLER PIC X(33) VALUE " ANYCASE".
+ 05 FILLER PIC X(33) VALUE " ARE".
+ 05 FILLER PIC X(33) VALUE " AREA".
+ 05 FILLER PIC X(33) VALUE " AREAS".
+ 05 FILLER PIC X(33) VALUE " ARGUMENT-NUMBER".
+ 05 FILLER PIC X(33) VALUE " ARGUMENT-VALUE".
+ 05 FILLER PIC X(33) VALUE " AS".
+ 05 FILLER PIC X(33) VALUE " ASCENDING".
+ 05 FILLER PIC X(33) VALUE "IASIN".
+ 05 FILLER PIC X(33) VALUE " ASSIGN".
+ 05 FILLER PIC X(33) VALUE " AT".
+ 05 FILLER PIC X(33) VALUE "IATAN".
+ 05 FILLER PIC X(33) VALUE " AUTHOR".
+ 05 FILLER PIC X(33) VALUE " AUTO".
+ 05 FILLER PIC X(33) VALUE " AUTO-SKIP".
+ 05 FILLER PIC X(33) VALUE " AUTOMATIC".
+ 05 FILLER PIC X(33) VALUE " AUTOTERMINATE".
+ 05 FILLER PIC X(33) VALUE " BACKGROUND-COLOR".
+ 05 FILLER PIC X(33) VALUE " BASED".
+ 05 FILLER PIC X(33) VALUE " BEEP".
+ 05 FILLER PIC X(33) VALUE " BEFORE".
+ 05 FILLER PIC X(33) VALUE " BELL".
+ 05 FILLER PIC X(33) VALUE " BINARY".
+ 05 FILLER PIC X(33) VALUE " BINARY-C-LONG".
+ 05 FILLER PIC X(33) VALUE " BINARY-CHAR".
+ 05 FILLER PIC X(33) VALUE " BINARY-DOUBLE".
+ 05 FILLER PIC X(33) VALUE " BINARY-LONG".
+ 05 FILLER PIC X(33) VALUE " BINARY-SHORT".
+ 05 FILLER PIC X(33) VALUE " BIT".
+ 05 FILLER PIC X(33) VALUE " BLANK".
+ 05 FILLER PIC X(33) VALUE " BLINK".
+ 05 FILLER PIC X(33) VALUE " BLOCK".
+ 05 FILLER PIC X(33) VALUE " BOOLEAN".
+ 05 FILLER PIC X(33) VALUE " BOTTOM".
+ 05 FILLER PIC X(33) VALUE "YBY".
+ 05 FILLER PIC X(33) VALUE "IBYTE-LENGTH".
+ 05 FILLER PIC X(33) VALUE "MC01".
+ 05 FILLER PIC X(33) VALUE "MC02".
+ 05 FILLER PIC X(33) VALUE "MC03".
+ 05 FILLER PIC X(33) VALUE "MC04".
+ 05 FILLER PIC X(33) VALUE "MC05".
+ 05 FILLER PIC X(33) VALUE "MC06".
+ 05 FILLER PIC X(33) VALUE "MC07".
+ 05 FILLER PIC X(33) VALUE "MC08".
+ 05 FILLER PIC X(33) VALUE "MC09".
+ 05 FILLER PIC X(33) VALUE "MC10".
+ 05 FILLER PIC X(33) VALUE "MC11".
+ 05 FILLER PIC X(33) VALUE "MC12".
+ 05 FILLER PIC X(33) VALUE "VCALL".
+ 05 FILLER PIC X(33) VALUE "VCANCEL".
+ 05 FILLER PIC X(33) VALUE " CF".
+ 05 FILLER PIC X(33) VALUE " CH".
+ 05 FILLER PIC X(33) VALUE " CHAINING".
+ 05 FILLER PIC X(33) VALUE "ICHAR".
+ 05 FILLER PIC X(33) VALUE " CHARACTER".
+ 05 FILLER PIC X(33) VALUE " CHARACTERS".
+ 05 FILLER PIC X(33) VALUE " CLASS".
+ 05 FILLER PIC X(33) VALUE " CLASS-ID".
+ 05 FILLER PIC X(33) VALUE "VCLOSE".
+ 05 FILLER PIC X(33) VALUE "ICOB-CRT-STATUS".
+ 05 FILLER PIC X(33) VALUE " CODE".
+ 05 FILLER PIC X(33) VALUE " CODE-SET".
+ 05 FILLER PIC X(33) VALUE " COL".
+ 05 FILLER PIC X(33) VALUE " COLLATING".
+ 05 FILLER PIC X(33) VALUE " COLS".
+ 05 FILLER PIC X(33) VALUE " COLUMN".
+ 05 FILLER PIC X(33) VALUE " COLUMNS".
+ 05 FILLER PIC X(33) VALUE "ICOMBINED-DATETIME".
+ 05 FILLER PIC X(33) VALUE " COMMA".
+ 05 FILLER PIC X(33) VALUE " COMMAND-LINE".
+ 05 FILLER PIC X(33) VALUE "VCOMMIT".
+ 05 FILLER PIC X(33) VALUE " COMMON".
+ 05 FILLER PIC X(33) VALUE " COMP".
+ 05 FILLER PIC X(33) VALUE " COMP-1".
+ 05 FILLER PIC X(33) VALUE " COMP-2".
+ 05 FILLER PIC X(33) VALUE " COMP-3".
+ 05 FILLER PIC X(33) VALUE " COMP-4".
+ 05 FILLER PIC X(33) VALUE " COMP-5".
+ 05 FILLER PIC X(33) VALUE " COMP-X".
+ 05 FILLER PIC X(33) VALUE " COMPUTATIONAL".
+ 05 FILLER PIC X(33) VALUE " COMPUTATIONAL-1".
+ 05 FILLER PIC X(33) VALUE " COMPUTATIONAL-2".
+ 05 FILLER PIC X(33) VALUE " COMPUTATIONAL-3".
+ 05 FILLER PIC X(33) VALUE " COMPUTATIONAL-4".
+ 05 FILLER PIC X(33) VALUE " COMPUTATIONAL-5".
+ 05 FILLER PIC X(33) VALUE " COMPUTATIONAL-X".
+ 05 FILLER PIC X(33) VALUE "VCOMPUTE".
+ 05 FILLER PIC X(33) VALUE "ICONCATENATE".
+ 05 FILLER PIC X(33) VALUE " CONDITION".
+ 05 FILLER PIC X(33) VALUE "KCONFIGURATION".
+ 05 FILLER PIC X(33) VALUE "MCONSOLE".
+ 05 FILLER PIC X(33) VALUE " CONSTANT".
+ 05 FILLER PIC X(33) VALUE " CONTAINS".
+ 05 FILLER PIC X(33) VALUE " CONTENT".
+ 05 FILLER PIC X(33) VALUE "VCONTINUE".
+ 05 FILLER PIC X(33) VALUE " CONTROL".
+ 05 FILLER PIC X(33) VALUE " CONTROLS".
+ 05 FILLER PIC X(33) VALUE "KCONVERTING".
+ 05 FILLER PIC X(33) VALUE " COPY".
+ 05 FILLER PIC X(33) VALUE " CORR".
+ 05 FILLER PIC X(33) VALUE " CORRESPONDING".
+ 05 FILLER PIC X(33) VALUE "ICOS".
+ 05 FILLER PIC X(33) VALUE "KCOUNT".
+ 05 FILLER PIC X(33) VALUE " CRT".
+ 05 FILLER PIC X(33) VALUE " CURRENCY".
+ 05 FILLER PIC X(33) VALUE "ICURRENT-DATE".
+ 05 FILLER PIC X(33) VALUE " CURSOR".
+ 05 FILLER PIC X(33) VALUE " CYCLE".
+ 05 FILLER PIC X(33) VALUE "KDATA".
+ 05 FILLER PIC X(33) VALUE " DATA-POINTER".
+ 05 FILLER PIC X(33) VALUE " DATE".
+ 05 FILLER PIC X(33) VALUE " DATE-COMPILED".
+ 05 FILLER PIC X(33) VALUE " DATE-MODIFIED".
+ 05 FILLER PIC X(33) VALUE "IDATE-OF-INTEGER".
+ 05 FILLER PIC X(33) VALUE "IDATE-TO-YYYYMMDD".
+ 05 FILLER PIC X(33) VALUE " DATE-WRITTEN".
+ 05 FILLER PIC X(33) VALUE " DAY".
+ 05 FILLER PIC X(33) VALUE "IDAY-OF-INTEGER".
+ 05 FILLER PIC X(33) VALUE " DAY-OF-WEEK".
+ 05 FILLER PIC X(33) VALUE "IDAY-TO-YYYYDDD".
+ 05 FILLER PIC X(33) VALUE " DE".
+ 05 FILLER PIC X(33) VALUE " DEBUGGING".
+ 05 FILLER PIC X(33) VALUE " DECIMAL-POINT".
+ 05 FILLER PIC X(33) VALUE " DECLARATIVES".
+ 05 FILLER PIC X(33) VALUE " DEFAULT".
+ 05 FILLER PIC X(33) VALUE "VDELETE".
+ 05 FILLER PIC X(33) VALUE " DELIMITED".
+ 05 FILLER PIC X(33) VALUE "KDELIMITER".
+ 05 FILLER PIC X(33) VALUE " DEPENDING".
+ 05 FILLER PIC X(33) VALUE " DESCENDING".
+ 05 FILLER PIC X(33) VALUE " DESTINATION".
+ 05 FILLER PIC X(33) VALUE " DETAIL".
+ 05 FILLER PIC X(33) VALUE " DISABLE".
+ 05 FILLER PIC X(33) VALUE " DISK".
+ 05 FILLER PIC X(33) VALUE "VDISPLAY".
+ 05 FILLER PIC X(33) VALUE "VDIVIDE".
+ 05 FILLER PIC X(33) VALUE "KDIVISION".
+ 05 FILLER PIC X(33) VALUE "KDOWN".
+ 05 FILLER PIC X(33) VALUE " DUPLICATES".
+ 05 FILLER PIC X(33) VALUE " DYNAMIC".
+ 05 FILLER PIC X(33) VALUE "IE".
+ 05 FILLER PIC X(33) VALUE " EBCDIC".
+ 05 FILLER PIC X(33) VALUE " EC".
+ 05 FILLER PIC X(33) VALUE "VELSE".
+GC0710 05 FILLER PIC X(33) VALUE "KEND".
+ 05 FILLER PIC X(33) VALUE " END-ACCEPT".
+ 05 FILLER PIC X(33) VALUE " END-ADD".
+ 05 FILLER PIC X(33) VALUE " END-CALL".
+ 05 FILLER PIC X(33) VALUE " END-COMPUTE".
+ 05 FILLER PIC X(33) VALUE " END-DELETE".
+ 05 FILLER PIC X(33) VALUE " END-DISPLAY".
+ 05 FILLER PIC X(33) VALUE " END-DIVIDE".
+ 05 FILLER PIC X(33) VALUE " END-EVALUATE".
+ 05 FILLER PIC X(33) VALUE " END-IF".
+ 05 FILLER PIC X(33) VALUE " END-MULTIPLY".
+ 05 FILLER PIC X(33) VALUE " END-OF-PAGE".
+ 05 FILLER PIC X(33) VALUE " END-PERFORM".
+ 05 FILLER PIC X(33) VALUE " END-READ".
+ 05 FILLER PIC X(33) VALUE " END-RETURN".
+ 05 FILLER PIC X(33) VALUE " END-REWRITE".
+ 05 FILLER PIC X(33) VALUE " END-SEARCH".
+ 05 FILLER PIC X(33) VALUE " END-START".
+ 05 FILLER PIC X(33) VALUE " END-STRING".
+ 05 FILLER PIC X(33) VALUE " END-SUBTRACT".
+ 05 FILLER PIC X(33) VALUE " END-UNSTRING".
+ 05 FILLER PIC X(33) VALUE " END-WRITE".
+ 05 FILLER PIC X(33) VALUE "VENTRY".
+ 05 FILLER PIC X(33) VALUE "KENVIRONMENT".
+ 05 FILLER PIC X(33) VALUE " ENVIRONMENT-NAME".
+ 05 FILLER PIC X(33) VALUE " ENVIRONMENT-VALUE".
+ 05 FILLER PIC X(33) VALUE " EO".
+ 05 FILLER PIC X(33) VALUE " EOL".
+ 05 FILLER PIC X(33) VALUE " EOP".
+ 05 FILLER PIC X(33) VALUE " EOS".
+ 05 FILLER PIC X(33) VALUE " EQUAL".
+ 05 FILLER PIC X(33) VALUE "KEQUALS".
+ 05 FILLER PIC X(33) VALUE " ERASE".
+ 05 FILLER PIC X(33) VALUE " ERROR".
+ 05 FILLER PIC X(33) VALUE " ESCAPE".
+ 05 FILLER PIC X(33) VALUE "VEVALUATE".
+ 05 FILLER PIC X(33) VALUE " EXCEPTION".
+ 05 FILLER PIC X(33) VALUE "IEXCEPTION-FILE".
+ 05 FILLER PIC X(33) VALUE "IEXCEPTION-LOCATION".
+ 05 FILLER PIC X(33) VALUE " EXCEPTION-OBJECT".
+ 05 FILLER PIC X(33) VALUE "IEXCEPTION-STATEMENT".
+ 05 FILLER PIC X(33) VALUE "IEXCEPTION-STATUS".
+ 05 FILLER PIC X(33) VALUE " EXCLUSIVE".
+ 05 FILLER PIC X(33) VALUE "VEXIT".
+ 05 FILLER PIC X(33) VALUE "IEXP".
+ 05 FILLER PIC X(33) VALUE "IEXP10".
+ 05 FILLER PIC X(33) VALUE " EXTEND".
+ 05 FILLER PIC X(33) VALUE " EXTERNAL".
+ 05 FILLER PIC X(33) VALUE "IFACTORIAL".
+ 05 FILLER PIC X(33) VALUE " FACTORY".
+ 05 FILLER PIC X(33) VALUE " FALSE".
+ 05 FILLER PIC X(33) VALUE "KFD".
+ 05 FILLER PIC X(33) VALUE "KFILE".
+ 05 FILLER PIC X(33) VALUE " FILE-CONTROL".
+ 05 FILLER PIC X(33) VALUE " FILE-ID".
+ 05 FILLER PIC X(33) VALUE " FILLER".
+ 05 FILLER PIC X(33) VALUE " FINAL".
+ 05 FILLER PIC X(33) VALUE " FIRST".
+ 05 FILLER PIC X(33) VALUE " FLOAT-BINARY-16".
+ 05 FILLER PIC X(33) VALUE " FLOAT-BINARY-34".
+ 05 FILLER PIC X(33) VALUE " FLOAT-BINARY-7".
+ 05 FILLER PIC X(33) VALUE " FLOAT-DECIMAL-16".
+ 05 FILLER PIC X(33) VALUE " FLOAT-DECIMAL-34".
+ 05 FILLER PIC X(33) VALUE " FLOAT-EXTENDED".
+ 05 FILLER PIC X(33) VALUE " FLOAT-LONG".
+ 05 FILLER PIC X(33) VALUE " FLOAT-SHORT".
+ 05 FILLER PIC X(33) VALUE " FOOTING".
+ 05 FILLER PIC X(33) VALUE " FOR".
+ 05 FILLER PIC X(33) VALUE " FOREGROUND-COLOR".
+ 05 FILLER PIC X(33) VALUE " FOREVER".
+ 05 FILLER PIC X(33) VALUE " FORMAT".
+ 05 FILLER PIC X(33) VALUE "MFORMFEED".
+ 05 FILLER PIC X(33) VALUE "IFRACTION-PART".
+ 05 FILLER PIC X(33) VALUE "VFREE".
+ 05 FILLER PIC X(33) VALUE " FROM".
+ 05 FILLER PIC X(33) VALUE " FULL".
+ 05 FILLER PIC X(33) VALUE " FUNCTION".
+ 05 FILLER PIC X(33) VALUE " FUNCTION-ID".
+ 05 FILLER PIC X(33) VALUE " FUNCTION-POINTER".
+ 05 FILLER PIC X(33) VALUE "VGENERATE".
+ 05 FILLER PIC X(33) VALUE " GET".
+ 05 FILLER PIC X(33) VALUE "KGIVING".
+ 05 FILLER PIC X(33) VALUE " GLOBAL".
+ 05 FILLER PIC X(33) VALUE "VGO".
+ 05 FILLER PIC X(33) VALUE "VGOBACK".
+ 05 FILLER PIC X(33) VALUE " GREATER".
+ 05 FILLER PIC X(33) VALUE " GROUP".
+ 05 FILLER PIC X(33) VALUE " GROUP-USAGE".
+ 05 FILLER PIC X(33) VALUE " HEADING".
+ 05 FILLER PIC X(33) VALUE " HIGH-VALUE".
+ 05 FILLER PIC X(33) VALUE " HIGH-VALUES".
+ 05 FILLER PIC X(33) VALUE " HIGHLIGHT".
+ 05 FILLER PIC X(33) VALUE " I-O".
+ 05 FILLER PIC X(33) VALUE " I-O-CONTROL".
+ 05 FILLER PIC X(33) VALUE "KID".
+ 05 FILLER PIC X(33) VALUE "KIDENTIFICATION".
+ 05 FILLER PIC X(33) VALUE "VIF".
+ 05 FILLER PIC X(33) VALUE " IGNORE".
+ 05 FILLER PIC X(33) VALUE " IGNORING".
+ 05 FILLER PIC X(33) VALUE " IN".
+ 05 FILLER PIC X(33) VALUE " INDEX".
+ 05 FILLER PIC X(33) VALUE "KINDEXED".
+ 05 FILLER PIC X(33) VALUE " INDICATE".
+ 05 FILLER PIC X(33) VALUE " INFINITY".
+ 05 FILLER PIC X(33) VALUE " INHERITS".
+ 05 FILLER PIC X(33) VALUE " INITIAL".
+ 05 FILLER PIC X(33) VALUE " INITIALISED".
+ 05 FILLER PIC X(33) VALUE "VINITIALIZE".
+ 05 FILLER PIC X(33) VALUE " INITIALIZED".
+ 05 FILLER PIC X(33) VALUE "VINITIATE".
+ 05 FILLER PIC X(33) VALUE " INPUT".
+ 05 FILLER PIC X(33) VALUE "KINPUT-OUTPUT".
+ 05 FILLER PIC X(33) VALUE "VINSPECT".
+ 05 FILLER PIC X(33) VALUE " INSTALLATION".
+ 05 FILLER PIC X(33) VALUE "IINTEGER".
+ 05 FILLER PIC X(33) VALUE "IINTEGER-OF-DATE".
+ 05 FILLER PIC X(33) VALUE "IINTEGER-OF-DAY".
+ 05 FILLER PIC X(33) VALUE "IINTEGER-PART".
+ 05 FILLER PIC X(33) VALUE " INTERFACE".
+ 05 FILLER PIC X(33) VALUE " INTERFACE-ID".
+ 05 FILLER PIC X(33) VALUE "KINTO".
+ 05 FILLER PIC X(33) VALUE " INTRINSIC".
+ 05 FILLER PIC X(33) VALUE " INVALID".
+ 05 FILLER PIC X(33) VALUE " INVOKE".
+ 05 FILLER PIC X(33) VALUE " IS".
+ 05 FILLER PIC X(33) VALUE " JUST".
+ 05 FILLER PIC X(33) VALUE " JUSTIFIED".
+ 05 FILLER PIC X(33) VALUE " KEY".
+ 05 FILLER PIC X(33) VALUE " LABEL".
+ 05 FILLER PIC X(33) VALUE " LAST".
+ 05 FILLER PIC X(33) VALUE " LEADING".
+ 05 FILLER PIC X(33) VALUE " LEFT".
+ 05 FILLER PIC X(33) VALUE " LEFT-JUSTIFY".
+ 05 FILLER PIC X(33) VALUE "ILENGTH".
+ 05 FILLER PIC X(33) VALUE " LESS".
+ 05 FILLER PIC X(33) VALUE " LIMIT".
+ 05 FILLER PIC X(33) VALUE " LIMITS".
+ 05 FILLER PIC X(33) VALUE " LINAGE".
+ 05 FILLER PIC X(33) VALUE "ILINAGE-COUNTER".
+ 05 FILLER PIC X(33) VALUE " LINE".
+ 05 FILLER PIC X(33) VALUE " LINE-COUNTER".
+ 05 FILLER PIC X(33) VALUE " LINES".
+ 05 FILLER PIC X(33) VALUE "KLINKAGE".
+ 05 FILLER PIC X(33) VALUE "KLOCAL-STORAGE".
+ 05 FILLER PIC X(33) VALUE " LOCALE".
+ 05 FILLER PIC X(33) VALUE "ILOCALE-DATE".
+ 05 FILLER PIC X(33) VALUE "ILOCALE-TIME".
+ 05 FILLER PIC X(33) VALUE "ILOCALE-TIME-FROM-SECONDS".
+ 05 FILLER PIC X(33) VALUE " LOCK".
+ 05 FILLER PIC X(33) VALUE "ILOG".
+ 05 FILLER PIC X(33) VALUE "ILOG10".
+ 05 FILLER PIC X(33) VALUE " LOW-VALUE".
+ 05 FILLER PIC X(33) VALUE " LOW-VALUES".
+ 05 FILLER PIC X(33) VALUE " LOWER".
+ 05 FILLER PIC X(33) VALUE "ILOWER-CASE".
+ 05 FILLER PIC X(33) VALUE " LOWLIGHT".
+ 05 FILLER PIC X(33) VALUE " MANUAL".
+ 05 FILLER PIC X(33) VALUE "IMAX".
+ 05 FILLER PIC X(33) VALUE "IMEAN".
+ 05 FILLER PIC X(33) VALUE "IMEDIAN".
+ 05 FILLER PIC X(33) VALUE " MEMORY".
+ 05 FILLER PIC X(33) VALUE "VMERGE".
+ 05 FILLER PIC X(33) VALUE " METHOD".
+ 05 FILLER PIC X(33) VALUE " METHOD-ID".
+ 05 FILLER PIC X(33) VALUE "IMIDRANGE".
+ 05 FILLER PIC X(33) VALUE "IMIN".
+ 05 FILLER PIC X(33) VALUE " MINUS".
+ 05 FILLER PIC X(33) VALUE "IMOD".
+ 05 FILLER PIC X(33) VALUE " MODE".
+ 05 FILLER PIC X(33) VALUE "VMOVE".
+ 05 FILLER PIC X(33) VALUE " MULTIPLE".
+ 05 FILLER PIC X(33) VALUE "VMULTIPLY".
+ 05 FILLER PIC X(33) VALUE " NATIONAL".
+ 05 FILLER PIC X(33) VALUE " NATIONAL-EDITED".
+ 05 FILLER PIC X(33) VALUE " NATIVE".
+ 05 FILLER PIC X(33) VALUE " NEGATIVE".
+ 05 FILLER PIC X(33) VALUE " NESTED".
+ 05 FILLER PIC X(33) VALUE "VNEXT".
+ 05 FILLER PIC X(33) VALUE " NO".
+ 05 FILLER PIC X(33) VALUE " NOT".
+ 05 FILLER PIC X(33) VALUE " NULL".
+ 05 FILLER PIC X(33) VALUE " NULLS".
+ 05 FILLER PIC X(33) VALUE " NUMBER".
+ 05 FILLER PIC X(33) VALUE "INUMBER-OF-CALL-PARAMETERS".
+ 05 FILLER PIC X(33) VALUE " NUMBERS".
+ 05 FILLER PIC X(33) VALUE " NUMERIC".
+ 05 FILLER PIC X(33) VALUE " NUMERIC-EDITED".
+ 05 FILLER PIC X(33) VALUE "INUMVAL".
+ 05 FILLER PIC X(33) VALUE "INUMVAL-C".
+ 05 FILLER PIC X(33) VALUE " OBJECT".
+ 05 FILLER PIC X(33) VALUE " OBJECT-COMPUTER".
+ 05 FILLER PIC X(33) VALUE " OBJECT-REFERENCE".
+ 05 FILLER PIC X(33) VALUE " OCCURS".
+ 05 FILLER PIC X(33) VALUE " OF".
+ 05 FILLER PIC X(33) VALUE " OFF".
+ 05 FILLER PIC X(33) VALUE " OMITTED".
+ 05 FILLER PIC X(33) VALUE " ON".
+ 05 FILLER PIC X(33) VALUE " ONLY".
+ 05 FILLER PIC X(33) VALUE "VOPEN".
+ 05 FILLER PIC X(33) VALUE " OPTIONAL".
+ 05 FILLER PIC X(33) VALUE " OPTIONS".
+ 05 FILLER PIC X(33) VALUE " OR".
+ 05 FILLER PIC X(33) VALUE "IORD".
+ 05 FILLER PIC X(33) VALUE "IORD-MAX".
+ 05 FILLER PIC X(33) VALUE "IORD-MIN".
+ 05 FILLER PIC X(33) VALUE " ORDER".
+ 05 FILLER PIC X(33) VALUE " ORGANIZATION".
+ 05 FILLER PIC X(33) VALUE " OTHER".
+ 05 FILLER PIC X(33) VALUE " OUTPUT".
+ 05 FILLER PIC X(33) VALUE " OVERFLOW".
+ 05 FILLER PIC X(33) VALUE " OVERLINE".
+ 05 FILLER PIC X(33) VALUE " OVERRIDE".
+ 05 FILLER PIC X(33) VALUE " PACKED-DECIMAL".
+ 05 FILLER PIC X(33) VALUE " PADDING".
+ 05 FILLER PIC X(33) VALUE " PAGE".
+ 05 FILLER PIC X(33) VALUE " PAGE-COUNTER".
+ 05 FILLER PIC X(33) VALUE " PARAGRAPH".
+ 05 FILLER PIC X(33) VALUE "VPERFORM".
+ 05 FILLER PIC X(33) VALUE " PF".
+ 05 FILLER PIC X(33) VALUE " PH".
+ 05 FILLER PIC X(33) VALUE "IPI".
+ 05 FILLER PIC X(33) VALUE "KPIC".
+ 05 FILLER PIC X(33) VALUE "KPICTURE".
+ 05 FILLER PIC X(33) VALUE " PLUS".
+ 05 FILLER PIC X(33) VALUE "KPOINTER".
+ 05 FILLER PIC X(33) VALUE " POSITION".
+ 05 FILLER PIC X(33) VALUE " POSITIVE".
+ 05 FILLER PIC X(33) VALUE " PRESENT".
+ 05 FILLER PIC X(33) VALUE "IPRESENT-VALUE".
+ 05 FILLER PIC X(33) VALUE " PREVIOUS".
+ 05 FILLER PIC X(33) VALUE "MPRINTER".
+ 05 FILLER PIC X(33) VALUE " PRINTING".
+ 05 FILLER PIC X(33) VALUE "KPROCEDURE".
+ 05 FILLER PIC X(33) VALUE " PROCEDURE-POINTER".
+ 05 FILLER PIC X(33) VALUE " PROCEDURES".
+ 05 FILLER PIC X(33) VALUE " PROCEED".
+ 05 FILLER PIC X(33) VALUE " PROGRAM".
+ 05 FILLER PIC X(33) VALUE "KPROGRAM-ID".
+ 05 FILLER PIC X(33) VALUE " PROGRAM-POINTER".
+ 05 FILLER PIC X(33) VALUE " PROMPT".
+ 05 FILLER PIC X(33) VALUE " PROPERTY".
+ 05 FILLER PIC X(33) VALUE " PROTOTYPE".
+ 05 FILLER PIC X(33) VALUE " QUOTE".
+ 05 FILLER PIC X(33) VALUE " QUOTES".
+ 05 FILLER PIC X(33) VALUE " RAISE".
+ 05 FILLER PIC X(33) VALUE " RAISING".
+ 05 FILLER PIC X(33) VALUE "IRANDOM".
+ 05 FILLER PIC X(33) VALUE "IRANGE".
+ 05 FILLER PIC X(33) VALUE " RD".
+ 05 FILLER PIC X(33) VALUE "VREAD".
+ 05 FILLER PIC X(33) VALUE "VREADY".
+ 05 FILLER PIC X(33) VALUE " RECORD".
+ 05 FILLER PIC X(33) VALUE " RECORDING".
+ 05 FILLER PIC X(33) VALUE " RECORDS".
+ 05 FILLER PIC X(33) VALUE " RECURSIVE".
+ 05 FILLER PIC X(33) VALUE "KREDEFINES".
+ 05 FILLER PIC X(33) VALUE " REEL".
+ 05 FILLER PIC X(33) VALUE " REFERENCE".
+ 05 FILLER PIC X(33) VALUE " RELATIVE".
+ 05 FILLER PIC X(33) VALUE "VRELEASE".
+ 05 FILLER PIC X(33) VALUE "IREM".
+ 05 FILLER PIC X(33) VALUE " REMAINDER".
+ 05 FILLER PIC X(33) VALUE " REMARKS".
+ 05 FILLER PIC X(33) VALUE " REMOVAL".
+ 05 FILLER PIC X(33) VALUE "KRENAMES".
+ 05 FILLER PIC X(33) VALUE "KREPLACING".
+ 05 FILLER PIC X(33) VALUE "KREPORT".
+ 05 FILLER PIC X(33) VALUE " REPORTING".
+ 05 FILLER PIC X(33) VALUE " REPORTS".
+ 05 FILLER PIC X(33) VALUE " REPOSITORY".
+ 05 FILLER PIC X(33) VALUE " REPRESENTS-NOT-A-NUMBER".
+ 05 FILLER PIC X(33) VALUE " REQUIRED".
+ 05 FILLER PIC X(33) VALUE " RESERVE".
+ 05 FILLER PIC X(33) VALUE " RESUME".
+ 05 FILLER PIC X(33) VALUE " RETRY".
+ 05 FILLER PIC X(33) VALUE "VRETURN".
+ 05 FILLER PIC X(33) VALUE "IRETURN-CODE".
+ 05 FILLER PIC X(33) VALUE "KRETURNING".
+ 05 FILLER PIC X(33) VALUE "IREVERSE".
+ 05 FILLER PIC X(33) VALUE " REVERSE-VIDEO".
+ 05 FILLER PIC X(33) VALUE " REWIND".
+ 05 FILLER PIC X(33) VALUE "VREWRITE".
+ 05 FILLER PIC X(33) VALUE " RF".
+ 05 FILLER PIC X(33) VALUE " RH".
+ 05 FILLER PIC X(33) VALUE " RIGHT".
+ 05 FILLER PIC X(33) VALUE " RIGHT-JUSTIFY".
+ 05 FILLER PIC X(33) VALUE "VROLLBACK".
+ 05 FILLER PIC X(33) VALUE " ROUNDED".
+ 05 FILLER PIC X(33) VALUE " RUN".
+ 05 FILLER PIC X(33) VALUE " SAME".
+ 05 FILLER PIC X(33) VALUE "KSCREEN".
+ 05 FILLER PIC X(33) VALUE " SCROLL".
+ 05 FILLER PIC X(33) VALUE "KSD".
+ 05 FILLER PIC X(33) VALUE "VSEARCH".
+ 05 FILLER PIC X(33) VALUE "ISECONDS-FROM-FORMATTED-TIME".
+ 05 FILLER PIC X(33) VALUE "ISECONDS-PAST-MIDNIGHT".
+ 05 FILLER PIC X(33) VALUE "KSECTION".
+ 05 FILLER PIC X(33) VALUE " SECURE".
+ 05 FILLER PIC X(33) VALUE " SECURITY".
+ 05 FILLER PIC X(33) VALUE " SEGMENT-LIMIT".
+ 05 FILLER PIC X(33) VALUE " SELECT".
+ 05 FILLER PIC X(33) VALUE " SELF".
+ 05 FILLER PIC X(33) VALUE " SENTENCE".
+ 05 FILLER PIC X(33) VALUE " SEPARATE".
+ 05 FILLER PIC X(33) VALUE " SEQUENCE".
+ 05 FILLER PIC X(33) VALUE " SEQUENTIAL".
+ 05 FILLER PIC X(33) VALUE "VSET".
+ 05 FILLER PIC X(33) VALUE " SHARING".
+ 05 FILLER PIC X(33) VALUE "ISIGN".
+ 05 FILLER PIC X(33) VALUE " SIGNED".
+ 05 FILLER PIC X(33) VALUE " SIGNED-INT".
+ 05 FILLER PIC X(33) VALUE " SIGNED-LONG".
+ 05 FILLER PIC X(33) VALUE " SIGNED-SHORT".
+ 05 FILLER PIC X(33) VALUE "ISIN".
+ 05 FILLER PIC X(33) VALUE " SIZE".
+ 05 FILLER PIC X(33) VALUE "VSORT".
+ 05 FILLER PIC X(33) VALUE " SORT-MERGE".
+ 05 FILLER PIC X(33) VALUE "ISORT-RETURN".
+ 05 FILLER PIC X(33) VALUE " SOURCE".
+ 05 FILLER PIC X(33) VALUE " SOURCE-COMPUTER".
+ 05 FILLER PIC X(33) VALUE " SOURCES".
+ 05 FILLER PIC X(33) VALUE " SPACE".
+ 05 FILLER PIC X(33) VALUE " SPACE-FILL".
+ 05 FILLER PIC X(33) VALUE " SPACES".
+ 05 FILLER PIC X(33) VALUE " SPECIAL-NAMES".
+ 05 FILLER PIC X(33) VALUE "ISQRT".
+ 05 FILLER PIC X(33) VALUE " STANDARD".
+ 05 FILLER PIC X(33) VALUE " STANDARD-1".
+ 05 FILLER PIC X(33) VALUE " STANDARD-2".
+ 05 FILLER PIC X(33) VALUE "ISTANDARD-DEVIATION".
+ 05 FILLER PIC X(33) VALUE "VSTART".
+ 05 FILLER PIC X(33) VALUE " STATUS".
+ 05 FILLER PIC X(33) VALUE "VSTOP".
+ 05 FILLER PIC X(33) VALUE "ISTORED-CHAR-LENGTH".
+ 05 FILLER PIC X(33) VALUE "VSTRING".
+ 05 FILLER PIC X(33) VALUE "ISUBSTITUTE".
+ 05 FILLER PIC X(33) VALUE "ISUBSTITUTE-CASE".
+ 05 FILLER PIC X(33) VALUE "VSUBTRACT".
+ 05 FILLER PIC X(33) VALUE "ISUM".
+ 05 FILLER PIC X(33) VALUE " SUPER".
+ 05 FILLER PIC X(33) VALUE "VSUPPRESS".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-1".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-2".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-3".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-4".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-5".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-6".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-7".
+ 05 FILLER PIC X(33) VALUE "MSWITCH-8".
+ 05 FILLER PIC X(33) VALUE " SYMBOLIC".
+ 05 FILLER PIC X(33) VALUE " SYNC".
+ 05 FILLER PIC X(33) VALUE " SYNCHRONIZED".
+ 05 FILLER PIC X(33) VALUE "MSYSERR".
+ 05 FILLER PIC X(33) VALUE "MSYSIN".
+ 05 FILLER PIC X(33) VALUE "MSYSIPT".
+ 05 FILLER PIC X(33) VALUE "MSYSLIST".
+ 05 FILLER PIC X(33) VALUE "MSYSLST".
+ 05 FILLER PIC X(33) VALUE "MSYSOUT".
+ 05 FILLER PIC X(33) VALUE " SYSTEM-DEFAULT".
+ 05 FILLER PIC X(33) VALUE " TABLE".
+ 05 FILLER PIC X(33) VALUE "KTALLYING".
+ 05 FILLER PIC X(33) VALUE "ITAN".
+ 05 FILLER PIC X(33) VALUE " TAPE".
+ 05 FILLER PIC X(33) VALUE "VTERMINATE".
+ 05 FILLER PIC X(33) VALUE " TEST".
+ 05 FILLER PIC X(33) VALUE "ITEST-DATE-YYYYMMDD".
+ 05 FILLER PIC X(33) VALUE "ITEST-DAY-YYYYDDD".
+ 05 FILLER PIC X(33) VALUE " THAN".
+ 05 FILLER PIC X(33) VALUE " THEN".
+ 05 FILLER PIC X(33) VALUE " THROUGH".
+ 05 FILLER PIC X(33) VALUE " THRU".
+ 05 FILLER PIC X(33) VALUE " TIME".
+ 05 FILLER PIC X(33) VALUE " TIMES".
+ 05 FILLER PIC X(33) VALUE "KTO".
+ 05 FILLER PIC X(33) VALUE " TOP".
+ 05 FILLER PIC X(33) VALUE " TRAILING".
+ 05 FILLER PIC X(33) VALUE " TRAILING-SIGN".
+ 05 FILLER PIC X(33) VALUE "VTRANSFORM".
+ 05 FILLER PIC X(33) VALUE "ITRIM".
+ 05 FILLER PIC X(33) VALUE " TRUE".
+ 05 FILLER PIC X(33) VALUE " TYPE".
+ 05 FILLER PIC X(33) VALUE " TYPEDEF".
+ 05 FILLER PIC X(33) VALUE " UNDERLINE".
+ 05 FILLER PIC X(33) VALUE " UNIT".
+ 05 FILLER PIC X(33) VALUE " UNIVERSAL".
+ 05 FILLER PIC X(33) VALUE "VUNLOCK".
+ 05 FILLER PIC X(33) VALUE " UNSIGNED".
+ 05 FILLER PIC X(33) VALUE " UNSIGNED-INT".
+ 05 FILLER PIC X(33) VALUE " UNSIGNED-LONG".
+ 05 FILLER PIC X(33) VALUE " UNSIGNED-SHORT".
+ 05 FILLER PIC X(33) VALUE "VUNSTRING".
+ 05 FILLER PIC X(33) VALUE " UNTIL".
+ 05 FILLER PIC X(33) VALUE "KUP".
+ 05 FILLER PIC X(33) VALUE " UPDATE".
+ 05 FILLER PIC X(33) VALUE " UPON".
+ 05 FILLER PIC X(33) VALUE " UPPER".
+ 05 FILLER PIC X(33) VALUE "IUPPER-CASE".
+ 05 FILLER PIC X(33) VALUE " USAGE".
+ 05 FILLER PIC X(33) VALUE "VUSE".
+ 05 FILLER PIC X(33) VALUE " USER-DEFAULT".
+ 05 FILLER PIC X(33) VALUE "KUSING".
+ 05 FILLER PIC X(33) VALUE " VAL-STATUS".
+ 05 FILLER PIC X(33) VALUE " VALID".
+ 05 FILLER PIC X(33) VALUE " VALIDATE".
+ 05 FILLER PIC X(33) VALUE " VALIDATE-STATUS".
+ 05 FILLER PIC X(33) VALUE " VALUE".
+ 05 FILLER PIC X(33) VALUE " VALUES".
+ 05 FILLER PIC X(33) VALUE "IVARIANCE".
+ 05 FILLER PIC X(33) VALUE "KVARYING".
+ 05 FILLER PIC X(33) VALUE " WAIT".
+ 05 FILLER PIC X(33) VALUE "VWHEN".
+ 05 FILLER PIC X(33) VALUE "IWHEN-COMPILED".
+ 05 FILLER PIC X(33) VALUE " WITH".
+ 05 FILLER PIC X(33) VALUE " WORDS".
+ 05 FILLER PIC X(33) VALUE "KWORKING-STORAGE".
+ 05 FILLER PIC X(33) VALUE "VWRITE".
+ 05 FILLER PIC X(33) VALUE "IYEAR-TO-YYYY".
+ 05 FILLER PIC X(33) VALUE " YYYYDDD".
+ 05 FILLER PIC X(33) VALUE " YYYYMMDD".
+ 05 FILLER PIC X(33) VALUE " ZERO".
+ 05 FILLER PIC X(33) VALUE " ZERO-FILL".
+ 05 FILLER PIC X(33) VALUE " ZEROES".
+ 05 FILLER PIC X(33) VALUE " ZEROS".
+ 01 Reserved-Word-Table REDEFINES Reserved-Words.
+ 05 Reserved-Word OCCURS 591 TIMES
+ ASCENDING KEY RW-Word
+ INDEXED RW-Idx.
+ 10 RW-Type PIC X(1).
+ 10 RW-Word PIC X(32).
+
+ 01 Saved-Section PIC X(15).
+
+ 01 Search-Token PIC X(32).
+
+ 01 Source-Line-No PIC 9(6).
+
+ 01 Src-Ptr USAGE BINARY-LONG.
+
+ 01 Syntax-Parsing-Items.
+ 05 SPI-Current-Char PIC X(1).
+ 88 Current-Char-Is-Punct VALUE "=", "(", ")", "*", "/",
+ "&", ";", ",", "<", ">",
+ ":".
+ 88 Current-Char-Is-Quote VALUE '"', "'".
+ 88 Current-Char-Is-X VALUE "x", "X".
+ 88 Current-Char-Is-Z VALUE "z", "Z".
+ 05 SPI-Current-Division PIC X(1).
+ 88 In-IDENTIFICATION-DIVISION VALUE "I", "?".
+ 88 In-ENVIRONMENT-DIVISION VALUE "E".
+ 88 In-DATA-DIVISION VALUE "D".
+ 88 In-PROCEDURE-DIVISION VALUE "P".
+ 05 SPI-Current-Line-No PIC 9(6).
+ 05 SPI-Current-Program-ID.
+ 10 FILLER PIC X(12).
+ 10 SPI-CP-13-15 PIC X(3).
+ 05 SPI-Current-Section.
+ 10 SPI-CS-1 PIC X(1).
+ 10 SPI-CS-2-14.
+ 15 FILLER PIC X(10).
+ 15 SPI-CS-11-14 PIC X(3).
+ 10 SPI-CS-15 PIC X(1).
+ 05 SPI-Current-Token PIC X(32).
+ 05 SPI-Current-Token-UC PIC X(32).
+ 05 SPI-Current-Verb PIC X(12).
+ 05 SPI-Next-Char PIC X(1).
+ 88 Next-Char-Is-Quote VALUE '"', "'".
+ 05 SPI-Prior-Token PIC X(32).
+ 05 SPI-Token-Type PIC X(1).
+ 88 Token-Is-EOF VALUE HIGH-VALUES.
+ 88 Token-Is-Identifier VALUE "I".
+ 88 Token-Is-Key-Word VALUE "K", "V".
+ 88 Token-Is-Literal-Alpha VALUE "L".
+ 88 Token-Is-Literal-Number VALUE "N".
+ 88 Token-Is-Verb VALUE "V".
+GC0710 88 Token-Is-Reserved-Word VALUE " ".
+
+ 01 Tally USAGE BINARY-LONG.
+
+ 01 Todays-Date PIC 9(8).
+
+ LINKAGE SECTION.
+ 01 Produce-Source-Listing PIC X(1).
+ 01 Produce-Xref-Listing PIC X(1).
+ 01 Src-Filename PIC X(256).
+ /
+ PROCEDURE DIVISION USING Produce-Source-Listing
+ Produce-Xref-Listing
+ Src-Filename.
+ 000-Main SECTION.
+ 001-Init.
+ PERFORM 100-Initialization
+ PERFORM 200-Execute-cobc
+ OPEN OUTPUT Report-File
+ IF Produce-Source-Listing NOT = SPACE
+ PERFORM 500-Produce-Source-Listing
+ END-IF
+ IF Produce-Xref-Listing NOT = SPACE
+ SORT Sort-File
+ ASCENDING KEY SR-Prog-ID
+ SR-Token-UC
+ SR-Line-No-Ref
+ INPUT PROCEDURE 300-Tokenize-Source
+ OUTPUT PROCEDURE 400-Produce-Xref-Listing
+ END-IF
+ CLOSE Report-File
+ GOBACK
+ .
+ /
+ 100-Initialization SECTION.
+ *****************************************************************
+ ** Perform all program-wide initialization operations **
+ *****************************************************************
+ 101-Establish-Working-Env.
+ MOVE TRIM(Src-Filename,Leading) TO Src-Filename
+ ACCEPT Env-TEMP
+ FROM ENVIRONMENT "TEMP"
+ END-ACCEPT
+ ACCEPT Lines-Per-Page-ENV
+ FROM ENVIRONMENT "OCXREF_LINES"
+ END-ACCEPT
+ INSPECT Src-Filename REPLACING ALL "\" BY "/"
+ INSPECT Env-TEMP REPLACING ALL "\" BY "/"
+ MOVE Src-Filename TO Program-Path
+ MOVE Program-Path TO Heading-2
+ CALL "C$JUSTIFY"
+ USING Heading-2, "Right"
+ END-CALL
+ MOVE LENGTH(TRIM(Src-Filename,Trailing)) TO I
+ MOVE 0 TO J
+ PERFORM UNTIL Src-Filename(I:1) = '/'
+ OR I = 0
+ SUBTRACT 1 FROM I
+ ADD 1 TO J
+ END-PERFORM
+ UNSTRING Src-Filename((I + 1):J) DELIMITED BY "."
+ INTO Filename, Dummy
+ END-UNSTRING
+ STRING TRIM(Env-TEMP,Trailing)
+ "/"
+ TRIM(Filename,Trailing)
+ ".i"
+ DELIMITED SIZE
+ INTO Expanded-Src-Filename
+ END-STRING
+ STRING Program-Path(1:I)
+ TRIM(Filename,Trailing)
+ ".lst"
+ DELIMITED SIZE
+ INTO Report-Filename
+ END-STRING
+ IF Lines-Per-Page-ENV NOT = SPACES
+ MOVE NUMVAL(Lines-Per-Page-ENV) TO Lines-Per-Page
+ ELSE
+ MOVE 60 TO Lines-Per-Page
+ END-IF
+ ACCEPT Todays-Date
+ FROM DATE YYYYMMDD
+ END-ACCEPT
+ MOVE Todays-Date TO H1X-Date
+ H1S-Date
+ MOVE "????????????..." TO SPI-Current-Program-ID
+ MOVE SPACES TO SPI-Current-Verb
+ Held-Reference
+ MOVE "Y" TO F-First-Record
+ .
+ /
+ 200-Execute-cobc SECTION.
+ 201-Build-Cmd.
+ STRING "cobc -E "
+ TRIM(Program-Path, Trailing)
+ " > "
+ TRIM(Expanded-Src-Filename,Trailing)
+ DELIMITED SIZE
+ INTO Cmd
+ END-STRING
+ CALL "SYSTEM"
+ USING Cmd
+ END-CALL
+ IF RETURN-CODE NOT = 0
+ DISPLAY
+ "Cross-reference terminated by previous errors"
+ UPON SYSERR
+ END-DISPLAY
+ GOBACK
+ END-IF
+ .
+
+ 209-Exit.
+ EXIT
+ .
+ /
+ 300-Tokenize-Source SECTION.
+ 301-Driver.
+ OPEN INPUT Expand-Code
+ MOVE SPACES TO Expand-Code-Rec
+ MOVE 256 TO Src-Ptr
+ MOVE 0 TO Num-UserNames
+ SPI-Current-Line-No
+ MOVE "?" TO SPI-Current-Division
+GC0710 MOVE "N" TO F-Verb-Has-Been-Found.
+ PERFORM FOREVER
+ PERFORM 310-Get-Token
+ IF Token-Is-EOF
+ EXIT PERFORM
+ END-IF
+ MOVE UPPER-CASE(SPI-Current-Token)
+ TO SPI-Current-Token-UC
+ IF Token-Is-Verb
+ MOVE SPI-Current-Token-UC TO SPI-Current-Verb
+ SPI-Prior-Token
+ IF Held-Reference NOT = SPACES
+ MOVE Held-Reference TO Sort-Rec
+ MOVE SPACES TO Held-Reference
+ RELEASE Sort-Rec
+ END-IF
+ END-IF
+ EVALUATE TRUE
+ WHEN In-IDENTIFICATION-DIVISION
+ PERFORM 320-IDENTIFICATION-DIVISION
+ WHEN In-ENVIRONMENT-DIVISION
+ PERFORM 330-ENVIRONMENT-DIVISION
+ WHEN In-DATA-DIVISION
+ PERFORM 340-DATA-DIVISION
+ WHEN In-PROCEDURE-DIVISION
+ PERFORM 350-PROCEDURE-DIVISION
+ END-EVALUATE
+ IF Token-Is-Key-Word
+ MOVE SPI-Current-Token-UC TO SPI-Prior-Token
+ END-IF
+ IF F-Token-Ended-Sentence = "Y"
+ AND SPI-Current-Division NOT = "I"
+ MOVE SPACES TO SPI-Prior-Token
+ SPI-Current-Verb
+ END-IF
+
+ END-PERFORM
+ CLOSE Expand-Code
+ EXIT SECTION
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 310-Get-Token.
+ *>-- Position to 1st non-blank character
+ MOVE F-Token-Ended-Sentence TO F-Last-Token-Ended-Sent
+ MOVE "N" TO F-Token-Ended-Sentence
+ PERFORM UNTIL Expand-Code-Rec(Src-Ptr : 1) NOT = SPACE
+ IF Src-Ptr > 255
+ READ Expand-Code AT END
+ IF Held-Reference NOT = SPACES
+ MOVE Held-Reference TO Sort-Rec
+ MOVE SPACES TO Held-Reference
+ RELEASE Sort-Rec
+ END-IF
+ SET Token-Is-EOF TO TRUE
+ MOVE 0 TO SPI-Current-Line-No
+ EXIT PARAGRAPH
+ END-READ
+ IF ECR-1 = "#"
+ PERFORM 311-Control-Record
+ ELSE
+ PERFORM 312-Expand-Code-Record
+ END-IF
+ ELSE
+ ADD 1 TO Src-Ptr
+ END-IF
+ END-PERFORM
+ *>-- Extract token string
+ MOVE Expand-Code-Rec(Src-Ptr : 1) TO SPI-Current-Char
+ MOVE Expand-Code-Rec(Src-Ptr + 1: 1) TO SPI-Next-Char
+ IF SPI-Current-Char = "."
+ ADD 1 TO Src-Ptr
+ MOVE SPI-Current-Char TO SPI-Current-Token
+ MOVE SPACE TO SPI-Token-Type
+ MOVE "Y" TO F-Token-Ended-Sentence
+ EXIT PARAGRAPH
+ END-IF
+ IF Current-Char-Is-Punct
+ AND SPI-Current-Char = "="
+ AND SPI-Current-Division = "P"
+ ADD 1 TO Src-Ptr
+ MOVE "EQUALS" TO SPI-Current-Token
+ MOVE "K" TO SPI-Token-Type
+ EXIT PARAGRAPH
+ END-IF
+ IF Current-Char-Is-Punct *> So subscripts don't get flagged w/ "*"
+ AND SPI-Current-Char = "("
+ AND SPI-Current-Division = "P"
+ MOVE SPACES TO SPI-Prior-Token
+ END-IF
+ IF Current-Char-Is-Punct
+ ADD 1 TO Src-Ptr
+ MOVE SPI-Current-Char TO SPI-Current-Token
+ MOVE SPACE TO SPI-Token-Type
+ EXIT PARAGRAPH
+ END-IF
+ IF Current-Char-Is-Quote
+ ADD 1 TO Src-Ptr
+ UNSTRING Expand-Code-Rec
+ DELIMITED BY SPI-Current-Char
+ INTO SPI-Current-Token
+ WITH POINTER Src-Ptr
+ END-UNSTRING
+ IF Expand-Code-Rec(Src-Ptr : 1) = "."
+ MOVE "Y" TO F-Token-Ended-Sentence
+ ADD 1 TO Src-Ptr
+ END-IF
+ SET Token-Is-Literal-Alpha TO TRUE
+ EXIT PARAGRAPH
+ END-IF
+ IF Current-Char-Is-X AND Next-Char-Is-Quote
+ ADD 2 TO Src-Ptr
+ UNSTRING Expand-Code-Rec
+ DELIMITED BY SPI-Next-Char
+ INTO SPI-Current-Token
+ WITH POINTER Src-Ptr
+ END-UNSTRING
+ IF Expand-Code-Rec(Src-Ptr : 1) = "."
+ MOVE "Y" TO F-Token-Ended-Sentence
+ ADD 1 TO Src-Ptr
+ END-IF
+ SET Token-Is-Literal-Number TO TRUE
+ EXIT PARAGRAPH
+ END-IF
+ IF Current-Char-Is-Z AND Next-Char-Is-Quote
+ ADD 2 TO Src-Ptr
+ UNSTRING Expand-Code-Rec
+ DELIMITED BY SPI-Next-Char
+ INTO SPI-Current-Token
+ WITH POINTER Src-Ptr
+ END-UNSTRING
+ IF Expand-Code-Rec(Src-Ptr : 1) = "."
+ MOVE "Y" TO F-Token-Ended-Sentence
+ ADD 1 TO Src-Ptr
+ END-IF
+ SET Token-Is-Literal-Alpha TO TRUE
+ EXIT PARAGRAPH
+ END-IF
+ IF F-Processing-PICTURE = "Y"
+ UNSTRING Expand-Code-Rec
+ DELIMITED BY ". " OR " "
+ INTO SPI-Current-Token
+ DELIMITER IN Delim
+ WITH POINTER Src-Ptr
+ END-UNSTRING
+ IF Delim = ". "
+ MOVE "Y" TO F-Token-Ended-Sentence
+ ADD 1 TO Src-Ptr
+ END-IF
+ IF UPPER-CASE(SPI-Current-Token) = "IS"
+ MOVE SPACE TO SPI-Token-Type
+ EXIT PARAGRAPH
+ ELSE
+ MOVE "N" TO F-Processing-PICTURE
+ MOVE SPACE TO SPI-Token-Type
+ EXIT PARAGRAPH
+ END-IF
+ END-IF
+ UNSTRING Expand-Code-Rec
+ DELIMITED BY ". " OR " " OR "=" OR "(" OR ")" OR "*"
+ OR "/" OR "&" OR ";" OR "," OR "<"
+ OR ">" OR ":"
+ INTO SPI-Current-Token
+ DELIMITER IN Delim
+ WITH POINTER Src-Ptr
+ END-UNSTRING
+ IF Delim = ". "
+ MOVE "Y" TO F-Token-Ended-Sentence
+ END-IF
+ IF Delim NOT = ". " AND " "
+ SUBTRACT 1 FROM Src-Ptr
+ END-IF
+ *>-- Classify Token
+ MOVE UPPER-CASE(SPI-Current-Token) TO Search-Token
+ IF Search-Token = "EQUAL" OR "EQUALS"
+ MOVE "EQUALS" TO SPI-Current-Token
+ MOVE "K" TO SPI-Token-Type
+ EXIT PARAGRAPH
+ END-IF
+ SEARCH ALL Reserved-Word
+ WHEN RW-Word (RW-Idx) = Search-Token
+ MOVE RW-Type (RW-Idx) TO SPI-Token-Type
+GC0710 IF Token-Is-Verb
+GC0710 MOVE "Y" TO F-Verb-Has-Been-Found
+GC0710 END-IF
+ EXIT PARAGRAPH
+ END-SEARCH
+ *>-- Not a reserved word, must be a user name
+ SET Token-Is-Identifier TO TRUE *> NEEDS EXPANSION!!!!
+ PERFORM 313-Check-For-Numeric-Token
+ IF Token-Is-Literal-Number
+ IF (F-Last-Token-Ended-Sent = "Y")
+ AND (SPI-Current-Division = "D")
+ MOVE "LEVEL #" TO SPI-Current-Token
+ MOVE "K" TO SPI-Token-Type
+ EXIT PARAGRAPH
+ ELSE
+ EXIT PARAGRAPH
+ END-IF
+ END-IF
+ EXIT PARAGRAPH
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 311-Control-Record.
+ UNSTRING ECR-2-256
+ DELIMITED BY '"'
+ INTO PIC-X10, PIC-X256, Dummy
+ END-UNSTRING
+ INSPECT PIC-X10 REPLACING ALL '"' BY SPACE
+ COMPUTE I = NUMVAL(PIC-X10) - 1
+ IF TRIM(PIC-X256,Trailing) = TRIM(Program-Path,Trailing)
+ MOVE I TO SPI-Current-Line-No
+ SET In-Main-Module TO TRUE
+ IF Saved-Section NOT = SPACES
+ MOVE Saved-Section TO SPI-Current-Section
+ END-IF
+ ELSE
+ SET In-Copybook TO TRUE
+ IF Saved-Section = SPACES
+ MOVE SPI-Current-Section TO Saved-Section
+ END-IF
+ MOVE LENGTH(TRIM(PIC-X256,Trailing)) TO I
+ MOVE 0 TO J
+ PERFORM UNTIL PIC-X256(I:1) = '/'
+ OR I = 0
+ SUBTRACT 1 FROM I
+ ADD 1 TO J
+ END-PERFORM
+ UNSTRING PIC-X256((I + 1):J) DELIMITED BY "."
+ INTO Filename, Dummy
+ END-UNSTRING
+ MOVE "[" TO SPI-CS-1
+ MOVE Filename TO SPI-CS-2-14
+ IF SPI-CS-11-14 NOT = SPACES
+ MOVE "..." TO SPI-CS-11-14
+ END-IF
+ MOVE "]" TO SPI-CS-15
+ END-IF
+ MOVE SPACES TO Expand-Code-Rec *> Force another READ
+ MOVE 256 TO Src-Ptr
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 312-Expand-Code-Record.
+ MOVE 1 TO Src-Ptr
+ IF In-Main-Module
+ ADD 1 To SPI-Current-Line-No
+ END-IF
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 313-Check-For-Numeric-Token.
+ MOVE SPI-Current-Token TO PIC-X32
+ INSPECT PIC-X32
+ REPLACING TRAILING SPACES BY "0"
+ IF PIC-X32 IS NUMERIC *> Simple Unsigned Integer
+ SET Token-Is-Literal-Number TO TRUE
+ EXIT PARAGRAPH
+ END-IF
+ IF PIC-X32(1:1) = "+" OR "-"
+ MOVE "0" TO PIC-X32(1:1)
+ END-IF
+ MOVE 0 TO Tally
+ INSPECT PIC-X32
+ TALLYING Tally FOR ALL "."
+ IF Tally = 1
+ INSPECT PIC-X32 REPLACING ALL "." BY "0"
+ END-IF
+ IF PIC-X32 IS NUMERIC
+ SET Token-Is-Literal-Number TO TRUE
+ EXIT PARAGRAPH
+ END-IF
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 320-IDENTIFICATION-DIVISION.
+GC0710 MOVE "N" TO F-Verb-Has-Been-Found
+ IF Token-Is-Key-Word AND SPI-Current-Token = "DIVISION"
+ MOVE SPI-Prior-Token TO SPI-Current-Division
+ EXIT PARAGRAPH
+ END-IF
+ IF SPI-Prior-Token = "PROGRAM-ID"
+ MOVE SPACES TO SPI-Prior-Token
+ MOVE SPI-Current-Token TO SPI-Current-Program-ID
+ IF SPI-CP-13-15 NOT = SPACES
+ MOVE "..." TO SPI-CP-13-15
+ END-IF
+ EXIT PARAGRAPH
+ END-IF
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 330-ENVIRONMENT-DIVISION.
+ IF Token-Is-Key-Word AND SPI-Current-Token = "DIVISION"
+ MOVE SPI-Prior-Token TO SPI-Current-Division
+ EXIT PARAGRAPH
+ END-IF
+ IF Token-Is-Key-Word AND SPI-Current-Token = "SECTION"
+ MOVE SPI-Prior-Token TO SPI-Current-Section
+ EXIT PARAGRAPH
+ END-IF
+ IF Token-Is-Identifier
+ PERFORM 361-Release-Ref
+ END-IF
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 340-DATA-DIVISION.
+ IF Token-Is-Key-Word AND SPI-Current-Token = "DIVISION"
+ MOVE SPI-Prior-Token TO SPI-Current-Division
+ EXIT PARAGRAPH
+ END-IF
+ IF Token-Is-Key-Word AND SPI-Current-Token = "SECTION"
+ MOVE SPI-Prior-Token TO SPI-Current-Section
+ EXIT PARAGRAPH
+ END-IF
+ IF (SPI-Current-Token = "PIC" OR "PICTURE")
+ AND (Token-Is-Key-Word)
+ MOVE "Y" TO F-Processing-PICTURE
+ EXIT PARAGRAPH
+ END-IF
+GC0710 IF Token-Is-Reserved-Word
+GC0710 AND SPI-Prior-Token = "LEVEL #"
+GC0710 MOVE SPACES TO SPI-Prior-Token
+GC0710 EXIT PARAGRAPH
+GC0710 END-IF
+ IF Token-Is-Identifier
+ EVALUATE SPI-Prior-Token
+ WHEN "FD"
+ PERFORM 360-Release-Def
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "SD"
+ PERFORM 360-Release-Def
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "LEVEL #"
+ PERFORM 360-Release-Def
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "INDEXED"
+ PERFORM 360-Release-Def
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "USING"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "INTO"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ EXIT PARAGRAPH
+ END-IF
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 350-PROCEDURE-DIVISION.
+ IF SPI-Current-Section NOT = "PROCEDURE"
+ MOVE "PROCEDURE" TO SPI-Current-Section
+ END-IF
+GC0710 IF SPI-Current-Token-UC = "PROGRAM"
+GC0710 AND SPI-Prior-Token = "END"
+GC0710 MOVE "?" TO SPI-Current-Division
+GC0710 EXIT PARAGRAPH
+GC0710 END-IF
+ IF Token-Is-Key-Word AND SPI-Current-Token = "DIVISION"
+ MOVE SPI-Prior-Token TO SPI-Current-Division
+ EXIT PARAGRAPH
+ END-IF
+ IF SPI-Current-Verb = SPACES
+GC0710 AND F-Verb-Has-Been-Found = "Y"
+ IF Token-Is-Identifier
+ PERFORM 360-Release-Def
+ MOVE SPACES TO SPI-Prior-Token
+ END-IF
+ EXIT PARAGRAPH
+ END-IF
+ IF NOT Token-Is-Identifier
+ EXIT PARAGRAPH
+ END-IF
+ EVALUATE SPI-Current-Verb
+ WHEN "ACCEPT"
+ PERFORM 351-ACCEPT
+ WHEN "ADD"
+ PERFORM 351-ADD
+ WHEN "ALLOCATE"
+ PERFORM 351-ALLOCATE
+ WHEN "CALL"
+ PERFORM 351-CALL
+ WHEN "COMPUTE"
+ PERFORM 351-COMPUTE
+ WHEN "DIVIDE"
+ PERFORM 351-DIVIDE
+ WHEN "FREE"
+ PERFORM 351-FREE
+ WHEN "INITIALIZE"
+ PERFORM 351-INITIALIZE
+ WHEN "INSPECT"
+ PERFORM 351-INSPECT
+ WHEN "MOVE"
+ PERFORM 351-MOVE
+ WHEN "MULTIPLY"
+ PERFORM 351-MULTIPLY
+ WHEN "PERFORM"
+ PERFORM 351-PERFORM
+ WHEN "SET"
+ PERFORM 351-SET
+ WHEN "STRING"
+ PERFORM 351-STRING
+ WHEN "SUBTRACT"
+ PERFORM 351-SUBTRACT
+ WHEN "TRANSFORM"
+ PERFORM 351-TRANSFORM
+ WHEN "UNSTRING"
+ PERFORM 351-UNSTRING
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-ACCEPT.
+ EVALUATE SPI-Prior-Token
+ WHEN "ACCEPT"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-ADD.
+ EVALUATE SPI-Prior-Token
+ WHEN "GIVING"
+ PERFORM 362-Release-Upd
+ WHEN "TO"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-ALLOCATE.
+ EVALUATE SPI-Prior-Token
+ WHEN "ALLOCATE"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "RETURNING"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-CALL.
+ EVALUATE SPI-Prior-Token
+ WHEN "RETURNING"
+ PERFORM 362-Release-Upd
+ WHEN "GIVING"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-COMPUTE.
+ EVALUATE SPI-Prior-Token
+ WHEN "COMPUTE"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-DIVIDE.
+ EVALUATE SPI-Prior-Token
+ WHEN "INTO"
+ PERFORM 363-Set-Upd
+ MOVE Sort-Rec TO Held-Reference
+ WHEN "GIVING"
+ IF Held-Reference NOT = SPACES
+ MOVE Held-Reference To Sort-Rec
+ MOVE SPACES To Held-Reference
+ SR-Ref-Flag
+ RELEASE Sort-Rec
+ END-IF
+ PERFORM 362-Release-Upd
+ WHEN "REMAINDER"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-FREE.
+ PERFORM 362-Release-Upd
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-INITIALIZE.
+ EVALUATE SPI-Prior-Token
+ WHEN "INITIALIZE"
+ PERFORM 362-Release-Upd
+ WHEN "REPLACING"
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-INSPECT.
+ EVALUATE SPI-Prior-Token
+ WHEN "INSPECT"
+ PERFORM 364-Set-Ref
+ MOVE SPACES TO Held-Reference
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "TALLYING"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "REPLACING"
+ IF Held-Reference NOT = SPACES
+ MOVE Held-Reference TO Sort-Rec
+ MOVE SPACES TO Held-Reference
+ MOVE "*" TO SR-Ref-Flag
+ RELEASE Sort-Rec
+ END-IF
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "CONVERTING"
+ IF Held-Reference NOT = SPACES
+ MOVE Held-Reference TO Sort-Rec
+ MOVE SPACES TO Held-Reference
+ MOVE "*" TO SR-Ref-Flag
+ RELEASE Sort-Rec
+ END-IF
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-MOVE.
+ EVALUATE SPI-Prior-Token
+ WHEN "TO"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-MULTIPLY.
+ EVALUATE SPI-Prior-Token
+ WHEN "BY"
+ PERFORM 363-Set-Upd
+ MOVE Sort-Rec TO Held-Reference
+ WHEN "GIVING"
+ MOVE Held-Reference TO Sort-Rec
+ MOVE SPACES TO Held-Reference
+ SR-Ref-Flag
+ RELEASE Sort-Rec
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-PERFORM.
+ EVALUATE SPI-Prior-Token
+ WHEN "VARYING"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN "AFTER"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-SET.
+ EVALUATE SPI-Prior-Token
+ WHEN "SET"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-STRING.
+ EVALUATE SPI-Prior-Token
+ WHEN "INTO"
+ PERFORM 362-Release-Upd
+ WHEN "POINTER"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-SUBTRACT.
+ EVALUATE SPI-Prior-Token
+ WHEN "GIVING"
+ PERFORM 362-Release-Upd
+ WHEN "FROM"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-TRANSFORM.
+ EVALUATE SPI-Prior-Token
+ WHEN "TRANSFORM"
+ PERFORM 362-Release-Upd
+ MOVE SPACES TO SPI-Prior-Token
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 351-UNSTRING.
+ EVALUATE SPI-Prior-Token
+ WHEN "INTO"
+ PERFORM 362-Release-Upd
+ WHEN "DELIMITER"
+ PERFORM 362-Release-Upd
+ WHEN "COUNT"
+ PERFORM 362-Release-Upd
+ WHEN "POINTER"
+ PERFORM 362-Release-Upd
+ WHEN "TALLYING"
+ PERFORM 362-Release-Upd
+ WHEN OTHER
+ PERFORM 361-Release-Ref
+ END-EVALUATE
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 360-Release-Def.
+ MOVE SPACES TO Sort-Rec
+ MOVE SPI-Current-Program-ID TO SR-Prog-ID
+ MOVE SPI-Current-Token-UC TO SR-Token-UC
+ MOVE SPI-Current-Token TO SR-Token
+ MOVE SPI-Current-Section TO SR-Section
+ MOVE SPI-Current-Line-No TO SR-Line-No-Def
+ MOVE 0 TO SR-Line-No-Ref
+ RELEASE Sort-Rec
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 361-Release-Ref.
+ PERFORM 364-Set-Ref
+ RELEASE Sort-Rec
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 362-Release-Upd.
+ PERFORM 363-Set-Upd
+ RELEASE Sort-Rec
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 363-Set-Upd.
+ MOVE SPACES TO Sort-Rec
+ MOVE SPI-Current-Program-ID TO SR-Prog-ID
+ MOVE SPI-Current-Token-UC TO SR-Token-UC
+ MOVE SPI-Current-Token TO SR-Token
+ MOVE SPI-Current-Section TO SR-Section
+ MOVE SPI-Current-Line-No TO SR-Line-No-Ref
+ MOVE "*" TO SR-Ref-Flag
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 364-Set-Ref.
+ MOVE SPACES TO Sort-Rec
+ MOVE SPI-Current-Program-ID TO SR-Prog-ID
+ MOVE SPI-Current-Token-UC TO SR-Token-UC
+ MOVE SPI-Current-Token TO SR-Token
+ MOVE SPI-Current-Section TO SR-Section
+ MOVE SPI-Current-Line-No TO SR-Line-No-Ref
+ .
+ /
+ 400-Produce-Xref-Listing SECTION.
+ 401-Init.
+ MOVE SPACES TO Detail-Line-X
+ Group-Indicators
+ MOVE 0 TO I
+ Lines-Left
+GC0710 MOVE 'N' TO F-Duplicate
+ .
+
+ 402-Process-Sorted-Recs.
+ PERFORM FOREVER
+ RETURN Sort-File AT END
+ EXIT PERFORM
+ END-RETURN
+ IF SR-Prog-ID NOT = GI-Prog-ID
+ OR SR-Token-UC NOT = GI-Token
+GC0710 MOVE 'N' TO F-Duplicate
+ IF Detail-Line-X NOT = SPACES
+ PERFORM 410-Generate-Report-Line
+ END-IF
+ IF SR-Prog-ID NOT = GI-Prog-ID
+ MOVE 0 TO Lines-Left
+ END-IF
+ MOVE SR-Prog-ID TO GI-Prog-ID
+ MOVE SR-Token-UC TO GI-Token
+ END-IF
+GC0710 IF SR-Token-UC = GI-Token
+GC0710 AND SR-Line-No-Def NOT = SPACES
+GC0710 AND Detail-Line-X NOT = SPACES
+GC0710 MOVE 'Y' TO F-Duplicate
+GC0710 PERFORM 410-Generate-Report-Line
+GC0710 MOVE 0 TO I
+GC0710 MOVE SR-Prog-ID TO DLX-Prog-ID
+GC0710 MOVE ' (Duplicate Definition)' TO DLX-Token
+GC0710 MOVE SR-Section TO DLX-Section
+GC0710 MOVE SR-Line-No-Def TO DLX-Line-No-Def
+GC0710 EXIT PERFORM CYCLE
+GC0710 END-IF
+GC0710 IF SR-Token-UC = GI-Token
+GC0710 AND SR-Line-No-Def = SPACES
+GC0710 AND F-Duplicate = 'Y'
+GC0710 MOVE 'N' TO F-Duplicate
+GC0710 PERFORM 410-Generate-Report-Line
+GC0710 MOVE 0 TO I
+GC0710 MOVE SR-Prog-ID TO DLX-Prog-ID
+GC0710 MOVE ' (Duplicate References)' TO DLX-Token
+GC0710 END-IF
+ IF Detail-Line-X = SPACES
+ MOVE SR-Prog-ID TO DLX-Prog-ID
+ MOVE SR-Token TO DLX-Token
+ MOVE SR-Section TO DLX-Section
+ IF SR-Line-No-Def NOT = SPACES
+ MOVE SR-Line-No-Def TO DLX-Line-No-Def
+ END-IF
+ END-IF
+ IF SR-Reference > '000000'
+ ADD 1 TO I
+ IF I > Line-Nos-Per-Rec
+ PERFORM 410-Generate-Report-Line
+ MOVE 1 TO I
+ END-IF
+ MOVE SR-Line-No-Ref TO DLX-Line-No-Ref (I)
+ MOVE SR-Ref-Flag TO DLX-Ref-Flag (I)
+ END-IF
+ END-PERFORM
+ IF Detail-Line-X NOT = SPACES
+ PERFORM 410-Generate-Report-Line
+ END-IF
+ EXIT SECTION
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 410-Generate-Report-Line.
+ IF Lines-Left < 1
+ IF F-First-Record = "Y"
+ MOVE "N" TO F-First-Record
+ WRITE Report-Rec FROM Heading-1X BEFORE 1
+ ELSE
+ MOVE SPACES TO Report-Rec
+ WRITE Report-Rec BEFORE PAGE
+ MOVE SPACES TO Report-Rec
+ WRITE Report-Rec BEFORE 1
+ WRITE Report-Rec FROM Heading-1X BEFORE 1
+ END-IF
+ WRITE Report-Rec FROM Heading-2 BEFORE 1
+ WRITE Report-Rec FROM Heading-4X BEFORE 1
+ WRITE Report-Rec FROM Heading-5X BEFORE 1
+ COMPUTE
+ Lines-Left = Lines-Per-Page - 4
+ END-COMPUTE
+ END-IF
+ WRITE Report-Rec FROM Detail-Line-X BEFORE 1
+ MOVE SPACES TO Detail-Line-X
+ MOVE 0 TO I
+ SUBTRACT 1 FROM Lines-Left
+ .
+ /
+ 500-Produce-Source-Listing SECTION.
+ 501-Generate-Source-Listing.
+ OPEN INPUT Source-Code
+ Expand-Code
+ MOVE 0 TO Source-Line-No
+ PERFORM FOREVER
+ READ Expand-Code AT END
+ EXIT PERFORM
+ END-READ
+ IF ECR-1 = "#"
+ PERFORM 510-Control-Record
+ ELSE
+ PERFORM 520-Expand-Code-Record
+ END-IF
+ END-PERFORM
+ CLOSE Source-Code
+ Expand-Code
+ EXIT SECTION
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 510-Control-Record.
+ UNSTRING ECR-2-256
+ DELIMITED BY '"'
+ INTO PIC-X10, PIC-X256, Dummy
+ END-UNSTRING
+ IF TRIM(PIC-X256,Trailing) = TRIM(Program-Path,Trailing) *> Main Pgm
+ SET In-Main-Module TO TRUE
+ IF Source-Line-No > 0
+ READ Expand-Code END-READ
+ END-IF
+ ELSE *> COPY
+ SET In-Copybook TO TRUE
+ END-IF
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 520-Expand-Code-Record.
+ IF In-Main-Module
+ ADD 1 To SPI-Current-Line-No
+ READ Source-Code AT END NEXT SENTENCE END-READ
+ ADD 1 TO Source-Line-No
+ MOVE SPACES TO Detail-Line-S
+ MOVE Source-Line-No TO DLS-Line-No
+ MOVE SCR-1-128 TO DLS-Statement
+GC0410 IF SCR-7 = "/"
+GC0410 MOVE 0 TO Lines-Left
+GC0410 END-IF
+ PERFORM 530-Generate-Source-Line
+ IF SCR-129-256 NOT = SPACES
+ MOVE SPACES TO Detail-Line-S
+ MOVE SCR-129-256 TO DLS-Statement
+ PERFORM 530-Generate-Source-Line
+ END-IF
+ ELSE
+ IF Expand-Code-Rec NOT = SPACES
+ MOVE SPACES TO Detail-Line-S
+ MOVE ECR-1-128 TO DLS-Statement
+ PERFORM 530-Generate-Source-Line
+ IF ECR-129-256 NOT = SPACES
+ MOVE SPACES TO Detail-Line-S
+ MOVE ECR-129-256 TO DLS-Statement
+ PERFORM 530-Generate-Source-Line
+ END-IF
+ END-IF
+ END-IF
+ .
+ *>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+ 530-Generate-Source-Line.
+ IF Lines-Left < 1
+ IF F-First-Record = "Y"
+ MOVE "N" TO F-First-Record
+ WRITE Report-Rec FROM Heading-1S BEFORE 1
+ ELSE
+ MOVE SPACES TO Report-Rec
+ WRITE Report-Rec BEFORE PAGE
+ MOVE SPACES TO Report-Rec
+ WRITE Report-Rec BEFORE 1
+ WRITE Report-Rec FROM Heading-1S BEFORE 1
+ END-IF
+ WRITE Report-Rec FROM Heading-2 BEFORE 1
+ WRITE Report-Rec FROM Heading-4S BEFORE 1
+ WRITE Report-Rec FROM Heading-5S BEFORE 1
+ COMPUTE
+ Lines-Left = Lines-Per-Page - 4
+ END-COMPUTE
+ END-IF
+ WRITE Report-Rec FROM Detail-Line-S BEFORE 1
+ MOVE SPACES TO Detail-Line-S
+ SUBTRACT 1 FROM Lines-Left
+ .
+
+ END PROGRAM LISTING.
diff --git a/tests/examplefiles/example.monkey b/tests/examplefiles/example.monkey
new file mode 100644
index 00000000..facd3a73
--- /dev/null
+++ b/tests/examplefiles/example.monkey
@@ -0,0 +1,152 @@
+Strict
+
+' single line comment
+
+#rem
+multi
+line
+comment
+#end
+
+#rem
+nested
+#rem
+multi
+line
+#end
+comment
+#end
+
+Import mojo
+
+Const ONECONST:Int = 1
+Const TWOCONST := 2
+Const THREECONST := 3, FOURCONST:Int = 4
+
+Global someVariable:Int = 4
+
+' sample class from the documentation
+Class Game Extends App
+
+ Function New()
+ End
+
+ Function DrawSpiral(clock)
+ Local w=DeviceWidth/2
+ For Local i#=0 Until w*1.5 Step .2
+ Local x#,y#
+ x=w+i*Sin(i*3+clock)
+ y=w+i*Cos(i*2+clock)
+ DrawRect x,y,1,1
+ Next
+ hitbox.Collide(event.pos)
+ End
+
+ Field updateCount
+
+ Method OnCreate()
+ Print "spiral"
+
+ SetUpdateRate 60
+ End
+
+ Method OnUpdate()
+ updateCount+=1
+ End
+
+ Method OnRender()
+ Cls
+ DrawSpiral updateCount
+ DrawSpiral updateCount*1.1
+ End
+
+End
+
+Class Enemy
+ Method Die () Abstract
+End
+
+' extending
+Class Hoodlum Extends Enemy
+ ' field
+ Field testField:Bool = True
+
+ ' naming class with modulepath
+ Local currentNode:list.Node<Vector2D>
+
+ Method Die ()
+ Print "B'oss, he-- he killed me, b'oss!"
+ End
+End
+
+' extending with generics
+Class VectorNode Extends Node<Vector2D>
+End
+
+' interfaces
+Interface Computer
+ Method Boot ()
+ Method Process ()
+ Method Display ()
+End
+
+Class PC Implements Computer
+End
+
+' array syntax
+Global listOfStuff:String[42]
+Global lessStuff:String[5] = listOfStuff[4..8]
+Global oneStuff:String = listOfStuff[23]
+
+'a comma separated sequence
+Global scores:Int[]=[10,20,30]
+'a comma separated sequence
+Global text:String[]=["Hello","There","World"]
+Global worstCase:worst.List<String[]>
+
+' string type
+Global string1:String = "Hello world"
+Global string2$ = "Hello world"
+
+' escape characers in strings
+Global string3 := "Hello~zWorld"
+Global string4 := "~qHello World~q"
+Global string5 := "~tIndented~n"
+Global string6 := "tilda is wavey... ~~"
+
+' string pseudofunctions
+Print " Hello World ~n".Trim() ' prints "Hello World"
+Print "Hello World".ToUpper() ' prints "HELLO WORLD"
+
+' Boolean shorttype
+Global boolVariable1:Bool = True
+Global boolVariable2? = False
+
+' number formats
+Global hexNum1:Int = $3d0dead
+Global hexNum2% = $CAFEBABE
+
+Global floatNum1:Float = 3.141516
+Global floatNum2# = 3.141516
+Global floatNum3 := .141516
+
+' preprocessor keywords
+#If TARGET = "android"
+DoStuff()
+#ElseIf TARGET = "ios"
+DoOtherStuff()
+#End
+
+' preprocessor variable
+#SOMETHING = True
+#Print SOMETHING
+#If SOMETHING
+#End
+
+' operators
+Global a = 32
+Global b = 32 ~ 0
+b ~= 16
+b |= 16
+b &= 16
+Global c = a | b
diff --git a/tests/examplefiles/example.reg b/tests/examplefiles/example.reg
new file mode 100644
index 00000000..bc4e9df4
--- /dev/null
+++ b/tests/examplefiles/example.reg
@@ -0,0 +1,19 @@
+Windows Registry Editor Version 5.00
+; comment
+
+[HKEY_CURRENT_USER\SOFTWARE\Pygments]
+@="Hello"
+"Key With Spaces"="Something"
+"Key With ="="With Quotes"
+"Key With = 2"=dword:123
+"Key" = "Value"
+"Hex"=hex(0):1,2,3,a,b,f
+"Hex 2"=hex(5):80,00,00,ff
+
+[-HKEY_CURRENT_USER\SOFTWARE\Pygments\Subkey]
+
+[HKEY_CURRENT_USER\SOFTWARE\Pygments\Subkey2]
+; comment
+@=-
+"Foo"=-
+"Foo"="Value"
diff --git a/tests/examplefiles/hello.smali b/tests/examplefiles/hello.smali
new file mode 100644
index 00000000..e539f00e
--- /dev/null
+++ b/tests/examplefiles/hello.smali
@@ -0,0 +1,40 @@
+# To Recreate:
+#
+# echo -e 'class hello {\n public static void main(String[] args) {\n
+# System.out.println("hi");\n }\n}\n' > hello.java
+# javac -target 1.4 -source 1.4 hello.java
+# dx --dex --output=hello.dex hello.class
+# baksmali hello.dex
+# cat out/hello.smali
+
+.class Lhello;
+.super Ljava/lang/Object;
+.source "hello.java"
+
+
+# direct methods
+.method constructor <init>()V
+ .registers 1
+
+ .prologue
+ .line 1
+ invoke-direct {p0}, Ljava/lang/Object;-><init>()V
+
+ return-void
+.end method
+
+.method public static main([Ljava/lang/String;)V
+ .registers 3
+ .parameter
+
+ .prologue
+ .line 3
+ sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
+
+ const-string v1, "hi"
+
+ invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
+
+ .line 4
+ return-void
+.end method
diff --git a/tests/examplefiles/inet_pton6.dg b/tests/examplefiles/inet_pton6.dg
new file mode 100644
index 00000000..4104b3e7
--- /dev/null
+++ b/tests/examplefiles/inet_pton6.dg
@@ -0,0 +1,71 @@
+re = import!
+sys = import!
+
+
+# IPv6address = hexpart [ ":" IPv4address ]
+# IPv4address = 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT "." 1*3DIGIT
+# hexpart = [ hexseq ] [ "::" [ hexseq ] ]
+# hexseq = hex4 *( ":" hex4)
+# hex4 = 1*4HEXDIG
+hexpart = r'({0}|)(?:::({0}|)|)'.format r'(?:[\da-f]{1,4})(?::[\da-f]{1,4})*'
+addrv4 = r'(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})'
+addrv6 = re.compile $ r'(?i)(?:{})(?::{})?$'.format hexpart addrv4
+
+
+# Parse a base-N number given a list of its digits.
+#
+# :param q: the number of digits in that numeral system
+#
+# :param digits: an iterable of integers in range [0..q]
+#
+# :return: a decimal integer
+#
+base_n = (q digits) -> foldl (x y) -> (x * q + y) 0 digits
+
+
+# Parse a sequence of hexadecimal numbers
+#
+# :param q: a string of colon-separated base-16 integers
+#
+# :return: an iterable of Python ints
+#
+unhex = q -> q and map p -> (int p 16) (q.split ':')
+
+
+# Parse an IPv6 address as specified in RFC 4291.
+#
+# :param address: a string, obviously.
+#
+# :return: an integer which, written in binary form, points to the same node.
+#
+inet_pton6 = address ->
+ raise $ ValueError 'not a valid IPv6 address' if not (match = addrv6.match address)
+ start, end, *ipv4 = match.groups!
+
+ is_ipv4 = not $ None in ipv4
+ shift = (7 - start.count ':' - 2 * is_ipv4) * 16
+
+ raise $ ValueError 'not a valid IPv6 address' if (end is None and shift) or shift < 0
+ hexaddr = (base_n 0x10000 (unhex start) << shift) + base_n 0x10000 (unhex $ end or '')
+ (hexaddr << 32) + base_n 0x100 (map int ipv4) if is_ipv4 else hexaddr
+
+
+inet6_type = q -> switch
+ not q = 'unspecified'
+ q == 1 = 'loopback'
+ (q >> 32) == 0x000000000000ffff = 'IPv4-mapped'
+ (q >> 64) == 0xfe80000000000000 = 'link-local'
+ (q >> 120) != 0x00000000000000ff = 'general unicast'
+ (q >> 112) % (1 << 4) == 0x0000000000000000 = 'multicast w/ reserved scope value'
+ (q >> 112) % (1 << 4) == 0x000000000000000f = 'multicast w/ reserved scope value'
+ (q >> 112) % (1 << 4) == 0x0000000000000001 = 'interface-local multicast'
+ (q >> 112) % (1 << 4) == 0x0000000000000004 = 'admin-local multicast'
+ (q >> 112) % (1 << 4) == 0x0000000000000005 = 'site-local multicast'
+ (q >> 112) % (1 << 4) == 0x0000000000000008 = 'organization-local multicast'
+ (q >> 112) % (1 << 4) == 0x000000000000000e = 'global multicast'
+ (q >> 112) % (1 << 4) != 0x0000000000000002 = 'multicast w/ unknown scope value'
+ (q >> 24) % (1 << 112) == 0x00000000000001ff = 'solicited-node multicast'
+ True = 'link-local multicast'
+
+
+print $ (x -> (inet6_type x, hex x)) $ inet_pton6 $ sys.stdin.read!.strip!
diff --git a/tests/examplefiles/metagrammar.treetop b/tests/examplefiles/metagrammar.treetop
new file mode 100644
index 00000000..acd6af63
--- /dev/null
+++ b/tests/examplefiles/metagrammar.treetop
@@ -0,0 +1,455 @@
+module Treetop
+ module Compiler
+ grammar Metagrammar
+ rule treetop_file
+ requires:(space? require_statement)* prefix:space? module_or_grammar suffix:space? {
+ def compile
+ requires.text_value + prefix.text_value + module_or_grammar.compile + suffix.text_value
+ end
+ }
+ end
+
+ rule require_statement
+ prefix:space? "require" [ \t]+ [^\n\r]+ [\n\r]
+ end
+
+ rule module_or_grammar
+ module_declaration / grammar
+ end
+
+ rule module_declaration
+ prefix:('module' space name:([A-Z] alphanumeric_char* ('::' [A-Z] alphanumeric_char*)*) space) module_contents:(module_declaration / grammar) suffix:(space 'end') {
+ def compile
+ prefix.text_value + module_contents.compile + suffix.text_value
+ end
+
+ def parser_name
+ prefix.name.text_value+'::'+module_contents.parser_name
+ end
+ }
+ end
+
+ rule grammar
+ 'grammar' space grammar_name space ('do' space)? declaration_sequence space? 'end' <Grammar>
+ end
+
+ rule grammar_name
+ ([A-Z] alphanumeric_char*)
+ end
+
+ rule declaration_sequence
+ head:declaration tail:(space declaration)* <DeclarationSequence> {
+ def declarations
+ [head] + tail
+ end
+
+ def tail
+ super.elements.map { |elt| elt.declaration }
+ end
+ }
+ /
+ '' {
+ def compile(builder)
+ end
+ }
+ end
+
+ rule declaration
+ parsing_rule / include_declaration
+ end
+
+ rule include_declaration
+ 'include' space [A-Z] (alphanumeric_char / '::')* {
+ def compile(builder)
+ builder << text_value
+ end
+ }
+ end
+
+ rule parsing_rule
+ 'rule' space nonterminal space ('do' space)? parsing_expression space 'end' <ParsingRule>
+ end
+
+ rule parsing_expression
+ choice / sequence / primary
+ end
+
+ rule choice
+ head:alternative tail:(space? '/' space? alternative)+ <Choice> {
+ def alternatives
+ [head] + tail
+ end
+
+ def tail
+ super.elements.map {|elt| elt.alternative}
+ end
+
+ def inline_modules
+ (alternatives.map {|alt| alt.inline_modules }).flatten
+ end
+ }
+ end
+
+ rule sequence
+ head:labeled_sequence_primary tail:(space labeled_sequence_primary)+ node_class_declarations <Sequence> {
+ def sequence_elements
+ [head] + tail
+ end
+
+ def tail
+ super.elements.map {|elt| elt.labeled_sequence_primary }
+ end
+
+ def inline_modules
+ (sequence_elements.map {|elt| elt.inline_modules}).flatten +
+ [sequence_element_accessor_module] +
+ node_class_declarations.inline_modules
+ end
+
+ def inline_module_name
+ node_class_declarations.inline_module_name
+ end
+ }
+ end
+
+ rule alternative
+ sequence / primary
+ end
+
+ rule primary
+ prefix atomic {
+ def compile(address, builder, parent_expression=nil)
+ prefix.compile(address, builder, self)
+ end
+
+ def prefixed_expression
+ atomic
+ end
+
+ def inline_modules
+ atomic.inline_modules
+ end
+
+ def inline_module_name
+ nil
+ end
+ }
+ /
+ prefix space? predicate_block {
+ def compile(address, builder, parent_expression=nil)
+ prefix.compile(address, builder, self)
+ end
+ def prefixed_expression
+ predicate_block
+ end
+ def inline_modules
+ []
+ end
+ }
+ /
+ atomic suffix node_class_declarations {
+ def compile(address, builder, parent_expression=nil)
+ suffix.compile(address, builder, self)
+ end
+
+ def optional_expression
+ atomic
+ end
+
+ def node_class_name
+ node_class_declarations.node_class_name
+ end
+
+ def inline_modules
+ atomic.inline_modules + node_class_declarations.inline_modules
+ end
+
+ def inline_module_name
+ node_class_declarations.inline_module_name
+ end
+ }
+ /
+ atomic node_class_declarations {
+ def compile(address, builder, parent_expression=nil)
+ atomic.compile(address, builder, self)
+ end
+
+ def node_class_name
+ node_class_declarations.node_class_name
+ end
+
+ def inline_modules
+ atomic.inline_modules + node_class_declarations.inline_modules
+ end
+
+ def inline_module_name
+ node_class_declarations.inline_module_name
+ end
+ }
+ end
+
+ rule labeled_sequence_primary
+ label sequence_primary {
+ def compile(lexical_address, builder)
+ sequence_primary.compile(lexical_address, builder)
+ end
+
+ def inline_modules
+ sequence_primary.inline_modules
+ end
+
+ def label_name
+ if label.name
+ label.name
+ elsif sequence_primary.instance_of?(Nonterminal)
+ sequence_primary.text_value
+ else
+ nil
+ end
+ end
+ }
+ end
+
+ rule label
+ (alpha_char alphanumeric_char*) ':' {
+ def name
+ elements[0].text_value
+ end
+ }
+ /
+ '' {
+ def name
+ nil
+ end
+ }
+ end
+
+ rule sequence_primary
+ prefix atomic {
+ def compile(lexical_address, builder)
+ prefix.compile(lexical_address, builder, self)
+ end
+
+ def prefixed_expression
+ elements[1]
+ end
+
+ def inline_modules
+ atomic.inline_modules
+ end
+
+ def inline_module_name
+ nil
+ end
+ }
+ /
+ prefix space? predicate_block {
+ def compile(address, builder, parent_expression=nil)
+ prefix.compile(address, builder, self)
+ end
+ def prefixed_expression
+ predicate_block
+ end
+ def inline_modules
+ []
+ end
+ }
+ /
+ atomic suffix {
+ def compile(lexical_address, builder)
+ suffix.compile(lexical_address, builder, self)
+ end
+
+ def node_class_name
+ nil
+ end
+
+ def inline_modules
+ atomic.inline_modules
+ end
+
+ def inline_module_name
+ nil
+ end
+ }
+ /
+ atomic
+ end
+
+ rule suffix
+ repetition_suffix / optional_suffix
+ end
+
+ rule optional_suffix
+ '?' <Optional>
+ end
+
+ rule node_class_declarations
+ node_class_expression trailing_inline_module {
+ def node_class_name
+ node_class_expression.node_class_name
+ end
+
+ def inline_modules
+ trailing_inline_module.inline_modules
+ end
+
+ def inline_module
+ trailing_inline_module.inline_module
+ end
+
+ def inline_module_name
+ inline_module.module_name if inline_module
+ end
+ }
+ end
+
+ rule repetition_suffix
+ '+' <OneOrMore> / '*' <ZeroOrMore> / occurrence_range
+ end
+
+ rule occurrence_range
+ space? min:([0-9])* '..' max:([0-9])* <OccurrenceRange>
+ end
+
+ rule prefix
+ '&' <AndPredicate> / '!' <NotPredicate> / '~' <TransientPrefix>
+ end
+
+ rule atomic
+ terminal
+ /
+ nonterminal
+ /
+ parenthesized_expression
+ end
+
+ rule parenthesized_expression
+ '(' space? parsing_expression space? ')' <ParenthesizedExpression> {
+ def inline_modules
+ parsing_expression.inline_modules
+ end
+ }
+ end
+
+ rule nonterminal
+ !keyword_inside_grammar (alpha_char alphanumeric_char*) <Nonterminal>
+ end
+
+ rule terminal
+ quoted_string / character_class / anything_symbol
+ end
+
+ rule quoted_string
+ (single_quoted_string / double_quoted_string) {
+ def string
+ super.text_value
+ end
+ }
+ end
+
+ rule double_quoted_string
+ '"' string:(!'"' ("\\\\" / '\"' / .))* '"' <Terminal>
+ end
+
+ rule single_quoted_string
+ "'" string:(!"'" ("\\\\" / "\\'" / .))* "'" <Terminal>
+ end
+
+ rule character_class
+ '[' characters:(!']' ('\\' . / bracket_expression / !'\\' .))+ ']' <CharacterClass> {
+ def characters
+ super.text_value
+ end
+ }
+ end
+
+ rule bracket_expression
+ '[:' '^'? (
+ 'alnum' / 'alpha' / 'blank' / 'cntrl' / 'digit' / 'graph' / 'lower' /
+ 'print' / 'punct' / 'space' / 'upper' / 'xdigit' / 'word'
+ ) ':]'
+ end
+
+ rule anything_symbol
+ '.' <AnythingSymbol>
+ end
+
+ rule node_class_expression
+ space '<' (!'>' .)+ '>' {
+ def node_class_name
+ elements[2].text_value
+ end
+ }
+ /
+ '' {
+ def node_class_name
+ nil
+ end
+ }
+ end
+
+ rule trailing_inline_module
+ space inline_module {
+ def inline_modules
+ [inline_module]
+ end
+
+ def inline_module_name
+ inline_module.module_name
+ end
+ }
+ /
+ '' {
+ def inline_modules
+ []
+ end
+
+ def inline_module
+ nil
+ end
+
+ def inline_module_name
+ nil
+ end
+ }
+ end
+
+ rule predicate_block
+ '' inline_module <PredicateBlock>
+ end
+
+ rule inline_module
+ '{' (inline_module / ![{}] .)* '}' <InlineModule>
+ end
+
+ rule keyword_inside_grammar
+ ('rule' / 'end') !non_space_char
+ end
+
+ rule non_space_char
+ !space .
+ end
+
+ rule alpha_char
+ [A-Za-z_]
+ end
+
+ rule alphanumeric_char
+ alpha_char / [0-9]
+ end
+
+ rule space
+ (white / comment_to_eol)+
+ end
+
+ rule comment_to_eol
+ '#' (!"\n" .)*
+ end
+
+ rule white
+ [ \t\n\r]
+ end
+ end
+ end
+end
diff --git a/tests/examplefiles/minehunt.qml b/tests/examplefiles/minehunt.qml
new file mode 100644
index 00000000..548e7e89
--- /dev/null
+++ b/tests/examplefiles/minehunt.qml
@@ -0,0 +1,112 @@
+ /****************************************************************************
+ **
+ ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+ ** All rights reserved.
+ ** Contact: Nokia Corporation (qt-info@nokia.com)
+ **
+ ** This file is part of the QtDeclarative module of the Qt Toolkit.
+ **
+ ** $QT_BEGIN_LICENSE:LGPL$
+ ** GNU Lesser General Public License Usage
+ ** This file may be used under the terms of the GNU Lesser General Public
+ ** License version 2.1 as published by the Free Software Foundation and
+ ** appearing in the file LICENSE.LGPL included in the packaging of this
+ ** file. Please review the following information to ensure the GNU Lesser
+ ** General Public License version 2.1 requirements will be met:
+ ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+ **
+ ** In addition, as a special exception, Nokia gives you certain additional
+ ** rights. These rights are described in the Nokia Qt LGPL Exception
+ ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+ **
+ ** GNU General Public License Usage
+ ** Alternatively, this file may be used under the terms of the GNU General
+ ** Public License version 3.0 as published by the Free Software Foundation
+ ** and appearing in the file LICENSE.GPL included in the packaging of this
+ ** file. Please review the following information to ensure the GNU General
+ ** Public License version 3.0 requirements will be met:
+ ** http://www.gnu.org/copyleft/gpl.html.
+ **
+ ** Other Usage
+ ** Alternatively, this file may be used in accordance with the terms and
+ ** conditions contained in a signed written agreement between you and Nokia.
+ **
+ **
+ **
+ **
+ **
+ ** $QT_END_LICENSE$
+ **
+ ****************************************************************************/
+
+ import QtQuick 1.0
+ import "MinehuntCore" 1.0
+
+ Item {
+ id: field
+ property int clickx: 0
+ property int clicky: 0
+
+ width: 450; height: 450
+
+ Image { source: "MinehuntCore/pics/background.png"; anchors.fill: parent; fillMode: Image.Tile }
+
+ Grid {
+ anchors.horizontalCenter: parent.horizontalCenter
+ columns: 9; spacing: 1
+
+ Repeater {
+ id: repeater
+ model: tiles
+ delegate: Tile {}
+ }
+ }
+
+ Row {
+ id: gamedata
+ x: 20; spacing: 20
+ anchors.bottom: field.bottom; anchors.bottomMargin: 15
+
+ Image {
+ source: "MinehuntCore/pics/quit.png"
+ scale: quitMouse.pressed ? 0.8 : 1.0
+ smooth: quitMouse.pressed
+ y: 10
+ MouseArea {
+ id: quitMouse
+ anchors.fill: parent
+ anchors.margins: -20
+ onClicked: Qt.quit()
+ }
+ }
+ Column {
+ spacing: 2
+ Image { source: "MinehuntCore/pics/bomb-color.png" }
+ Text { anchors.horizontalCenter: parent.horizontalCenter; color: "white"; text: numMines }
+ }
+
+ Column {
+ spacing: 2
+ Image { source: "MinehuntCore/pics/flag-color.png" }
+ Text { anchors.horizontalCenter: parent.horizontalCenter; color: "white"; text: numFlags }
+ }
+ }
+
+ Image {
+ anchors.bottom: field.bottom; anchors.bottomMargin: 15
+ anchors.right: field.right; anchors.rightMargin: 20
+ source: isPlaying ? 'MinehuntCore/pics/face-smile.png' :
+ hasWon ? 'MinehuntCore/pics/face-smile-big.png': 'MinehuntCore/pics/face-sad.png'
+
+ MouseArea { anchors.fill: parent; onPressed: reset() }
+ }
+ Text {
+ anchors.centerIn: parent; width: parent.width - 20
+ horizontalAlignment: Text.AlignHCenter
+ wrapMode: Text.WordWrap
+ text: "Minehunt demo has to be compiled to run.\n\nPlease see README."
+ color: "white"; font.bold: true; font.pixelSize: 14
+ visible: tiles == undefined
+ }
+
+ }
diff --git a/tests/examplefiles/nanomsg.intr b/tests/examplefiles/nanomsg.intr
new file mode 100644
index 00000000..d21f62cc
--- /dev/null
+++ b/tests/examplefiles/nanomsg.intr
@@ -0,0 +1,95 @@
+module: nanomsg
+synopsis: generated bindings for the nanomsg library
+author: Bruce Mitchener, Jr.
+copyright: See LICENSE file in this distribution.
+
+define simple-C-mapped-subtype <C-buffer-offset> (<C-char*>)
+ export-map <machine-word>, export-function: identity;
+end;
+
+define interface
+ #include {
+ "sp/sp.h",
+ "sp/fanin.h",
+ "sp/inproc.h",
+ "sp/pair.h",
+ "sp/reqrep.h",
+ "sp/survey.h",
+ "sp/fanout.h",
+ "sp/ipc.h",
+ "sp/pubsub.h",
+ "sp/tcp.h"
+ },
+
+ exclude: {
+ "SP_HAUSNUMERO",
+ "SP_PAIR_ID",
+ "SP_PUBSUB_ID",
+ "SP_REQREP_ID",
+ "SP_FANIN_ID",
+ "SP_FANOUT_ID",
+ "SP_SURVEY_ID"
+ },
+
+ equate: {"char *" => <c-string>},
+
+ rename: {
+ "sp_recv" => %sp-recv,
+ "sp_send" => %sp-send,
+ "sp_setsockopt" => %sp-setsockopt
+ };
+
+ function "sp_version",
+ output-argument: 1,
+ output-argument: 2,
+ output-argument: 3;
+
+ function "sp_send",
+ map-argument: { 2 => <C-buffer-offset> };
+
+ function "sp_recv",
+ map-argument: { 2 => <C-buffer-offset> };
+
+end interface;
+
+// Function for adding the base address of the repeated slots of a <buffer>
+// to an offset and returning the result as a <machine-word>. This is
+// necessary for passing <buffer> contents across the FFI.
+
+define function buffer-offset
+ (the-buffer :: <buffer>, data-offset :: <integer>)
+ => (result-offset :: <machine-word>)
+ u%+(data-offset,
+ primitive-wrap-machine-word
+ (primitive-repeated-slot-as-raw
+ (the-buffer, primitive-repeated-slot-offset(the-buffer))))
+end function;
+
+define inline function sp-send (socket :: <integer>, data :: <buffer>, flags :: <integer>) => (res :: <integer>)
+ %sp-send(socket, buffer-offset(data, 0), data.size, flags)
+end;
+
+define inline function sp-recv (socket :: <integer>, data :: <buffer>, flags :: <integer>) => (res :: <integer>)
+ %sp-recv(socket, buffer-offset(data, 0), data.size, flags);
+end;
+
+define inline method sp-setsockopt (socket :: <integer>, level :: <integer>, option :: <integer>, value :: <integer>)
+ with-stack-structure (int :: <C-int*>)
+ pointer-value(int) := value;
+ let setsockopt-result =
+ %sp-setsockopt(socket, level, option, int, size-of(<C-int*>));
+ if (setsockopt-result < 0)
+ // Check error!
+ end;
+ setsockopt-result
+ end;
+end;
+
+define inline method sp-setsockopt (socket :: <integer>, level :: <integer>, option :: <integer>, data :: <byte-string>)
+ let setsockopt-result =
+ %sp-setsockopt(socket, level, option, as(<c-string>, data), data.size);
+ if (setsockopt-result < 0)
+ // Check error!
+ end;
+ setsockopt-result
+end;
diff --git a/tests/examplefiles/phpMyAdmin.spec b/tests/examplefiles/phpMyAdmin.spec
new file mode 100644
index 00000000..120fbc92
--- /dev/null
+++ b/tests/examplefiles/phpMyAdmin.spec
@@ -0,0 +1,163 @@
+%define _myadminpath /var/www/myadmin
+%define pkgrelease rc1
+%define microrelease 1
+
+Name: phpMyAdmin
+Version: 3.1.1
+Release: %{pkgrelease}.%{microrelease}
+License: GPL
+Group: Applications/Databases/Interfaces
+Source0: http://prdownloads.sourceforge.net/phpmyadmin/%{name}-%{version}-%{pkgrelease}.tar.bz2
+Source1: phpMyAdmin-http.conf
+URL: http://sourceforge.net/projects/phpmyadmin/
+Requires: mysql
+Requires: php-mysql
+Buildarch: noarch
+#BuildRoot: %{_tmppath}/%{name}-root
+
+Summary: phpMyAdmin - web-based MySQL administration
+
+%description
+phpMyAdmin can manage a whole MySQL-server (needs a super-user) but
+also a single database. To accomplish the latter you'll need a
+properly set up MySQL-user which can read/write only the desired
+database. It's up to you to look up the appropiate part in the MySQL
+manual. Currently phpMyAdmin can:
+ - create and drop databases
+ - create, copy, drop and alter tables
+ - delete, edit and add fields
+ - execute any SQL-statement, even batch-queries
+ - manage keys on fields
+ - load text files into tables
+ - create (*) and read dumps of tables
+ - export (*) and import data to CSV values
+ - administer multiple servers and single databases
+ - check referencial integrity
+ - create complex queries automatically connecting required tables
+ - create PDF graphics of your database layout
+ - communicate in more than 38 different languages
+
+
+%prep
+%setup -q -n %{name}-%{version}-%{pkgrelease}
+
+
+%build
+
+
+%install
+[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d "${RPM_BUILD_ROOT}" ] && \
+ rm -rf "${RPM_BUILD_ROOT}"
+
+# Create directories.
+
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/{css,js,lang,libraries,themes}
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/libraries/{auth,dbg,dbi,engines}
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/libraries/{export,tcpdf,import}
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/libraries/transformations
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/libraries/tcpdf/font
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/themes/{darkblue_orange,original}
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/themes/darkblue_orange/{css,img}
+install -d "${RPM_BUILD_ROOT}%{_myadminpath}"/themes/original/{css,img}
+
+# Install files.
+
+install libraries/config.default.php \
+ "${RPM_BUILD_ROOT}%{_myadminpath}"/config.inc.php
+install *.{php,ico} "${RPM_BUILD_ROOT}%{_myadminpath}"/
+install ChangeLog LICENSE README "${RPM_BUILD_ROOT}%{_myadminpath}"/
+install Documentation.html docs.css "${RPM_BUILD_ROOT}%{_myadminpath}"/
+install css/* "${RPM_BUILD_ROOT}%{_myadminpath}/css"/
+install js/* "${RPM_BUILD_ROOT}%{_myadminpath}/js"/
+install lang/*.php "${RPM_BUILD_ROOT}%{_myadminpath}/lang"/
+install libraries/*.php "${RPM_BUILD_ROOT}%{_myadminpath}/libraries"/
+install libraries/auth/*.php "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/auth"/
+install libraries/dbg/*.php "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/dbg"/
+install libraries/dbi/*.php "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/dbi"/
+install libraries/engines/*.php \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/engines"/
+install libraries/export/*.php \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/export"/
+install libraries/tcpdf/*.php "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/tcpdf"/
+install libraries/tcpdf/font/*.{php,z} \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/tcpdf/font"/
+install libraries/import/*.php \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/import"/
+install libraries/transformations/*.php \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/libraries/transformations"/
+install themes/darkblue_orange/*.{php,png} \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/themes/darkblue_orange"/
+install themes/darkblue_orange/css/*.php \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/themes/darkblue_orange/css"/
+install themes/darkblue_orange/img/*.{png,ico} \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/themes/darkblue_orange/img"/
+install themes/original/*.{php,png} \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/themes/original"/
+install themes/original/css/*.php \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/themes/original/css"/
+install themes/original/img/*.{png,ico} \
+ "${RPM_BUILD_ROOT}%{_myadminpath}/themes/original/img"/
+
+# Create documentation directories.
+
+DOCROOT="${RPM_BUILD_ROOT}%{_docdir}/%{name}-%{version}"
+install -d "${DOCROOT}"
+install -d "${DOCROOT}"/{lang,scripts,transformations}
+
+# Install documentation files.
+
+install RELEASE-DATE-* "${DOCROOT}"/
+install CREDITS ChangeLog INSTALL LICENSE "${DOCROOT}"/
+install README TODO "${DOCROOT}"/
+install Documentation.* docs.css "${DOCROOT}"/
+install translators.html "${DOCROOT}"/
+install lang/*.sh "${DOCROOT}"/lang/
+install scripts/* "${DOCROOT}"/scripts/
+install libraries/tcpdf/README "${DOCROOT}"/README.tcpdf
+install libraries/import/README "${DOCROOT}"/README.import
+install libraries/transformations/README "${DOCROOT}"/transformations/
+install libraries/transformations/TEMPLATE* "${DOCROOT}"/transformations/
+install libraries/transformations/*.sh "${DOCROOT}"/transformations/
+
+# Install configuration file for Apache.
+
+install -d "${RPM_BUILD_ROOT}%{_sysconfdir}/httpd/conf.d"
+install "%{SOURCE1}" \
+ "${RPM_BUILD_ROOT}%{_sysconfdir}/httpd/conf.d/phpMyAdmin.conf"
+
+# Generate non-configuration file list.
+
+(cd "${RPM_BUILD_ROOT}"; ls -d ."%{_myadminpath}"/*) |
+ sed -e '/\/config\.inc\.php$/d' -e 's/^.//' > files.list
+
+
+
+%clean
+[ "${RPM_BUILD_ROOT}" != "/" ] && [ -d "${RPM_BUILD_ROOT}" ] && \
+ rm -rf "${RPM_BUILD_ROOT}"
+
+
+%files -f files.list
+%defattr(644, root, root, 755)
+%doc %{_docdir}/%{name}-%{version}
+%dir %{_myadminpath}
+%attr(640,root,apache) %config(noreplace) %verify(not size mtime md5) %{_myadminpath}/config.inc.php
+%config(noreplace) %verify(not size mtime md5) %{_sysconfdir}/httpd/conf.d/*
+
+
+%changelog
+* Thu Feb 23 2006 Patrick Monnerat <pm@datasphere.ch>
+- Version 2.8.0-rc1.1.
+
+* Thu Dec 22 2005 Patrick Monnerat <patrick.monnerat@econophone.ch>
+- Path "nullpw" to allow trying connection with null password after failure.
+- Version 2.7.0-pl1.1.
+
+* Mon Aug 22 2005 Patrick Monnerat <patrick.monnerat@econophone.ch>
+- Version 2.6.3-pl1.
+
+* Wed Jul 21 2004 Patrick Monnerat <patrick.monnerat@econophone.ch>
+- Version 2.5.7-pl1.
+
+* Fri Nov 22 2002 Patrick Monnerat <patrick.monnerat@econophone.ch>
+- Version 2.3.0-rc1.
diff --git a/tests/examplefiles/pytb_test3.pytb b/tests/examplefiles/pytb_test3.pytb
new file mode 100644
index 00000000..6947c1ef
--- /dev/null
+++ b/tests/examplefiles/pytb_test3.pytb
@@ -0,0 +1,4 @@
+>>> 3/"3"
+Traceback (most recent call last):
+ File "<stdin>", line 1, in <module>
+TypeError: unsupported operand type(s) for /: 'int' and 'str'
diff --git a/tests/examplefiles/robotframework.txt b/tests/examplefiles/robotframework.txt
new file mode 100644
index 00000000..63ba63e6
--- /dev/null
+++ b/tests/examplefiles/robotframework.txt
@@ -0,0 +1,39 @@
+*** Settings ***
+Documentation Simple example demonstrating syntax highlighting.
+Library ExampleLibrary
+Test Setup Keyword argument argument with ${VARIABLE}
+
+*** Variables ***
+${VARIABLE} Variable value
+@{LIST} List variable here
+
+*** Test Cases ***
+Keyword-driven example
+ Initialize System
+ Do Something
+ Result Should Be 42
+ [Teardown] Cleanup System
+
+Data-driven example
+ [Template] Keyword
+ argument1 argument2
+ argument ${VARIABLE}
+ @{LIST}
+
+Gherkin
+ Given system is initialized
+ When something is done
+ Then result should be "42"
+
+| Pipes |
+| | [Documentation] | Also pipe separated format is supported. |
+| | Log | As this example demonstrates. |
+
+*** Keywords ***
+Result Should Be
+ [Arguments] ${expected}
+ ${actual} = Get Value
+ Should be Equal ${actual} ${expected}
+
+Then result should be "${expected}"
+ Result Should Be ${expected}
diff --git a/tests/examplefiles/rust_example.rs b/tests/examplefiles/rust_example.rs
index af791fbc..1c0a70c3 100644
--- a/tests/examplefiles/rust_example.rs
+++ b/tests/examplefiles/rust_example.rs
@@ -1,743 +1,233 @@
-
-#[doc = "json serialization"];
-
-import result::{result, ok, err};
-import io;
-import io::{reader_util, writer_util};
-import map;
-import map::hashmap;
-
-export json;
-export error;
-export to_writer;
-export to_str;
-export from_reader;
-export from_str;
-export eq;
-
-export num;
-export string;
-export boolean;
-export list;
-export dict;
-export null;
-
-#[doc = "Represents a json value"]
-enum json {
- num(float),
- string(str),
- boolean(bool),
- list([json]),
- dict(map::hashmap<str,json>),
- null,
+// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// based on:
+// http://shootout.alioth.debian.org/u32/benchmark.php?test=nbody&lang=java
+
+extern mod std;
+
+use core::os;
+
+// Using sqrt from the standard library is way slower than using libc
+// directly even though std just calls libc, I guess it must be
+// because the the indirection through another dynamic linker
+// stub. Kind of shocking. Might be able to make it faster still with
+// an llvm intrinsic.
+#[nolink]
+extern mod libc {
+ #[legacy_exports];
+ fn sqrt(n: float) -> float;
}
-type error = {
- line: uint,
- col: uint,
- msg: str,
-};
-
-#[doc = "Serializes a json value into a io::writer"]
-fn to_writer(wr: io::writer, j: json) {
- alt j {
- num(n) { wr.write_str(float::to_str(n, 6u)); }
- string(s) {
- wr.write_char('"');
- let mut escaped = "";
- str::chars_iter(s) { |c|
- alt c {
- '"' { escaped += "\\\""; }
- '\\' { escaped += "\\\\"; }
- '\x08' { escaped += "\\b"; }
- '\x0c' { escaped += "\\f"; }
- '\n' { escaped += "\\n"; }
- '\r' { escaped += "\\r"; }
- '\t' { escaped += "\\t"; }
- _ { escaped += str::from_char(c); }
- }
- };
- wr.write_str(escaped);
- wr.write_char('"');
- }
- boolean(b) {
- wr.write_str(if b { "true" } else { "false" });
- }
- list(v) {
- wr.write_char('[');
- let mut first = true;
- vec::iter(v) { |item|
- if !first {
- wr.write_str(", ");
- }
- first = false;
- to_writer(wr, item);
- };
- wr.write_char(']');
- }
- dict(d) {
- if d.size() == 0u {
- wr.write_str("{}");
- ret;
- }
-
- wr.write_str("{ ");
- let mut first = true;
- d.items { |key, value|
- if !first {
- wr.write_str(", ");
- }
- first = false;
- to_writer(wr, string(key));
- wr.write_str(": ");
- to_writer(wr, value);
- };
- wr.write_str(" }");
- }
- null {
- wr.write_str("null");
- }
- }
+fn main() {
+ let args = os::args();
+ let args = if os::getenv(~"RUST_BENCH").is_some() {
+ ~[~"", ~"4000000"]
+ } else if args.len() <= 1u {
+ ~[~"", ~"100000"]
+ } else {
+ args
+ };
+ let n = int::from_str(args[1]).get();
+ let mut bodies: ~[Body::props] = NBodySystem::make();
+ io::println(fmt!("%f", NBodySystem::energy(bodies)));
+ let mut i = 0;
+ while i < n {
+ NBodySystem::advance(bodies, 0.01);
+ i += 1;
+ }
+ io::println(fmt!("%f", NBodySystem::energy(bodies)));
}
-#[doc = "Serializes a json value into a string"]
-fn to_str(j: json) -> str {
- io::with_str_writer { |wr| to_writer(wr, j) }
-}
+mod NBodySystem {
+ use Body;
-type parser = {
- rdr: io::reader,
- mut ch: char,
- mut line: uint,
- mut col: uint,
-};
+ pub fn make() -> ~[Body::props] {
+ let mut bodies: ~[Body::props] =
+ ~[Body::sun(),
+ Body::jupiter(),
+ Body::saturn(),
+ Body::uranus(),
+ Body::neptune()];
-impl parser for parser {
- fn eof() -> bool { self.ch == -1 as char }
+ let mut px = 0.0;
+ let mut py = 0.0;
+ let mut pz = 0.0;
- fn bump() {
- self.ch = self.rdr.read_char();
+ let mut i = 0;
+ while i < 5 {
+ px += bodies[i].vx * bodies[i].mass;
+ py += bodies[i].vy * bodies[i].mass;
+ pz += bodies[i].vz * bodies[i].mass;
- if self.ch == '\n' {
- self.line += 1u;
- self.col = 1u;
- } else {
- self.col += 1u;
+ i += 1;
}
- }
- fn next_char() -> char {
- self.bump();
- self.ch
- }
+ // side-effecting
+ Body::offset_momentum(&mut bodies[0], px, py, pz);
- fn error<T>(msg: str) -> result<T, error> {
- err({ line: self.line, col: self.col, msg: msg })
+ return bodies;
}
- fn parse() -> result<json, error> {
- alt self.parse_value() {
- ok(value) {
- // Skip trailing whitespaces.
- self.parse_whitespace();
- // Make sure there is no trailing characters.
- if self.eof() {
- ok(value)
- } else {
- self.error("trailing characters")
+ pub fn advance(bodies: &mut [Body::props], dt: float) {
+ let mut i = 0;
+ while i < 5 {
+ let mut j = i + 1;
+ while j < 5 {
+ advance_one(&mut bodies[i],
+ &mut bodies[j], dt);
+ j += 1;
}
- }
- e { e }
- }
- }
- fn parse_value() -> result<json, error> {
- self.parse_whitespace();
-
- if self.eof() { ret self.error("EOF while parsing value"); }
-
- alt self.ch {
- 'n' { self.parse_ident("ull", null) }
- 't' { self.parse_ident("rue", boolean(true)) }
- 'f' { self.parse_ident("alse", boolean(false)) }
- '0' to '9' | '-' { self.parse_number() }
- '"' {
- alt self.parse_str() {
- ok(s) { ok(string(s)) }
- err(e) { err(e) }
- }
- }
- '[' { self.parse_list() }
- '{' { self.parse_object() }
- _ { self.error("invalid syntax") }
+ i += 1;
}
- }
- fn parse_whitespace() {
- while char::is_whitespace(self.ch) { self.bump(); }
- }
-
- fn parse_ident(ident: str, value: json) -> result<json, error> {
- if str::all(ident, { |c| c == self.next_char() }) {
- self.bump();
- ok(value)
- } else {
- self.error("invalid syntax")
+ i = 0;
+ while i < 5 {
+ move_(&mut bodies[i], dt);
+ i += 1;
}
}
- fn parse_number() -> result<json, error> {
- let mut neg = 1f;
+ pub fn advance_one(bi: &mut Body::props,
+ bj: &mut Body::props,
+ dt: float) unsafe {
+ let dx = bi.x - bj.x;
+ let dy = bi.y - bj.y;
+ let dz = bi.z - bj.z;
- if self.ch == '-' {
- self.bump();
- neg = -1f;
- }
+ let dSquared = dx * dx + dy * dy + dz * dz;
- let mut res = alt self.parse_integer() {
- ok(res) { res }
- err(e) { ret err(e); }
- };
+ let distance = ::libc::sqrt(dSquared);
+ let mag = dt / (dSquared * distance);
- if self.ch == '.' {
- alt self.parse_decimal(res) {
- ok(r) { res = r; }
- err(e) { ret err(e); }
- }
- }
-
- if self.ch == 'e' || self.ch == 'E' {
- alt self.parse_exponent(res) {
- ok(r) { res = r; }
- err(e) { ret err(e); }
- }
- }
+ bi.vx -= dx * bj.mass * mag;
+ bi.vy -= dy * bj.mass * mag;
+ bi.vz -= dz * bj.mass * mag;
- ok(num(neg * res))
+ bj.vx += dx * bi.mass * mag;
+ bj.vy += dy * bi.mass * mag;
+ bj.vz += dz * bi.mass * mag;
}
- fn parse_integer() -> result<float, error> {
- let mut res = 0f;
-
- alt self.ch {
- '0' {
- self.bump();
-
- // There can be only one leading '0'.
- alt self.ch {
- '0' to '9' { ret self.error("invalid number"); }
- _ {}
- }
- }
- '1' to '9' {
- while !self.eof() {
- alt self.ch {
- '0' to '9' {
- res *= 10f;
- res += ((self.ch as int) - ('0' as int)) as float;
-
- self.bump();
- }
- _ { break; }
- }
- }
- }
- _ { ret self.error("invalid number"); }
- }
-
- ok(res)
+ pub fn move_(b: &mut Body::props, dt: float) {
+ b.x += dt * b.vx;
+ b.y += dt * b.vy;
+ b.z += dt * b.vz;
}
- fn parse_decimal(res: float) -> result<float, error> {
- self.bump();
+ pub fn energy(bodies: &[Body::props]) -> float unsafe {
+ let mut dx;
+ let mut dy;
+ let mut dz;
+ let mut distance;
+ let mut e = 0.0;
- // Make sure a digit follows the decimal place.
- alt self.ch {
- '0' to '9' {}
- _ { ret self.error("invalid number"); }
- }
-
- let mut res = res;
- let mut dec = 1f;
- while !self.eof() {
- alt self.ch {
- '0' to '9' {
- dec /= 10f;
- res += (((self.ch as int) - ('0' as int)) as float) * dec;
-
- self.bump();
- }
- _ { break; }
- }
- }
-
- ok(res)
- }
-
- fn parse_exponent(res: float) -> result<float, error> {
- self.bump();
+ let mut i = 0;
+ while i < 5 {
+ e +=
+ 0.5 * bodies[i].mass *
+ (bodies[i].vx * bodies[i].vx + bodies[i].vy * bodies[i].vy
+ + bodies[i].vz * bodies[i].vz);
- let mut res = res;
- let mut exp = 0u;
- let mut neg_exp = false;
+ let mut j = i + 1;
+ while j < 5 {
+ dx = bodies[i].x - bodies[j].x;
+ dy = bodies[i].y - bodies[j].y;
+ dz = bodies[i].z - bodies[j].z;
- alt self.ch {
- '+' { self.bump(); }
- '-' { self.bump(); neg_exp = true; }
- _ {}
- }
-
- // Make sure a digit follows the exponent place.
- alt self.ch {
- '0' to '9' {}
- _ { ret self.error("invalid number"); }
- }
-
- while !self.eof() {
- alt self.ch {
- '0' to '9' {
- exp *= 10u;
- exp += (self.ch as uint) - ('0' as uint);
+ distance = ::libc::sqrt(dx * dx + dy * dy + dz * dz);
+ e -= bodies[i].mass * bodies[j].mass / distance;
- self.bump();
- }
- _ { break; }
+ j += 1;
}
- }
- let exp = float::pow_with_uint(10u, exp);
- if neg_exp {
- res /= exp;
- } else {
- res *= exp;
+ i += 1;
}
+ return e;
- ok(res)
- }
-
- fn parse_str() -> result<str, error> {
- let mut escape = false;
- let mut res = "";
-
- while !self.eof() {
- self.bump();
-
- if (escape) {
- alt self.ch {
- '"' { str::push_char(res, '"'); }
- '\\' { str::push_char(res, '\\'); }
- '/' { str::push_char(res, '/'); }
- 'b' { str::push_char(res, '\x08'); }
- 'f' { str::push_char(res, '\x0c'); }
- 'n' { str::push_char(res, '\n'); }
- 'r' { str::push_char(res, '\r'); }
- 't' { str::push_char(res, '\t'); }
- 'u' {
- // Parse \u1234.
- let mut i = 0u;
- let mut n = 0u;
- while i < 4u {
- alt self.next_char() {
- '0' to '9' {
- n = n * 10u +
- (self.ch as uint) - ('0' as uint);
- }
- _ { ret self.error("invalid \\u escape"); }
- }
- i += 1u;
- }
-
- // Error out if we didn't parse 4 digits.
- if i != 4u {
- ret self.error("invalid \\u escape");
- }
-
- str::push_char(res, n as char);
- }
- _ { ret self.error("invalid escape"); }
- }
- escape = false;
- } else if self.ch == '\\' {
- escape = true;
- } else {
- if self.ch == '"' {
- self.bump();
- ret ok(res);
- }
- str::push_char(res, self.ch);
- }
- }
-
- self.error("EOF while parsing string")
- }
-
- fn parse_list() -> result<json, error> {
- self.bump();
- self.parse_whitespace();
-
- let mut values = [];
-
- if self.ch == ']' {
- self.bump();
- ret ok(list(values));
- }
-
- loop {
- alt self.parse_value() {
- ok(v) { vec::push(values, v); }
- e { ret e; }
- }
-
- self.parse_whitespace();
- if self.eof() {
- ret self.error("EOF while parsing list");
- }
-
- alt self.ch {
- ',' { self.bump(); }
- ']' { self.bump(); ret ok(list(values)); }
- _ { ret self.error("expecting ',' or ']'"); }
- }
- };
- }
-
- fn parse_object() -> result<json, error> {
- self.bump();
- self.parse_whitespace();
-
- let values = map::str_hash();
-
- if self.ch == '}' {
- self.bump();
- ret ok(dict(values));
- }
-
- while !self.eof() {
- self.parse_whitespace();
-
- if self.ch != '"' {
- ret self.error("key must be a string");
- }
-
- let key = alt self.parse_str() {
- ok(key) { key }
- err(e) { ret err(e); }
- };
-
- self.parse_whitespace();
-
- if self.ch != ':' {
- if self.eof() { break; }
- ret self.error("expecting ':'");
- }
- self.bump();
-
- alt self.parse_value() {
- ok(value) { values.insert(key, value); }
- e { ret e; }
- }
- self.parse_whitespace();
-
- alt self.ch {
- ',' { self.bump(); }
- '}' { self.bump(); ret ok(dict(values)); }
- _ {
- if self.eof() { break; }
- ret self.error("expecting ',' or '}'");
- }
- }
- }
-
- ret self.error("EOF while parsing object");
- }
-}
-
-#[doc = "Deserializes a json value from an io::reader"]
-fn from_reader(rdr: io::reader) -> result<json, error> {
- let parser = {
- rdr: rdr,
- mut ch: rdr.read_char(),
- mut line: 1u,
- mut col: 1u,
- };
-
- parser.parse()
-}
-
-#[doc = "Deserializes a json value from a string"]
-fn from_str(s: str) -> result<json, error> {
- io::with_str_reader(s, from_reader)
-}
-
-#[doc = "Test if two json values are equal"]
-fn eq(value0: json, value1: json) -> bool {
- alt (value0, value1) {
- (num(f0), num(f1)) { f0 == f1 }
- (string(s0), string(s1)) { s0 == s1 }
- (boolean(b0), boolean(b1)) { b0 == b1 }
- (list(l0), list(l1)) { vec::all2(l0, l1, eq) }
- (dict(d0), dict(d1)) {
- if d0.size() == d1.size() {
- let mut equal = true;
- d0.items { |k, v0|
- alt d1.find(k) {
- some(v1) {
- if !eq(v0, v1) { equal = false; } }
- none { equal = false; }
- }
- };
- equal
- } else {
- false
- }
- }
- (null, null) { true }
- _ { false }
}
}
-#[cfg(test)]
-mod tests {
- fn mk_dict(items: [(str, json)]) -> json {
- let d = map::str_hash();
-
- vec::iter(items) { |item|
- let (key, value) = item;
- d.insert(key, value);
- };
-
- dict(d)
- }
-
- #[test]
- fn test_write_null() {
- assert to_str(null) == "null";
- }
-
- #[test]
- fn test_write_num() {
- assert to_str(num(3f)) == "3";
- assert to_str(num(3.1f)) == "3.1";
- assert to_str(num(-1.5f)) == "-1.5";
- assert to_str(num(0.5f)) == "0.5";
- }
-
- #[test]
- fn test_write_str() {
- assert to_str(string("")) == "\"\"";
- assert to_str(string("foo")) == "\"foo\"";
- }
-
- #[test]
- fn test_write_bool() {
- assert to_str(boolean(true)) == "true";
- assert to_str(boolean(false)) == "false";
- }
-
- #[test]
- fn test_write_list() {
- assert to_str(list([])) == "[]";
- assert to_str(list([boolean(true)])) == "[true]";
- assert to_str(list([
- boolean(false),
- null,
- list([string("foo\nbar"), num(3.5f)])
- ])) == "[false, null, [\"foo\\nbar\", 3.5]]";
- }
-
- #[test]
- fn test_write_dict() {
- assert to_str(mk_dict([])) == "{}";
- assert to_str(mk_dict([("a", boolean(true))])) == "{ \"a\": true }";
- assert to_str(mk_dict([
- ("a", boolean(true)),
- ("b", list([
- mk_dict([("c", string("\x0c\r"))]),
- mk_dict([("d", string(""))])
- ]))
- ])) ==
- "{ " +
- "\"a\": true, " +
- "\"b\": [" +
- "{ \"c\": \"\\f\\r\" }, " +
- "{ \"d\": \"\" }" +
- "]" +
- " }";
+mod Body {
+ use Body;
+
+ pub const PI: float = 3.141592653589793;
+ pub const SOLAR_MASS: float = 39.478417604357432;
+ // was 4 * PI * PI originally
+ pub const DAYS_PER_YEAR: float = 365.24;
+
+ pub type props =
+ {mut x: float,
+ mut y: float,
+ mut z: float,
+ mut vx: float,
+ mut vy: float,
+ mut vz: float,
+ mass: float};
+
+ pub fn jupiter() -> Body::props {
+ return {mut x: 4.84143144246472090e+00,
+ mut y: -1.16032004402742839e+00,
+ mut z: -1.03622044471123109e-01,
+ mut vx: 1.66007664274403694e-03 * DAYS_PER_YEAR,
+ mut vy: 7.69901118419740425e-03 * DAYS_PER_YEAR,
+ mut vz: -6.90460016972063023e-05 * DAYS_PER_YEAR,
+ mass: 9.54791938424326609e-04 * SOLAR_MASS};
+ }
+
+ pub fn saturn() -> Body::props {
+ return {mut x: 8.34336671824457987e+00,
+ mut y: 4.12479856412430479e+00,
+ mut z: -4.03523417114321381e-01,
+ mut vx: -2.76742510726862411e-03 * DAYS_PER_YEAR,
+ mut vy: 4.99852801234917238e-03 * DAYS_PER_YEAR,
+ mut vz: 2.30417297573763929e-05 * DAYS_PER_YEAR,
+ mass: 2.85885980666130812e-04 * SOLAR_MASS};
+ }
+
+ pub fn uranus() -> Body::props {
+ return {mut x: 1.28943695621391310e+01,
+ mut y: -1.51111514016986312e+01,
+ mut z: -2.23307578892655734e-01,
+ mut vx: 2.96460137564761618e-03 * DAYS_PER_YEAR,
+ mut vy: 2.37847173959480950e-03 * DAYS_PER_YEAR,
+ mut vz: -2.96589568540237556e-05 * DAYS_PER_YEAR,
+ mass: 4.36624404335156298e-05 * SOLAR_MASS};
+ }
+
+ pub fn neptune() -> Body::props {
+ return {mut x: 1.53796971148509165e+01,
+ mut y: -2.59193146099879641e+01,
+ mut z: 1.79258772950371181e-01,
+ mut vx: 2.68067772490389322e-03 * DAYS_PER_YEAR,
+ mut vy: 1.62824170038242295e-03 * DAYS_PER_YEAR,
+ mut vz: -9.51592254519715870e-05 * DAYS_PER_YEAR,
+ mass: 5.15138902046611451e-05 * SOLAR_MASS};
+ }
+
+ pub fn sun() -> Body::props {
+ return {mut x: 0.0,
+ mut y: 0.0,
+ mut z: 0.0,
+ mut vx: 0.0,
+ mut vy: 0.0,
+ mut vz: 0.0,
+ mass: SOLAR_MASS};
+ }
+
+ pub fn offset_momentum(props: &mut Body::props,
+ px: float, py: float, pz: float) {
+ props.vx = -px / SOLAR_MASS;
+ props.vy = -py / SOLAR_MASS;
+ props.vz = -pz / SOLAR_MASS;
}
- #[test]
- fn test_trailing_characters() {
- assert from_str("nulla") ==
- err({line: 1u, col: 5u, msg: "trailing characters"});
- assert from_str("truea") ==
- err({line: 1u, col: 5u, msg: "trailing characters"});
- assert from_str("falsea") ==
- err({line: 1u, col: 6u, msg: "trailing characters"});
- assert from_str("1a") ==
- err({line: 1u, col: 2u, msg: "trailing characters"});
- assert from_str("[]a") ==
- err({line: 1u, col: 3u, msg: "trailing characters"});
- assert from_str("{}a") ==
- err({line: 1u, col: 3u, msg: "trailing characters"});
- }
-
- #[test]
- fn test_read_identifiers() {
- assert from_str("n") ==
- err({line: 1u, col: 2u, msg: "invalid syntax"});
- assert from_str("nul") ==
- err({line: 1u, col: 4u, msg: "invalid syntax"});
-
- assert from_str("t") ==
- err({line: 1u, col: 2u, msg: "invalid syntax"});
- assert from_str("truz") ==
- err({line: 1u, col: 4u, msg: "invalid syntax"});
-
- assert from_str("f") ==
- err({line: 1u, col: 2u, msg: "invalid syntax"});
- assert from_str("faz") ==
- err({line: 1u, col: 3u, msg: "invalid syntax"});
-
- assert from_str("null") == ok(null);
- assert from_str("true") == ok(boolean(true));
- assert from_str("false") == ok(boolean(false));
- assert from_str(" null ") == ok(null);
- assert from_str(" true ") == ok(boolean(true));
- assert from_str(" false ") == ok(boolean(false));
- }
-
- #[test]
- fn test_read_num() {
- assert from_str("+") ==
- err({line: 1u, col: 1u, msg: "invalid syntax"});
- assert from_str(".") ==
- err({line: 1u, col: 1u, msg: "invalid syntax"});
-
- assert from_str("-") ==
- err({line: 1u, col: 2u, msg: "invalid number"});
- assert from_str("00") ==
- err({line: 1u, col: 2u, msg: "invalid number"});
- assert from_str("1.") ==
- err({line: 1u, col: 3u, msg: "invalid number"});
- assert from_str("1e") ==
- err({line: 1u, col: 3u, msg: "invalid number"});
- assert from_str("1e+") ==
- err({line: 1u, col: 4u, msg: "invalid number"});
-
- assert from_str("3") == ok(num(3f));
- assert from_str("3.1") == ok(num(3.1f));
- assert from_str("-1.2") == ok(num(-1.2f));
- assert from_str("0.4") == ok(num(0.4f));
- assert from_str("0.4e5") == ok(num(0.4e5f));
- assert from_str("0.4e+15") == ok(num(0.4e15f));
- assert from_str("0.4e-01") == ok(num(0.4e-01f));
- assert from_str(" 3 ") == ok(num(3f));
- }
-
- #[test]
- fn test_read_str() {
- assert from_str("\"") ==
- err({line: 1u, col: 2u, msg: "EOF while parsing string"});
- assert from_str("\"lol") ==
- err({line: 1u, col: 5u, msg: "EOF while parsing string"});
-
- assert from_str("\"\"") == ok(string(""));
- assert from_str("\"foo\"") == ok(string("foo"));
- assert from_str("\"\\\"\"") == ok(string("\""));
- assert from_str("\"\\b\"") == ok(string("\x08"));
- assert from_str("\"\\n\"") == ok(string("\n"));
- assert from_str("\"\\r\"") == ok(string("\r"));
- assert from_str("\"\\t\"") == ok(string("\t"));
- assert from_str(" \"foo\" ") == ok(string("foo"));
- }
-
- #[test]
- fn test_read_list() {
- assert from_str("[") ==
- err({line: 1u, col: 2u, msg: "EOF while parsing value"});
- assert from_str("[1") ==
- err({line: 1u, col: 3u, msg: "EOF while parsing list"});
- assert from_str("[1,") ==
- err({line: 1u, col: 4u, msg: "EOF while parsing value"});
- assert from_str("[1,]") ==
- err({line: 1u, col: 4u, msg: "invalid syntax"});
- assert from_str("[6 7]") ==
- err({line: 1u, col: 4u, msg: "expecting ',' or ']'"});
-
- assert from_str("[]") == ok(list([]));
- assert from_str("[ ]") == ok(list([]));
- assert from_str("[true]") == ok(list([boolean(true)]));
- assert from_str("[ false ]") == ok(list([boolean(false)]));
- assert from_str("[null]") == ok(list([null]));
- assert from_str("[3, 1]") == ok(list([num(3f), num(1f)]));
- assert from_str("\n[3, 2]\n") == ok(list([num(3f), num(2f)]));
- assert from_str("[2, [4, 1]]") ==
- ok(list([num(2f), list([num(4f), num(1f)])]));
- }
-
- #[test]
- fn test_read_dict() {
- assert from_str("{") ==
- err({line: 1u, col: 2u, msg: "EOF while parsing object"});
- assert from_str("{ ") ==
- err({line: 1u, col: 3u, msg: "EOF while parsing object"});
- assert from_str("{1") ==
- err({line: 1u, col: 2u, msg: "key must be a string"});
- assert from_str("{ \"a\"") ==
- err({line: 1u, col: 6u, msg: "EOF while parsing object"});
- assert from_str("{\"a\"") ==
- err({line: 1u, col: 5u, msg: "EOF while parsing object"});
- assert from_str("{\"a\" ") ==
- err({line: 1u, col: 6u, msg: "EOF while parsing object"});
-
- assert from_str("{\"a\" 1") ==
- err({line: 1u, col: 6u, msg: "expecting ':'"});
- assert from_str("{\"a\":") ==
- err({line: 1u, col: 6u, msg: "EOF while parsing value"});
- assert from_str("{\"a\":1") ==
- err({line: 1u, col: 7u, msg: "EOF while parsing object"});
- assert from_str("{\"a\":1 1") ==
- err({line: 1u, col: 8u, msg: "expecting ',' or '}'"});
- assert from_str("{\"a\":1,") ==
- err({line: 1u, col: 8u, msg: "EOF while parsing object"});
-
- assert eq(result::get(from_str("{}")), mk_dict([]));
- assert eq(result::get(from_str("{\"a\": 3}")),
- mk_dict([("a", num(3.0f))]));
-
- assert eq(result::get(from_str("{ \"a\": null, \"b\" : true }")),
- mk_dict([("a", null), ("b", boolean(true))]));
- assert eq(result::get(from_str("\n{ \"a\": null, \"b\" : true }\n")),
- mk_dict([("a", null), ("b", boolean(true))]));
- assert eq(result::get(from_str("{\"a\" : 1.0 ,\"b\": [ true ]}")),
- mk_dict([
- ("a", num(1.0)),
- ("b", list([boolean(true)]))
- ]));
- assert eq(result::get(from_str(
- "{" +
- "\"a\": 1.0, " +
- "\"b\": [" +
- "true," +
- "\"foo\\nbar\", " +
- "{ \"c\": {\"d\": null} } " +
- "]" +
- "}")),
- mk_dict([
- ("a", num(1.0f)),
- ("b", list([
- boolean(true),
- string("foo\nbar"),
- mk_dict([
- ("c", mk_dict([("d", null)]))
- ])
- ]))
- ]));
- }
-
- #[test]
- fn test_multiline_errors() {
- assert from_str("{\n \"foo\":\n \"bar\"") ==
- err({line: 3u, col: 8u, msg: "EOF while parsing object"});
- }
}
diff --git a/tests/examplefiles/test2.pypylog b/tests/examplefiles/test2.pypylog
new file mode 100644
index 00000000..543e21dd
--- /dev/null
+++ b/tests/examplefiles/test2.pypylog
@@ -0,0 +1,120 @@
+[2f1dd6c3b8b7] {jit-log-opt-loop
+# Loop 0 (<Function object at 0xb720e550> ds1dr4 dsdr3 ds1dr4) : loop with 115 ops
+[p0, p1]
++33: label(p0, p1, descr=TargetToken(-1223434224))
+debug_merge_point(0, 0, '<Function object at 0xb710b120> ds1dr4 dsdr3 ds1dr4')
++33: guard_nonnull_class(p1, 138371488, descr=<Guard2>) [p1, p0]
++54: p3 = getfield_gc_pure(p1, descr=<FieldP pyhaskell.interpreter.haskell.Substitution.inst_rhs 8>)
++57: guard_value(p3, ConstPtr(ptr4), descr=<Guard3>) [p1, p0, p3]
++69: p5 = getfield_gc_pure(p1, descr=<FieldP pyhaskell.interpreter.haskell.Substitution.inst_subst 12>)
++72: p7 = getarrayitem_gc(p5, 0, descr=<ArrayP 4>)
++75: guard_class(p7, 138371552, descr=<Guard4>) [p0, p5, p7]
++88: p9 = getfield_gc(p7, descr=<FieldP pyhaskell.interpreter.haskell.Thunk.inst_application 8>)
++91: guard_nonnull_class(p9, 138373024, descr=<Guard5>) [p0, p5, p7, p9]
++109: p12 = getarrayitem_gc(p5, 1, descr=<ArrayP 4>)
++112: guard_class(p12, 138371552, descr=<Guard6>) [p0, p5, p12, p7]
++125: p14 = getfield_gc(p12, descr=<FieldP pyhaskell.interpreter.haskell.Thunk.inst_application 8>)
++128: guard_nonnull_class(p14, 138373024, descr=<Guard7>) [p0, p5, p12, p14, p7]
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
++146: p16 = getfield_gc_pure(p9, descr=<FieldP pyhaskell.interpreter.haskell.Application.inst_function 8>)
++149: guard_value(p16, ConstPtr(ptr17), descr=<Guard8>) [p16, p9, p0, p12, p7]
++161: p18 = getfield_gc_pure(p9, descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg0 12>)
++164: guard_class(p18, 138371648, descr=<Guard9>) [p18, p9, p0, p12, p7]
++177: p20 = getfield_gc_pure(p9, descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg1 16>)
++180: guard_class(p20, 138371648, descr=<Guard10>) [p20, p9, p18, p0, p12, p7]
++193: p22 = getfield_gc_pure(p9, descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg2 20>)
++196: guard_class(p22, 138371936, descr=<Guard11>) [p22, p9, p20, p18, p0, p12, p7]
+debug_merge_point(0, 0, 'None')
++209: p24 = getfield_gc_pure(p22, descr=<FieldP pyhaskell.interpreter.haskell.Application.inst_function 8>)
++215: guard_value(p24, ConstPtr(ptr25), descr=<Guard12>) [p24, p22, p9, None, None, p0, p12, p7]
++227: p27 = getfield_gc_pure(p22, descr=<FieldP pyhaskell.interpreter.haskell.Application1.inst_arg0 12>)
++230: guard_class(p27, 138371648, descr=<Guard13>) [p22, p27, p9, None, None, p0, p12, p7]
+debug_merge_point(0, 0, '_')
+debug_merge_point(0, 0, 'None')
++243: p30 = getfield_gc(ConstPtr(ptr29), descr=<FieldP pyhaskell.interpreter.module.CoreMod.inst_qvars 24>)
++249: i34 = call(ConstClass(ll_dict_lookup_trampoline__v64___simple_call__function_ll), p30, ConstPtr(ptr32), 360200661, descr=<Calli 4 rri EF=4>)
++281: guard_no_exception(, descr=<Guard14>) [p27, p20, p18, i34, p30, None, None, None, p0, p12, p7]
++294: i36 = int_and(i34, -2147483648)
++302: i37 = int_is_true(i36)
+guard_false(i37, descr=<Guard15>) [p27, p20, p18, i34, p30, None, None, None, p0, p12, p7]
++311: p38 = getfield_gc(p30, descr=<FieldP dicttable.entries 12>)
++314: p39 = getinteriorfield_gc(p38, i34, descr=<InteriorFieldDescr <FieldP dictentry.value 4>>)
++318: i40 = instance_ptr_eq(p18, p39)
+guard_true(i40, descr=<Guard16>) [p27, p20, None, None, None, p0, p12, p7]
+debug_merge_point(0, 0, 'None')
++327: i41 = getfield_gc_pure(p20, descr=<FieldS pyhaskell.interpreter.primtype.Int.inst_value 8>)
++330: i42 = getfield_gc_pure(p27, descr=<FieldS pyhaskell.interpreter.primtype.Int.inst_value 8>)
++333: i43 = int_sub(i41, i42)
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
++335: i45 = int_eq(0, i43)
+guard_false(i45, descr=<Guard17>) [p0, i43, None, None, None, None, p12, p7]
+p47 = new_with_vtable(138371648)
++393: setfield_gc(p47, i43, descr=<FieldS pyhaskell.interpreter.primtype.Int.inst_value 8>)
+setfield_gc(p7, p47, descr=<FieldP pyhaskell.interpreter.haskell.Thunk.inst_application 8>)
++414: p48 = getfield_gc(p12, descr=<FieldP pyhaskell.interpreter.haskell.Thunk.inst_application 8>)
++420: guard_nonnull_class(p48, 138371648, descr=<Guard18>) [p0, p48, p12, p47, p7]
+debug_merge_point(0, 0, '<PrimFunction object at 0x83f3f6c> 1 <Function object at 0xb710b3b0> 1 <Function object at 0xb710b3c0> <PrimFunction object at 0x83f3f3c> 1 dsdr3 <Function object at 0xb710b210> 1')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, '_')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, '<Function object at 0xb710b3d0> dsdr3 dsdr3')
+debug_merge_point(0, 0, '<Function object at 0xb710b120> ds1dr4 dsdr3 ds1dr4')
++438: label(p0, p48, p30, p38, descr=TargetToken(-1223434176))
+debug_merge_point(0, 0, '<Function object at 0xb710b120> ds1dr4 dsdr3 ds1dr4')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, '_')
+debug_merge_point(0, 0, 'None')
++438: i50 = call(ConstClass(ll_dict_lookup_trampoline__v64___simple_call__function_ll), p30, ConstPtr(ptr32), 360200661, descr=<Calli 4 rri EF=4>)
++464: guard_no_exception(, descr=<Guard19>) [p48, i50, p30, p0]
++477: i51 = int_and(i50, -2147483648)
++485: i52 = int_is_true(i51)
+guard_false(i52, descr=<Guard20>) [p48, i50, p30, p0]
++494: p53 = getinteriorfield_gc(p38, i50, descr=<InteriorFieldDescr <FieldP dictentry.value 4>>)
++501: i55 = instance_ptr_eq(ConstPtr(ptr54), p53)
+guard_true(i55, descr=<Guard21>) [p48, p0]
+debug_merge_point(0, 0, 'None')
++513: i56 = getfield_gc_pure(p48, descr=<FieldS pyhaskell.interpreter.primtype.Int.inst_value 8>)
++516: i58 = int_sub(i56, 1)
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
++519: i59 = int_eq(0, i58)
+guard_false(i59, descr=<Guard22>) [i58, p48, p0]
+debug_merge_point(0, 0, '<PrimFunction object at 0x83f3f6c> 1 <Function object at 0xb710b3b0> 1 <Function object at 0xb710b3c0> <PrimFunction object at 0x83f3f3c> 1 dsdr3 <Function object at 0xb710b210> 1')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, '_')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, 'None')
+debug_merge_point(0, 0, '<Function object at 0xb710b3d0> dsdr3 dsdr3')
+debug_merge_point(0, 0, '<Function object at 0xb710b120> ds1dr4 dsdr3 ds1dr4')
+p61 = new_with_vtable(138371700)
+p63 = new_with_vtable(138373024)
+p65 = new_with_vtable(138371936)
++606: setfield_gc(p63, ConstPtr(ptr66), descr=<FieldP pyhaskell.interpreter.haskell.Application.inst_function 8>)
+p68 = new_with_vtable(138373024)
++632: setfield_gc(p65, ConstPtr(ptr69), descr=<FieldP pyhaskell.interpreter.haskell.Application.inst_function 8>)
+p71 = new_with_vtable(138371936)
++658: setfield_gc(p68, ConstPtr(ptr17), descr=<FieldP pyhaskell.interpreter.haskell.Application.inst_function 8>)
++665: setfield_gc(p71, ConstPtr(ptr72), descr=<FieldP pyhaskell.interpreter.haskell.Application1.inst_arg0 12>)
++672: setfield_gc(p68, p71, descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg2 20>)
++675: setfield_gc(p68, p48, descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg1 16>)
++678: setfield_gc(p68, ConstPtr(ptr54), descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg0 12>)
+p73 = new_with_vtable(138371648)
++701: setfield_gc(p61, p0, descr=<FieldP pyhaskell.interpreter.haskell.StackElement.inst_next 8>)
++716: setfield_gc(p61, 2, descr=<FieldS pyhaskell.interpreter.haskell.CopyStackElement.inst_index 16>)
++723: setfield_gc(p71, ConstPtr(ptr25), descr=<FieldP pyhaskell.interpreter.haskell.Application.inst_function 8>)
++730: setfield_gc(p65, p68, descr=<FieldP pyhaskell.interpreter.haskell.Application1.inst_arg0 12>)
++733: setfield_gc(p63, p65, descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg2 20>)
++736: setfield_gc(p63, ConstPtr(ptr75), descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg1 16>)
++743: setfield_gc(p63, ConstPtr(ptr54), descr=<FieldP pyhaskell.interpreter.haskell.Application3.inst_arg0 12>)
++750: setfield_gc(p61, p63, descr=<FieldP pyhaskell.interpreter.haskell.CopyStackElement.inst_application 12>)
++753: setfield_gc(p73, i58, descr=<FieldS pyhaskell.interpreter.primtype.Int.inst_value 8>)
++762: jump(p61, p73, p30, p38, descr=TargetToken(-1223434176))
++775: --end of the loop--
+[2f1dd6da3b99] jit-log-opt-loop}
diff --git a/tests/examplefiles/unix-io.lid b/tests/examplefiles/unix-io.lid
new file mode 100644
index 00000000..617fcaa4
--- /dev/null
+++ b/tests/examplefiles/unix-io.lid
@@ -0,0 +1,37 @@
+Library: io
+Synopsis: A portable IO library
+Author: Gail Zacharias
+Files: library
+ streams/defs
+ streams/stream
+ streams/sequence-stream
+ streams/native-buffer
+ streams/buffer
+ streams/typed-stream
+ streams/external-stream
+ streams/buffered-stream
+ streams/convenience
+ streams/wrapper-stream
+ streams/cleanup-streams
+ streams/native-speed
+ streams/async-writes
+ streams/file-stream
+ streams/multi-buffered-streams
+ pprint
+ print
+ print-double-integer-kludge
+ format
+ buffered-format
+ format-condition
+ unix-file-accessor
+ unix-standard-io
+ unix-interface
+ format-out
+C-Source-Files: unix-portability.c
+Major-Version: 2
+Minor-Version: 1
+Target-Type: dll
+Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc.
+ All rights reserved.
+License: See License.txt in this distribution for details.
+Warranty: Distributed WITHOUT WARRANTY OF ANY KIND
diff --git a/tests/old_run.py b/tests/old_run.py
index 7929d743..4f7cef16 100644
--- a/tests/old_run.py
+++ b/tests/old_run.py
@@ -8,7 +8,7 @@
python run.py [testfile ...]
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/run.py b/tests/run.py
index 68303cdb..18a1d824 100644
--- a/tests/run.py
+++ b/tests/run.py
@@ -8,7 +8,7 @@
python run.py [testfile ...]
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_basic_api.py b/tests/test_basic_api.py
index bc4eb771..f6643308 100644
--- a/tests/test_basic_api.py
+++ b/tests/test_basic_api.py
@@ -3,7 +3,7 @@
Pygments basic API tests
~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
@@ -93,7 +93,7 @@ def test_lexer_options():
'PythonConsoleLexer', 'RConsoleLexer', 'RubyConsoleLexer',
'SqliteConsoleLexer', 'MatlabSessionLexer', 'ErlangShellLexer',
'BashSessionLexer', 'LiterateHaskellLexer', 'PostgresConsoleLexer',
- 'ElixirConsoleLexer', 'JuliaConsoleLexer'):
+ 'ElixirConsoleLexer', 'JuliaConsoleLexer', 'RobotFrameworkLexer'):
inst = cls(ensurenl=False)
ensure(inst.get_tokens('a\nb'), 'a\nb')
inst = cls(ensurenl=False, stripall=True)
diff --git a/tests/test_clexer.py b/tests/test_clexer.py
index 08fb42cf..8b37bf57 100644
--- a/tests/test_clexer.py
+++ b/tests/test_clexer.py
@@ -3,7 +3,7 @@
Basic CLexer Test
~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_cmdline.py b/tests/test_cmdline.py
index 56036183..5ad815c0 100644
--- a/tests/test_cmdline.py
+++ b/tests/test_cmdline.py
@@ -3,7 +3,7 @@
Command line test
~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_examplefiles.py b/tests/test_examplefiles.py
index 41acf4ef..d785cf3b 100644
--- a/tests/test_examplefiles.py
+++ b/tests/test_examplefiles.py
@@ -3,7 +3,7 @@
Pygments tests with example files
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
@@ -58,6 +58,8 @@ def check_lexer(lx, absfn, outfn):
text = text.strip(b('\n')) + b('\n')
try:
text = text.decode('utf-8')
+ if text.startswith(u'\ufeff'):
+ text = text[len(u'\ufeff'):]
except UnicodeError:
text = text.decode('latin1')
ntext = []
diff --git a/tests/test_html_formatter.py b/tests/test_html_formatter.py
index 284a6c75..96273638 100644
--- a/tests/test_html_formatter.py
+++ b/tests/test_html_formatter.py
@@ -3,7 +3,7 @@
Pygments HTML formatter tests
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_latex_formatter.py b/tests/test_latex_formatter.py
index 8412ec41..06a74c3d 100644
--- a/tests/test_latex_formatter.py
+++ b/tests/test_latex_formatter.py
@@ -3,7 +3,7 @@
Pygments LaTeX formatter tests
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_perllexer.py b/tests/test_perllexer.py
index b9c3cb74..315b20e3 100644
--- a/tests/test_perllexer.py
+++ b/tests/test_perllexer.py
@@ -3,7 +3,7 @@
Pygments regex lexer tests
~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_regexlexer.py b/tests/test_regexlexer.py
index b1392d3a..28d9689b 100644
--- a/tests/test_regexlexer.py
+++ b/tests/test_regexlexer.py
@@ -3,7 +3,7 @@
Pygments regex lexer tests
~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_token.py b/tests/test_token.py
index a9d1edeb..6a5b00b7 100644
--- a/tests/test_token.py
+++ b/tests/test_token.py
@@ -3,7 +3,7 @@
Test suite for the token module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_using_api.py b/tests/test_using_api.py
index 83d3f18e..bb89d1e2 100644
--- a/tests/test_using_api.py
+++ b/tests/test_using_api.py
@@ -3,7 +3,7 @@
Pygments tests for using()
~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
diff --git a/tests/test_util.py b/tests/test_util.py
index be1662f9..dbbc66ce 100644
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -3,7 +3,7 @@
Test suite for the util module
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- :copyright: Copyright 2006-2012 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2013 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
@@ -98,8 +98,10 @@ class UtilTest(unittest.TestCase):
self.assertTrue(util.shebang_matches('#!C:\\Python2.4\\Python.exe',
r'python(2\.\d)?'))
- self.assertFalse(util.shebang_matches('#!/usr/bin/python-ruby', r'python(2\.\d)?'))
- self.assertFalse(util.shebang_matches('#!/usr/bin/python/ruby', r'python(2\.\d)?'))
+ self.assertFalse(util.shebang_matches('#!/usr/bin/python-ruby',
+ r'python(2\.\d)?'))
+ self.assertFalse(util.shebang_matches('#!/usr/bin/python/ruby',
+ r'python(2\.\d)?'))
self.assertFalse(util.shebang_matches('#!', r'python'))
def test_doctype_matches(self):
@@ -131,4 +133,3 @@ class UtilTest(unittest.TestCase):
m = r.match(first_non_bmp * 2)
self.assertTrue(m)
self.assertEquals(m.end(), len(first_non_bmp) * 2)
-