Files
harbour-core/harbour/utils/hbmake/hbmutils.prg
Viktor Szakats 5dcbeffc68 2006-06-22 00:25 UTC+0100 Viktor Szakats (viktor.szakats syenar.hu)
* harbour/include/common.ch
   * harbour/source/debug/dbghelp.prg
   * harbour/source/debug/dbgmenu.prg
   * harbour/source/debug/dbgtarr.prg
   * harbour/source/debug/dbgtobj.prg
   * harbour/source/debug/dbgwa.prg
   * harbour/source/debug/debugger.prg
   * harbour/source/rdd/dbupdat.prg
   * harbour/source/rtl/achoice.prg
   * harbour/source/rtl/checkbox.prg
   * harbour/source/rtl/dbedit.prg
   * harbour/source/rtl/getsys.prg
   * harbour/source/rtl/listbox.prg
   * harbour/source/rtl/persist.prg
   * harbour/source/rtl/pushbtn.prg
   * harbour/source/rtl/radiobtn.prg
   * harbour/source/rtl/tbcolumn.prg
   * harbour/source/rtl/tbrowse.prg
   * harbour/source/rtl/tclass.prg
   * harbour/source/rtl/teditor.prg
   * harbour/source/rtl/tget.prg
   * harbour/source/rtl/tgetlist.prg
   * harbour/source/rtl/tlabel.prg
   * harbour/source/rtl/treport.prg
   * harbour/utils/hbdoc/genchm.prg
   * harbour/utils/hbdoc/genhtm.prg
   * harbour/utils/hbdoc/genng.prg
   * harbour/utils/hbdoc/genos2.prg
   * harbour/utils/hbdoc/genrtf.prg
   * harbour/utils/hbdoc/gentrf.prg
   * harbour/utils/hbdoc/html.prg
   * harbour/utils/hbdoc/ng.prg
   * harbour/utils/hbdoc/os2.prg
   * harbour/utils/hbdoc/rtf.prg
   * harbour/utils/hbmake/checks.prg
   * harbour/utils/hbmake/hbmake.prg
   * harbour/utils/hbmake/hbmutils.prg
   * harbour/utils/hbmake/radios.prg
   * harbour/utils/hbtest/rt_hvm.prg
     + HB_SYMBOL_UNUSED() added for .prg code. It can suppress unused
       var warnings where applicable. The code won't generate any final
       pcodes, so it won't cause overhead. The only current downside
       is that it cannot be used inside codeblocks.
     ! Fixed a number (>200) of declared but unused variable /w2 error.
       All parts were scanned and fixed (except contrib).
       Note that there are several false "unreachable code" warnings,
       and there are still quite a few unused var warnings inside
       codeblocks. After fixing these /w2 switch could be added to
       the standard build process to maintain code quality.
2006-06-21 22:25:00 +00:00

393 lines
13 KiB
Plaintext

