/* * Test file to check the preprocessor. * * Usage: * 1) Execute compare.hb script for a comparison between Harbour and CA-Cl*pper: * 'hbrun compare' * 2) Results will be stored in pp_test.dif * * Notes: * - clipper.exe (5.x) and diff executable need to be in the path. * - requires 32-bit Windows OS * * Ignore most of errors reported during compilation. * */ PROCEDURE Main() #ifdef __HARBOUR__ #xtranslate CCC => QOUT( [2] [, []\[3\]] ) CCC b #endif #xtranslate CCCC => QOUT( \[3\] ) CCCC c #xtranslate AAA [A [B ] ] => Qout([][, ]) AAA AAA A a AAA A a B b #define RED {255,0,0} #ifdef __HARBOUR__ /* ---------------------------------------------------------------------*/ /* obligatory clause on left side used as optional clause on right side * Clipper doesn't allow for it */ #xcommand SET COOLTIP TO OF
=> ; SM( TTH (<"form">), 1, RGB(\[1\], ; \[2\], ; [, [ 3 ] ]), 0) SET COOLTIP TO RED OF form1 #endif #xcommand SET TOOLTIP TO OF => ; SM( TTH (<"form">), 1, RGB(\[1\], ; \[2\], ; \[ 3 \]), 0) SET TOOLTIP TO RED OF form1 /* ---------------------------------------------------------------------*/ /* simple optional clause */ #command ZZZ [] => QOUT( [ \[1\] ] ) ZZZ a ZZZ ZZZ a[1]+2 ZZZ 1 ZZZ 'z' ZZZ "z" #translate TZZZ [] => QOUT( [ \[1\] ] ) TZZZ a TZZZ TZZZ a[1]+2 TZZZ 1 TZZZ 'z' TZZZ "z" /* ---------------------------------------------------------------------*/ #xtranslate _HMG_a => _HMG\[137\] ? _bro[ a( _HMG_a [i] ) ] /* ---------------------------------------------------------------------*/ #define clas( x ) (x) #ifdef __HARBOUR__ /* is harbour extension match marker used to allow identifiers * only */ #xtranslate ( { [] } => (():New(

) a :=clas( TesT{ 1,2,3} ) a :=clas( a+3{ 11,2,3} ) a :=clas( a(){ 11,2,3} ) #endif #xtranslate ( { [] } => (():New(

) a :=clas( TEST{ 1,2,3} ) a :=clas( a+3{ 11,2,3} ) a :=clas( a(){ 11,2,3} ) /* ---------------------------------------------------------------------*/ #define DATENEW 1 #define DATEOLD(x) x #define datediff(x,y) ( DATEOLD(x) - DATENEW ) #command datediff1(,) => ( DATEOLD() - DATENEW ) ? datediff( x, y ) /* ---------------------------------------------------------------------*/ /* test for regular match marker */ #command _REGULAR_() => rm( ) _REGULAR_(a) _REGULAR_("a") _REGULAR_('a') _REGULAR_(["'a'"]) _REGULAR_(&a.1) _REGULAR_(&a) _REGULAR_(&a.) _REGULAR_(&(a)) _REGULAR_(&a[1]) _REGULAR_(a[1]) _REGULAR_("['']") //NORMAL /* test for normal match marker */ #command _NORMAL_M() => nm( <"z"> ) _NORMAL_M(a) _NORMAL_M("a") _NORMAL_M('a') _NORMAL_M(["'a'"]) _NORMAL_M(&a.1) _NORMAL_M(&a) _NORMAL_M(&a.) _NORMAL_M(&(a)) _NORMAL_M(&a[1]) _NORMAL_M(a[1]) _NORMAL_M("['']") //SMART /* test for smart match marker */ #command _SMART_M() => sm( <(z)> ) _SMART_M(a) _SMART_M("a") _SMART_M('a') _SMART_M(["'a'"]) _SMART_M(&a.1) _SMART_M(&a) _SMART_M(&a.) _SMART_M(&(a)) _SMART_M(&a[1]) _SMART_M(a[1]) _SMART_M("['']") //DUMB /* test for dumb match marker */ #command _DUMB_M() => dm( # ) _DUMB_M(a) _DUMB_M("a") _DUMB_M('a') _DUMB_M(["'a'"]) _DUMB_M(&a.1) _DUMB_M(&a) _DUMB_M(&a.) _DUMB_M(&(a)) _DUMB_M(&a[1]) _DUMB_M(a[1]) _DUMB_M("['']") /* ---------------------------------------------------------------------*/ // REGULAR list /* test for regular match marker */ #command _REGULAR_L() => rl( ) _REGULAR_L(a,"a",'a',["'a'"],"['a']",'["a"]',&a.1,&a,&a.,&a. ,&(a),&a[1],&a.[1],&a. [2],&a&a, &a.a, a, a) // NORMAL list /* test for normal match marker */ #command _NORMAL_L() => nl( <"z"> ) _NORMAL_L(n,"n",'a',["'a'"],"['a']",'["a"]',&a.1,&a,&a.,&a. ,&(a),&a[1],&a.[1],&a. [2],&a&a, &.a, &a.a, a, a) // SMART list /* test for smart match marker */ #command _SMART_L() => sl( <(z)> ) _SMART_L(a,"a",'a',["'a'"],"['a']",'["a"]',&a.1,&a,&a.,&a. ,&(a),&a[1],&a.[1],&a. [2],&a&a, &.a, &a.a, a, a) // DUMB list /* test for dumb match marker */ #command _DUMB_L() => dl( # ) _DUMB_L(a,"a",'a',["'a'"],"['a']",'["a"]',&a.1,&a,&a.,&a. ,&(a),&a[1],&a.[1],&a. [2],&a&a, &.a, &a.a, a, a) /* ---------------------------------------------------------------------*/ /* test of preserving spaces in expressions */ /* Notice that Clipper and Harbour doesn't remove spaces from * expressions passed for stingify */ index on LEFT( f1 , 10 ) to _tst /* ---------------------------------------------------------------------*/ /* repeated optinal clauses */ #xcommand INSERT INTO ( [, ] ) VALUES ( [, ] ) => ; if
->( dbappend() ) ;; replace
-> with ;; [ replace
-> with ; ] ;
->( dbunlock() ) ;; endif insert into test ( FIRST, LAST, STREET ) values ( "first", "last", "street" ) #xcommand INSERT2 INTO
( [, ] ) VALUES ( [, ] ) => ; if
->( dbappend() ) ;;
-> := ;; [
-> := ; ] ;
->( dbunlock() ) ;; endif insert2 into test ( FIRST, LAST, STREET ) ; values ( "first", "last", "street" ) /* ---------------------------------------------------------------------*/ /* test for case sensitivity in define */ #define F1( n ) F2( n, N ) F1( 1 ) #define F3( nN, Nn ) F2( nN, Nn, NN, nn, N, n ) F3( 1, 2 ) /* ---------------------------------------------------------------------*/ /* test for different order of optional clauses */ #command MYCOMMAND [] [MYCLAUSE ] => ; MyFunction( {} [, ] ) MYCOMMAND MYCLAUSE 321 "HELLO" MYCOMMAND MYCLAUSE 321 "HELLO","all" MYCOMMAND "HELLO","all" MYCLAUSE 321 #command MYCOMMAND2 [] [MYCLAUSE ] [ALL] => ; MyFunction2( {} [, ] ) MYCOMMAND2 MYCLAUSE 321 "HELLO" MYCOMMAND2 MYCLAUSE 321 "HELLO" ALL MYCOMMAND2 ALL MYCLAUSE 321 "HELLO" MYCOMMAND2 MYCLAUSE 321 "HELLO" ALL MYCOMMAND2 MYCLAUSE 321 ALL "HELLO" #xcommand MYCOMMAND3 [] ; [MYCLAUSE ] [MYOTHER ] => MyFunction3( {}, , ) MYCOMMAND3 MYCLAUSE 322 "Hello" MYOTHER 1 MYCOMMAND3 MYOTHER 1 MYCLAUSE 322 "Hello" MYCOMMAND3 "Hello" MYOTHER 1 MYCLAUSE 322 MYCOMMAND3 MYOTHER 1 "Hello" MYCLAUSE 322 /* ---------------------------------------------------------------------*/ /* Special restricted macro match marker (used in SET FILTER TO command */ /* is matched when &variable or &(expression) are used */ SET FILTER TO &cVar. SET FILTER TO &(cVar .AND. &cVar) SET FILTER TO &cVar. .AND. cVar /* ---------------------------------------------------------------------*/ #xtranslate XTRANS(( => normal_match( <(x)> ) #xtranslate XTRANS(( => macro_match( <(x)> ) XTRANS( cVar ( XTRANS( &cVar ( XTRANS( &cVar+1 ( XTRANS( &cVar. ( XTRANS( &cVar&cVar ( XTRANS( &cVar.&cVar ( XTRANS( &cVar.&cVar. ( XTRANS( (&cVar.) ( XTRANS( &(cVar) ( XTRANS( &cVar[3] ( XTRANS( &cVar. [3] ( XTRANS( &(cVar [3],&cvar) ( XTRANS( (&cVar. [3],&cvar) ( XTRANS( &cVar.1+5 ( XTRANS( &cVar .AND. cVar ( XTRANS( &cVar. .AND. cVar ( /* ---------------------------------------------------------------------*/ #xtranslate MXCALL => () #xtranslate MYCALL => ( , 'mycall' ) #xtranslate MZCALL => ( , "mzcall" ) #command FOO FOO => <(x)>+<(y)> #translate BAR BAR => <(x)>+<(y)> MYCALL &cVar ++cVar MZCALL &cVar ++cVar MYCALL &cVar+1 &cVar MZCALL &cVar+1 &cVar MXCALL &cVar MXCALL &cVar. MXCALL &cVar.1 MXCALL &cVar + 1 MYCALL &cVar &cVar MYCALL &cVar. &cVar. MYCALL &cVar.1 &cVar.1 MYCALL &cVar ++cVar MYCALL &cVar. --cVar MYCALL &cVar.1 !cVar MYCALL &cVar+1 &cVar MYCALL &cVar.+1 &cVar. MYCALL &cVar.1+1 &cVar.1 MYCALL &cVar +1 &cVar MYCALL &cVar. +1 &cVar. MYCALL &cVar.1 +1 &cVar.1 MYCALL &cVar +1 MYCALL &cVar. +1 MYCALL &cVar.1 +1 FOO &cVar FOO &var. BAR &cVar BAR &var. FOO &cVar FOO &var.+1 BAR &cVar BAR &var.+1 MXCALL &cVar() MXCALL &cVar++ (MXCALL &cVar)++ MXCALL &cVar.() MXCALL &cVar.++ (MXCALL &cVar.)++ MXCALL &cVar.1 () MXCALL &cVar.1 ++ (MXCALL &cVar.1) ++ /* ---------------------------------------------------------------------*/ #translate MTRANSLATE => normal_t(<"x">) #translate MTRANSLATE => macro_t(<(x)>) #command MCOMMAND => normal_c(<"x">) #command MCOMMAND => macro_c(<(x)>) MTRANSLATE &cVar MTRANSLATE &cVar. MTRANSLATE &(cVar) MTRANSLATE & (cVar) MTRANSLATE &cVar&cVar MTRANSLATE &cVar+1 MTRANSLATE &cVar.+1 MTRANSLATE &cVar. .AND. .T. MTRANSLATE &cVar++ MTRANSLATE &cVar.++ MTRANSLATE &cVar+=1 MTRANSLATE &cVar.-=2 MTRANSLATE &cVar*=1 MTRANSLATE &cVar/=2 MTRANSLATE &cVar%=1 MTRANSLATE &cVar^=2 MTRANSLATE &cVar:=1 MTRANSLATE &cVar. .AND. .T. MTRANSLATE &cVar .AND. .T. MTRANSLATE &(cVar) +1 MTRANSLATE & (cVar) +1 MTRANSLATE &cVar.&cVar. MTRANSLATE &cVar.&cVar.&cVar&cVar MTRANSLATE &cVar.&(cVar) /* command */ MCOMMAND &cVar MCOMMAND &cVar. MCOMMAND &(cVar) MCOMMAND & (cVar) MCOMMAND &cVar&cVar MCOMMAND &cVar+1 MCOMMAND &cVar.+1 MCOMMAND &cVar. .AND. .T. MCOMMAND &cVar++ MCOMMAND &cVar.++ MCOMMAND &cVar+=1 MCOMMAND &cVar.-=2 MCOMMAND &cVar*=1 MCOMMAND &cVar/=2 MCOMMAND &cVar%=12 MCOMMAND &cVar^=2 MCOMMAND &cVar:=1 MCOMMAND &cVar. .AND. .T. MCOMMAND &cVar .AND. .T. MCOMMAND &(cVar) +1 MCOMMAND & (cVar) +1 MCOMMAND &cVar.&cVar. MCOMMAND &cVar.&cVar.&cVar&cVar2 MCOMMAND &cVar.&(cVar) /* ---------------------------------------------------------------------*/ /* repeated optional clauses */ #xcommand SET [, ] WITH => := [; :=] SET v1 WITH 0 SET v1, v2 WITH 0 SET v1, v2, v3 WITH 0 SET v1, v2, v3, v4 WITH 0 #command AVG [, ] TO [, ] =>; AVERAGE( {||:=+} [, {||:=+} ] ) AVG f1 TO s1 AVG f1, f2 TO s1, s2 AVG f1, f2, f3 TO s1, s2, s3 /* ---------------------------------------------------------------------*/ COPY STRUCTURE EXTENDED TO teststru /* ---------------------------------------------------------------------*/ #ifdef __HARBOUR__ #command @ , GET ; [PICTURE ] ; [VALID ] ; [WHEN ] ; [CAPTION ) ; ; AAdd( GetList, ; _GET_( , <"var">, , <{valid}>, <{when}> ) ) ; [; ATail(GetList):Caption := GET ; PUSHBUTTON ; [VALID ] ; [WHEN ] ; [CAPTION
] ; [MESSAGE ] ; [SEND ] ; ; => SetPos( , ] ; [; ATail(GetList):CapRow := ATail(Getlist):row ; ; ATail(GetList):CapCol := ATail(Getlist):col - ; __CapLength() - 1] ; [; ATail(GetList):message := ] ; [; ATail(GetList):] ; ; ATail(GetList):Display() #endif @ 0,1 GET a @ 0,2 GET a PICTURE "X" @ 0,3 GET a PICTURE "X" VALID .T. @ 0,4 GET a PICTURE "X" VALID .T. WHEN .T. @ 0,5 GET a PICTURE "X" VALID .T. WHEN .T. CAPTION "myget" @ 0,6 GET a PICTURE "X" VALID .T. WHEN .T. CAPTION "myget" MESSAGE "mymess" @ 0,7 GET a PICTURE "X" VALID .T. WHEN .T. CAPTION "myget" MESSAGE "mymess" SEND send() /* ---------------------------------------------------------------------*/ @ 1,1 GET a RANGE 0,100 @ 1,2 GET a PICTURE "X" RANGE 0,100 /* NOTE: Clipper fails here */ @ 1,3 GET a PICTURE "X" VALID .T. RANGE 0,100 @ 1,4 GET a PICTURE "X" WHEN .T. RANGE 0,100 @ 1,5 GET a PICTURE "X" WHEN .T. CAPTION "myget" RANGE 0,100 @ 1,6 GET a PICTURE "X" WHEN .T. CAPTION "myget" MESSAGE "mymess" RANGE 0,100 @ 1,7 GET a PICTURE "X" WHEN .T. CAPTION "myget" MESSAGE "mymess" SEND send() RANGE 0,100 @ 2,1 GET a @ 2,2 GET a RANGE 0,100 PICTURE "X" @ 2,3 GET a PICTURE "X" RANGE 0,100 @ 2,4 GET a PICTURE "X" RANGE 0,100 WHEN .T. @ 2,5 GET a PICTURE "X" RANGE 0,100 WHEN .T. CAPTION "myget" @ 2,6 GET a PICTURE "X" RANGE 0,100 WHEN .T. CAPTION "myget" MESSAGE "mymess" @ 2,7 GET a PICTURE "X" RANGE 0,100 WHEN .T. CAPTION "myget" MESSAGE "mymess" SEND send() /* ---------------------------------------------------------------------*/ #ifdef __HARBOUR__ #command @ , ] ; [MESSAGE ] ; [COLOR ] ; [FOCUS ] ; [STATE ] ; [STYLE