2008-05-12 14:24 UTC+0100 Viktor Szakats (harbour.01 syenar hu)

* bin/bld.bat
     + Added hbpcre to lib list.

   * source/rtl/hbini.prg
     ; Some formatting.

   * tests/Makefile
   + tests/parseini.prg
   + tests/parseini.ini
   + tests/parseins.ini
     + Added .ini handling tests. Adapted from xhb.
This commit is contained in:
Viktor Szakats
2008-05-12 12:26:37 +00:00
parent f6bbde9371
commit 006724dc11
7 changed files with 236 additions and 31 deletions

View File

@@ -8,6 +8,19 @@
2008-12-31 13:59 UTC+0100 Foo Bar <foo.bar@foobar.org>
*/
2008-05-12 14:24 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* bin/bld.bat
+ Added hbpcre to lib list.
* source/rtl/hbini.prg
; Some formatting.
* tests/Makefile
+ tests/parseini.prg
+ tests/parseini.ini
+ tests/parseins.ini
+ Added .ini handling tests. Adapted from xhb.
2008-05-12 13:56 UTC+0100 Viktor Szakats (harbour.01 syenar hu)
* bin/bld.bat
+ Added %HB_USER_LIB% for w32/msvc.

View File

@@ -174,7 +174,7 @@ if "%HB_INC_INSTALL%" == "" set HB_INC_INSTALL=..\include\
if not "%HB_COMPILER%" == "rsx32" GOTO A_DOS_RSX32_NOT
gcc %1.c -Zrsx32 %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon
gcc %1.c -Zrsx32 %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon -lhbpcre
goto END
:A_DOS_RSX32_NOT
@@ -198,6 +198,7 @@ if "%HB_INC_INSTALL%" == "" set HB_INC_INSTALL=..\include\
echo LIB rddfpt.lib >> build.tmp
echo LIB hbsix.lib >> build.tmp
echo LIB hbcommon.lib >> build.tmp
echo LIB hbpcre.lib >> build.tmp
wlink @build.tmp
del build.tmp
goto END
@@ -208,13 +209,13 @@ if not "%HB_ARCHITECTURE%" == "w32" goto A_OS2
if "%HB_GT_LIB%" == "" set _HB_GT_LIB=gtwin
if "%HB_COMPILER%" == "bcc32" bcc32 -O2 -d %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% %1.c %HB_USER_LIBS% hbcpage.lib hbdebug.lib hbvm.lib hbrtl.lib %_HB_GT_LIB%.lib hblang.lib hbrdd.lib hbmacro.lib hbpp.lib rddfpt.lib rddntx.lib rddcdx.lib hbsix.lib hbcommon.lib
if "%HB_COMPILER%" == "bcc32" bcc32 -O2 -d %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% %1.c %HB_USER_LIBS% hbcpage.lib hbdebug.lib hbvm.lib hbrtl.lib %_HB_GT_LIB%.lib hblang.lib hbrdd.lib hbmacro.lib hbpp.lib rddfpt.lib rddntx.lib rddcdx.lib hbsix.lib hbcommon.lib hbpcre.lib
if "%HB_COMPILER%" == "gcc" gcc %1.c -o%1.exe %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon
if "%HB_COMPILER%" == "mingw32" gcc %1.c -o%1.exe %CFLAGS% -mno-cygwin -I%HB_INC_INSTALL% %HB_INC_TEMP% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon
if "%HB_COMPILER%" == "rsxnt" gcc %1.c -Zwin32 %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon
if "%HB_COMPILER%" == "gcc" gcc %1.c -o%1.exe %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon -lhbpcre
if "%HB_COMPILER%" == "mingw32" gcc %1.c -o%1.exe %CFLAGS% -mno-cygwin -I%HB_INC_INSTALL% %HB_INC_TEMP% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon -lhbpcre
if "%HB_COMPILER%" == "rsxnt" gcc %1.c -Zwin32 %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon -lhbpcre
if "%HB_COMPILER%" == "msvc" cl -TP -W3 %CFLAGS% -I%HB_INC_INSTALL% %1.c /link /subsystem:CONSOLE %HB_USER_LIBS% %HB_LIB_INSTALL%\hbcpage.lib %HB_LIB_INSTALL%\hbdebug.lib %HB_LIB_INSTALL%\hbvm.lib %HB_LIB_INSTALL%\hbrtl.lib %HB_LIB_INSTALL%\%_HB_GT_LIB%.lib %HB_LIB_INSTALL%\hblang.lib %HB_LIB_INSTALL%\hbrdd.lib %HB_LIB_INSTALL%\hbmacro.lib %HB_LIB_INSTALL%\hbpp.lib %HB_LIB_INSTALL%\rddntx.lib %HB_LIB_INSTALL%\rddcdx.lib %HB_LIB_INSTALL%\rddfpt.lib %HB_LIB_INSTALL%\hbsix.lib %HB_LIB_INSTALL%\hbcommon.lib user32.lib winspool.lib
if "%HB_COMPILER%" == "msvc" cl -TP -W3 %CFLAGS% -I%HB_INC_INSTALL% %1.c /link /subsystem:CONSOLE %HB_USER_LIBS% %HB_LIB_INSTALL%\hbcpage.lib %HB_LIB_INSTALL%\hbdebug.lib %HB_LIB_INSTALL%\hbvm.lib %HB_LIB_INSTALL%\hbrtl.lib %HB_LIB_INSTALL%\%_HB_GT_LIB%.lib %HB_LIB_INSTALL%\hblang.lib %HB_LIB_INSTALL%\hbrdd.lib %HB_LIB_INSTALL%\hbmacro.lib %HB_LIB_INSTALL%\hbpp.lib %HB_LIB_INSTALL%\rddntx.lib %HB_LIB_INSTALL%\rddcdx.lib %HB_LIB_INSTALL%\rddfpt.lib %HB_LIB_INSTALL%\hbsix.lib %HB_LIB_INSTALL%\hbcommon.lib %HB_LIB_INSTALL%\hbpcre.lib user32.lib winspool.lib
if "%HB_COMPILER%" == "msvc" echo Ignore LNK4033 warning
:C_WATCOM
@@ -238,6 +239,7 @@ if not "%HB_ARCHITECTURE%" == "w32" goto A_OS2
echo LIB hbsix.lib >> build.tmp
echo LIB hbrdd.lib >> build.tmp
echo LIB hbcommon.lib >> build.tmp
echo LIB hbpcre.lib >> build.tmp
echo LIB kernel32.lib >> build.tmp
echo LIB user32.lib >> build.tmp
echo LIB winspool.lib >> build.tmp
@@ -253,8 +255,8 @@ if not "%HB_ARCHITECTURE%" == "w32" goto A_OS2
if "%HB_GT_LIB%" == "" set _HB_GT_LIB=gtos2
if "%HB_COMPILER%" == "gcc" gcc %1.c %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon
if "%HB_COMPILER%" == "icc" icc /Gs+ /W2 /Se /Sd+ /Ti+ /C- /Tp %CFLAGS% -I%HB_INC_INSTALL% %1.c %HB_LIB_INSTALL%\hbcpage.lib %HB_LIB_INSTALL%\hbdebug.lib %HB_LIB_INSTALL%\hbvm.lib %HB_LIB_INSTALL%\hbrtl.lib %HB_LIB_INSTALL%\%_HB_GT_LIB%.lib %HB_LIB_INSTALL%\hblang.lib %HB_LIB_INSTALL%\hbrdd.lib %HB_LIB_INSTALL%\hbrtl.lib %HB_LIB_INSTALL%\hbvm.lib %HB_LIB_INSTALL%\hbmacro.lib %HB_LIB_INSTALL%\hbpp.lib %HB_LIB_INSTALL%\rddfpt.lib %HB_LIB_INSTALL%\rddntx.lib %HB_LIB_INSTALL%\rddcdx.lib %HB_LIB_INSTALL%\hbsix.lib %HB_LIB_INSTALL%\hbcommon.lib
if "%HB_COMPILER%" == "gcc" gcc %1.c %CFLAGS% -I%HB_INC_INSTALL% -L%HB_LIB_INSTALL% -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon -lhbpcre
if "%HB_COMPILER%" == "icc" icc /Gs+ /W2 /Se /Sd+ /Ti+ /C- /Tp %CFLAGS% -I%HB_INC_INSTALL% %1.c %HB_LIB_INSTALL%\hbcpage.lib %HB_LIB_INSTALL%\hbdebug.lib %HB_LIB_INSTALL%\hbvm.lib %HB_LIB_INSTALL%\hbrtl.lib %HB_LIB_INSTALL%\%_HB_GT_LIB%.lib %HB_LIB_INSTALL%\hblang.lib %HB_LIB_INSTALL%\hbrdd.lib %HB_LIB_INSTALL%\hbrtl.lib %HB_LIB_INSTALL%\hbvm.lib %HB_LIB_INSTALL%\hbmacro.lib %HB_LIB_INSTALL%\hbpp.lib %HB_LIB_INSTALL%\rddfpt.lib %HB_LIB_INSTALL%\rddntx.lib %HB_LIB_INSTALL%\rddcdx.lib %HB_LIB_INSTALL%\hbsix.lib %HB_LIB_INSTALL%\hbcommon.lib %HB_LIB_INSTALL%\hbpcre.lib
goto END
:A_LINUX
@@ -263,7 +265,7 @@ if not "%HB_ARCHITECTURE%" == "w32" goto A_OS2
if "%HB_GT_LIB%" == "" set _HB_GT_LIB=gtstd
if "%HB_COMPILER%" == "gcc" gcc %1.c %CFLAGS% -I%HB_INC_INSTALL% -L../lib -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon
if "%HB_COMPILER%" == "gcc" gcc %1.c %CFLAGS% -I%HB_INC_INSTALL% -L../lib -lhbcpage -lhbdebug -lhbvm -lhbrtl -l%_HB_GT_LIB% -lhblang -lhbrdd -lhbrtl -lhbvm -lhbmacro -lhbpp -lrddfpt -lrddntx -lrddcdx -lhbsix -lhbcommon -lhbpcre
goto END
:CLEANUP

