Changing to fnc* didn't make a difference, seems that the TEST command isn't
PPes:

---
#line 1 "STD.CH"@"STD.CH"
#line 1 "Set.ch"@"Set.ch"
#line 1 "natmsg.ch"@"natmsg.ch"
#line 18 "Set.ch"
#line 37 "STD.CH"
#line 1 "Get.ch"@"Get.ch"
#line 42 "STD.CH"
#line 1 "Prompt.ch"@"Prompt.ch"
#line 47 "STD.CH"
#line 1 "Memvar.ch"@"Memvar.ch"
#line 53 "STD.CH"
#line 1 "collat.ch"@"collat.ch"
#line 58 "STD.CH"
#line 1 "speedtst.prg"
#line 1 "common.ch"@"common.ch"
#line 70 "speedtst.prg"






































proc main( _p01, _p02, _p03, _p04, _p05, _p06, _p07, _p08, _p09, _p10,
 _p11, _p12, _p13, _p14, _p15, _p16, _p17, _p18, _p19, _p20 )



   local aParams :=  asize( { _p01, _p02, _p03, _p04, _p05, _p06, _p07,
_p08, _p09, _p10,  _p11, _p12, _p13, _p14, _p15, _p16, _p17, _p18, _p19,
_p20 },  min( pCount(), 20 ) )

   local nMT, cExclude, lScale, cParam, cMemTests, lSyntax, i, j

   lSyntax := lScale := .f.
   cMemTests := "029 030 023 025 027 040 041 043 052 053 019 022 031 032 054
