2012-09-26 01:24 UTC+0200 Viktor Szakats (harbour syenar.net)

* contrib/hbnf/aading.prg
  * contrib/hbnf/aemaxlen.prg
  * contrib/hbnf/aeminlen.prg
  * contrib/hbnf/amedian.prg
  * contrib/hbnf/any2any.prg
  * contrib/hbnf/at2.prg
  * contrib/hbnf/blink.prg
  * contrib/hbnf/calendar.prg
  * contrib/hbnf/clrsel.prg
  * contrib/hbnf/d2e.prg
  * contrib/hbnf/dectobin.prg
  * contrib/hbnf/dfile.prg
  * contrib/hbnf/diskfunc.prg
  * contrib/hbnf/doc/en/dosver.txt
  * contrib/hbnf/doc/en/proper.txt
  * contrib/hbnf/doc/en/setdate.txt
  * contrib/hbnf/doc/en/settime.txt
  * contrib/hbnf/dosver.prg
  * contrib/hbnf/e2d.prg
  * contrib/hbnf/findith.prg
  * contrib/hbnf/gcd.prg
  * contrib/hbnf/hex2dec.prg
  * contrib/hbnf/invclr.prg
  * contrib/hbnf/isshare.prg
  * contrib/hbnf/linked.prg
  * contrib/hbnf/menu1.prg
  * contrib/hbnf/metaph.prg
  * contrib/hbnf/miltime.prg
  * contrib/hbnf/mouse1.prg
  * contrib/hbnf/mouse2.prg
  * contrib/hbnf/netpv.prg
  * contrib/hbnf/ntow.prg
  * contrib/hbnf/nwlstat.prg
  * contrib/hbnf/nwsem.prg
  * contrib/hbnf/nwuid.prg
  * contrib/hbnf/pending.prg
  * contrib/hbnf/pickday.prg
  * contrib/hbnf/prtesc.prg
  * contrib/hbnf/rand1.prg
  * contrib/hbnf/savesets.prg
  * contrib/hbnf/scancode.prg
  * contrib/hbnf/setdate.prg
  * contrib/hbnf/settime.prg
  * contrib/hbnf/sleep.prg
  * contrib/hbnf/sysmem.prg
  * contrib/hbnf/tempfile.prg
  * contrib/hbnf/vertmenu.prg
  * contrib/hbnf/vidmode.prg
  * contrib/hbnf/wda.prg
  * contrib/hbnf/workdays.prg
  * contrib/hbnf/woy.prg
  * contrib/hbnf/xbox.prg
  * doc/codebloc.txt
  * extras/hbxlsxml/tests/example.prg
  * extras/hbxlsxml/tests/example2.prg
  * extras/hbxlsxml/tests/example3.prg
  * extras/httpsrv/uhttpd.prg
  * website/samples/codebloc.prg.html
  * website/samples/testbrw.prg.html
  * website/samples/testcgi.prg.html
    * more cleanup, formatting
This commit is contained in:
Viktor Szakats
2012-09-25 23:28:53 +00:00
parent 9094676888
commit e33c57fc35
61 changed files with 1043 additions and 976 deletions

View File

@@ -16,6 +16,69 @@
The license applies to all entries newer than 2009-04-28.
*/
2012-09-26 01:24 UTC+0200 Viktor Szakats (harbour syenar.net)
* contrib/hbnf/aading.prg
* contrib/hbnf/aemaxlen.prg
* contrib/hbnf/aeminlen.prg
* contrib/hbnf/amedian.prg
* contrib/hbnf/any2any.prg
* contrib/hbnf/at2.prg
* contrib/hbnf/blink.prg
* contrib/hbnf/calendar.prg
* contrib/hbnf/clrsel.prg
* contrib/hbnf/d2e.prg
* contrib/hbnf/dectobin.prg
* contrib/hbnf/dfile.prg
* contrib/hbnf/diskfunc.prg
* contrib/hbnf/doc/en/dosver.txt
* contrib/hbnf/doc/en/proper.txt
* contrib/hbnf/doc/en/setdate.txt
* contrib/hbnf/doc/en/settime.txt
* contrib/hbnf/dosver.prg
* contrib/hbnf/e2d.prg
* contrib/hbnf/findith.prg
* contrib/hbnf/gcd.prg
* contrib/hbnf/hex2dec.prg
* contrib/hbnf/invclr.prg
* contrib/hbnf/isshare.prg
* contrib/hbnf/linked.prg
* contrib/hbnf/menu1.prg
* contrib/hbnf/metaph.prg
* contrib/hbnf/miltime.prg
* contrib/hbnf/mouse1.prg
* contrib/hbnf/mouse2.prg
* contrib/hbnf/netpv.prg
* contrib/hbnf/ntow.prg
* contrib/hbnf/nwlstat.prg
* contrib/hbnf/nwsem.prg
* contrib/hbnf/nwuid.prg
* contrib/hbnf/pending.prg
* contrib/hbnf/pickday.prg
* contrib/hbnf/prtesc.prg
* contrib/hbnf/rand1.prg
* contrib/hbnf/savesets.prg
* contrib/hbnf/scancode.prg
* contrib/hbnf/setdate.prg
* contrib/hbnf/settime.prg
* contrib/hbnf/sleep.prg
* contrib/hbnf/sysmem.prg
* contrib/hbnf/tempfile.prg
* contrib/hbnf/vertmenu.prg
* contrib/hbnf/vidmode.prg
* contrib/hbnf/wda.prg
* contrib/hbnf/workdays.prg
* contrib/hbnf/woy.prg
* contrib/hbnf/xbox.prg
* doc/codebloc.txt
* extras/hbxlsxml/tests/example.prg
* extras/hbxlsxml/tests/example2.prg
* extras/hbxlsxml/tests/example3.prg
* extras/httpsrv/uhttpd.prg
* website/samples/codebloc.prg.html
* website/samples/testbrw.prg.html
* website/samples/testcgi.prg.html
* more cleanup, formatting
2012-09-26 00:52 UTC+0200 Viktor Szakats (harbour syenar.net)
* contrib/hbamf/tests/tstendin.prg
* contrib/hbnf/floptst.prg

View File

@@ -24,7 +24,7 @@
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
LOCAL aList1,aList2,var0,nstart,nstop,nelapsed,nCtr
CLS
? "TEST TO DEMONSTRATE EXAMPLES OF FT_AADDITION"
@@ -57,7 +57,7 @@ FUNCTION MAIN()
? PADR("FT_AADDITION( aList1, aList2, .F., .F. ) ->",44)
AEVAL( var0, { |x| QQOUT(x + ",") } )
?
RETURN NIL
RETURN
#endif

View File

@@ -24,7 +24,7 @@
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
LOCAL var0, myarray1 := DIRECTORY()
CLS
? "TEST TO DEMONSTRATE EXAMPLES OF FT_AEMAXLEN"
@@ -47,7 +47,7 @@ FUNCTION MAIN()
? PADR('FT_AEMAXLEN( aTail( myarray1 ) ) ->',30)
?? var0
?
RETURN NIL
RETURN
#endif

View File

@@ -24,7 +24,7 @@
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
LOCAL var0, myarray1 := DIRECTORY()
CLS
? "TEST TO DEMONSTRATE EXAMPLES OF FT_AEMINLEN"
@@ -50,7 +50,7 @@ FUNCTION MAIN()
? PADR('FT_AEMINLEN( myarray1,3 ) ->',30)
?? var0
?
RETURN NIL
RETURN
#endif

View File

@@ -28,7 +28,7 @@
#include "directry.ch"
FUNCTION MAIN()
PROCEDURE Main()
LOCAL var0, myarray0 := DIRECTORY(), myarray1 := {}
CLS
? "TEST TO DEMONSTRATE EXAMPLES OF FT_AMEDIAN"
@@ -50,7 +50,7 @@ FUNCTION MAIN()
? PADR('FT_AMEDIAN( myarray1, 8, 40 ) ->',35)
?? var0
?
RETURN NIL
RETURN
#endif

View File