#include "common.ch"
#ifndef __HARBOUR__
#include 'hbclip.ch'
#else
DECLARE extenprg( cExt AS STRING, nType AS NUMERIC ) AS STRING
declare exten( cExt as string, nType as numeric ) as string
DECLARE GetSourceFiles( lSubdir as logical ) as ARRAY
DECLARE GetDirs( cPat as USUAL ) as Array
DECLARE GetBccDir() as String
DECLARE GetVccDir() as String
DECLARE GetMakeDir() as String
DECLARE HB_ARGV( n as numeric ) as string
declare hbmake_filedate( c as String ) as string
declare listasArray2( cString as String, cSep as String ) as Array
#endif
Function GetSourceFiles( lSubdir )
Local adirs AS ARRAY
Local aRet AS ARRAY := {}
Local lLinux := At( 'linux', lower(Os() )) > 0
Local cdir as String := If( !llinux, '\' + Curdir() + '\', '/' + Curdir() + '/' )
Local aStru := { cDir }
Local aData AS ARRAY
Local nCounter as numeric := 0
Local nArrayLen as numeric
Local nDatalen as numeric
Local y as numeric
Local cItem as String
Local cext
Local cpath
Local cdrive
Local nPos
Local xItem
Default lSubdir To .t.
While ++ nCounter <= Len( aStru )
If !Empty( adirs := GetDirs( astru[ nCounter ] ) ) // There are elements!
Aeval( aDirs, { | xItem | Aadd( aStru, xItem ) } )
Endif
Enddo
aDirs := {}
Asort( aStru )
nArrayLen := Len( aStru )
For nCounter := 1 To nArrayLen
If Len( aData := DIR_MULTI(aStru[ nCounter ]+"*.prg |"+aStru[ nCounter ]+"*.c") ) != 0
nDataLen := Len( aData )
For y := 1 To nDataLen
If At( '.PRG', Upper( adata[ y, 1 ] ) ) > 0 .or. At( '.C', Upper( adata[ y, 1 ] ) ) > 0
If lSubdir
Aadd( aRet, Strtran( astru[ nCounter ], cDir, '' ) + aData[ y, 1 ] + ;
Str( aData[ y, 2 ], 8 ) + ' ' + ;
Dtoc( aData[ y, 3 ] ) + ' ' + ;
aData[ y, 4 ] )
Elseif !lsubdir .and. At( If( lLinux, "/", "\" ), Strtran( astru[ nCounter ], cDir, '' ) ) == 0
Aadd( aRet, Pad( aData[ y, 1 ], 18 ) + ;
Str( aData[ y, 2 ], 8 ) + ' ' + ;
Dtoc( aData[ y, 3 ] ) + ' ' + ;
aData[ y, 4 ] )
Endif
Endif
Next
Endif
Next
For nCounter := 1 To Len( aret )
xItem := Substr( aret[ nCounter ], Rat( If( llinux, "/", '\' ), aret[ nCounter ] ) + 1 )
nPos := Ascan( astru, { | x | x := Substr( x, Rat( If( llinux, "/", '\' ), x ) + 1 ), Left( x, At( ".", x ) ) == Left( xitem, At( ".", xitem ) ) } )
If nPos > 0
Adel( astru, nPos )
Asize( astru, Len( astru ) - 1 )
Endif
Next
For nCounter := 1 To Len( aStru )
hb_FNAMESPLIT( Left( astru[ nCounter ], At( ' ', astru[ nCounter ] ) - 1 ), @cPath, @cItem, @cExt, @cDrive )
If ( cExt == '.C' ) .or. ( cExt == ".c" )
Aadd( aret, astru[ nCounter ] )
Endif
Next
Return aRet
Function extenprg( cExt, nType )
Local aext AS ARRAY := { "C", "c" }
Local nPos AS NUMERIC
Local cTemp AS String := ""
nPos := Ascan( aext, { | a | a == cExt } )
If nPos > 0
If nTYpe == 1
cTemp := Strtran( cExt, aExt[ nPos ], 'prg' )
Elseif ntype == 2
cTemp := Strtran( cExt, aExt[ nPos ], 'prG' )
Elseif ntype == 3
cTemp := Strtran( cExt, aExt[ nPos ], 'pRg' )
Elseif ntype == 4
cTemp := Strtran( cExt, aExt[ nPos ], 'Prg' )
Elseif ntype == 5
cTemp := Strtran( cExt, aExt[ nPos ], 'PRg' )
Elseif ntype == 6
cTemp := Strtran( cExt, aExt[ nPos ], 'PrG' )
Elseif ntype == 7
cTemp := Strtran( cExt, aExt[ nPos ], 'PRG' )
Endif
Endif
Return ctemp
Static Function GetDirs( cPattern )
Local aDir := {}
Local lLinux := At( 'linux', lower(Os()) ) > 0
Aeval( Directory( cPattern + if(lLinux,"*","*."), "D" ), ;
{ | xItem | If( xItem[ 5 ] = "D" .and. ;
( xItem[ 1 ] != "." .and. xItem[ 1 ] != ".." ), ;
( Aadd( aDir, cPattern + xItem[ 1 ] + If( llinux, "/", '\' ) ), ;
Outstd( "." ) ), "" ) } )
Return ( aDir )
Function GetBccDir()
Local cPath := ''
Local cEnv := Gete( "PATH" )
Local aEnv := listasarray2( cEnv, ";" )
Local nPos
For nPos := 1 To Len( aEnv )
If File( aenv[ nPos ] + '\bcc32.exe' ) .or. File( Upper( aenv[ nPos ] ) + '\BCC32.EXE' )
cPath := aenv[ nPos ]
cPath := Left( cPath, Rat( '\', cPath ) - 1 )
Exit
Endif
Next
Return cPath
Function GetVccDir()
Local cPath AS STRING := ''
Local cEnv AS STRING := Gete( "PATH" )
Local aEnv as array of string := listasarray2( cEnv, ";" )
Local nPos as numeric
For nPos := 1 To Len( aEnv )
If File( aenv[ nPos ] + '\cl.exe' ) .or. File( Upper( aenv[ nPos ] ) + '\cl.EXE' )
cPath := aenv[ nPos ]
cPath := Left( cPath, Rat( '\', cPath ) - 1 )
Exit
Endif
Next
Return cPath
Function exten( cExt, nType )
Local aext as array := { 'C', 'c' }
Local nPos as numeric
Local cTemp as string := ""
nPos := Ascan( aext, { | a | a == cExt } )
If nPos > 0
If nTYpe == 1
cTemp := Strtran( cExt, aExt[ nPos ], 'o' )
Elseif ntype == 2
cTemp := Strtran( cExt, aExt[ nPos ], 'obj' )
Endif
Endif
Return ctemp
Function ListAsArray2( cList, cDelimiter )
Local nPos as numeric
Local aList as array := {} // Define an empty array
If cDelimiter = NIL
cDelimiter := ","
Endif
//
Do While ( nPos := At( cDelimiter, cList ) ) != 0
Aadd( aList, Alltrim( Substr( cList, 1, nPos - 1 ) ) ) // Add a new element
cList := Substr( cList, nPos + 1 )
Enddo
Aadd( aList, Alltrim( cList ) ) // Add final element
//
Return aList // Return the array
Function GetMakeDir()
Local cPath := ""
Local cExe := HB_ARGV( 0 )
cExe:=strtran(cExe,"/","\")
cPath := Left( cexe, Rat( "\", cexe ) - 1 )
cPath := Left( cPath, Rat( "\", cPath ) - 1 )
Return cPath
Function GetSourceDirMacros()
Local adirs AS ARRAY
Local lLinux := At( 'linux', lower(Os()) ) > 0
Local cdir as String := If( llinux, '/' + Curdir() + '/', '\' + Curdir() + '\' )
Local aStru := { cDir }
Local nCounter as numeric := 0
Local amacros as Array := {}
While ++ nCounter <= Len( aStru )
If !Empty( adirs := GetDirs( astru[ nCounter ] ) ) // There are elements!
Aeval( aDirs, { | xItem | Aadd( aStru, xItem ) } )
Endif
Enddo
For nCounter := 1 To Len( aStru )
Aadd( amacros, { "SRC" + Strzero( nCounter, 2, 0 ), Strtran( astru[ nCounter ], cDir, '' ), .f. } )
Next
Return amacros
Function hbmake_filedate( cFileName )
Local aFiles := Directory( cFileName )
Return If( Len( aFiles ) == 1, aFiles[ 1, 3 ], Ctod( '' ) )
Function hbmake_filetime( cFileName )
Local aFiles := Directory( cFileName )
Return If( Len( aFiles ) == 1, aFiles[ 1, 4 ], '' )
Function TD2JUL( CTIME, DDATE )
Return DDATE - Ctod( '01/01/1900' ) + ( PRB_INT( TTOS( CTIME ) / 100000,, 5 ) )
Function TTOS( CTIME )
Return ( Val( Substr( CTIME, 7, 2 ) ) ) + ;
( Val( Substr( CTIME, 4, 2 ) ) * 60 ) + ;
( Val( Substr( CTIME, 1, 2 ) ) * 3600 )
Function PRB_INT( SOMENUMBER, length, NUM_DECIMALS )
Local NEGATIVE := ( SOMENUMBER < 0 )
Local SOMESTRING
Local dotat
Default NUM_DECIMALS To 0
Default length To 19
If NEGATIVE
SOMENUMBER := Abs( SOMENUMBER )
Endif
SOMENUMBER += .0000000000000005
SOMESTRING := Alltrim( Str( SOMENUMBER ) )
dotat := At( '.', somestring )
Do Case
Case NUM_DECIMALS == 0
If dotat > 0
somestring := Left( somestring, dotat - 1 )
Endif
Case NUM_DECIMALS > 0
If dotat > 0
somestring := Left( somestring, dotat + num_decimals )
Endif
Endcase
If NEGATIVE
SOMESTRING := '-' + SOMESTRING
Endif
Return Val( SOMESTRING )
Function exte( cExt, nType )
Local aext := { 'prg', 'prG', 'pRg', 'Prg', 'PRg', 'PrG', 'PRG' }
Local nPos
Local cTemp := ""
nPos := Ascan( aext, { | a | a == cExt } )
If nPos > 0
If nTYpe == 1
cTemp := Strtran( cExt, aExt[ nPos ], 'c' )
Elseif ntype == 2
cTemp := Strtran( cExt, aExt[ nPos ], 'obj' )
Elseif ntype == 3
cTemp := Strtran( cExt, aExt[ nPos ], 'o' )
Endif
Endif
Return ctemp
Procedure ATTENTION( CSTRING, NLINENUM, CCOLOR )
Local COLDCOLOR
Default NLINENUM To 24
Default CCOLOR To 'GR+/R'
COLDCOLOR := Setcolor( CCOLOR )
CSTRING := ' ' + Alltrim( CSTRING ) + ' '
Devpos( NLINENUM, c( CSTRING ) )
Devout( CSTRING )
Setcolor( COLDCOLOR )
Return
Function c( CSTRING )
Return Max( ( Maxcol() / 2 ) - Int( Len( CSTRING ) / 2 ), 0 )
Function ReadLN( leof )
Local cBuffer := ""
cBuffer := FT_FREADLN()
cBuffer := Strtran( cBuffer, Chr( 13 ), '' )
cBuffer := Strtran( cBuffer, Chr( 10 ), '' )
FT_FSKIP( 1 )
leof := ft_FEOF()
Return cBuffer
Function GetinstaledLibs( clibs, lGcc )
Local adeflib := { 'lang' + If( lgcc, '.a', '.lib' ), 'vm' + If( lgcc, '.a', '.lib' ), 'rtl' + If( lgcc, '.a', '.lib' ), 'rdd' + If( lgcc, '.a', '.lib' ), 'macro' + If( lgcc, '.a', '.lib' ), 'pp' + If( lgcc, '.a', '.lib' ), 'dbfntx' + If( lgcc, '.a', '.lib' ), 'dbfcdx' + If( lgcc, '.a', '.lib' ), 'common' + If( lgcc, '.a', '.lib' ), 'gtwin' + If( lgcc, '.a', '.lib' ), 'debug' + If( lgcc, '.a', '.lib' ), 'gtpca' + If( lgcc, '.a', '.lib' ), 'gtdos' + If( lgcc, '.a', '.lib' ), 'gtsln' + If( lgcc, '.a', '.lib' ), 'gtstd' + If( lgcc, '.a', '.lib' ), 'zlib1' + If( lgcc, '.a', '.lib' ), 'ziparchive' + If( lgcc, '.a', '.lib' ), 'rddads' + If( lgcc, '.a', '.lib' ), 'ace32' + If( lgcc, '.a', '.lib' ), 'libnf' + If( lgcc, '.a', '.lib' ), 'libct' + If( lgcc, '.a', '.lib' ), 'htmllib' + If( lgcc, '.a', '.lib' ), 'libgt' + If( lgcc, '.a', '.lib' ), 'libmisc' + If( lgcc, '.a', '.lib' ), 'mysql' + If( lgcc, '.a', '.lib' ), 'libmysql' + If( lgcc, '.a', '.lib' ), 'mysqlclient' + If( lgcc, '.a', '.lib' ), 'samples' + If( lgcc, '.a', '.lib' ), 'pdflib' + If( lgcc, '.a', '.lib' ), 'nulsys' + If( lgcc, '.a', '.lib' ), 'gtcgi' + If( lgcc, '.a', '.lib' ) }
Local aReturnLibs := {}
Local aLibs := Directory( clibs )
Local nPos
Local nCount
Local citem
if lgcc
aeval(aLibs,{|x,y| citem:=x[1] ,if(left(citem,3)=="lib", alibs[y,1]:=substr(cItem,4),)})
endif
For ncount := 1 To Len( alibs )
citem := Lower( alibs[ ncount, 1 ] )
npos := Ascan( adeflib, { | a | Lower( a ) == citem } )
If npos == 0
Aadd( aReturnLibs, alibs[ ncount, 1 ] )
Endif
Next
Return aReturnLibs
Function Getlibs( lgcc ,cDir)
Local lLinux:=at('linux',lower(os()))>0
Local ainstaledlibs := Getinstaledlibs( If( !llinux, if(!lgcc, cDir+"\*.lib",cDir+"\*.a") , '/usr/lib/harbour/*.a' ),lGcc )
Local aLibsDesc := { { "Harbour Ct3 library - Libct", 'ct' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour Misc library - Libmisc", 'misc' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour html library - Htmllib", 'html' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour Nanfor library - Libnf", 'nf' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour Gt library - Libgt", 'nf' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour Zip library Zlib1", 'zlib1.lib ziparchive' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour Hbole library Hbole", 'hbole' + If( lgcc, '.a', '.lib' ) + ' ole2' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour Mysql library - MySql", 'mysql' + If( lgcc, '.a', '.lib' ) + ' libmysql' + If( lgcc, '.a', '.lib' ) + ' mysqlclient' + If( lgcc, '.a', '.lib' ) }, ;
{ "Harbour Samples library - Samples", 'samples' + If( lgcc, '.a', '.lib' ) } }
Aeval( ainstaledlibs, { | x | Aadd( aLibsDesc, { "User - " + x +" Library", x } ) } )
Return aLibsDesc
*+ EOF: HBMUTILS.PRG
FUNCTION DIR_MULTI( cFileMaskList, cAttr )
LOCAL aList := ListasArray2( cFileMaskList, "|" )
AEval( aList, {|tmp, tmp1| aList[ tmp1 ] := DIRECTORY( tmp, cAttr ) })
RETURN ArrayAJoin(alist)
FUNCTION ArrayAJoin( array )
LOCAL tmp
LOCAL nLenArray := Len( array )
LOCAL nLen
LOCAL nPos := Len( array[ 1 ] ) + 1
nLen := 0
FOR tmp := 1 TO nLenArray
nLen += Len( array[ tmp ] )
NEXT
ASize( array[ 1 ], nLen )
FOR tmp := 2 TO nLenArray
ACopy( array[ tmp ], array[ 1 ], , , nPos )
nPos += Len( array[ tmp ] )
NEXT
RETURN array[ 1 ]