Expand LinuxCNC interpreter regression coverage

This commit is contained in:
2026-06-09 14:54:54 +08:00
parent 50757e45ba
commit 5bd8f12872
143 changed files with 10895 additions and 219 deletions

View File

@@ -0,0 +1,12 @@
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
7 N..... COMMENT("Fanuc M98 requires P-word ")
Found 'm98' code with no P-word
M98
8 N..... ON_RESET()
9 N..... ON_RESET()

View File

@@ -0,0 +1,9 @@
%
( Fanuc M98 requires P-word )
M98
O1
#1 = 13
M99
%

View File

@@ -0,0 +1,7 @@
#!/bin/bash
if ! rs274 -g test.ngc 2>&1; then
# expected to fail
exit 0
fi
exit 1

View File

@@ -0,0 +1,10 @@
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
7 N..... COMMENT("M98 call non-existant sub ")
8 N..... FINISH()
9 N..... ON_RESET()
10 N..... ON_RESET()

View File

@@ -0,0 +1,6 @@
%
( M98 call non-existant sub )
M98 P1
M30
%

View File

@@ -0,0 +1,2 @@
#!/bin/bash -e
! rs274 -g test.ngc

View File

@@ -0,0 +1,135 @@
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("A simple O sub example ")
N..... SET_FEED_RATE(40.0000)
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(1.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 1.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(2.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 2.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(3.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 3.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(4.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(4.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(4.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 4.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(4.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(5.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(5.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(5.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 5.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(5.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(6.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(6.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(6.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 6.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(6.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(7.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(7.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(7.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 7.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(7.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(8.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(8.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(8.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 8.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(8.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(9.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(9.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(9.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 9.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(9.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(10.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(10.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(10.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 10.000000
MAIN 10LOOP PARAM1 = 10.000000
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
MAIN 0LOOP PARAM1 = 0.000000
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(1.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 1.000000
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(2.0000, 0.0000, -0.5000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.5000, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
SUB O1 PARAM1 = 2.000000
MAIN 2LOOP PARAM1 = 2.000000
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()
N..... ON_RESET()

View File

@@ -0,0 +1,27 @@
%
( A simple O sub example )
F40
; Test with 10 loops
#1 = 0
G90 G0 X0 Y0 Z0.25
M98 P1 L10
(PRINT,X MAIN 10LOOP PARAM1 = #1)
; Test with 0 loops
#1 = 0
G90 G0 X0 Y0 Z0.25
M98 P1 L0
(PRINT,X MAIN 0LOOP PARAM1 = #1)
; Test with 2 loops
#1 = 0
G90 G0 X0 Y0 Z0.25
M98 P1 L2
(PRINT,X MAIN 2LOOP PARAM1 = #1)
M30
O1
G91 G99 G81 X1 Z-1.0 R0.25 ; Drill to Z-1.0
#1 = [#1 + 1]
(PRINT,X SUB O1 PARAM1 = #1)
M99
%

View File

@@ -0,0 +1,3 @@
#!/bin/bash
rs274 -g test.ngc | awk '{$1=""; print}'
exit "${PIPESTATUS[0]}"

View File

@@ -0,0 +1,9 @@
%
( Fanuc 'O...' sub must be called with M98 )
O1 call
O1
(PRINT,X FANUC)
M99
%

View File

@@ -0,0 +1,9 @@
%
( Fanuc 'O...' sub must end with M99 )
M98 P1
O1
(PRINT,X FANUC)
O1 endsub
%

View File

@@ -0,0 +1,9 @@
%
( RS274NGC 'O...' sub must not be called with M98 )
M98 P1
O1 sub
(PRINT,X FANUC)
O1 endsub
%

View File

@@ -0,0 +1,9 @@
%
( RS274NGC 'O... sub' sub must not end with M99 )
O1 call
O1 sub
(PRINT,X FANUC)
M99
%

View File

@@ -0,0 +1,50 @@
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
7 N..... COMMENT("Fanuc 'O...' sub must be called with M98 ")
Fanuc 'O....' subroutine must be called with 'M98'
O1
8 N..... ON_RESET()
9 N..... ON_RESET()
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
7 N..... COMMENT("Fanuc 'O...' sub must end with M99 ")
X FANUC
Fanuc 'O....' subroutine definition must end with 'M99'
O1 endsub
8 N..... ON_RESET()
9 N..... ON_RESET()
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
7 N..... COMMENT("RS274NGC 'O...' sub must not be called with M98 ")
'O.... sub' subroutine must be called with 'O.... call'
O1 sub
8 N..... ON_RESET()
9 N..... ON_RESET()
executing
1 N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
2 N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
3 N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
4 N..... SET_XY_ROTATION(0.0000)
5 N..... SET_FEED_REFERENCE(CANON_XYZ)
6 N..... ON_RESET()
7 N..... COMMENT("RS274NGC 'O... sub' sub must not end with M99 ")
X FANUC
'O.... endsub' or 'O.... return' must follow 'O.... sub' subroutine definition
M99
8 N..... ON_RESET()
9 N..... ON_RESET()

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# All expected to fail
# Fanuc 'O...' sub definition mixed with RS274NGC 'O... endsub'/'O... call'
! rs274 -g O...-called-with-O..._call.ngc 2>&1 || exit 1
! rs274 -g O...-ended-with-O..._endsub.ngc 2>&1 || exit 1
# RS274 'O... sub' sub definition mixed with Fanuc 'M99'/'M98'
! rs274 -g O...-sub-called-with-M98.ngc 2>&1 || exit 1
! rs274 -g O...-sub-ended-with-M99.ngc 2>&1 || exit 1

View File

@@ -0,0 +1,206 @@
program: fanuc; INI: fanuc
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("A simple O sub example ")
N..... SET_FEED_RATE(40.0000)
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(1.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(2.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(3.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()
program: rs274ngc; INI: fanuc
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("A simple O sub example ")
N..... SET_FEED_RATE(40.0000)
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(1.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()
program: fanuc; INI: NO fanuc
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("A simple O sub example ")
N..... SET_FEED_RATE(40.0000)
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
DISABLE_FANUC_STYLE_SUB set in INI file, but found m98
M98 P1 L3
N..... ON_RESET()
program: rs274ngc; INI: NO fanuc
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("A simple O sub example ")
N..... SET_FEED_RATE(40.0000)
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(1.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()
program: fanuc; INI: (none)
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("A simple O sub example ")
N..... SET_FEED_RATE(40.0000)
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(1.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(2.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(2.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(3.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(3.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()
N..... ON_RESET()
program: rs274ngc; INI: (none)
executing
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("A simple O sub example ")
N..... SET_FEED_RATE(40.0000)
N..... STRAIGHT_TRAVERSE(0.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to incremental")
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... COMMENT("interpreter: distance mode changed to absolute")
N..... COMMENT("interpreter: retract mode set to r_plane")
N..... SET_MOTION_CONTROL_MODE(CANON_EXACT_PATH)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_FEED(1.0000, 0.0000, -1.0000, 0.0000, 0.0000, 0.0000)
N..... STRAIGHT_TRAVERSE(1.0000, 0.0000, 0.2500, 0.0000, 0.0000, 0.0000)
N..... SET_MOTION_CONTROL_MODE(CANON_CONTINUOUS, 0.000000)
N..... SET_NAIVECAM_TOLERANCE(0.0000)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()
N..... ON_RESET()

View File

@@ -0,0 +1,2 @@
[RS274NGC]
DISABLE_FANUC_STYLE_SUB = 0

View File

@@ -0,0 +1,13 @@
%
( A simple O sub example )
F40
G90 G0 X0 Y0 Z0.25
M98 P1 L3
M30
O1
G91 G0 X1 ; Jog 1" along X (relative)
G90 G99 G81 Z-1.0 R0.25 ; Drill to Z-1.0
M99
%

View File

@@ -0,0 +1,4 @@
[RS274NGC]
DISABLE_FANUC_STYLE_SUB = 1
[EMC]
DEBUG = 2147483647

View File

@@ -0,0 +1,13 @@
%
( A simple O sub example )
O1 sub
G91 G0 X1 ; Jog 1" along X (relative)
G90 G99 G81 Z-1.0 R0.25 ; Drill to Z-1.0
O1 endsub
F40
G90 G0 X0 Y0 Z0.25
O1 call
M30
%

View File

@@ -0,0 +1,27 @@
#!/bin/bash
trim() { sed 's/^ *[0-9][0-9]* //'; }
# Fanuc enabled:
# - with Fanuc sub: pass
echo "program: fanuc; INI: fanuc"
rs274 -g -i test-fanuc.ini test-fanuc.ngc 2>&1 | trim
# - with rs274ngc sub: pass (rs274ngc subs not disabled)
echo "program: rs274ngc; INI: fanuc"
rs274 -g -i test-fanuc.ini test-rs274ngc.ngc 2>&1 | trim
# Fanuc disabled:
# - with Fanuc sub: fail
echo "program: fanuc; INI: NO fanuc"
{ ! rs274 -g -i test-no-fanuc.ini test-fanuc.ngc 2>&1; } | trim || exit 1
# - with rs274ngc sub: pass
echo "program: rs274ngc; INI: NO fanuc"
rs274 -g -i test-no-fanuc.ini test-rs274ngc.ngc 2>&1 | trim
# Default (Fanuc enabled):
# - with Fanuc sub: pass
echo "program: fanuc; INI: (none)"
rs274 -g test-fanuc.ngc 2>&1 | trim
# - with rs274ngc sub: pass (rs274ngc subs not disabled)
echo "program: rs274ngc; INI: (none)"
rs274 -g test-rs274ngc.ngc 2>&1 | trim

View File

@@ -0,0 +1,145 @@
Legal test end-main-with-m2:
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("legal example")
N..... COMMENT("Main program defined with numeric O-word title, terminated by M2")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("calling sub 2")
N..... COMMENT("in sub 2")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("returning from sub 2")
N..... COMMENT("returned from sub 2")
N..... COMMENT("end of main")
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PROGRAM_END()
N..... ON_RESET()
N..... ON_RESET()
Legal test end-main-with-m02:
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("legal example")
N..... COMMENT("Main program defined with numeric O-word title, terminated by M02")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("calling sub 2")
N..... COMMENT("in sub 2")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("returning from sub 2")
N..... COMMENT("returned from sub 2")
N..... COMMENT("end of main")
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PROGRAM_END()
N..... ON_RESET()
N..... ON_RESET()
Legal test end-main-with-m30:
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("legal example")
N..... COMMENT("Main program defined with numeric O-word title, terminated by M30")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("calling sub 2")
N..... COMMENT("in sub 2")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("returning from sub 2")
N..... COMMENT("returned from sub 2")
N..... COMMENT("end of main")
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_MODE(0, 0)
N..... SET_FEED_RATE(0.0000)
N..... STOP_SPINDLE_TURNING(0)
N..... SET_SPINDLE_MODE(0 0.0000)
N..... PALLET_SHUTTLE()
N..... PROGRAM_END()
N..... ON_RESET()
N..... ON_RESET()
Legal test end-main-with-percent:
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("legal example")
N..... COMMENT("Main program defined with numeric O-word title, terminated by percent")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("calling sub 2")
N..... COMMENT("in sub 2")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("returning from sub 2")
N..... COMMENT("returned from sub 2")
N..... COMMENT("end of main signaled by percent")
N..... FINISH()
N..... ON_RESET()
N..... ON_RESET()
Illegal test end-main-with-eof:
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("legal example")
N..... COMMENT("Main program defined with numeric O-word title, terminated by EOF")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("calling sub 2")
N..... COMMENT("in sub 2")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("returning from sub 2")
N..... COMMENT("returned from sub 2")
N..... COMMENT("end of main signaled by EOF")
N..... ON_RESET()
N..... ON_RESET()
Illegal test no-m30-before-osub:
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("illegal example")
N..... COMMENT("Define rs274-style sub before numeric O-word main program end")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("calling sub 2")
N..... COMMENT("in sub 2")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 3.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("returning from sub 2")
N..... COMMENT("returned from sub 2")
N..... COMMENT("Illegal: O-sub with no M02 or M30 terminating main")
N..... ON_RESET()
N..... ON_RESET()
Illegal test sub-after-percent:
N..... USE_LENGTH_UNITS(CANON_UNITS_MM)
N..... SET_G5X_OFFSET(1, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_G92_OFFSET(0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... SET_XY_ROTATION(0.0000)
N..... SET_FEED_REFERENCE(CANON_XYZ)
N..... ON_RESET()
N..... COMMENT("illegal example")
N..... COMMENT("Define sub after percent [= after EOF]")
N..... STRAIGHT_TRAVERSE(1.0000, 2.0000, 0.0000, 0.0000, 0.0000, 0.0000)
N..... COMMENT("calling sub 2")
N..... FINISH()
N..... ON_RESET()
N..... ON_RESET()

View File

@@ -0,0 +1,15 @@
(legal example)
(Main program defined with numeric O-word title, terminated by EOF)
O2 sub (subprogram begin) (program end signaled by O2 sub)
(in sub 2)
G0 Z3
(returning from sub 2)
O2 endsub
O1 (main program begin)
G0 X1Y2
(calling sub 2)
O2 call
(returned from sub 2)
(end of main signaled by EOF)

View File

@@ -0,0 +1,14 @@
(illegal example)
(Define rs274-style sub before numeric O-word main program end)
O1 (main program begin)
G0 X1Y2
(calling sub 2)
O2 call
(returned from sub 2)
(Illegal: O-sub with no M02 or M30 terminating main)
O2 sub (subprogram begin)
(in sub 2)
G0 Z3
(returning from sub 2)
O2 endsub

View File

@@ -0,0 +1,25 @@
%
(illegal example)
(Define sub after percent [= after EOF])
O1 (main program begin)
G0 X1Y2
(calling sub 2)
O2 call
(returned from sub 2)
%
(Nothing should follow % sign)
(From http://linuxcnc.org/docs/html/gcode/overview.html#_overview )
( The useful contents of a file demarcated by percents stop after )
( the second percent line. Anything after that is ignored. )
(From Smid 3rd Ed. p. 62)
( The percent sign (%) after M30 is a special _stop_code_. This )
( symbol terminates the loading of a program from an external )
( device. It is also called the _end-of-file_marker_. )
O2 sub (subprogram begin) (program end signaled by O2 sub)
(in sub 2)
G0 Z3
(returning from sub 2)
O2 endsub

View File

@@ -0,0 +1,15 @@
(legal example)
(Main program defined with numeric O-word title, terminated by M02)
O1 (main program begin)
G0 X1Y2
(calling sub 2)
O2 call
(returned from sub 2)
M02 (end of main)
(should never get here)
O2 sub (subprogram begin) (program end signaled by O2 sub)
(in sub 2)
G0 Z3
(returning from sub 2)
O2 endsub

View File

@@ -0,0 +1,15 @@
(legal example)
(Main program defined with numeric O-word title, terminated by M2)
O1 (main program begin)
G0 X1Y2
(calling sub 2)
O2 call
(returned from sub 2)
M2 (end of main)
(should never get here)
O2 sub (subprogram begin) (program end signaled by O2 sub)
(in sub 2)
G0 Z3
(returning from sub 2)
O2 endsub

View File

@@ -0,0 +1,15 @@
(legal example)
(Main program defined with numeric O-word title, terminated by M30)
O1 (main program begin)
G0 X1Y2
(calling sub 2)
O2 call
(returned from sub 2)
M30 (end of main)
(should never get here)
O2 sub (subprogram begin) (program end signaled by O2 sub)
(in sub 2)
G0 Z3
(returning from sub 2)
O2 endsub

View File

@@ -0,0 +1,17 @@
%
(legal example)
(Main program defined with numeric O-word title, terminated by percent)
O2 sub (subprogram begin) (program end signaled by O2 sub)
(in sub 2)
G0 Z3
(returning from sub 2)
O2 endsub
O1 (main program begin)
G0 X1Y2
(calling sub 2)
O2 call
(returned from sub 2)
(end of main signaled by percent)
%

View File

@@ -0,0 +1,44 @@
#!/bin/bash -e
LEGAL_TESTS="
end-main-with-m2
end-main-with-m02
end-main-with-m30
end-main-with-percent
"
ILLEGAL_TESTS="
end-main-with-eof
no-m30-before-osub
sub-after-percent
"
#
# Run legal tests
#
for t in $LEGAL_TESTS; do
echo "Legal test ${t}:"
rs274 -g "test-legal-${t}.ngc" | awk '{$1=""; print}'
res=${PIPESTATUS[0]}
if test "$res" = 0; then
echo "Success: Test '${t}' exited ${res}" >&2
else
echo "Error: Test '${t}' exited ${res}" >&2
exit "$res"
fi
done
# Run illegal tests
#
for t in $ILLEGAL_TESTS; do
echo "Illegal test ${t}:"
res=-1
rs274 -g "test-illegal-${t}.ngc" | awk '{$1=""; print}'
res=${PIPESTATUS[0]}
if test "$res" = 0; then
echo "Error: Illegal test '${t}' exited ${res}" >&2
exit "$res"
else
echo "Success: Illegal test '${t}' exited ${res} (non-zero=success)" >&2
fi
done