055 "
   cExclude := ""
   nMT := 0
   for j := 1 to len( aParams )
      cParam := lower( aParams[ j ] )
      if cParam = "--thread"
         if substr( cParam, 9, 1 ) == "="
            if isdigit( substr( cParam, 10, 1 ) )
               nMT := val( substr( cParam, 10 ) )
            elseif substr( cParam, 10 ) == "all"
               nMT := -1
            else
               lSyntax = .t.
            endif
         elseif empty( substr( cParam, 9 ) )
            nMT := -1
         else
            lSyntax = .t.
         endif
      elseif cParam = "--exclude="
         if substr( cParam, 11 ) == "mem"
            cExclude += cMemTests
         else

            cExclude += strtran( strtran( strtran( substr( cParam, 11 ),
 ".", " " ), ".", " " ), "/", " " ) + " "
         endif
      elseif cParam = "--only="
         cExclude := ""
         if substr( cParam, 8 ) == "mem"
            cParam := cMemTests
         endif
         for i := 1 to 55
            if !strzero( i, 3 ) $ cParam
               cExclude += strzero( i, 3 ) + " "
            endif
         next
      elseif cParam = "--scale"
         lScale := .t.
      else
         lSyntax = .t.
      endif
      if lSyntax
         outstd(chr(10));outstd("Unknown option:",cParam)
         outstd(chr(10));outstd("syntax: speedtst [--thread[=<num>]]
[--only=<test(s)>] [--exclude=<test(s)>]")
         outstd(chr(10))
         return
      endif
   next
   test( nMT, cExclude, lScale )
return




func t000 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;next ;time := seconds() - time ;return { procname() + ": " + iif( .T.,
"empty loop overhead", "" ), time }

func t001 ;local time, i, x := nil ;local  L_C:=dtos(date()) ;time :=
seconds() ;for i:=1 to 1000000 ;x := L_C;next ;time := seconds() - time
;return { procname() + ": " + iif( .F., , "x := L_C" ), time }

func t002 ;local time, i, x := nil ;local  L_N:=112345.67 ;time := seconds()
;for i:=1 to 1000000 ;x := L_N;next ;time := seconds() - time ;return {
procname() + ": " + iif( .F., , "x := L_N" ), time }

func t003 ;local time, i, x := nil ;local  L_D:=date() ;time := seconds()
;for i:=1 to 1000000 ;x := L_D;next ;time := seconds() - time ;return {
procname() + ": " + iif( .F., , "x := L_D" ), time }



TEST t004 INIT _( static s_once, S_C )  INIT hb_threadOnce( @s_once, {|| S_C
:= dtos( date() ) } )  CODE x := S_C



TEST t005 INIT _( static s_once, S_N )  INIT hb_threadOnce( @s_once, {|| S_N
:= 112345.67 } )  CODE x := S_N



TEST t006 INIT _( static s_once, S_D )  INIT hb_threadOnce( @s_once, {|| S_D
:= date() } )  CODE x := S_D


TEST t007 INIT _( memvar M_C ) INIT _( private M_C := dtos( date() ) )  CODE
x := M_C


TEST t008 INIT _( memvar M_N ) INIT _( private M_N := 112345.67 )  CODE x :=
M_N


TEST t009 INIT _( memvar M_D ) INIT _( private M_D := date() )  CODE x :=
M_D





TEST t010 INIT _( memvar P_C )  INIT _( static s_once )  INIT _( public P_C
)  INIT hb_threadOnce( @s_once, {|| P_C := dtos( date() ) } )  CODE x := P_C





TEST t011 INIT _( memvar P_N )  INIT _( static s_once )  INIT _( public P_N
)  INIT hb_threadOnce( @s_once, {|| P_N := 112345.67 } )  CODE x := P_N





TEST t012 INIT _( memvar P_D )  INIT _( static s_once )  INIT _( public P_D
)  INIT hb_threadOnce( @s_once, {|| P_D := date() } )  CODE x := P_D


TEST t013 INIT _( field F_C ) INIT use_dbsh() EXIT close_db()  CODE x := F_C


TEST t014 INIT _( field F_N ) INIT use_dbsh() EXIT close_db()  CODE x := F_N


TEST t015 INIT _( field F_D ) INIT use_dbsh() EXIT close_db()  CODE x := F_D

func t016 ;local time, i, x := nil ;local  o := errorNew() ;time :=
seconds() ;for i:=1 to 1000000 ;x := o:Args;next ;time := seconds() - time
;return { procname() + ": " + iif( .F., , "x := o:Args" ), time }

func t017 ;local time, i, x := nil ;local  o := errorNew() ;time :=
seconds() ;for i:=1 to 1000000 ;x := o[2];next ;time := seconds() - time
;return { procname() + ": " + iif( .F., , "x := o[2]" ), time }

func t018 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;round( i / 1000, 2 );next ;time := seconds() - time ;return { procname() +
": " + iif( .F., , "round( i / 1000, 2 )" ), time }

func t019 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;str( i / 1000 );next ;time := seconds() - time ;return { procname() + ": "
+ iif( .F., , "str( i / 1000 )" ), time }

func t020 ;local time, i, x := nil ;local  s := stuff( dtos( date() ), 7, 0,
"." ) ;time := seconds() ;for i:=1 to 1000000 ;val( s );next ;time :=
seconds() - time ;return { procname() + ": " + iif( .F., , "val( s )" ),
time }



func t021 ;local time, i, x := nil ;local  a := afill( array( 16 ),  stuff(
dtos( date() ), 7, 0, "." ) ) ;time := seconds() ;for i:=1 to 1000000 ;val(
a [ i % 16 + 1 ] );next ;time := seconds() - time ;return { procname() + ":
" + iif( .F., , "val( a [ i % 16 + 1 ] )" ), time }

func t022 ;local time, i, x := nil ;local  d := date() ;time := seconds()
;for i:=1 to 1000000 ;dtos( d - i % 10000 );next ;time := seconds() - time
;return { procname() + ": " + iif( .F., , "dtos( d - i % 10000 )" ), time }

func t023 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;eval( { || i % 16 } );next ;time := seconds() - time ;return { procname() +
": " + iif( .F., , "eval( { || i % 16 } )" ), time }



func t024 ;local time, i, x := nil ;local  bc := { || i % 16 } ;time :=
seconds() ;for i:=1 to 1000000 ;eval( bc );next ;time := seconds() - time
;return { procname() + ": " + iif( .T., "eval( bc := { || i % 16 } )",
"eval( bc )" ), time }

func t025 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;eval( { |x| x % 16 }, i );next ;time := seconds() - time ;return {
procname() + ": " + iif( .F., , "eval( { |x| x % 16 }, i )" ), time }



func t026 ;local time, i, x := nil ;local  bc := { |x| x % 16 } ;time :=
seconds() ;for i:=1 to 1000000 ;eval( bc, i );next ;time := seconds() - time
;return { procname() + ": " + iif( .T., "eval( bc := { |x| x % 16 }, i )",
"eval( bc, i )" ), time }

func t027 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;eval( { |x| fnc1( x ) }, i );next ;time := seconds() - time ;return {
procname() + ": " + iif( .F., , "eval( { |x| fnc1( x ) }, i )" ), time }



func t028 ;local time, i, x := nil ;local  bc := { |x| fnc1( x ) } ;time :=
seconds() ;for i:=1 to 1000000 ;eval( bc, i );next ;time := seconds() - time
;return { procname() + ": " + iif( .T., "eval( bc := { |x| fnc1( x ) }, i
)", "eval( bc, i )" ), time }

func t029 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;x := &( "fnc1(" + str(i) + ")" );next ;time := seconds() - time ;return {
procname() + ": " + iif( .F., , 'x := &( "fnc1(" + str(i) + ")" )' ), time }

func t030 ;local time, i, x := nil ;local  bc ;time := seconds() ;for i:=1
to 1000000 ;bc := &( "{|x|fnc1(x)}" );next ;time := seconds() - time ;return
{ procname() + ": " + iif( .F., , 'bc := &( "{|x|fnc1(x)}" )' ), time
};eval( bc, i )

func t031 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;x := valtype( x ) +  valtype( i );next ;time := seconds() - time ;return {
procname() + ": " + iif( .F., , "x := valtype( x ) +  valtype( i )" ), time
}



func t032 ;local time, i, x := nil ;local  a := afill( array( 16 ),  stuff(
dtos( date() ), 7, 0, "." ) ) ;time := seconds() ;for i:=1 to 1000000 ;x :=
strzero( i % 100, 2 ) $ a[ i % 16 + 1 ];next ;time := seconds() - time
;return { procname() + ": " + iif( .F., , "x := strzero( i % 100, 2 ) $ a[ i
% 16 + 1 ]" ), time }



func t033 ;local time, i, x := nil ;local  a := array( 16 ),s := dtos(
date() ) ;aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;time :=
seconds() ;for i:=1 to 1000000 ;x := a[ i % 16 + 1 ] == s;next ;time :=
seconds() - time ;return { procname() + ": " + iif( .F., , "x := a[ i % 16 +
1 ] == s" ), time }



func t034 ;local time, i, x := nil ;local  a := array( 16 ),s := dtos(
date() ) ;aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;time :=
seconds() ;for i:=1 to 1000000 ;x := a[ i % 16 + 1 ] = s;next ;time :=
seconds() - time ;return { procname() + ": " + iif( .F., , "x := a[ i % 16 +
1 ] = s" ), time }



func t035 ;local time, i, x := nil ;local  a := array( 16 ),s := dtos(
date() ) ;aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;time :=
seconds() ;for i:=1 to 1000000 ;x := a[ i % 16 + 1 ] >= s;next ;time :=
seconds() - time ;return { procname() + ": " + iif( .F., , "x := a[ i % 16 +
1 ] >= s" ), time }



func t036 ;local time, i, x := nil ;local  a := array( 16 ),s := dtos(
date() ) ;aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;time :=
seconds() ;for i:=1 to 1000000 ;x := a[ i % 16 + 1 ] <= s;next ;time :=
seconds() - time ;return { procname() + ": " + iif( .F., , "x := a[ i % 16 +
1 ] <= s" ), time }



func t037 ;local time, i, x := nil ;local  a := array( 16 ),s := dtos(
date() ) ;aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;time :=
seconds() ;for i:=1 to 1000000 ;x := a[ i % 16 + 1 ] < s;next ;time :=
seconds() - time ;return { procname() + ": " + iif( .F., , "x := a[ i % 16 +
1 ] < s" ), time }



func t038 ;local time, i, x := nil ;local  a := array( 16 ),s := dtos(
date() ) ;aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;time :=
seconds() ;for i:=1 to 1000000 ;x := a[ i % 16 + 1 ] > s;next ;time :=
seconds() - time ;return { procname() + ": " + iif( .F., , "x := a[ i % 16 +
1 ] > s" ), time }



func t039 ;local time, i, x := nil ;local  a := array( 16 ) ;aeval( a, {
|x,i| a[i] := i, x } ) ;time := seconds() ;for i:=1 to 1000000 ;ascan( a, i
% 16 );next ;time := seconds() - time ;return { procname() + ": " + iif(
.F., , "ascan( a, i % 16 )" ), time }



func t040 ;local time, i, x := nil ;local  a := array( 16 ) ;aeval( a, {
|x,i| a[i] := i, x } ) ;time := seconds() ;for i:=1 to 1000000 ;ascan( a, {
|x| x == i % 16 } );next ;time := seconds() - time ;return { procname() + ":
" + iif( .F., , "ascan( a, { |x| x == i % 16 } )" ), time }



func t041 ;local time, i, x := nil ;local  a := {},a2 := { 1, 2, 3 },bc := {
|x| fnc1(x) },s := dtos( date() ),s2 := "static text" ;time := seconds()
;for i:=1 to 1000000 ;if i%1000==0;next ;time := seconds() - time ;return {
procname() + ": " + iif( .F., , "if i%1000==0" ), time
};a:={};end;aadd(a,{i,1,.t.,s,s2,a2,bc})

func t042 ;local time, i, x := nil ;local  a := {} ;time := seconds() ;for
i:=1 to 1000000 ;x := a;next ;time := seconds() - time ;return { procname()
+ ": " + iif( .F., , "x := a" ), time }

func t043 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;x := {};next ;time := seconds() - time ;return { procname() + ": " + iif(
.F., , "x := {}" ), time }

func t044 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;fnc0();next ;time := seconds() - time ;return { procname() + ": " + iif(
.F., , "fnc0()" ), time }

func t045 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;fnc1( i );next ;time := seconds() - time ;return { procname() + ": " + iif(
.F., , "fnc1( i )" ), time }



func t046 ;local time, i, x := nil ;local  c := dtos( date() ) ;time :=
seconds() ;for i:=1 to 1000000 ;fnc2( c );next ;time := seconds() - time
;return { procname() + ": " + iif( .T., "fnc2( c[1...8] )", "fnc2( c )" ),
time }



func t047 ;local time, i, x := nil ;local  c := repl( dtos( date() ), 5000 )
;time := seconds() ;for i:=1 to 1000000 ;fnc2( c );next ;time := seconds() -
time ;return { procname() + ": " + iif( .T., "fnc2( c[1...40000] )", "fnc2(
c )" ), time }



func t048 ;local time, i, x := nil ;local  c := repl( dtos( date() ), 5000 )
;time := seconds() ;for i:=1 to 1000000 ;fnc2( c );next ;time := seconds() -
time ;return { procname() + ": " + iif( .T., "fnc2( @c[1...40000] )", "fnc2(
c )" ), time }



func t049 ;local time, i, x := nil ;local  c := repl( dtos( date() ),5000
),c2 ;time := seconds() ;for i:=1 to 1000000 ;fnc2( @c );next ;time :=
seconds() - time ;return { procname() + ": " + iif( .T., "fnc2(
@c[1...40000] ), c2 := c", "fnc2( @c )" ), time };c2 := c



func t050 ;local time, i, x := nil ;local  a := {},a2 := { 1, 2, 3 },bc := {
|x| fnc1(x) },s := dtos( date() ),s2 := "static text",n := 1.23 ;time :=
seconds() ;for i:=1 to 1000000 ;fnc3( a, a2, s, i, s2, bc, i, n, x );next
;time := seconds() - time ;return { procname() + ": " + iif( .F., , "fnc3(
a, a2, s, i, s2, bc, i, n, x )" ), time }

func t051 ;local time, i, x := nil ;local  a := { 1, 2, 3 } ;time :=
seconds() ;for i:=1 to 1000000 ;fnc2( a );next ;time := seconds() - time
;return { procname() + ": " + iif( .F., , "fnc2( a )" ), time }

func t052 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;x := fnc4();next ;time := seconds() - time ;return { procname() + ": " +
iif( .F., , "x := fnc4()" ), time }

func t053 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;x := fnc5();next ;time := seconds() - time ;return { procname() + ": " +
iif( .F., , "x := fnc5()" ), time }

func t054 ;local time, i, x := nil ;time := seconds() ;for i:=1 to 1000000
;x := space(16);next ;time := seconds() - time ;return { procname() + ": " +
iif( .F., , "x := space(16)" ), time }

func t055 ;local time, i, x := nil ;local  c := dtos( date() ) ;time :=
seconds() ;for i:=1 to 1000000 ;f_prv( c );next ;time := seconds() - time
;return { procname() + ": " + iif( .F., , "f_prv( c )" ), time }































proc test( nMT, cExclude, lScale )


local nLoopOverHead, nTimes, nSeconds, cNum, aThreads, aResults,  mtxJobs,
mtxResults, nTimeST, nTimeMT, nTimeTotST, nTimeTotMT,  cTest, x, i, j

create_db()












if !hb_mtvm()
   if lScale
      outstd(chr(10));outstd("scale test available only in MULTI THREAD
mode")
      outstd(chr(10))
      return
   endif
   if nMT != 0
      outstd(chr(10));outstd("SINGLE THREAD mode, number of threads set to
0")
      nMT := 0
   endif
endif
outstd(chr(10));outstd(date(),time(),os())
outstd(chr(10));outstd(version() + iif( hb_mtvm(), " (MT)" + iif( nMT != 0,
"+", "" ), "" ),"")




if lScale .and. nMT < 1
   nMT := 1
endif

outstd(chr(10));outstd("THREADS:",iif( nMT < 0, "all->" + ltrim( str( 55 )
), ltrim( str( nMT ) ) ))
outstd(chr(10));outstd("N_LOOPS:",ltrim( str( 1000000 ) ))
if !empty( cExclude )
   outstd(chr(10));outstd("excluded tests:",cExclude)
endif

x :=t000()
nLoopOverHead := x[2]

if lScale
   outstd(chr(10));outstd(space(56) + "1 th." + str(nMT,3) + " th.  factor")
   outstd(chr(10));outstd(replicate("=",76))
else
   outstd(chr(10));outstd(dsp_result( x, 0 ))
   outstd(chr(10));outstd(replicate("=",68))
endif

nSeconds := seconds()
nTimes := seconds()






















































































   for i:=1 to 55
      cNum := strzero( i, 3 )
      if !cNum $ cExclude
         outstd(chr(10));outstd(dsp_result( &( "t" + cNum )(), nLoopOverHead
))
      endif
   next


nTimes := seconds() - nTimes
nSeconds := seconds() - nSeconds

if lScale
   outstd(chr(10));outstd(replicate("=",76))
   outstd(chr(10));outstd(dsp_scaleResult( "  TOTAL  ", nTimeTotST,
nTimeTotMT, nMT, 0 ))
   outstd(chr(10));outstd(replicate("=",76))
else
   outstd(chr(10));outstd(replicate("=",68))
endif
outstd(chr(10));outstd(dsp_result( { "total application time:", nTimes },
0))
outstd(chr(10));outstd(dsp_result( { "total real time:", nSeconds }, 0 ))
outstd(chr(10))

remove_db()
return

function fnc0()
return nil

function fnc1(x)
return x

function fnc2(x)
( ( x ) )
return nil

function fnc3(a,b,c,d,e,f,g,h,i)
( ( a ) )
( ( b ) )
( ( c ) )
( ( d ) )
( ( e ) )
( ( f ) )
( ( g ) )
( ( h ) )
( ( i ) )
return nil

function fnc4()
return space(4000)

function fnc5()
return space(5)

function f_prv(x)
   memvar PRV_C
   private PRV_C := x
return nil













static func dsp_result( aResult, nLoopOverHead )

   return padr( "[ " + left( aResult[1], 56 ) + " ]", 60, "." ) +  strtran(
str( max( aResult[2] - nLoopOverHead, 0 ), 8, 2 ), " ", "." )

static func dsp_scaleResult( cTest, nTimeST, nTimeMT, nMT, nLoopOverHead )
   if .f.
      nTimeST := max( 0, nTimeST - nMT * nLoopOverHead )
      nTimeMT := max( 0, nTimeMT - nMT * nLoopOverHead )
   endif


   return padr( "[ " + left( cTest, 50 ) + " ]", 54, "_" ) +  str( nTimeST,
6, 2 ) + " " + str( nTimeMT, 6, 2 ) + " ->" +  str( nTimeST / nTimeMT, 6, 2
)



static proc create_db()
   remove_db()


   dbcreate( "_tst_tmp.dbf", { {"F_C", "C", 10, 0}, {"F_N", "N", 10, 2},
{"F_D", "D",  8, 0} } )
   dbUseArea( .F., , "_tst_tmp.dbf", , iif(.F. .or. .T., !.T., NIL), .F.)
   dbappend()
   FIELD->F_C := dtos(date())
   FIELD->F_N := 112345.67
   FIELD->F_D := date()
   dbCloseArea()
return

static proc remove_db()
   ferase( "_tst_tmp.dbf" )
return

static proc close_db()
   dbCloseArea()
return

static proc use_dbsh()
   dbUseArea( .F., , "_tst_tmp.dbf", , iif(.T. .or. .F., !.F., NIL), .F.)
return











   function hb_mtvm()
   return .t.










   function hb_threadOnce( xOnceControl, bAction )
      local lFirstCall := .f.
      if xOnceControl == NIL
         if bAction != NIL
            eval( bAction )
         endif
         xOnceControl := .t.
         lFirstCall := .t.
      endif
   return lFirstCall



























































































































































---

Brgds,
Viktor

On Mon, Mar 16, 2009 at 2:03 PM, Przemyslaw Czerpak <[email protected]>wrote:

> On Mon, 16 Mar 2009, Szak�ts Viktor wrote:
>
> Hi,
>
> > ---
> > Xbase++ (R) Compiler 1.90.331 Apr 27 2006
> > Copyright (c) Alaska Software. All rights reserved.
> > File: speedtst.prg Line:  816
> > speedtst.prg(182:0): error XBT0200: Syntax Error
> > speedtst.prg(265:0): warning XBT0105: Function t030 does not end with
> RETURN
> > speedtst.prg(306:0): error XBT0223: NEXT does not match FOR
> > speedtst.prg(308:0): error XBT0251: Reserved keyword
> [...]
> > speedtst.prg(398:0): warning XBT0100: RETURN statement with no value in
> > function
> > speedtst.prg(543:0): warning XBT0100: RETURN statement with no value in
> > function
> > speedtst.prg(545:0): error XBT0251: Reserved keyword
> > speedtst.prg(548:0): error XBT0251: Reserved keyword
> > speedtst.prg(551:0): error XBT0251: Reserved keyword
> > speedtst.prg(555:0): error XBT0251: Reserved keyword
> > Too many errors, exiting
>
> Oops, seems that it's not Clipper compatible as I thought.
> I'll try to change the code but I need more information about
> xBase++.
> Looks like F0(), F1(), F2(), ... as function names cannot be used
> because these are reserved names. Is it documented?
> Can you check if translation to FNC0(), FNC1(), FNC2(), ... is
> enough.
> END seems to be translated unconditionally to NEXT or it's some
> other PP problem. Can you generate .ppo file with xBase++?
> I would like to see the output.
>
> best regards,
> Przemek
> _______________________________________________
> Harbour mailing list
> [email protected]
> http://lists.harbour-project.org/mailman/listinfo/harbour
>
_______________________________________________
Harbour mailing list
[email protected]
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to