@@ -43,7 +43,7 @@
#define TRUE (.t.)
#define FALSE (.f.)
#Define XTOC(x) CASE_AT(VALTYPE(x), "CNDLM", ;
#define XTOC(x) CASE_AT(VALTYPE(x), "CNDLM", ;
{ NULL, ;
x, ;
iif(IS_NUMERIC(x),;

View File

@@ -29,7 +29,7 @@
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
LOCAL cSearch,cTarget,var0
CLS
? "TEST TO DEMONSTRATE EXAMPLES OF FT_AT2"
@@ -51,7 +51,7 @@ FUNCTION MAIN()
? PADR("FT_AT2( cSearch, cTarget, 2, .F. ) -> ",40)
??var0
?
RETURN NIL
RETURN
#endif

View File

@@ -25,9 +25,9 @@
*/
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
FT_BLINK( "WAIT", 5, 10 )
RETURN NIL
RETURN
#endif
FUNCTION FT_BLINK( cMsg, nRow, nCol )

View File

@@ -24,7 +24,7 @@
#include "setcurs.ch"
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
local aRet[8], i
setcolor ('w+/b')
cls
@@ -33,15 +33,15 @@
endif
keyboard chr (28)
aRet := ft_calendar (10,40,'w+/rb',.t.,.t.) //display calendar, return all.
@1,0 say 'Date :'+dtoc(aRet[1])
@2,0 say 'Month Number:'+str(aRet[2],2,0)
@3,0 say 'Day Number :'+str(aRet[3],2,0)
@4,0 say 'Year Number :'+str(aRet[4],4,0)
@5,0 say 'Month :'+aRet[5]
@6,0 say 'Day :'+aRet[6]
@7,0 say 'Julian Day :'+str(aRet[7],3,0)
@8,0 say 'Current Time:'+aRet[8]
RETURN NIL
@ 1,0 say 'Date :'+dtoc(aRet[1])
@ 2,0 say 'Month Number:'+str(aRet[2],2,0)
@ 3,0 say 'Day Number :'+str(aRet[3],2,0)
@ 4,0 say 'Year Number :'+str(aRet[4],4,0)
@ 5,0 say 'Month :'+aRet[5]
@ 6,0 say 'Day :'+aRet[6]
@ 7,0 say 'Julian Day :'+str(aRet[7],3,0)
@ 8,0 say 'Current Time:'+aRet[8]
RETURN
#endif
#include "inkey.ch"

View File

@@ -96,9 +96,9 @@
*
*/
#IFDEF FT_TEST
#ifdef FT_TEST
FUNCTION Main( cVidMode )
PROCEDURE Main( cVidMode )
LOCAL nRowDos := ROW()
LOCAL nColDos := COL()
@@ -145,9 +145,9 @@
SETPOS( nRowDos, nColDos )
SETBLINK( .F. ) // doesn't appear to be reset from FT_RestSets
RETURN Nil
RETURN
#ENDIF
#endif
*------------------------------------------------
FUNCTION FT_ClrSel( aClrs, lColour, cChr )

View File

@@ -29,9 +29,10 @@
#command DEFAULT <p> TO <val> => <p> := iif( <p> == NIL, <val>, <p> )
#ifdef FT_TEST
function main( cNum, cPrec )
PROCEDURE Main( cNum, cPrec )
DEFAULT cPrec TO str( DEFAULT_PRECISION )
return qout( ft_d2e( val(cNum), val(cPrec) ) )
qout( ft_d2e( val(cNum), val(cPrec) ) )
RETURN
#endif
function ft_d2e( nDec, nPrecision )

View File

@@ -26,12 +26,12 @@
#ifdef FT_TEST
FUNCTION MAIN
PROCEDURE Main()
LOCAL X
FOR X := 1 TO 255
QOUT( FT_DEC2BIN( x ))
next
return nil
return
#endif

View File

@@ -31,7 +31,7 @@ THREAD static nHandle := 0
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
@ 0,0 CLEAR
@@ -77,7 +77,7 @@ THREAD static nHandle := 0
@ 20,0 SAY "Key pressed was: " + '[' + cKey + ']'
return (NIL)
return
#endif

View File

@@ -31,12 +31,12 @@
#define DRVTABLE "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#ifdef FT_TEST
FUNCTION MAIN( cDrv )
PROCEDURE Main( cDrv )
QOut("Disk size: " + str( FT_DSKSIZE() ) )
QOut("Free bytes: " + str( FT_DSKFREE() ) )
RETURN NIL
RETURN
#endif
FUNCTION FT_DSKSIZE( cDrive )

View File

@@ -28,8 +28,9 @@
*
*
* $EXAMPLES$
* FUNCTION main()
* RETURN QOut( "Dos version: " + FT_DOSVER() )
* PROCEDURE Main()
* QOut( "Dos version: " + FT_DOSVER() )
* RETURN
*
* $END$
*/

View File

@@ -32,8 +32,8 @@
* and Mark Zechiel; it was re-written in C (and thus, optimized
* and enhanced) by Robert DiFalco.
* $EXAMPLES$
* FUNCTION main( cStr )
* OutStd( FT_PROPER( cStr ) + chr(13) + chr(10) )
* RETURN ( nil )
* PROCEDURE Main( cStr )
* OutStd( FT_PROPER( cStr ) + hb_eol() )
* RETURN
* $END$
*/

View File

@@ -31,14 +31,14 @@
* The following program takes a date from the command line and sets
* the DOS system date:
*
* FUNCTION main( cDate )
* PROCEDURE Main( cDate )
*
* cDate := iif( cDate == nil, dtoc( date() ), cDate )
* cDate := iif( cDate == NIL, DToC( Date() ), cDate )
* QOut( "Setting date to: " + cDate + "... " )
* FT_SETDATE( ctod( cDate ) )
* Qout( "Today is now: " + dtoc( date() ) )
* FT_SETDATE( CToD( cDate ) )
* QOut( "Today is now: " + DToC( Date() ) )
*
* RETURN NIL
* RETURN
*
* $END$
*/

View File

@@ -29,14 +29,14 @@
* The following program takes a time string from the command line and sets
* the DOS system time:
*
* FUNCTION main( cTime )
* PROCEDURE Main( cTime )
*
* cTime := iif( cTime == nil, time(), cTime )
* cTime := iif( cTime == NIL, Time(), cTime )
* QOut( "Setting time to: " + cTime + "... " )
* FT_SETTIME( cTime )
* Qout( "Time is now: " + time() )
* QOut( "Time is now: " + Time() )
*
* RETURN NIL
* RETURN
*
* $END$
*/

View File

@@ -31,9 +31,9 @@
#define DOSVER 48
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
QOut( "Dos version: " + FT_DOSVER() )
RETURN NIL
RETURN
#endif
FUNCTION FT_DOSVER()

View File

@@ -25,8 +25,9 @@
*/
#ifdef FT_TEST
function main( sNumE )
return qout( FT_E2D( sNumE ) )
PROCEDURE Main( sNumE )
qout( FT_E2D( sNumE ) )
RETURN
#endif
function ft_e2d( sNumE )

View File

@@ -29,7 +29,7 @@
#define NULL ""
#ifdef FT_TEST
FUNCTION MAIN( cCk, cStr, nOcc, xCase )
PROCEDURE Main( cCk, cStr, nOcc, xCase )
LOCAL nFind
if pcount() != 4
QOut( "usage: findith cCk cStr nOcc xCase")
@@ -43,7 +43,7 @@
QOut( cStr )
nFind := FT_FINDITH( cCk, cStr, nOcc, xCase )
QOut( iif( nFind > 0, space( nFind - 1) + "^" , "Not found" ) )
RETURN nil
RETURN
#endif
FUNCTION FT_FINDITH(cCheckFor,cCheckIn,nWhichOccurrence,lIgnoreCase)

View File

@@ -33,8 +33,9 @@
IF <Condition> ; EXIT ; END ; END
#ifdef FT_TEST
FUNCTION MAIN( cNum1, cNum2 )
RETURN OUTSTD( STR(FT_GCD( val(cNum1), val(cNum2) )) + CHR(13) + CHR(10) )
PROCEDURE Main( cNum1, cNum2 )
OUTSTD( STR(FT_GCD( val(cNum1), val(cNum2) )) + hb_eol() )
RETURN
#endif
FUNCTION FT_GCD(nNumber1, nNumber2)

View File

@@ -30,9 +30,9 @@
#define HEXTABLE "0123456789ABCDEF"
#ifdef FT_TEST
FUNCTION MAIN( cHexNum )
PROCEDURE Main( cHexNum )
QOut( FT_HEX2DEC( cHexNum ) )
RETURN NIL
RETURN
#endif
FUNCTION FT_HEX2DEC( cHexNum )

View File

@@ -24,7 +24,7 @@
*
*/
#Command DEFAULT <Param1> TO <Def1> [, <ParamN> TO <DefN> ] ;
#command DEFAULT <Param1> TO <Def1> [, <ParamN> TO <DefN> ] ;
=> ;
<Param1> := iif(<Param1> == NIL,<Def1>,<Param1>) ;
[; <ParamN> := iif(<ParamN> == NIL,<DefN>,<ParamN>)]

View File

@@ -31,21 +31,21 @@
#include "ftint86.ch"
#ifdef FT_TEST
function main()
PROCEDURE Main()
local nLoaded := ft_isshare()
do case
case nLoaded == 0
Qout("Share not loaded, but ok to load")
case nLoaded == 1
Qout("Share not loaded, but NOT ok to load!")
case nLoaded == 255
Qout("Share is loaded!")
case nLoaded == 0
Qout("Share not loaded, but ok to load")
case nLoaded == 1
Qout("Share not loaded, but NOT ok to load!")
case nLoaded == 255
Qout("Share is loaded!")
endcase
Qout("Retcode: " + str( nLoaded ) )
return nil
return
#endif
FUNCTION ft_isshare()

View File

@@ -26,7 +26,7 @@
#ifdef FT_TEST
FUNCTION Main
PROCEDURE Main()
LOCAL cString
LOCAL aString := { "TRIM('abc ')", ;
"NotARealFunc()", ;
@@ -41,11 +41,11 @@
"EOF(>> Note: Syntax IS NOT checked! <<)" ;
}
CLS
@1,0 SAY "String Tested Result"
@2,0 TO 2,MAXCOL()
@ 1,0 SAY "String Tested Result"
@ 2,0 TO 2,MAXCOL()
AEVAL(aString, {|ele,num| QOUT(ele, SPACE(45-LEN(ele)), FT_Linked(ele)) } )
@MAXROW()-2,0
RETURN NIL
@ MAXROW()-2,0
RETURN
#endif

View File

@@ -64,7 +64,7 @@ THREAD STATIC ACHOICES := {}, AVALIDKEYS := {}
THREAD STATIC NHPOS, NVPOS, NMAXROW, NMAXCOL
// BEGINNING OF DEMO PROGRAM
#IFDEF FT_TEST
#ifdef FT_TEST
// DUMMY PROCEDURE NAME SO "CCMDLINE" WILL BE LOCAL
PROCEDURE CALLMENU( cCmdLine )
LOCAL sDosScrn, nDosRow, nDosCol, lColor

View File

@@ -97,8 +97,8 @@
// #define FT_TEST .T.
#IFDEF FT_TEST
FUNCTION MAIN()
#ifdef FT_TEST
PROCEDURE Main()
LOCAL cJunk := SPACE( 8000 )
LOCAL aNames := {}
LOCAL cName, nElem

View File

@@ -26,7 +26,7 @@
#ifdef FT_TEST
function main()
PROCEDURE Main()
cls
? "am-pm"
@@ -58,7 +58,7 @@
? "sys to mil"
? time()
? ft_sys2mil()
return nil
return
#endif

View File

@@ -7,7 +7,7 @@ THREAD static s_lMinit:=.F.
#ifdef FT_TEST
FUNCTION MAIN(nRow,nCol)
PROCEDURE Main(nRow,nCol)
* Pass valid row and column values for different video modes to change modes
@@ -192,7 +192,7 @@ THREAD static s_lMinit:=.F.
FT_MSETSENS(nHoriz, nVert, nDouble)
RETURN nil
RETURN
#endif

View File

@@ -72,7 +72,7 @@ THREAD static lMinit:=.F.
#ifdef FT_TEST
FUNCTION MAIN(nRow,nCol)
PROCEDURE Main(nRow,nCol)
* Pass valid row and column values for different video modes to change modes
@@ -263,7 +263,7 @@ THREAD static lMinit:=.F.
FT_MSETSENS(nHoriz, nVert, nDouble)
RETURN nil
RETURN
#endif

View File

@@ -25,9 +25,9 @@
*/
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
? FT_NETPV( 10000, 10, { 10000,15000,16000,17000 } )
RETURN ( nil )
RETURN
#endif
FUNCTION FT_NETPV(nInitialInvestment, nInterestRate, aCashFlow, nNoOfCashFlows)

View File

@@ -37,8 +37,9 @@ static sc_tens := { "", "", " Twenty", " Thirty", " Forty", " Fifty", ;
static sc_qualifiers := { "", " Thousand", " Million", " Billion", " Trillion" }
#ifdef FT_TEST
function main( cNum )
return qout( ft_ntow( val( cNum ) ) )
PROCEDURE Main( cNum )
qout( ft_ntow( val( cNum ) ) )
RETURN
#endif
function ft_ntow(nAmount)

View File

@@ -31,9 +31,9 @@
#define STATNUM 220
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
QOut( "Logical station: " + str( FT_NWLSTAT() ) )
RETURN NIL
RETURN
#endif
FUNCTION FT_NWLSTAT()

View File

@@ -56,7 +56,7 @@
#define INITIAL_SEMAPHORE_VALUE 2
#define WAIT_SECONDS 1
function main()
PROCEDURE Main()
local nInitVal, nRc, nHandle, nValue, nOpenCnt
cls
@@ -91,12 +91,12 @@
tone( nHandle,.5 )
ft_nwSemEx( nHandle, @nValue, @nOpenCnt )
end
enddo
qout( "Signal returns: " + str( ft_nwsemSig( nHandle ) ) )
qout( "Close returns: " + str( ft_nwsemClose( nHandle ) ) )
return nil
return
#endif

View File

@@ -38,7 +38,7 @@
#define NW_LOG 227
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
local x, cUid
QOut( "I am: [" + FT_NWUID() + "]" )
QOut( "---------------------" )
@@ -50,7 +50,7 @@
endif
next
RETURN NIL
RETURN
#endif
FUNCTION FT_NWUID( nConn )

View File

@@ -22,15 +22,15 @@
*/
#ifdef FT_TEST
FUNCTION MAIN()
@0,0 CLEAR
PROCEDURE Main()
@ 0,0 CLEAR
FT_PENDING("Message one",20,0,3,"W+/G") // Displays "Message one."
// sets row to 20, col to 0.
// wait to 3 and color to
// bright white over green.
FT_PENDING("Message two") // Displays "Message two", after 5 sec.
FT_PENDING("Message three") // Displays "Message three", after 5 sec.
RETURN NIL
RETURN
#endif
FUNCTION FT_PENDING (cMsg, nRow, nCol, nWait, cColor)

View File

@@ -29,13 +29,13 @@
// test code
#ifdef FT_TEST
FUNCTION MAIN
QOUT("You selected " + FT_PICKDAY())
return nil
PROCEDURE Main()
QOUT("You selected " + FT_PICKDAY())
RETURN
#endif
function FT_PICKDAY
function FT_PICKDAY()
LOCAL DAYS := { "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", ;
"FRIDAY", "SATURDAY" }, SEL := 0
LOCAL OLDSCRN := SAVESCREEN(8, 35, 16, 45), oldcolor := setcolor('+w/r')

View File

@@ -25,7 +25,7 @@
*/
#ifdef FT_TEST
FUNCTION MAIN( cParm1 )
PROCEDURE Main( cParm1 )
*-------------------------------------------------------
* Sample routine to test function from command line
*-------------------------------------------------------
@@ -37,7 +37,7 @@
? " outputs converted code to standard output"
?
ENDIF
RETURN (nil)
RETURN
#endif
FUNCTION FT_ESCCODE( cInput )

View File

@@ -30,14 +30,14 @@
// Run it multiple times and redirect output to a file
// to check it
function main()
PROCEDURE Main()
local x
for x := 1 to 100
outstd( int( ft_rand1(100) ) )
outstd( chr(13) + chr(10) )
outstd( hb_eol() )
next
return nil
return
#endif

View File

@@ -34,10 +34,10 @@
#define FT_SET_BLINK _SET_COUNT + 2
#ifdef FT_TEST
FUNCTION MAIN
PROCEDURE Main()
LOCAL ASETS := FT_SAVESETS()
INKEY(0)
RETURN Nil
RETURN
#endif
FUNCTION FT_SAVESETS()

View File

@@ -33,9 +33,9 @@
#ifdef FT_TEST
#DEFINE SCANCODE_ESCAPE (chr(27) + chr(1))
#define SCANCODE_ESCAPE (chr(27) + chr(1))
FUNCTION main()
PROCEDURE Main()
LOCAL getlist, cKey
CLEAR
QOut("Press any key, ESCape to exit:")
@@ -46,8 +46,8 @@
if cKey == SCANCODE_ESCAPE
exit
endif
end
RETURN nil
enddo
RETURN
#endif

View File

@@ -34,14 +34,14 @@
#define SETDATE 43
#ifdef FT_TEST
FUNCTION MAIN( cDate )
PROCEDURE Main( cDate )
cDate := iif( cDate == nil, dtoc( date() ), cDate )
QOut( "Setting date to: " + cDate + "... " )
FT_SETDATE( ctod( cDate ) )
Qout( "Today is now: " + dtoc( date() ) )
QOut( "Today is now: " + dtoc( date() ) )
RETURN NIL
RETURN
#endif
function FT_SETDATE( dDate )

View File

@@ -38,12 +38,12 @@
#define MINS( ts ) ( val( substr( ts, 4, 2 ) ) )
#ifdef FT_TEST
FUNCTION MAIN( cTime )
PROCEDURE Main( cTime )
cTime := iif( cTime == nil, time(), cTime )
QOut( "Setting time to: " + cTime + "... " )
FT_SETTIME( cTime )
Qout( "Time is now: " + time() )
RETURN NIL
QOut( "Time is now: " + time() )
RETURN
#endif
function FT_SETTIME( cTime )

View File

@@ -27,13 +27,13 @@
* Invoke by running SLEEP 1.0 to sleep 1.0 seconds
*
FUNCTION MAIN(nSleep)
PROCEDURE Main(nSleep)
? "Time is now: " + time()
FT_SLEEP(VAL(nSleep))
? "Time is now: " + time()
RETURN NIL
RETURN
#endif

View File

@@ -35,9 +35,9 @@
#define MEMSIZE 18
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
QOut( "Conventional memory: " + str( FT_SYSMEM() ) + "K installed" )
RETURN NIL
RETURN
#endif
FUNCTION FT_SYSMEM()

View File

@@ -115,7 +115,7 @@
#endif /* FT_TEMPFILE_ORIGINAL */
#ifdef FT_TEST
FUNCTION MAIN( cPath, cHide )
PROCEDURE Main( cPath, cHide )
LOCAL cFile, nHandle
cFile := FT_TEMPFIL( cPath, (cHide == "Y") )
@@ -127,5 +127,5 @@
else
Qout( "An error occurred" )
endif
RETURN nil
RETURN
#endif

View File

@@ -26,7 +26,7 @@
// test code
#ifdef FT_TEST
FUNCTION MAIN
PROCEDURE Main()
LOCAL MAINMENU := ;
{ { "DATA ENTRY", "ENTER DATA", { || FT_MENU2(datamenu) } }, ;
{ "Reports", "Hard copy", { || FT_MENU2(repmenu) } }, ;
@@ -51,7 +51,7 @@ local maintmenu := { { "Reindex", "Rebuild index files", { || re_ntx() } } , ;
{ "Exit", "Return to Main Menu" } }
FT_MENU2(mainmenu)
return nil
return
/* stub functions to avoid missing symbols */
static function cust

View File

@@ -34,11 +34,11 @@
#define GETMODE 15
#ifdef FT_TEST
FUNCTION MAIN( cMode )
PROCEDURE Main( cMode )
FT_SETMODE( val( cMode ) )
QOut( "Video mode is: " + str( FT_GETMODE() ) )
RETURN NIL
RETURN
#endif

View File

@@ -22,11 +22,11 @@
*/
#ifdef FT_TEST
function main( cDate, cDays )
PROCEDURE Main( cDate, cDays )
local nDays := ft_addWkDy( ctod(cDate), val(cDays) )
qout( "Num days to add: " + str( nDays ) )
qout( "New date: " + dtoc( ctod( cDate ) + nDays ) )
return nil
return
#endif
FUNCTION ft_addWkDy( dStart, nDys )

View File

@@ -28,8 +28,9 @@
*/
#ifdef FT_TEST
function main( cStart, cStop )
return qout( ft_workdays( ctod( cStart ), ctod( cStop ) ) )
PROCEDURE Main( cStart, cStop )
qout( ft_workdays( ctod( cStart ), ctod( cStop ) ) )
RETURN
#endif
FUNCTION FT_WorkDays( dStart, dStop )

View File

@@ -29,48 +29,48 @@
// ADD PARAMETER "CENTURY" ON COMMAND LINES TO TEST 4-DIGIT YEARS
FUNCTION MAIN( cCent )
PROCEDURE Main( cCent )
LOCAL lCentOn := .F., cDate
MEMVAR getlist
IF VALTYPE( cCent) == "C" .AND. "CENT" $ UPPER( cCent)
SET CENTURY ON
lCentOn := .T.
END
SET CENTURY ON
lCentOn := .T.
ENDIF
DO WHILE .T.
CLEAR
@ 2,10 SAY "Date to Test"
CLEAR
@ 2,10 SAY "Date to Test"
IF lCentOn
cDate := SPACE(10)
@ 2,24 GET cDate PICTURE "##/##/####"
ELSE
cDate := SPACE(8)
@ 2,24 GET cDate PICTURE "##/##/##"
END
READ
IF lCentOn
cDate := SPACE(10)
@ 2,24 GET cDate PICTURE "##/##/####"
ELSE
cDate := SPACE(8)
@ 2,24 GET cDate PICTURE "##/##/##"
ENDIF
READ
IF EMPTY(cDate)
EXIT
END
IF EMPTY(cDate)
EXIT
ENDIF
IF Left( DTOC( CTOD( cDate) ), 1 ) == " "
QQOUT( CHR( 7) )
@ 4,24 SAY "INVALID DATE"
INKEY(2)
LOOP
END
IF Left( DTOC( CTOD( cDate) ), 1 ) == " "
QQOUT( CHR( 7) )
@ 4,24 SAY "INVALID DATE"
INKEY(2)
LOOP
ENDIF
@ 4,10 SAY "Is Day Number " + STR( FT_DOY( CTOD( cDate)) ,3)
@ 4,10 SAY "Is Day Number " + STR( FT_DOY( CTOD( cDate)) ,3)
@ 6,10 SAY "Is in Week Number " + STR( FT_WOY( CTOD( cDate)) ,2)
@ 7,0
WAIT
END
@ 6,10 SAY "Is in Week Number " + STR( FT_WOY( CTOD( cDate)) ,2)
@ 7,0
WAIT
ENDDO
CLEAR
RETURN nil
RETURN
#endif

View File

@@ -28,7 +28,7 @@
*/
#ifdef FT_TEST
FUNCTION MAIN()
PROCEDURE Main()
local i
setcolor('W/B')
* clear screen
@@ -45,7 +45,7 @@
'of calculating the box size!',;
'Even though this line is way too long, and is in fact more than 80 characters long, if you care to check!')
RETURN NIL
RETURN
#endif
/* NOTE: In original NF, flag parameters were also accepted when

View File

@@ -137,7 +137,7 @@ PROCEDURE Main()
LOCAL cb
PRIVATE a
cb := Detach()
? EVAL( cb, 10 )
? Eval( cb, 10 )
RETURN
The above code also prints 10 in Clipper (even if compiled with -a or -v

View File

@@ -53,7 +53,7 @@
*/
/*----------------------------------------------------------------------*/
FUNCTION main()
FUNCTION Main()
LOCAL oXml, oSheet, xarquivo := "example.xml"
LOCAL i, xqtddoc, xttotnot, xtbascal, xtvlricm, xtbasipi, xtvlripi, aDoc, nLinha
LOCAL xEmpresa

View File

@@ -53,7 +53,7 @@
*/
/*----------------------------------------------------------------------*/
FUNCTION main()
FUNCTION Main()
LOCAL xml, format1, format2, format3, format4
LOCAL sheet1, sheet2, sheet4
@@ -149,4 +149,3 @@ FUNCTION main()
RETURN NIL
/*----------------------------------------------------------------------*/

View File

@@ -53,7 +53,7 @@
*/
/*----------------------------------------------------------------------*/
FUNCTION main()
FUNCTION Main()
LOCAL xml, sheet1, format4
xml:= ExcelWriterXML():New('my file.xml')
@@ -82,4 +82,3 @@ FUNCTION main()
RETURN NIL
/*----------------------------------------------------------------------*/

View File

@@ -207,7 +207,7 @@ ANNOUNCE ERRORSYS
//
// ----------------------------------------
FUNCTION MAIN( ... )
FUNCTION Main( ... )
LOCAL nPort, hListen, hSocket, aRemote, cI, xVal
LOCAL aThreads, nStartThreads, nMaxThreads, nStartServiceThreads
LOCAL i, cPar, lStop

View File

@@ -1,143 +1,143 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>codebloc.prg</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16386" name=GENERATOR>
<STYLE type=text/css>
<!--
body { color: #000000; background-color: #FFFFFF; }
.any1-activedot { color: #800080; }
.any1-comment { color: #008080; }
.any1-constant { color: #800080; }
.any1-escapeampersand { color: #00FF00; font-weight: bold; }
.any1-function { color: #808000; }
.any1-identifier { color: #000000; }
.any1-number { color: #FF0000; }
.any1-preprocessor { }
.any1-reservedword { color: #800000; }
.any1-space { }
.any1-string { color: #0000FF; }
.any1-symbol { }
.any1-variable { color: #808000; }
-->
</STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<PRE><CODE><SPAN style="FONT: 10pt Courier New"><SPAN class=any1-comment>// codeblocks test
</SPAN><SPAN class=any1-reservedword>function</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Main</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> B := </SPAN><SPAN class=any1-string>"this will never print"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> a := { |b,c| </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"I am a codeblock"</SPAN><SPAN class=any1-space> + b + c ) }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> d
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> de
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> ar := { </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> crlf:=</SPAN><SPAN class=any1-function>CHR</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> YY, X
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> x1, x2
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"this should print first"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>Eval</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>" with parameters"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>" ... and it works!"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
d =</SPAN><SPAN class=any1-string>"with access to local variables"
</SPAN><SPAN class=any1-space> a ={ |b,c| </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"I am a second codeblock "</SPAN><SPAN class=any1-space> +d +b +;
</SPAN><SPAN class=any1-variable>IIF</SPAN><SPAN class=any1-symbol>(c==NIL, </SPAN><SPAN class=any1-string>' empty second parameter '</SPAN><SPAN class=any1-symbol>, c)), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(crlf), </SPAN><SPAN class=any1-string>"WITH return value"</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>", codeblock parameters"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>", codeblock parameters "</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"and with second parameter"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>MyEval</SPAN><SPAN class=any1-symbol>( a ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-variable>OtherTest</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-variable>AnotherTest</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>"==&gt; Another "</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
a ={|c| </SPAN><SPAN class=any1-variable>IIF</SPAN><SPAN class=any1-symbol>( c=NIL, {|a| </SPAN><SPAN class=any1-string>"First "</SPAN><SPAN class=any1-symbol>+a}, {|a| </SPAN><SPAN class=any1-string>"Second "</SPAN><SPAN class=any1-symbol>+a}) }
a =</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>"codeblock created in a codeblock"</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( ar[ </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ] )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
a :={|| ar[ </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ]++}
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( ar[ </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ] )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
yy :=</SPAN><SPAN class=any1-number>5
</SPAN><SPAN class=any1-space> x :={|xx| </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-variable>LTRIM</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-function>STR</SPAN><SPAN class=any1-symbol>(xx))), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"+"</SPAN><SPAN class=any1-symbol>), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-variable>LTRIM</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-function>STR</SPAN><SPAN class=any1-symbol>(yy))), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>), xx + yy }
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( x, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) ) </SPAN><SPAN class=any1-comment>//this is OK
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( CRLF )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( x, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) ) </SPAN><SPAN class=any1-comment>//this should ignore unnecesary parameters
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>RetBlock</SPAN><SPAN class=any1-symbol>(), </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-comment>// BugToFix()
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Trying to use detached variable ..."</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
x1 :=</SPAN><SPAN class=any1-number>5
</SPAN><SPAN class=any1-space> x2 :=</SPAN><SPAN class=any1-number>6
</SPAN><SPAN class=any1-space> de =</SPAN><SPAN class=any1-variable>DetachLocal</SPAN><SPAN class=any1-symbol>( x1, x2 )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( de ) )
</SPAN><SPAN class=any1-comment>//changing the value of variables
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
x1 := </SPAN><SPAN class=any1-number>10
</SPAN><SPAN class=any1-space> x2 := </SPAN><SPAN class=any1-number>11
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( de ) )
de =</SPAN><SPAN class=any1-variable>DetachLocal</SPAN><SPAN class=any1-symbol>( x1, x2 )
</SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( de ) )
</SPAN><SPAN class=any1-reservedword>return</SPAN><SPAN class=any1-space> nil
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>MyEval</SPAN><SPAN class=any1-symbol>( bCodeBlock )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> D:=</SPAN><SPAN class=any1-string>"this is another variable"
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>(bCodeBlock, </SPAN><SPAN class=any1-string>" from "</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"MyEval Function"</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-reservedword>PROCEDURE</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>OtherTest</SPAN><SPAN class=any1-symbol>( cblock )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cb
cb :={|a,b| </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cblock,a,b ) }
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cb, </SPAN><SPAN class=any1-string>"--&gt; with nested "</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"EVAL"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>RETURN
PROCEDURE</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AnotherTest</SPAN><SPAN class=any1-symbol>( cb, a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cb, a ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cb, a, </SPAN><SPAN class=any1-string>"again and again"</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>) )
</SPAN><SPAN class=any1-reservedword>RETURN
FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>DetachLocal</SPAN><SPAN class=any1-symbol>( x, y )
</SPAN><SPAN class=any1-comment>//NOTE! this should work
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> z:=x+y
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cb:={|| </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"z=x+y="</SPAN><SPAN class=any1-symbol>), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(z), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"x*x="</SPAN><SPAN class=any1-symbol>), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(x*x), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"x*x+z="</SPAN><SPAN class=any1-symbol>), x*x+z}
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( cb )
</SPAN><SPAN class=any1-reservedword>PROCEDURE</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>BugToFix</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> b, a := {|| a+b }
b =</SPAN><SPAN class=any1-string>"bug "
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-reservedword>RETURN
FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>RetBlock</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( {|x| x*x} )
</SPAN></SPAN>
</CODE></PRE></BODY></HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>codebloc.prg</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16386" name=GENERATOR>
<STYLE type=text/css>
<!--
body { color: #000000; background-color: #FFFFFF; }
.any1-activedot { color: #800080; }
.any1-comment { color: #008080; }
.any1-constant { color: #800080; }
.any1-escapeampersand { color: #00FF00; font-weight: bold; }
.any1-function { color: #808000; }
.any1-identifier { color: #000000; }
.any1-number { color: #FF0000; }
.any1-preprocessor { }
.any1-reservedword { color: #800000; }
.any1-space { }
.any1-string { color: #0000FF; }
.any1-symbol { }
.any1-variable { color: #808000; }
-->
</STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<PRE><CODE><SPAN style="FONT: 10pt Courier New"><SPAN class=any1-comment>// codeblocks test
</SPAN><SPAN class=any1-reservedword>function</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Main</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> B := </SPAN><SPAN class=any1-string>"this will never print"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> a := {| b, c | </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"I am a codeblock"</SPAN><SPAN class=any1-space> + b + c ) }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> d
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> de
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> ar := { </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> crlf:=</SPAN><SPAN class=any1-function>CHR</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> YY, X
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> x1, x2
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"this should print first"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>Eval</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>" with parameters"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>" ... and it works!"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
d =</SPAN><SPAN class=any1-string>"with access to local variables"
</SPAN><SPAN class=any1-space> a ={| b, c | </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"I am a second codeblock "</SPAN><SPAN class=any1-space> +d +b +;
</SPAN><SPAN class=any1-variable>IIF</SPAN><SPAN class=any1-symbol>(c==NIL, </SPAN><SPAN class=any1-string>' empty second parameter '</SPAN><SPAN class=any1-symbol>, c)), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(crlf), </SPAN><SPAN class=any1-string>"WITH return value"</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>", codeblock parameters"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>", codeblock parameters "</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"and with second parameter"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>MyEval</SPAN><SPAN class=any1-symbol>( a ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-variable>OtherTest</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-variable>AnotherTest</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>"==&gt; Another "</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
a ={| c | </SPAN><SPAN class=any1-variable>IIF</SPAN><SPAN class=any1-symbol>( c=NIL, {| a | </SPAN><SPAN class=any1-string>"First "</SPAN><SPAN class=any1-symbol>+a}, {| a | </SPAN><SPAN class=any1-string>"Second "</SPAN><SPAN class=any1-symbol>+a}) }
a =</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a, </SPAN><SPAN class=any1-string>"codeblock created in a codeblock"</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( ar[ </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ] )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
a :={|| ar[ </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ]++}
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( ar[ </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ] )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
yy :=</SPAN><SPAN class=any1-number>5
</SPAN><SPAN class=any1-space> x :={|xx| </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-variable>LTRIM</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-function>STR</SPAN><SPAN class=any1-symbol>(xx))), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"+"</SPAN><SPAN class=any1-symbol>), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-variable>LTRIM</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-function>STR</SPAN><SPAN class=any1-symbol>(yy))), </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>), xx + yy }
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( x, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) ) </SPAN><SPAN class=any1-comment>//this is OK
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( CRLF )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( x, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) ) </SPAN><SPAN class=any1-comment>//this should ignore unnecesary parameters
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>RetBlock</SPAN><SPAN class=any1-symbol>(), </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-comment>// BugToFix()
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Trying to use detached variable ..."</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
x1 :=</SPAN><SPAN class=any1-number>5
</SPAN><SPAN class=any1-space> x2 :=</SPAN><SPAN class=any1-number>6
</SPAN><SPAN class=any1-space> de =</SPAN><SPAN class=any1-variable>DetachLocal</SPAN><SPAN class=any1-symbol>( x1, x2 )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( de ) )
</SPAN><SPAN class=any1-comment>//changing the value of variables
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( crlf )
x1 := </SPAN><SPAN class=any1-number>10
</SPAN><SPAN class=any1-space> x2 := </SPAN><SPAN class=any1-number>11
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( de ) )
de =</SPAN><SPAN class=any1-variable>DetachLocal</SPAN><SPAN class=any1-symbol>( x1, x2 )
</SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( de ) )
</SPAN><SPAN class=any1-reservedword>return</SPAN><SPAN class=any1-space> nil
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>MyEval</SPAN><SPAN class=any1-symbol>( bCodeBlock )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> D:=</SPAN><SPAN class=any1-string>"this is another variable"
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>(bCodeBlock, </SPAN><SPAN class=any1-string>" from "</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"MyEval Function"</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-reservedword>PROCEDURE</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>OtherTest</SPAN><SPAN class=any1-symbol>( cblock )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cb
cb :={| a, b | </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cblock,a,b ) }
</SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cb, </SPAN><SPAN class=any1-string>"--&gt; with nested "</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"EVAL"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>RETURN
PROCEDURE</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AnotherTest</SPAN><SPAN class=any1-symbol>( cb, a )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cb, a ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( cb, a, </SPAN><SPAN class=any1-string>"again and again"</SPAN><SPAN class=any1-space> ) )
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>) )
</SPAN><SPAN class=any1-reservedword>RETURN
FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>DetachLocal</SPAN><SPAN class=any1-symbol>( x, y )
</SPAN><SPAN class=any1-comment>//NOTE! this should work
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> z:=x+y
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cb:={|| </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"z=x+y="</SPAN><SPAN class=any1-symbol>), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(z), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"x*x="</SPAN><SPAN class=any1-symbol>), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(x*x), </SPAN><SPAN class=any1-function>QOut</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-string>"x*x+z="</SPAN><SPAN class=any1-symbol>), x*x+z}
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( cb )
</SPAN><SPAN class=any1-reservedword>PROCEDURE</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>BugToFix</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> b, a := {|| a+b }
b =</SPAN><SPAN class=any1-string>"bug "
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>EVAL</SPAN><SPAN class=any1-symbol>( a )
</SPAN><SPAN class=any1-reservedword>RETURN
FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>RetBlock</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( {|x| x*x} )
</SPAN></SPAN>
</CODE></PRE></BODY></HTML>