View File

@@ -6,7 +6,7 @@
* xHarbour Project source code:
* Handling .ini files
*
* Copyright 2002 Giancarlo Niccolai [gian@niccolai.ws]
* Copyright 2002 Giancarlo Niccolai <gian@niccolai.ws>
* www - http://www.xharbour.org
*
* this program is free software; you can redistribute it and/or modify
@@ -83,36 +83,39 @@ STATIC s_cHalfLineComment := "#"
PROCEDURE hb_IniSetComment( cLc, cHlc )
s_cLineComment := cLc
s_cHalfLineComment := cHlc
RETURN
FUNCTION HB_IniNew( bAutoMain )
RETURN
FUNCTION HB_IniNew( lAutoMain )
LOCAL hIni := hb_Hash()
IF bAutoMain
IF lAutoMain
hIni[ "MAIN" ] := hb_Hash()
ENDIF
RETURN hIni
RETURN hIni
FUNCTION hb_IniRead( cFileSpec, bKeyCaseSens, cSplitters, bAutoMain )
FUNCTION hb_IniRead( cFileSpec, lKeyCaseSens, cSplitters, lAutoMain )
LOCAL hIni := hb_Hash()
/* Default case sensitiveness for keys */
DEFAULT bKeyCaseSens TO .T.
DEFAULT lKeyCaseSens TO .T.
DEFAULT cSplitters TO "=|:"
DEFAULT bAutoMain TO .T.
DEFAULT lAutoMain TO .T.
hb_HCaseMatch( hIni, bKeyCaseSens )
hb_HCaseMatch( hIni, lKeyCaseSens )
IF bAutoMain
IF lAutoMain
hIni[ "MAIN" ] := hb_Hash()
ENDIF
RETURN hb_IniRdLow( hIni, cFileSpec, bKeyCaseSens, cSplitters, bAutoMain )
RETURN hb_IniRdLow( hIni, cFileSpec, lKeyCaseSens, cSplitters, lAutoMain )
STATIC FUNCTION hb_IniRdLow( hIni, cFileSpec, bKeyCaseSens, cSplitters, bAutoMain )
STATIC FUNCTION hb_IniRdLow( hIni, cFileSpec, lKeyCaseSens, cSplitters, lAutoMain )
LOCAL aFiles
LOCAL cFile, nLen
LOCAL aKeyVal, hCurrentSection
@@ -151,7 +154,7 @@ STATIC FUNCTION hb_IniRdLow( hIni, cFileSpec, bKeyCaseSens, cSplitters, bAutoMai
FClose( hFile )
/* Always begin with the MAIN section */
IF bAutoMain
IF lAutoMain
hCurrentSection := hIni[ "MAIN" ]
ELSE
hCurrentSection := hIni
@@ -215,7 +218,7 @@ STATIC FUNCTION hb_IniRdLow( hIni, cFileSpec, bKeyCaseSens, cSplitters, bAutoMai
IF Len( aKeyVal[ 2 ] ) == 0
LOOP
ENDIF
hb_IniRdLow( hIni, aKeyVal[ 2 ], bKeyCaseSens, cSplitters, bAutoMain )
hb_IniRdLow( hIni, aKeyVal[ 2 ], lKeyCaseSens, cSplitters, lAutoMain )
cLine := ""
LOOP
ENDIF
@@ -226,7 +229,7 @@ STATIC FUNCTION hb_IniRdLow( hIni, cFileSpec, bKeyCaseSens, cSplitters, bAutoMai
cLine := AllTrim( aKeyVal[ 2 ] )
IF Len( cLine ) != 0
hCurrentSection := hb_Hash()
IF ! bKeyCaseSens
IF ! lKeyCaseSens
cLine := Upper( cLine )
ENDIF
hIni[ cLine ] := hCurrentSection
@@ -244,7 +247,7 @@ STATIC FUNCTION hb_IniRdLow( hIni, cFileSpec, bKeyCaseSens, cSplitters, bAutoMai
ENDIF
/* If not case sensitive, use upper keys */
IF ! bKeyCaseSens
IF ! lKeyCaseSens
aKeyVal[ 1 ] := Upper( aKeyVal[ 1 ] )
ENDIF
@@ -252,10 +255,10 @@ STATIC FUNCTION hb_IniRdLow( hIni, cFileSpec, bKeyCaseSens, cSplitters, bAutoMai
cLine := ""
ENDDO
RETURN hIni
RETURN hIni
FUNCTION hb_IniWrite( xFileName, hIni, cCommentBegin, cCommentEnd, bAutoMain )
FUNCTION hb_IniWrite( xFileName, hIni, cCommentBegin, cCommentEnd, lAutoMain )
LOCAL hFile
LOCAL lClose
LOCAL cNewLine := hb_OSNewLine()
@@ -286,10 +289,10 @@ FUNCTION hb_IniWrite( xFileName, hIni, cCommentBegin, cCommentEnd, bAutoMain )
ENDIF
ENDIF
DEFAULT bAutoMain TO .T.
DEFAULT lAutoMain TO .T.
/* Write toplevel section */
IF bAutoMain
IF lAutoMain
/* When automain is on, write the main section */
hb_HEval( hIni[ "MAIN" ], ;
{ |cKey, xVal| FWrite( hFile, hb_CStr( cKey ) + " = " + ;
@@ -305,7 +308,7 @@ FUNCTION hb_IniWrite( xFileName, hIni, cCommentBegin, cCommentEnd, bAutoMain )
FOR EACH cSection IN hIni
/* Avoid re-processing main section */
IF bAutoMain
IF lAutoMain
/* When automain is on, skip section named MAIN */
IF cSection:__enumKey == "MAIN"
LOOP
@@ -344,4 +347,4 @@ FUNCTION hb_IniWrite( xFileName, hIni, cCommentBegin, cCommentEnd, bAutoMain )
FClose( hFile )
ENDIF
RETURN .T.
RETURN .T.

View File

@@ -97,6 +97,7 @@ PRG_SOURCES=\
output.prg \
overload.prg \
parexpr.prg \
parseini.prg \
passref.prg \
procline.prg \
procname.prg \

View File

@@ -0,0 +1,38 @@
#
# $Id$
#
; Demo INI file
;
; Copyright 2003 Giancarlo Niccolai (gian@niccolai.ws)
; (showing another style of comment here )
# This is the MAIN section
Procedure = Demo ini file
Name = Parseini.ini
#including a subfile
include parseins.ini
[Files] #Declaring files section
Path=/home/pub
Filename: foobar.pdf # variable declared with ':'
Long= A Data ||
Spreading ||
On varius lines ||
here.
[Printers]
LPT1 = \\HEAD\Lexmark
#including a subfile
include parseins.ini
#invalid line
An invalid line
#
# End!
#

110
harbour/tests/parseini.prg Normal file
View File

@@ -0,0 +1,110 @@
/*
* $Id$
*/
******************************************************************
* Test for Ini file reading/writing
*
* Giancarlo Niccolai
*
PROCEDURE Main( cName )
LOCAL aIni, aSect
LOCAL cSection
LOCAL cKey
LOCAL nRow := 1
set color to w+/b
CLEAR SCREEN
@nRow++,20 SAY "H A R B O U R - .ini file parser test"
@nRow++,5 SAY "Call from command line using a .ini filename as the only parameter"
nRow++
IF Empty( cName )
cName := "parseini.ini"
@nRow++, 5 SAY "Using default parseini.ini file"
ENDIF
aIni := hb_IniRead( cName )
@nRow, 0
? "Content of " + cName
IF Empty( aIni )
? "Not a valid .ini file!"
ELSE
FOR EACH cSection IN aIni:Keys
?
? "Section [" + cSection + "]"
aSect := aIni[ cSection ]
FOR EACH cKey IN aSect:Keys
? cKey + " = " + aSect[ cKey ]
NEXT
NEXT
ENDIF
?
? "Adding section 'Added', with key NEW = new"
aIni[ "Added" ] := hb_Hash()
aIni[ "Added" ][ "NEW" ] := "new"
? "Writing output to parseini_out.ini"
IF hb_IniWrite( "parseini_out.ini", aIni, "#Generated file; don't touch", "#End of file")
? "File written"
ELSE
? "Can't write file"
ENDIF
?
? "Press any key to next text."
Inkey(0)
?
? "REPEATING TESTS WITHOUT AUTOMATIC MAIN SECTION"
aIni := hb_IniRead( cName, /*default case*/ , /*Default key indicators */ , .F. )
@nRow, 0
? "Content of " + cName
IF Empty( aIni )
? "Not a valid .ini file!"
ELSE
FOR EACH cSection IN aIni:Keys
/* Now (without automatic main), toplevel options may be in the root hash */
aSect := aIni[ cSection ]
IF HB_IsHash( aSect )
/* It's a section */
?
? "Section [" + cSection + "]"
FOR EACH cKey IN aSect:Keys
? cKey + " = " + aSect[ cKey ]
NEXT
ELSE
/* It's a toplevel option */
? "TOPLEVEL option:", cSection + " = " + aSect
ENDIF
NEXT
ENDIF
?
? "Adding section 'Added', with key NEW = new"
aIni[ "Added" ] := hb_Hash()
aIni[ "Added" ][ "NEW" ] := "new"
? "Writing output to parseini_out1.ini"
IF hb_IniWrite( "parseini_out1.ini", aIni,;
"#Generated file without main auto section; don't touch", "#End of file",;
.F. )
? "File written"
ELSE
? "Can't write file"
ENDIF
?
? "Press any key to next text."
Inkey(0)
RETURN

View File

@@ -0,0 +1,38 @@
#
# $Id$
#
; Demo INI file
;
; Copyright 2003 Giancarlo Niccolai (gian@niccolai.ws)
; (showing another style of comment here )
# This is the MAIN section
Procedure = Demo ini file
Name = Parseini.ini
#including a subfile
include parseini2.ini
[Files] #Declaring files section
Path=/home/pub
Filename: foobar.pdf # variable declared with ':'
Long= A Data ||
Spreading ||
On varius lines ||
here.
[Printers]
LPT1 = \\HEAD\Lexmark
#including a subfile
include parseini2.ini
#invalid line
An invalid line
#
# End!
#