View File

@@ -1,169 +1,169 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>testbrw.prg</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16386" name=GENERATOR>
<STYLE type=text/css>
<!--
body { color: #000000; background-color: #FFFFFF; }
.any1-activedot { color: #800080; }
.any1-comment { color: #008080; }
.any1-constant { color: #800080; }
.any1-escapeampersand { color: #00FF00; font-weight: bold; }
.any1-function { color: #808000; }
.any1-identifier { color: #000000; }
.any1-number { color: #FF0000; }
.any1-preprocessor { }
.any1-reservedword { color: #800000; }
.any1-space { }
.any1-string { color: #0000FF; }
.any1-symbol { }
.any1-variable { color: #808000; }
-->
</STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<PRE><CODE><SPAN style="FONT: 10pt Courier New"><SPAN class=any1-comment>// Harbour Class TBrowse and TBColumn sample
</SPAN><SPAN class=any1-constant>#include</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-string>"inkey.ch"
</SPAN><SPAN class=any1-reservedword>function</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Main</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> oBrowse := </SPAN><SPAN class=any1-variable>TBrowseNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>16</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>30</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest0 := { </SPAN><SPAN class=any1-string>"This"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"is"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"a"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"browse"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"on"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"an"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"array"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"test"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"with"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"a"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"long"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"data"</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest1 := { </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>3</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>6</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>7</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>8</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>10000</SPAN><SPAN class=any1-symbol>, -</SPAN><SPAN class=any1-number>1000</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>54</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>456342</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest2 := { </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>(), </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>56</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>14</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>6</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>7</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>8</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>10000</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()-</SPAN><SPAN class=any1-number>1000</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()-</SPAN><SPAN class=any1-number>54</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>456342</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest3 := { </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> n := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nKey
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> lEnd := </SPAN><SPAN class=any1-activedot>.f.
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nCursor
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> cColor
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nRow, nCol
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nTmpRow, nTmpCol
oBrowse:colorSpec = </SPAN><SPAN class=any1-string>"W+/B, N/BG"
</SPAN><SPAN class=any1-space> oBrowse:ColSep = </SPAN><SPAN class=any1-string>"¦"
</SPAN><SPAN class=any1-space> oBrowse:HeadSep = </SPAN><SPAN class=any1-string>"Ð-"
</SPAN><SPAN class=any1-space> oBrowse:FootSep = </SPAN><SPAN class=any1-string>"¤-"
</SPAN><SPAN class=any1-space> oBrowse:GoTopBlock = { || n := </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> }
oBrowse:GoBottomBlock = { || n := </SPAN><SPAN class=any1-function>Len</SPAN><SPAN class=any1-symbol>( aTest0 ) }
oBrowse:SkipBlock = { | nSkip, nPos | nPos := n,;
n := </SPAN><SPAN class=any1-reservedword>If</SPAN><SPAN class=any1-symbol>( nSkip &gt; </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>Min</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>Len</SPAN><SPAN class=any1-symbol>( aTest0 ), n + nSkip ),;
</SPAN><SPAN class=any1-function>Max</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, n + nSkip )), n - nPos }
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"First"</SPAN><SPAN class=any1-symbol>, { || n } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Second"</SPAN><SPAN class=any1-symbol>, { || aTest0[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Third"</SPAN><SPAN class=any1-symbol>, { || aTest1[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Forth"</SPAN><SPAN class=any1-symbol>, { || aTest2[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Fifth"</SPAN><SPAN class=any1-symbol>, { || aTest3[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Number'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Strins'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>):Picture := </SPAN><SPAN class=any1-string>'@!'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>3</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Number'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>3</SPAN><SPAN class=any1-symbol>):Picture := </SPAN><SPAN class=any1-string>'999,999.99'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Dates'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Logical'
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// needed since I've changed some columns _after_ I've added them to TBrowse object
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>Configure</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>Alert</SPAN><SPAN class=any1-symbol>( oBrowse:</SPAN><SPAN class=any1-variable>ClassName</SPAN><SPAN class=any1-symbol>() )
</SPAN><SPAN class=any1-function>Alert</SPAN><SPAN class=any1-symbol>( oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ):</SPAN><SPAN class=any1-variable>ClassName</SPAN><SPAN class=any1-symbol>() )
oBrowse:Freeze = </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> nCursor := </SPAN><SPAN class=any1-function>SetCursor</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
cColor := </SPAN><SPAN class=any1-function>SetColor</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"W+/B"</SPAN><SPAN class=any1-space> )
nRow := </SPAN><SPAN class=any1-function>Row</SPAN><SPAN class=any1-symbol>()
nCol := </SPAN><SPAN class=any1-function>Col</SPAN><SPAN class=any1-symbol>()
@ </SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>,</SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>,</SPAN><SPAN class=any1-number>17</SPAN><SPAN class=any1-symbol>,</SPAN><SPAN class=any1-number>31</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>BOX</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-string>"+-+¦+-+¦ "
</SPAN><SPAN class=any1-constant>#ifdef</SPAN><SPAN class=any1-space> HB_COMPAT_C53
oBrowse:</SPAN><SPAN class=any1-function>Setkey</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>,{|ob,nkey| </SPAN><SPAN class=any1-variable>Defproc</SPAN><SPAN class=any1-symbol>(ob,nKey)})
</SPAN><SPAN class=any1-reservedword>while</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-activedot>.t.
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>ForceStable</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-space> (oBrowse:</SPAN><SPAN class=any1-variable>applykey</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-function>inkey</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>))== -</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>)
</SPAN><SPAN class=any1-reservedword>exit
endif
enddo
</SPAN><SPAN class=any1-constant>#else
</SPAN><SPAN class=any1-reservedword>While</SPAN><SPAN class=any1-space> !lEnd
oBrowse:</SPAN><SPAN class=any1-variable>ForceStable</SPAN><SPAN class=any1-symbol>()
nKey = </SPAN><SPAN class=any1-function>InKey</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>do</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>case
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_ESC
</SPAN><SPAN class=any1-function>SetPos</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>17</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
lEnd = </SPAN><SPAN class=any1-activedot>.t.
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_DOWN
oBrowse:</SPAN><SPAN class=any1-variable>Down</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_UP
oBrowse:</SPAN><SPAN class=any1-variable>Up</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_LEFT
oBrowse:</SPAN><SPAN class=any1-function>Left</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_RIGHT
oBrowse:</SPAN><SPAN class=any1-function>Right</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_PGDN
oBrowse:</SPAN><SPAN class=any1-variable>pageDown</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_PGUP
oBrowse:</SPAN><SPAN class=any1-variable>pageUp</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_PGUP
oBrowse:</SPAN><SPAN class=any1-variable>goTop</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_PGDN
oBrowse:</SPAN><SPAN class=any1-variable>goBottom</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_HOME
oBrowse:</SPAN><SPAN class=any1-variable>home</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_END
oBrowse:</SPAN><SPAN class=any1-reservedword>end</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_LEFT
oBrowse:</SPAN><SPAN class=any1-variable>panLeft</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_RIGHT
oBrowse:</SPAN><SPAN class=any1-variable>panRight</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_HOME
oBrowse:</SPAN><SPAN class=any1-variable>panHome</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_END
oBrowse:</SPAN><SPAN class=any1-variable>panEnd</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_TAB
nTmpRow := </SPAN><SPAN class=any1-function>ROW</SPAN><SPAN class=any1-symbol>()
nTmpCol := </SPAN><SPAN class=any1-function>COL</SPAN><SPAN class=any1-symbol>()
@ </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>SAY</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TIME</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>DevPos</SPAN><SPAN class=any1-symbol>( nTmpRow, nTmpCol )
</SPAN><SPAN class=any1-reservedword>endcase
</SPAN><SPAN class=any1-space>
</SPAN><SPAN class=any1-reservedword>end
</SPAN><SPAN class=any1-constant>#endif
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>DevPos</SPAN><SPAN class=any1-symbol>( nRow, nCol )
</SPAN><SPAN class=any1-function>SetColor</SPAN><SPAN class=any1-symbol>( cColor )
</SPAN><SPAN class=any1-function>SetCursor</SPAN><SPAN class=any1-symbol>( nCursor )
</SPAN><SPAN class=any1-reservedword>return</SPAN><SPAN class=any1-space> nil
</SPAN><SPAN class=any1-constant>#ifdef</SPAN><SPAN class=any1-space> HB_COMPAT_C53
</SPAN><SPAN class=any1-reservedword>function</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>defproc</SPAN><SPAN class=any1-symbol>(ob,nkey)
</SPAN><SPAN class=any1-reservedword>Local</SPAN><SPAN class=any1-space> nTmpRow,nTmpCol
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-space> nKey = K_TAB
nTmpRow := </SPAN><SPAN class=any1-function>ROW</SPAN><SPAN class=any1-symbol>()
nTmpCol := </SPAN><SPAN class=any1-function>COL</SPAN><SPAN class=any1-symbol>()
@ </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>SAY</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TIME</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>DevPos</SPAN><SPAN class=any1-symbol>( nTmpRow, nTmpCol )
ob:</SPAN><SPAN class=any1-variable>Refreshall</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>endif
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>return</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-constant>#endif
</SPAN></SPAN>
</CODE></PRE></BODY></HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>testbrw.prg</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16386" name=GENERATOR>
<STYLE type=text/css>
<!--
body { color: #000000; background-color: #FFFFFF; }
.any1-activedot { color: #800080; }
.any1-comment { color: #008080; }
.any1-constant { color: #800080; }
.any1-escapeampersand { color: #00FF00; font-weight: bold; }
.any1-function { color: #808000; }
.any1-identifier { color: #000000; }
.any1-number { color: #FF0000; }
.any1-preprocessor { }
.any1-reservedword { color: #800000; }
.any1-space { }
.any1-string { color: #0000FF; }
.any1-symbol { }
.any1-variable { color: #808000; }
-->
</STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<PRE><CODE><SPAN style="FONT: 10pt Courier New"><SPAN class=any1-comment>// Harbour Class TBrowse and TBColumn sample
</SPAN><SPAN class=any1-constant>#include</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-string>"inkey.ch"
</SPAN><SPAN class=any1-reservedword>function</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Main</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> oBrowse := </SPAN><SPAN class=any1-variable>TBrowseNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>16</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>30</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest0 := { </SPAN><SPAN class=any1-string>"This"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"is"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"a"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"browse"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"on"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"an"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"array"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"test"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"with"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"a"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"long"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>"data"</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest1 := { </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>3</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>6</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>7</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>8</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>10000</SPAN><SPAN class=any1-symbol>, -</SPAN><SPAN class=any1-number>1000</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>54</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>456342</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest2 := { </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>(), </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>56</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>14</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>6</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>7</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>8</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>10000</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()-</SPAN><SPAN class=any1-number>1000</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()-</SPAN><SPAN class=any1-number>54</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>date</SPAN><SPAN class=any1-symbol>()+</SPAN><SPAN class=any1-number>456342</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> aTest3 := { </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.t.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-activedot>.f.</SPAN><SPAN class=any1-space> }
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> n := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nKey
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> lEnd := </SPAN><SPAN class=any1-activedot>.f.
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nCursor
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> cColor
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nRow, nCol
</SPAN><SPAN class=any1-reservedword>local</SPAN><SPAN class=any1-space> nTmpRow, nTmpCol
oBrowse:colorSpec = </SPAN><SPAN class=any1-string>"W+/B, N/BG"
</SPAN><SPAN class=any1-space> oBrowse:ColSep = </SPAN><SPAN class=any1-string>"|"
</SPAN><SPAN class=any1-space> oBrowse:HeadSep = </SPAN><SPAN class=any1-string>"?-"
</SPAN><SPAN class=any1-space> oBrowse:FootSep = </SPAN><SPAN class=any1-string>"¤-"
</SPAN><SPAN class=any1-space> oBrowse:GoTopBlock = {|| n := </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> }
oBrowse:GoBottomBlock = {|| n := </SPAN><SPAN class=any1-function>Len</SPAN><SPAN class=any1-symbol>( aTest0 ) }
oBrowse:SkipBlock = {| nSkip, nPos | nPos := n,;
n := </SPAN><SPAN class=any1-reservedword>If</SPAN><SPAN class=any1-symbol>( nSkip &gt; </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>Min</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>Len</SPAN><SPAN class=any1-symbol>( aTest0 ), n + nSkip ),;
</SPAN><SPAN class=any1-function>Max</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, n + nSkip )), n - nPos }
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"First"</SPAN><SPAN class=any1-symbol>, {|| n } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Second"</SPAN><SPAN class=any1-symbol>, {|| aTest0[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Third"</SPAN><SPAN class=any1-symbol>, {|| aTest1[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Forth"</SPAN><SPAN class=any1-symbol>, {|| aTest2[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>AddColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>TBColumnNew</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Fifth"</SPAN><SPAN class=any1-symbol>, {|| aTest3[ n ] } ) )
oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Number'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Strins'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>):Picture := </SPAN><SPAN class=any1-string>'@!'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>3</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Number'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>3</SPAN><SPAN class=any1-symbol>):Picture := </SPAN><SPAN class=any1-string>'999,999.99'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Dates'
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>5</SPAN><SPAN class=any1-symbol>):Footing = </SPAN><SPAN class=any1-string>'Logical'
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// needed since I've changed some columns _after_ I've added them to TBrowse object
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>Configure</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>Alert</SPAN><SPAN class=any1-symbol>( oBrowse:</SPAN><SPAN class=any1-variable>ClassName</SPAN><SPAN class=any1-symbol>() )
</SPAN><SPAN class=any1-function>Alert</SPAN><SPAN class=any1-symbol>( oBrowse:</SPAN><SPAN class=any1-variable>GetColumn</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ):</SPAN><SPAN class=any1-variable>ClassName</SPAN><SPAN class=any1-symbol>() )
oBrowse:Freeze = </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> nCursor := </SPAN><SPAN class=any1-function>SetCursor</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
cColor := </SPAN><SPAN class=any1-function>SetColor</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"W+/B"</SPAN><SPAN class=any1-space> )
nRow := </SPAN><SPAN class=any1-function>Row</SPAN><SPAN class=any1-symbol>()
nCol := </SPAN><SPAN class=any1-function>Col</SPAN><SPAN class=any1-symbol>()
@ </SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>,</SPAN><SPAN class=any1-number>4</SPAN><SPAN class=any1-symbol>,</SPAN><SPAN class=any1-number>17</SPAN><SPAN class=any1-symbol>,</SPAN><SPAN class=any1-number>31</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>BOX</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-string>"+-+|+-+| "
</SPAN><SPAN class=any1-constant>#ifdef</SPAN><SPAN class=any1-space> HB_COMPAT_C53
oBrowse:</SPAN><SPAN class=any1-function>Setkey</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>,{|ob,nkey| </SPAN><SPAN class=any1-variable>Defproc</SPAN><SPAN class=any1-symbol>(ob,nKey)})
</SPAN><SPAN class=any1-reservedword>while</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-activedot>.t.
</SPAN><SPAN class=any1-space> oBrowse:</SPAN><SPAN class=any1-variable>ForceStable</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-space> (oBrowse:</SPAN><SPAN class=any1-variable>applykey</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-function>inkey</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>))== -</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>)
</SPAN><SPAN class=any1-reservedword>exit
endif
enddo
</SPAN><SPAN class=any1-constant>#else
</SPAN><SPAN class=any1-reservedword>While</SPAN><SPAN class=any1-space> !lEnd
oBrowse:</SPAN><SPAN class=any1-variable>ForceStable</SPAN><SPAN class=any1-symbol>()
nKey = </SPAN><SPAN class=any1-function>InKey</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>do</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>case
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_ESC
</SPAN><SPAN class=any1-function>SetPos</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>17</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
lEnd = </SPAN><SPAN class=any1-activedot>.t.
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_DOWN
oBrowse:</SPAN><SPAN class=any1-variable>Down</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_UP
oBrowse:</SPAN><SPAN class=any1-variable>Up</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_LEFT
oBrowse:</SPAN><SPAN class=any1-function>Left</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey == K_RIGHT
oBrowse:</SPAN><SPAN class=any1-function>Right</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_PGDN
oBrowse:</SPAN><SPAN class=any1-variable>pageDown</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_PGUP
oBrowse:</SPAN><SPAN class=any1-variable>pageUp</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_PGUP
oBrowse:</SPAN><SPAN class=any1-variable>goTop</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_PGDN
oBrowse:</SPAN><SPAN class=any1-variable>goBottom</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_HOME
oBrowse:</SPAN><SPAN class=any1-variable>home</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_END
oBrowse:</SPAN><SPAN class=any1-reservedword>end</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_LEFT
oBrowse:</SPAN><SPAN class=any1-variable>panLeft</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_RIGHT
oBrowse:</SPAN><SPAN class=any1-variable>panRight</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_HOME
oBrowse:</SPAN><SPAN class=any1-variable>panHome</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_CTRL_END
oBrowse:</SPAN><SPAN class=any1-variable>panEnd</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>case</SPAN><SPAN class=any1-space> nKey = K_TAB
nTmpRow := </SPAN><SPAN class=any1-function>ROW</SPAN><SPAN class=any1-symbol>()
nTmpCol := </SPAN><SPAN class=any1-function>COL</SPAN><SPAN class=any1-symbol>()
@ </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>SAY</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TIME</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>DevPos</SPAN><SPAN class=any1-symbol>( nTmpRow, nTmpCol )
</SPAN><SPAN class=any1-reservedword>endcase
</SPAN><SPAN class=any1-space>
</SPAN><SPAN class=any1-reservedword>end
</SPAN><SPAN class=any1-constant>#endif
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>DevPos</SPAN><SPAN class=any1-symbol>( nRow, nCol )
</SPAN><SPAN class=any1-function>SetColor</SPAN><SPAN class=any1-symbol>( cColor )
</SPAN><SPAN class=any1-function>SetCursor</SPAN><SPAN class=any1-symbol>( nCursor )
</SPAN><SPAN class=any1-reservedword>return</SPAN><SPAN class=any1-space> nil
</SPAN><SPAN class=any1-constant>#ifdef</SPAN><SPAN class=any1-space> HB_COMPAT_C53
</SPAN><SPAN class=any1-reservedword>function</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>defproc</SPAN><SPAN class=any1-symbol>(ob,nkey)
</SPAN><SPAN class=any1-reservedword>Local</SPAN><SPAN class=any1-space> nTmpRow,nTmpCol
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-space> nKey = K_TAB
nTmpRow := </SPAN><SPAN class=any1-function>ROW</SPAN><SPAN class=any1-symbol>()
nTmpCol := </SPAN><SPAN class=any1-function>COL</SPAN><SPAN class=any1-symbol>()
@ </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>SAY</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TIME</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>DevPos</SPAN><SPAN class=any1-symbol>( nTmpRow, nTmpCol )
ob:</SPAN><SPAN class=any1-variable>Refreshall</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>endif
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>return</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-constant>#endif
</SPAN></SPAN>
</CODE></PRE></BODY></HTML>

View File

@@ -1,495 +1,495 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>testcgi.prg</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16386" name=GENERATOR>
<STYLE type=text/css>
<!--
body { color: #000000; background-color: #FFFFFF; }
.any1-activedot { color: #800080; }
.any1-comment { color: #008080; }
.any1-constant { color: #800080; }
.any1-escapeampersand { color: #00FF00; font-weight: bold; }
.any1-function { color: #808000; }
.any1-identifier { color: #000000; }
.any1-number { color: #FF0000; }
.any1-preprocessor { }
.any1-reservedword { color: #800000; }
.any1-space { }
.any1-string { color: #0000FF; }
.any1-symbol { }
.any1-variable { color: #808000; }
-->
</STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<PRE><CODE><SPAN style="FONT: 10pt Courier New"><SPAN class=any1-comment>/*
*
* TestCGI.PRG
* Harbour Test of a CGI/HTML-Generator class.
*
* 1999/05/30 First implementation.
*
* Tips: - Use ShowResults to make dynamic html (to test dynamic
* results, put the exe file on CGI-BIN dir or equivalent);
* - Use SaveToFile to make static html page
*
* 1999/05/31 Initial CGI functionality.
* 1999/06/01 Translated %nn to correct chars.
* 1999/06/02 Dynamic TAG matching routines (inspired on Delphi).
* First attempt to convert Delphi's ISAPI dll of WebSites'
* Function List
* (See http://www.flexsys-ci.com/harbour-project/functions.htm)
* 1999/06/11 List can be viewed online at
* http://www.flexsys-ci.com/cgi-bin/testcgi.exe
* 1999/07/29 Changed qOut() calls to OutStd() calls.
*
*/
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_SOFTWARE </SPAN><SPAN class=any1-number>01
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_NAME </SPAN><SPAN class=any1-number>02
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_GATEWAY_INTERFACE </SPAN><SPAN class=any1-number>03
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_PROTOCOL </SPAN><SPAN class=any1-number>04
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_PORT </SPAN><SPAN class=any1-number>05
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REQUEST_METHOD </SPAN><SPAN class=any1-number>06
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_HTTP_ACCEPT </SPAN><SPAN class=any1-number>07
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_HTTP_USER_AGENT </SPAN><SPAN class=any1-number>08
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_HTTP_REFERER </SPAN><SPAN class=any1-number>09
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_PATH_INFO </SPAN><SPAN class=any1-number>10
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_PATH_TRANSLATED </SPAN><SPAN class=any1-number>11
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SCRIPT_NAME </SPAN><SPAN class=any1-number>12
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_QUERY_STRING </SPAN><SPAN class=any1-number>13
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REMOTE_HOST </SPAN><SPAN class=any1-number>14
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REMOTE_ADDR </SPAN><SPAN class=any1-number>15
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REMOTE_USER </SPAN><SPAN class=any1-number>16
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_AUTH_TYPE </SPAN><SPAN class=any1-number>17
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_CONTENT_TYPE </SPAN><SPAN class=any1-number>18
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_CONTENT_LENGTH </SPAN><SPAN class=any1-number>19
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_ANNOTATION_SERVER </SPAN><SPAN class=any1-number>20
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> IF_BUFFER </SPAN><SPAN class=any1-number>65535
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Main</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> oHTML := </SPAN><SPAN class=any1-variable>THTML</SPAN><SPAN class=any1-symbol>():</SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> hFile, nPos, cString, cBuf, i, cTable, cLine
oHTML:</SPAN><SPAN class=any1-variable>SetHTMLFile</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"function.cfm"</SPAN><SPAN class=any1-space> )
hFile := </SPAN><SPAN class=any1-function>fOpen</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"list.txt"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
cString := </SPAN><SPAN class=any1-function>space</SPAN><SPAN class=any1-symbol>( IF_BUFFER )
cBuf := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> cTable := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Builds dynamic table replacement
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> hFile != -</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> .AND. (nPos := </SPAN><SPAN class=any1-function>fRead</SPAN><SPAN class=any1-symbol>( hFile, @cString, IF_BUFFER )) &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>DO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> i &lt;= nPos
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cString, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-space> )
i := i + </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> cLine := cBuf
cBuf := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>left</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) &lt;&gt; </SPAN><SPAN class=any1-string>';'
</SPAN><SPAN class=any1-space> cTable += </SPAN><SPAN class=any1-string>'&lt;TR&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="50%"&gt;&lt;FONT SIZE="2" FACE="Tahoma"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) + </SPAN><SPAN class=any1-string>'&lt;/FONT&gt;&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="16%"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>'R'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&lt;CENTER&gt;&lt;IMG SRC="images/purple-m.gif"&gt;'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&amp;nbsp'</SPAN><SPAN class=any1-space> ) + ;
</SPAN><SPAN class=any1-string>'&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="16%"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>'S'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&lt;CENTER&gt;&lt;IMG SRC="images/purple-m.gif"&gt;'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&amp;nbsp'</SPAN><SPAN class=any1-space> ) + ;
</SPAN><SPAN class=any1-string>'&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="16%"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>'N'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&lt;CENTER&gt;&lt;IMG SRC="images/purple-m.gif"&gt;'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&amp;nbsp'</SPAN><SPAN class=any1-space> ) + ;
</SPAN><SPAN class=any1-string>'&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;/TR&gt;'
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> cBuf := cBuf + </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cString, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> i++
</SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>fClose</SPAN><SPAN class=any1-symbol>( hFile )
oHTML:</SPAN><SPAN class=any1-variable>AddReplaceTag</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Functions"</SPAN><SPAN class=any1-symbol>, cTable )
oHTML:</SPAN><SPAN class=any1-variable>Generate</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-comment>// Uncomment the following if you don't have a Web Server to test
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// this sample
// oHTML:SaveToFile( "test.htm" )
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// If the above is uncommented, you may comment this line:
</SPAN><SPAN class=any1-space> oHTML:</SPAN><SPAN class=any1-variable>ShowResult</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( NIL )
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cString, cDelim, nRet )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cBuf, aElem, nPosFim, nSize, i
nSize := </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cString ) - </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>StrTran</SPAN><SPAN class=any1-symbol>( cString, cDelim, </SPAN><SPAN class=any1-string>''</SPAN><SPAN class=any1-space> ) ) + </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> aElem := </SPAN><SPAN class=any1-function>array</SPAN><SPAN class=any1-symbol>( nSize )
cBuf := cString
i := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FOR</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TO</SPAN><SPAN class=any1-space> nSize
nPosFim := </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( cDelim, cBuf )
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nPosFim &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> aElem[i] := </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuf, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, nPosFim - </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> aElem[i] := cBuf
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> cBuf := </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuf, nPosFim + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cBuf ) )
</SPAN><SPAN class=any1-reservedword>NEXT</SPAN><SPAN class=any1-space> i
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( aElem[ nRet ] )
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Hex2Dec</SPAN><SPAN class=any1-symbol>( cHex )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> aHex := { { </SPAN><SPAN class=any1-string>"0"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>00</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"1"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>01</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"2"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>02</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"3"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>03</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"4"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>04</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"5"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>05</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"6"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>06</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"7"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>07</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"8"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>08</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"9"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>09</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"A"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"B"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>11</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"C"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>12</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"D"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"E"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>14</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"F"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>15</SPAN><SPAN class=any1-space> } }
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nRet
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nRes
nRet := </SPAN><SPAN class=any1-function>ascan</SPAN><SPAN class=any1-symbol>( aHex, { |x| </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( x[</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] ) = </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>left</SPAN><SPAN class=any1-symbol>( cHex, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) ) } )
nRes := aHex[nRet, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>] * </SPAN><SPAN class=any1-number>16
</SPAN><SPAN class=any1-space> nRet := </SPAN><SPAN class=any1-function>ascan</SPAN><SPAN class=any1-symbol>( aHex, { |x| </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( x[</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] ) = </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>right</SPAN><SPAN class=any1-symbol>( cHex, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) ) } )
nRes += aHex[nRet, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>]
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( nRes )
</SPAN><SPAN class=any1-comment>/*-------------------------------------------------------------------------*/
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> THTML
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> oClass
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> oClass == NIL
oClass = </SPAN><SPAN class=any1-variable>HBClass</SPAN><SPAN class=any1-symbol>():</SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"THTML"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cTitle"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Page Title
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cBody"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// HTML Body Handler
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cBGColor"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Background Color
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cLinkColor"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Link Color
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cvLinkColor"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Visited Link Color
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cContent"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Page Content Handler
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"aCGIContents"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"aQueryFields"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cHTMLFile"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"aReplaceTags"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"New"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// New Method
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SetTitle"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>SetTitle</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Set Page Title
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddHead"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddHead</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Add &lt;H1&gt; Header
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddLink"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddLink</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Add Hyperlink
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddPara"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddPara</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Add Paragraph
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SaveToFile"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>SaveToFile</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Saves Content to File
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"ShowResult"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>ShowResult</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Show Result - SEE Fcn
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Generate"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>Generate</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Generate HTML
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SetHTMLFile"</SPAN><SPAN class=any1-symbol>,@</SPAN><SPAN class=any1-variable>SetHTMLFile</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Sets source HTML file
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"ProcessCGI"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"GetCGIParam"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>GetCGIParam</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"QueryFields"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>QueryFields</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddReplaceTag"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddReplaceTag</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-function>Create</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( oClass:</SPAN><SPAN class=any1-variable>Instance</SPAN><SPAN class=any1-symbol>() )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cTitle := </SPAN><SPAN class=any1-string>"Untitled"
</SPAN><SPAN class=any1-space> ::cBGColor := </SPAN><SPAN class=any1-string>"#FFFFFF"
</SPAN><SPAN class=any1-space> ::cLinkColor := </SPAN><SPAN class=any1-string>"#0000FF"
</SPAN><SPAN class=any1-space> ::cvLinkColor := </SPAN><SPAN class=any1-string>"#FF0000"
</SPAN><SPAN class=any1-space> ::cContent := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> ::cBody := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> ::aCGIContents := {}
::aQueryFields := {}
::aReplaceTags := {}
::cHTMLFile := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>SetTitle</SPAN><SPAN class=any1-symbol>( cTitle )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cTitle := cTitle
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddLink</SPAN><SPAN class=any1-symbol>( cLinkTo, cLinkName )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cBody := ::cBody + ;
</SPAN><SPAN class=any1-string>"&lt;A HREF='"</SPAN><SPAN class=any1-space> + cLinkTo + </SPAN><SPAN class=any1-string>"'&gt;"</SPAN><SPAN class=any1-space> + cLinkName + </SPAN><SPAN class=any1-string>"&lt;/A&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddHead</SPAN><SPAN class=any1-symbol>( cDescr )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-comment>// Why this doesn't work?
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// ::cBody += ...
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// ???
</SPAN><SPAN class=any1-space> ::cBody := ::cBody + ;
</SPAN><SPAN class=any1-string>"&lt;H1&gt;"</SPAN><SPAN class=any1-space> + cDescr + </SPAN><SPAN class=any1-string>"&lt;/H1&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( NIL )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddPara</SPAN><SPAN class=any1-symbol>( cPara, cAlign )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cBody := ::cBody + ;
</SPAN><SPAN class=any1-string>"&lt;P ALIGN='"</SPAN><SPAN class=any1-space> + cAlign + </SPAN><SPAN class=any1-string>"'&gt;"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
cPara + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;/P&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Generate</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cFile, i, hFile, nPos, cRes := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> lFlag := </SPAN><SPAN class=any1-activedot>.f.
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Is this a meta file or hand generated script?
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>empty</SPAN><SPAN class=any1-symbol>( ::cHTMLFile )
::cContent := ;
</SPAN><SPAN class=any1-string>"&lt;HTML&gt;&lt;HEAD&gt;"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;TITLE&gt;"</SPAN><SPAN class=any1-space> + ::cTitle + </SPAN><SPAN class=any1-string>"&lt;/TITLE&gt;"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;BODY link='"</SPAN><SPAN class=any1-space> + ::cLinkColor + </SPAN><SPAN class=any1-string>"' "</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-string>"vlink='"</SPAN><SPAN class=any1-space> + ::cvLinkColor + </SPAN><SPAN class=any1-string>"'&gt;"</SPAN><SPAN class=any1-space> + + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
::cBody + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;/BODY&gt;&lt;/HTML&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> ::cContent := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Does cHTMLFile exists?
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> !</SPAN><SPAN class=any1-function>File</SPAN><SPAN class=any1-symbol>( ::cHTMLFile )
::cContent := </SPAN><SPAN class=any1-string>"&lt;H1&gt;Server Error&lt;/H1&gt;&lt;P&gt;&lt;I&gt;No such file: "</SPAN><SPAN class=any1-space> + ;
::cHTMLFile
</SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Read from file
</SPAN><SPAN class=any1-space> hFile := </SPAN><SPAN class=any1-function>fOpen</SPAN><SPAN class=any1-symbol>( ::cHTMLFile, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
cFile := </SPAN><SPAN class=any1-function>space</SPAN><SPAN class=any1-symbol>( IF_BUFFER )
</SPAN><SPAN class=any1-reservedword>DO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> (nPos := </SPAN><SPAN class=any1-function>fRead</SPAN><SPAN class=any1-symbol>( hFile, @cFile, IF_BUFFER )) &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> cFile := </SPAN><SPAN class=any1-function>left</SPAN><SPAN class=any1-symbol>( cFile, nPos )
cRes += cFile
cFile := </SPAN><SPAN class=any1-function>space</SPAN><SPAN class=any1-symbol>( IF_BUFFER )
</SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>fClose</SPAN><SPAN class=any1-symbol>( hFile )
</SPAN><SPAN class=any1-comment>// Replace matched tags
</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> ::cContent := cRes
</SPAN><SPAN class=any1-comment>/* TODO: Replace this DO WHILE with FOR..NEXT */
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>DO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> i &lt;= </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( ::aReplaceTags )
::cContent := </SPAN><SPAN class=any1-function>strtran</SPAN><SPAN class=any1-symbol>( ::cContent, ;
</SPAN><SPAN class=any1-string>"&lt;#"</SPAN><SPAN class=any1-space> + ::aReplaceTags[i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] + </SPAN><SPAN class=any1-string>"&gt;"</SPAN><SPAN class=any1-symbol>, ::aReplaceTags[i, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>] )
i++
</SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>/* TODO: Clear remaining (not matched) tags */
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>/*
cRes := ""
FOR i := 1 TO len( ::cContent )
IF substr( ::cContent, i, 1 ) == "&lt;" .AND. ;
substr( ::cContent, i + 1, 1 ) == "#"
lFlag := .t.
ELSEIF substr( ::cContent, i, 1 ) == "&gt;" .AND. lFlag
lFlag := .f.
ELSEIF !lFlag
cRes += substr( ::cContent, i, 1 )
ENDIF
NEXT i
::cContent := cRes
*/
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>ShowResult</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( ;
</SPAN><SPAN class=any1-string>"HTTP/1.0 200 OK"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"CONTENT-TYPE: TEXT/HTML"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
::cContent )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>SaveToFile</SPAN><SPAN class=any1-symbol>( cFile )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> hFile := </SPAN><SPAN class=any1-function>fCreate</SPAN><SPAN class=any1-symbol>( cFile )
</SPAN><SPAN class=any1-function>fWrite</SPAN><SPAN class=any1-symbol>( hFile, ::cContent )
</SPAN><SPAN class=any1-function>fClose</SPAN><SPAN class=any1-symbol>( hFile )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cQuery := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cBuff := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nBuff := </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> i
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>empty</SPAN><SPAN class=any1-symbol>( ::aCGIContents )
::aCGIContents := { ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_SOFTWARE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_NAME"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"GATEWAY_INTERFACE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_PROTOCOL"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_PORT"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REQUEST_METHOD"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"HTTP_ACCEPT"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"HTTP_USER_AGENT"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"HTTP_REFERER"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"PATH_INFO"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"PATH_TRANSLATED"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SCRIPT_NAME"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"QUERY_STRING"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REMOTE_HOST"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REMOTE_ADDR"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REMOTE_USER"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AUTH_TYPE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"CONTENT_TYPE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"CONTENT_LENGTH"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"ANNOTATION_SERVER"</SPAN><SPAN class=any1-space> ) ;
}
cQuery := ::</SPAN><SPAN class=any1-variable>GetCGIParam</SPAN><SPAN class=any1-symbol>( CGI_QUERY_STRING )
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> !</SPAN><SPAN class=any1-function>empty</SPAN><SPAN class=any1-symbol>( cQuery )
::aQueryFields := {}
</SPAN><SPAN class=any1-reservedword>FOR</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cQuery ) + </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> i &gt; </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cQuery ) .OR. </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) == </SPAN><SPAN class=any1-string>"&amp;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>aadd</SPAN><SPAN class=any1-symbol>( ::aQueryFields, ;
{ </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuff, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>, cBuff ) - </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>strtran</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuff, </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>, cBuff ) + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cBuff ) - </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>, cBuff ) + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ), </SPAN><SPAN class=any1-string>"+"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>" "</SPAN><SPAN class=any1-space> ) } )
cBuff := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>"%"
</SPAN><SPAN class=any1-space> cBuff += </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>Hex2Dec</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) ) )
nBuff := </SPAN><SPAN class=any1-number>3
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nBuff = </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> cBuff += </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> nBuff--
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>NEXT
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>GetCGIParam</SPAN><SPAN class=any1-symbol>( nParam )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::</SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nParam &gt; </SPAN><SPAN class=any1-number>20</SPAN><SPAN class=any1-space> .OR. nParam &lt; </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>outerr</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Invalid CGI parameter"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( NIL )
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( ::aCGIContents[nParam] )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>QueryFields</SPAN><SPAN class=any1-symbol>( cQueryName )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cRet := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nRet
::</SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>()
nRet := </SPAN><SPAN class=any1-function>aScan</SPAN><SPAN class=any1-symbol>( ::aQueryFields, ;
{ |x| </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( x[</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] ) = </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( cQueryName ) } )
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nRet &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> cRet := ::aQueryFields[nRet, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>]
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( cRet )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>SetHTMLFile</SPAN><SPAN class=any1-symbol>( cFile )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cHTMLFile := cFile
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddReplaceTag</SPAN><SPAN class=any1-symbol>( cTag, cReplaceText )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>aAdd</SPAN><SPAN class=any1-symbol>( ::aReplaceTags, { cTag, cReplaceText } )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN></SPAN>
</CODE></PRE>
</BODY></HTML>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>testcgi.prg</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16386" name=GENERATOR>
<STYLE type=text/css>
<!--
body { color: #000000; background-color: #FFFFFF; }
.any1-activedot { color: #800080; }
.any1-comment { color: #008080; }
.any1-constant { color: #800080; }
.any1-escapeampersand { color: #00FF00; font-weight: bold; }
.any1-function { color: #808000; }
.any1-identifier { color: #000000; }
.any1-number { color: #FF0000; }
.any1-preprocessor { }
.any1-reservedword { color: #800000; }
.any1-space { }
.any1-string { color: #0000FF; }
.any1-symbol { }
.any1-variable { color: #808000; }
-->
</STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<PRE><CODE><SPAN style="FONT: 10pt Courier New"><SPAN class=any1-comment>/*
*
* TestCGI.PRG
* Harbour Test of a CGI/HTML-Generator class.
*
* 1999/05/30 First implementation.
*
* Tips: - Use ShowResults to make dynamic html (to test dynamic
* results, put the exe file on CGI-BIN dir or equivalent);
* - Use SaveToFile to make static html page
*
* 1999/05/31 Initial CGI functionality.
* 1999/06/01 Translated %nn to correct chars.
* 1999/06/02 Dynamic TAG matching routines (inspired on Delphi).
* First attempt to convert Delphi's ISAPI dll of WebSites'
* Function List
* (See http://www.flexsys-ci.com/harbour-project/functions.htm)
* 1999/06/11 List can be viewed online at
* http://www.flexsys-ci.com/cgi-bin/testcgi.exe
* 1999/07/29 Changed qOut() calls to OutStd() calls.
*
*/
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_SOFTWARE </SPAN><SPAN class=any1-number>01
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_NAME </SPAN><SPAN class=any1-number>02
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_GATEWAY_INTERFACE </SPAN><SPAN class=any1-number>03
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_PROTOCOL </SPAN><SPAN class=any1-number>04
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SERVER_PORT </SPAN><SPAN class=any1-number>05
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REQUEST_METHOD </SPAN><SPAN class=any1-number>06
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_HTTP_ACCEPT </SPAN><SPAN class=any1-number>07
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_HTTP_USER_AGENT </SPAN><SPAN class=any1-number>08
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_HTTP_REFERER </SPAN><SPAN class=any1-number>09
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_PATH_INFO </SPAN><SPAN class=any1-number>10
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_PATH_TRANSLATED </SPAN><SPAN class=any1-number>11
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_SCRIPT_NAME </SPAN><SPAN class=any1-number>12
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_QUERY_STRING </SPAN><SPAN class=any1-number>13
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REMOTE_HOST </SPAN><SPAN class=any1-number>14
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REMOTE_ADDR </SPAN><SPAN class=any1-number>15
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_REMOTE_USER </SPAN><SPAN class=any1-number>16
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_AUTH_TYPE </SPAN><SPAN class=any1-number>17
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_CONTENT_TYPE </SPAN><SPAN class=any1-number>18
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_CONTENT_LENGTH </SPAN><SPAN class=any1-number>19
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> CGI_ANNOTATION_SERVER </SPAN><SPAN class=any1-number>20
</SPAN><SPAN class=any1-constant>#define</SPAN><SPAN class=any1-space> IF_BUFFER </SPAN><SPAN class=any1-number>65535
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Main</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> oHTML := </SPAN><SPAN class=any1-variable>THTML</SPAN><SPAN class=any1-symbol>():</SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> hFile, nPos, cString, cBuf, i, cTable, cLine
oHTML:</SPAN><SPAN class=any1-variable>SetHTMLFile</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"function.cfm"</SPAN><SPAN class=any1-space> )
hFile := </SPAN><SPAN class=any1-function>fOpen</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"list.txt"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
cString := </SPAN><SPAN class=any1-function>space</SPAN><SPAN class=any1-symbol>( IF_BUFFER )
cBuf := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> cTable := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Builds dynamic table replacement
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> hFile != -</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> .AND. (nPos := </SPAN><SPAN class=any1-function>fRead</SPAN><SPAN class=any1-symbol>( hFile, @cString, IF_BUFFER )) &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>DO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> i &lt;= nPos
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cString, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-space> )
i := i + </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> cLine := cBuf
cBuf := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>left</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) &lt;&gt; </SPAN><SPAN class=any1-string>';'
</SPAN><SPAN class=any1-space> cTable += </SPAN><SPAN class=any1-string>'&lt;TR&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="50%"&gt;&lt;FONT SIZE="2" FACE="Tahoma"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) + </SPAN><SPAN class=any1-string>'&lt;/FONT&gt;&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="16%"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>'R'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&lt;CENTER&gt;&lt;IMG SRC="images/purple-m.gif"&gt;'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&amp;nbsp'</SPAN><SPAN class=any1-space> ) + ;
</SPAN><SPAN class=any1-string>'&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="16%"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>'S'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&lt;CENTER&gt;&lt;IMG SRC="images/purple-m.gif"&gt;'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&amp;nbsp'</SPAN><SPAN class=any1-space> ) + ;
</SPAN><SPAN class=any1-string>'&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;TD WIDTH="16%"&gt;'</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-reservedword>if</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cLine, </SPAN><SPAN class=any1-string>';'</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>'N'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&lt;CENTER&gt;&lt;IMG SRC="images/purple-m.gif"&gt;'</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-string>'&amp;nbsp'</SPAN><SPAN class=any1-space> ) + ;
</SPAN><SPAN class=any1-string>'&lt;/TD&gt;'</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-symbol>)+</SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>(</SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-symbol>) + ;
</SPAN><SPAN class=any1-string>'&lt;/TR&gt;'
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> cBuf := cBuf + </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cString, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> i++
</SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>fClose</SPAN><SPAN class=any1-symbol>( hFile )
oHTML:</SPAN><SPAN class=any1-variable>AddReplaceTag</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Functions"</SPAN><SPAN class=any1-symbol>, cTable )
oHTML:</SPAN><SPAN class=any1-variable>Generate</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-comment>// Uncomment the following if you don't have a Web Server to test
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// this sample
// oHTML:SaveToFile( "test.htm" )
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// If the above is uncommented, you may comment this line:
</SPAN><SPAN class=any1-space> oHTML:</SPAN><SPAN class=any1-variable>ShowResult</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( NIL )
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>ParseString</SPAN><SPAN class=any1-symbol>( cString, cDelim, nRet )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cBuf, aElem, nPosFim, nSize, i
nSize := </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cString ) - </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>StrTran</SPAN><SPAN class=any1-symbol>( cString, cDelim, </SPAN><SPAN class=any1-string>''</SPAN><SPAN class=any1-space> ) ) + </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> aElem := </SPAN><SPAN class=any1-function>array</SPAN><SPAN class=any1-symbol>( nSize )
cBuf := cString
i := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FOR</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TO</SPAN><SPAN class=any1-space> nSize
nPosFim := </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( cDelim, cBuf )
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nPosFim &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> aElem[i] := </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuf, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, nPosFim - </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> aElem[i] := cBuf
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> cBuf := </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuf, nPosFim + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cBuf ) )
</SPAN><SPAN class=any1-reservedword>NEXT</SPAN><SPAN class=any1-space> i
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( aElem[ nRet ] )
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Hex2Dec</SPAN><SPAN class=any1-symbol>( cHex )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> aHex := { { </SPAN><SPAN class=any1-string>"0"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>00</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"1"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>01</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"2"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>02</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"3"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>03</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"4"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>04</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"5"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>05</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"6"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>06</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"7"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>07</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"8"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>08</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"9"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>09</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"A"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>10</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"B"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>11</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"C"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>12</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"D"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>13</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"E"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>14</SPAN><SPAN class=any1-space> }, ;
{ </SPAN><SPAN class=any1-string>"F"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>15</SPAN><SPAN class=any1-space> } }
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nRet
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nRes
nRet := </SPAN><SPAN class=any1-function>ascan</SPAN><SPAN class=any1-symbol>( aHex, {| x | </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( x[</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] ) = </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>left</SPAN><SPAN class=any1-symbol>( cHex, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) ) } )
nRes := aHex[nRet, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>] * </SPAN><SPAN class=any1-number>16
</SPAN><SPAN class=any1-space> nRet := </SPAN><SPAN class=any1-function>ascan</SPAN><SPAN class=any1-symbol>( aHex, {| x | </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( x[</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] ) = </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>right</SPAN><SPAN class=any1-symbol>( cHex, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) ) } )
nRes += aHex[nRet, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>]
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( nRes )
</SPAN><SPAN class=any1-comment>/*-------------------------------------------------------------------------*/
</SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> THTML
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> oClass
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> oClass == NIL
oClass = </SPAN><SPAN class=any1-variable>HBClass</SPAN><SPAN class=any1-symbol>():</SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"THTML"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cTitle"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Page Title
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cBody"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// HTML Body Handler
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cBGColor"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Background Color
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cLinkColor"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Link Color
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cvLinkColor"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Visited Link Color
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cContent"</SPAN><SPAN class=any1-space> ) </SPAN><SPAN class=any1-comment>// Page Content Handler
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"aCGIContents"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"aQueryFields"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"cHTMLFile"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddData</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"aReplaceTags"</SPAN><SPAN class=any1-space> )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"New"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// New Method
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SetTitle"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>SetTitle</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Set Page Title
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddHead"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddHead</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Add &lt;H1&gt; Header
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddLink"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddLink</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Add Hyperlink
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddPara"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddPara</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Add Paragraph
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SaveToFile"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>SaveToFile</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Saves Content to File
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"ShowResult"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>ShowResult</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Show Result - SEE Fcn
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Generate"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>Generate</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Generate HTML
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SetHTMLFile"</SPAN><SPAN class=any1-symbol>,@</SPAN><SPAN class=any1-variable>SetHTMLFile</SPAN><SPAN class=any1-symbol>() ) </SPAN><SPAN class=any1-comment>// Sets source HTML file
</SPAN><SPAN class=any1-space> oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"ProcessCGI"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"GetCGIParam"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>GetCGIParam</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"QueryFields"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>QueryFields</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-variable>AddMethod</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AddReplaceTag"</SPAN><SPAN class=any1-symbol>, @</SPAN><SPAN class=any1-variable>AddReplaceTag</SPAN><SPAN class=any1-symbol>() )
oClass:</SPAN><SPAN class=any1-function>Create</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( oClass:</SPAN><SPAN class=any1-variable>Instance</SPAN><SPAN class=any1-symbol>() )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>New</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cTitle := </SPAN><SPAN class=any1-string>"Untitled"
</SPAN><SPAN class=any1-space> ::cBGColor := </SPAN><SPAN class=any1-string>"#FFFFFF"
</SPAN><SPAN class=any1-space> ::cLinkColor := </SPAN><SPAN class=any1-string>"#0000FF"
</SPAN><SPAN class=any1-space> ::cvLinkColor := </SPAN><SPAN class=any1-string>"#FF0000"
</SPAN><SPAN class=any1-space> ::cContent := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> ::cBody := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> ::aCGIContents := {}
::aQueryFields := {}
::aReplaceTags := {}
::cHTMLFile := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>SetTitle</SPAN><SPAN class=any1-symbol>( cTitle )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cTitle := cTitle
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddLink</SPAN><SPAN class=any1-symbol>( cLinkTo, cLinkName )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cBody := ::cBody + ;
</SPAN><SPAN class=any1-string>"&lt;A HREF='"</SPAN><SPAN class=any1-space> + cLinkTo + </SPAN><SPAN class=any1-string>"'&gt;"</SPAN><SPAN class=any1-space> + cLinkName + </SPAN><SPAN class=any1-string>"&lt;/A&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddHead</SPAN><SPAN class=any1-symbol>( cDescr )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-comment>// Why this doesn't work?
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// ::cBody += ...
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// ???
</SPAN><SPAN class=any1-space> ::cBody := ::cBody + ;
</SPAN><SPAN class=any1-string>"&lt;H1&gt;"</SPAN><SPAN class=any1-space> + cDescr + </SPAN><SPAN class=any1-string>"&lt;/H1&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( NIL )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddPara</SPAN><SPAN class=any1-symbol>( cPara, cAlign )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cBody := ::cBody + ;
</SPAN><SPAN class=any1-string>"&lt;P ALIGN='"</SPAN><SPAN class=any1-space> + cAlign + </SPAN><SPAN class=any1-string>"'&gt;"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
cPara + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;/P&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>Generate</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cFile, i, hFile, nPos, cRes := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> lFlag := </SPAN><SPAN class=any1-activedot>.f.
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Is this a meta file or hand generated script?
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>empty</SPAN><SPAN class=any1-symbol>( ::cHTMLFile )
::cContent := ;
</SPAN><SPAN class=any1-string>"&lt;HTML&gt;&lt;HEAD&gt;"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;TITLE&gt;"</SPAN><SPAN class=any1-space> + ::cTitle + </SPAN><SPAN class=any1-string>"&lt;/TITLE&gt;"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;BODY link='"</SPAN><SPAN class=any1-space> + ::cLinkColor + </SPAN><SPAN class=any1-string>"' "</SPAN><SPAN class=any1-space> + ;
</SPAN><SPAN class=any1-string>"vlink='"</SPAN><SPAN class=any1-space> + ::cvLinkColor + </SPAN><SPAN class=any1-string>"'&gt;"</SPAN><SPAN class=any1-space> + + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
::cBody + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"&lt;/BODY&gt;&lt;/HTML&gt;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> ::cContent := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Does cHTMLFile exists?
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> !</SPAN><SPAN class=any1-function>File</SPAN><SPAN class=any1-symbol>( ::cHTMLFile )
::cContent := </SPAN><SPAN class=any1-string>"&lt;H1&gt;Server Error&lt;/H1&gt;&lt;P&gt;&lt;I&gt;No such file: "</SPAN><SPAN class=any1-space> + ;
::cHTMLFile
</SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>// Read from file
</SPAN><SPAN class=any1-space> hFile := </SPAN><SPAN class=any1-function>fOpen</SPAN><SPAN class=any1-symbol>( ::cHTMLFile, </SPAN><SPAN class=any1-number>0</SPAN><SPAN class=any1-space> )
cFile := </SPAN><SPAN class=any1-function>space</SPAN><SPAN class=any1-symbol>( IF_BUFFER )
</SPAN><SPAN class=any1-reservedword>DO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> (nPos := </SPAN><SPAN class=any1-function>fRead</SPAN><SPAN class=any1-symbol>( hFile, @cFile, IF_BUFFER )) &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> cFile := </SPAN><SPAN class=any1-function>left</SPAN><SPAN class=any1-symbol>( cFile, nPos )
cRes += cFile
cFile := </SPAN><SPAN class=any1-function>space</SPAN><SPAN class=any1-symbol>( IF_BUFFER )
</SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>fClose</SPAN><SPAN class=any1-symbol>( hFile )
</SPAN><SPAN class=any1-comment>// Replace matched tags
</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> ::cContent := cRes
</SPAN><SPAN class=any1-comment>/* TODO: Replace this DO WHILE with FOR..NEXT */
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>DO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>WHILE</SPAN><SPAN class=any1-space> i &lt;= </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( ::aReplaceTags )
::cContent := </SPAN><SPAN class=any1-function>strtran</SPAN><SPAN class=any1-symbol>( ::cContent, ;
</SPAN><SPAN class=any1-string>"&lt;#"</SPAN><SPAN class=any1-space> + ::aReplaceTags[i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] + </SPAN><SPAN class=any1-string>"&gt;"</SPAN><SPAN class=any1-symbol>, ::aReplaceTags[i, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>] )
i++
</SPAN><SPAN class=any1-reservedword>ENDDO
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>/* TODO: Clear remaining (not matched) tags */
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-comment>/*
cRes := ""
FOR i := 1 TO len( ::cContent )
IF substr( ::cContent, i, 1 ) == "&lt;" .AND. ;
substr( ::cContent, i + 1, 1 ) == "#"
lFlag := .t.
ELSEIF substr( ::cContent, i, 1 ) == "&gt;" .AND. lFlag
lFlag := .f.
ELSEIF !lFlag
cRes += substr( ::cContent, i, 1 )
ENDIF
NEXT i
::cContent := cRes
*/
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>ShowResult</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>OutStd</SPAN><SPAN class=any1-symbol>( ;
</SPAN><SPAN class=any1-string>"HTTP/1.0 200 OK"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
</SPAN><SPAN class=any1-string>"CONTENT-TYPE: TEXT/HTML"</SPAN><SPAN class=any1-space> + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + </SPAN><SPAN class=any1-variable>HB_OSNewLine</SPAN><SPAN class=any1-symbol>() + ;
::cContent )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>SaveToFile</SPAN><SPAN class=any1-symbol>( cFile )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> hFile := </SPAN><SPAN class=any1-function>fCreate</SPAN><SPAN class=any1-symbol>( cFile )
</SPAN><SPAN class=any1-function>fWrite</SPAN><SPAN class=any1-symbol>( hFile, ::cContent )
</SPAN><SPAN class=any1-function>fClose</SPAN><SPAN class=any1-symbol>( hFile )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cQuery := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cBuff := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nBuff := </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> i
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>empty</SPAN><SPAN class=any1-symbol>( ::aCGIContents )
::aCGIContents := { ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_SOFTWARE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_NAME"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"GATEWAY_INTERFACE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_PROTOCOL"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SERVER_PORT"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REQUEST_METHOD"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"HTTP_ACCEPT"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"HTTP_USER_AGENT"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"HTTP_REFERER"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"PATH_INFO"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"PATH_TRANSLATED"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"SCRIPT_NAME"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"QUERY_STRING"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REMOTE_HOST"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REMOTE_ADDR"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"REMOTE_USER"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"AUTH_TYPE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"CONTENT_TYPE"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"CONTENT_LENGTH"</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>GetEnv</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"ANNOTATION_SERVER"</SPAN><SPAN class=any1-space> ) ;
}
cQuery := ::</SPAN><SPAN class=any1-variable>GetCGIParam</SPAN><SPAN class=any1-symbol>( CGI_QUERY_STRING )
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> !</SPAN><SPAN class=any1-function>empty</SPAN><SPAN class=any1-symbol>( cQuery )
::aQueryFields := {}
</SPAN><SPAN class=any1-reservedword>FOR</SPAN><SPAN class=any1-space> i := </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>TO</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cQuery ) + </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> i &gt; </SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cQuery ) .OR. </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) == </SPAN><SPAN class=any1-string>"&amp;"
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>aadd</SPAN><SPAN class=any1-symbol>( ::aQueryFields, ;
{ </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuff, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>, cBuff ) - </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ), ;
</SPAN><SPAN class=any1-function>strtran</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cBuff, </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>, cBuff ) + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, ;
</SPAN><SPAN class=any1-function>len</SPAN><SPAN class=any1-symbol>( cBuff ) - </SPAN><SPAN class=any1-function>at</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"="</SPAN><SPAN class=any1-symbol>, cBuff ) + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ), </SPAN><SPAN class=any1-string>"+"</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-string>" "</SPAN><SPAN class=any1-space> ) } )
cBuff := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> ) = </SPAN><SPAN class=any1-string>"%"
</SPAN><SPAN class=any1-space> cBuff += </SPAN><SPAN class=any1-function>chr</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-variable>Hex2Dec</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i + </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-space> ) ) )
nBuff := </SPAN><SPAN class=any1-number>3
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nBuff = </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> cBuff += </SPAN><SPAN class=any1-function>substr</SPAN><SPAN class=any1-symbol>( cQuery, i, </SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>ELSE
</SPAN><SPAN class=any1-space> nBuff--
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>NEXT
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>GetCGIParam</SPAN><SPAN class=any1-symbol>( nParam )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::</SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nParam &gt; </SPAN><SPAN class=any1-number>20</SPAN><SPAN class=any1-space> .OR. nParam &lt; </SPAN><SPAN class=any1-number>1
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-function>outerr</SPAN><SPAN class=any1-symbol>( </SPAN><SPAN class=any1-string>"Invalid CGI parameter"</SPAN><SPAN class=any1-space> )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( NIL )
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( ::aCGIContents[nParam] )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>QueryFields</SPAN><SPAN class=any1-symbol>( cQueryName )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> cRet := </SPAN><SPAN class=any1-string>""
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> nRet
::</SPAN><SPAN class=any1-variable>ProcessCGI</SPAN><SPAN class=any1-symbol>()
nRet := </SPAN><SPAN class=any1-function>aScan</SPAN><SPAN class=any1-symbol>( ::aQueryFields, ;
{| x | </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( x[</SPAN><SPAN class=any1-number>1</SPAN><SPAN class=any1-symbol>] ) = </SPAN><SPAN class=any1-function>upper</SPAN><SPAN class=any1-symbol>( cQueryName ) } )
</SPAN><SPAN class=any1-reservedword>IF</SPAN><SPAN class=any1-space> nRet &gt; </SPAN><SPAN class=any1-number>0
</SPAN><SPAN class=any1-space> cRet := ::aQueryFields[nRet, </SPAN><SPAN class=any1-number>2</SPAN><SPAN class=any1-symbol>]
</SPAN><SPAN class=any1-reservedword>ENDIF
</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( cRet )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>SetHTMLFile</SPAN><SPAN class=any1-symbol>( cFile )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
::cHTMLFile := cFile
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN><SPAN class=any1-reservedword>STATIC</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-reservedword>FUNCTION</SPAN><SPAN class=any1-space> </SPAN><SPAN class=any1-variable>AddReplaceTag</SPAN><SPAN class=any1-symbol>( cTag, cReplaceText )
</SPAN><SPAN class=any1-reservedword>LOCAL</SPAN><SPAN class=any1-space> Self := </SPAN><SPAN class=any1-variable>QSelf</SPAN><SPAN class=any1-symbol>()
</SPAN><SPAN class=any1-function>aAdd</SPAN><SPAN class=any1-symbol>( ::aReplaceTags, { cTag, cReplaceText } )
</SPAN><SPAN class=any1-reservedword>RETURN</SPAN><SPAN class=any1-symbol>( Self )
</SPAN></SPAN>
</CODE></PRE>
</BODY></HTML>