2013-02-18 14:48 UTC+0100 Viktor Szakats (harbour syenar.net)

* utils/hbmk2/hbmk2.*.po
  * utils/hbmk2/hbmk2.prg
    + added '-hb30' option and '{hb30}' filter macro to allow
      reverting back to Harbour 3.0.0
    + added provisions for merging 'hblang' and 'hbcpage'
      core libs into new 'hbnat' lib
    + SETCURSOR() and SETCOLOR() references will now also
      trigger full screen CUI mode in hbrun scripts
    + documented the fact that GTCGI is default GT for scripts
      and that it's switched to another one (and which) when
      CUI mode script is detected
    + marked all information in help with '[*]' which shows
      host platform dependent, dynamic data (f.e. systems paths)
    + hbmk.hbc will now be searched for under user's home
      directory on non-*nix, too
    + added '-find' special hbmk2 option for finding Harbour functions.
      It will lookup any strings passed as command line arguments
      and display in which library they can be found. It will
      also do the lookup in packages not currently installed.
      Replaces similar 'hbrun bin/find' functionality, but now
      uses existing code inside hbmk2. The new implementation
      also supports wildcards.
      Example:
         hbmk2 -find wapi_*string ntos wild
    ! documented that hbstart.hb is first searched for in
      current working directory
    ! ${hb_ver} and ${hb_verstr} macros now change their value
      in compatibility modes (-hb10, -hb20, -hb30, -xhb)
    + -longhelpmd output will now not contain installation
      specific (and potentially sensitive) data: home directory,
      hbmk2 directory, only generic replacement terms
    + version= directive help text got a mention of its default
      value (it was so far only mentioned next to HBMK_HAS_<hbcname>
      envvar)
    + documented exit codes in help text
    * minor tweaks to some help lines
    * cleanup for Markdown formatting internals
    * plugin callback variable "nErrorLevel" renamed to "nExitCode"
      [INCOMPATIBLE]
    * exit code changed to value 6 from 1 when hbrun script has
      a compile error [INCOMPATIBLE]
    + use core hb_DirSepToOS() where possible
    - deleted hbmk2 plugin API function hbmk_PathSepToSelf()
      Use core hb_DirSepToOS() instead. [INCOMPATIBLE]
    + added '-exitstr' hbmk2 option which will display the exit result
      in textual format

  * contrib/hbpre.hbm
  * contrib/make.hb
    % use -exitstr hbmk2 option instead of rolling a local copy
      of possible result strings

  * src/pp/ppcore.c
    + generate '\a' '\f' '\v' escape chars

  - bin/find.hb
  * config/postinst.hb
  * package/harbour.spec
    - deleted find.hb for 'hbrun bin/find' functionality.
      Replaced by 'hbmk2 -find' option.

  * src/rtl/Makefile
  - src/rtl/strxchg.c
  + src/rtl/strrepl.c
  * src/rtl/tget.prg
  * utils/hbmk2/hbmk2.prg
  * include/harbour.hbx
  * ChangeLog.txt
    * renamed HB_STRXCHG() to HB_STRREPLACE(), according to:
         https://groups.google.com/d/topic/harbour-devel/vSzlAkv6h9Y/discussion
    * updated function skeleton in ChangeLog and C source
      (also with new hash parameter)

  * contrib/hbsqlit3/hbsqlit3.hbp
  * contrib/hbsqlit3/hbsqlit3.hbx
  + contrib/hbsqlit3/errstr.prg
    + hb_sqlite3_errstr_short( <nError> ) -> <cError>

  * contrib/hbsqlit3/tests/authoriz.prg
  * contrib/hbsqlit3/tests/backup.prg
  * contrib/hbsqlit3/tests/hooks.prg
    % use hb_sqlite3_errstr_short() instead of implementing
      it locally in each example
    % use sqlite3_errstr() API to get long error strings instead
      of reimplementing it locally
    % minor opt

  * contrib/hbsqlit3/hbsqlit3.hbp
  - contrib/hbsqlit3/hdbcsqlt.prg
  + contrib/hbsqlit3/hdbc.prg
    * renamed

  * contrib/hbhpdf/errstr.prg
  * contrib/hbmzip/mziperr.prg
    ! indenting

  * contrib/hbtip/tests/tiptest.prg
    * leave color
This commit is contained in:
Viktor Szakats
2013-02-18 13:50:13 +00:00
parent c72e900a2d
commit 3fb65e7924
25 changed files with 872 additions and 684 deletions

View File

@@ -10,6 +10,106 @@
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
*/
2013-02-18 14:48 UTC+0100 Viktor Szakats (harbour syenar.net)
* utils/hbmk2/hbmk2.*.po
* utils/hbmk2/hbmk2.prg
+ added '-hb30' option and '{hb30}' filter macro to allow
reverting back to Harbour 3.0.0
+ added provisions for merging 'hblang' and 'hbcpage'
core libs into new 'hbnat' lib
+ SETCURSOR() and SETCOLOR() references will now also
trigger full screen CUI mode in hbrun scripts
+ documented the fact that GTCGI is default GT for scripts
and that it's switched to another one (and which) when
CUI mode script is detected
+ marked all information in help with '[*]' which shows
host platform dependent, dynamic data (f.e. systems paths)
+ hbmk.hbc will now be searched for under user's home
directory on non-*nix, too
+ added '-find' special hbmk2 option for finding Harbour functions.
It will lookup any strings passed as command line arguments
and display in which library they can be found. It will
also do the lookup in packages not currently installed.
Replaces similar 'hbrun bin/find' functionality, but now
uses existing code inside hbmk2. The new implementation
also supports wildcards.
Example:
hbmk2 -find wapi_*string ntos wild
! documented that hbstart.hb is first searched for in
current working directory
! ${hb_ver} and ${hb_verstr} macros now change their value
in compatibility modes (-hb10, -hb20, -hb30, -xhb)
+ -longhelpmd output will now not contain installation
specific (and potentially sensitive) data: home directory,
hbmk2 directory, only generic replacement terms
+ version= directive help text got a mention of its default
value (it was so far only mentioned next to HBMK_HAS_<hbcname>
envvar)
+ documented exit codes in help text
* minor tweaks to some help lines
* cleanup for Markdown formatting internals
* plugin callback variable "nErrorLevel" renamed to "nExitCode"
[INCOMPATIBLE]
* exit code changed to value 6 from 1 when hbrun script has
a compile error [INCOMPATIBLE]
+ use core hb_DirSepToOS() where possible
- deleted hbmk2 plugin API function hbmk_PathSepToSelf()
Use core hb_DirSepToOS() instead. [INCOMPATIBLE]
+ added '-exitstr' hbmk2 option which will display the exit result
in textual format
* contrib/hbpre.hbm
* contrib/make.hb
% use -exitstr hbmk2 option instead of rolling a local copy
of possible result strings
* src/pp/ppcore.c
+ generate '\a' '\f' '\v' escape chars
- bin/find.hb
* config/postinst.hb
* package/harbour.spec
- deleted find.hb for 'hbrun bin/find' functionality.
Replaced by 'hbmk2 -find' option.
* src/rtl/Makefile
- src/rtl/strxchg.c
+ src/rtl/strrepl.c
* src/rtl/tget.prg
* utils/hbmk2/hbmk2.prg
* include/harbour.hbx
* ChangeLog.txt
* renamed HB_STRXCHG() to HB_STRREPLACE(), according to:
https://groups.google.com/d/topic/harbour-devel/vSzlAkv6h9Y/discussion
* updated function skeleton in ChangeLog and C source
(also with new hash parameter)
* contrib/hbsqlit3/hbsqlit3.hbp
* contrib/hbsqlit3/hbsqlit3.hbx
+ contrib/hbsqlit3/errstr.prg
+ hb_sqlite3_errstr_short( <nError> ) -> <cError>
* contrib/hbsqlit3/tests/authoriz.prg
* contrib/hbsqlit3/tests/backup.prg
* contrib/hbsqlit3/tests/hooks.prg
% use hb_sqlite3_errstr_short() instead of implementing
it locally in each example
% use sqlite3_errstr() API to get long error strings instead
of reimplementing it locally
% minor opt
* contrib/hbsqlit3/hbsqlit3.hbp
- contrib/hbsqlit3/hdbcsqlt.prg
+ contrib/hbsqlit3/hdbc.prg
* renamed
* contrib/hbhpdf/errstr.prg
* contrib/hbmzip/mziperr.prg
! indenting
* contrib/hbtip/tests/tiptest.prg
* leave color
2013-02-17 12:43 UTC+0100 Viktor Szakats (harbour syenar.net)
* src/codepage/*.c
- src/codepage/l_*.c
@@ -80,10 +180,10 @@
+ added support for using hash arrays as replace pairs in second
argument of hb_strXChg() - hash arrays are accepted if 3-rd parameter
is ommitted or is NIL. Now this alternative syntax:
hb_strXChg( <cString>, <hChanges> ) -> <cResult>
hb_StrReplace( <cString>, <hChanges> ) -> <cResult>
is also supported, i.e.:
cData := hb_strXChg( cSource, { "{LI}" => cLIValue, ;
"{FI}" => cFIValue } )
cData := hb_StrReplace( cSource, { "{LI}" => cLIValue, ;
"{FI}" => cFIValue } )
Please remember that single hash layer is much lighter data type
then array of subarrays because it needs only one GC item when
each subarray is new GC item.
@@ -121,7 +221,7 @@
I'm only wishing for a syntax that keeps search
and replace values closer together to keep the
source well readable, f.e.:
STRXCHG( str, { ;
HB_STRXCHG( str, { ;
{ "{LI}", cLIValue }, ;
{ "{FI}", cFIValue } } )
Though it may be solved with a local wrapper because
@@ -151,8 +251,8 @@
* harbour/src/rtl/Makefile
+ harbour/src/rtl/strxchg.c
+ added new PRG function:
hb_strXChg( <cString>, <cSource> | <acSource>, ;
<cDest> | <acDest> ] ) -> <cResult>
hb_StrReplace( <cString>, <cSource> | <acSource> | <hReplace>, ;
<cDest> | <acDest> ] ) -> <cResult>
This function allows to easy replace different substrings in
given string.
If 2-nd is string then each character in <cString> which exists
@@ -167,15 +267,15 @@
StrTran() calls all regex which can change also substituted values.
Examples:
// encode XML value
cXmlText := hb_strXChg( cText, "<>&", { "&lt;", "&gt;", "&amp;" } )
cXmlText := hb_StrReplace( cText, "<>&", { "&lt;", "&gt;", "&amp;" } )
// now decode it to raw text
cText := hb_strXChg( cXmlText, { "&lt;", "&gt;", "&amp;" }, "<>&" )
cText := hb_StrReplace( cXmlText, { "&lt;", "&gt;", "&amp;" }, "<>&" )
// strip all digits from string
cNoDigit := hb_strXChg( cText, "0123456789" )
cNoDigit := hb_StrReplace( cText, "0123456789" )
// extract all digits from string
cDigits := hb_strXChg( cText, cNoDigit )
cDigits := hb_StrReplace( cText, cNoDigit )
// convert chosen letters to upper case
? hb_strXChg( "hello world, "hlwd", "HLWD" )
? hb_StrReplace( "hello world, "hlwd", "HLWD" )
* harbour/src/common/hbfopen.c
* added workaround for missing wsystem() in XCC

View File

@@ -1,97 +0,0 @@
/*
* $Id$
*/
/*
* Harbour Project source code:
* Lists selected functions and their location
*
* Copyright 2012 Viktor Szakats (harbour syenar.net)
* www - http://harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
* their web site at http://www.gnu.org/).
*
*/
#include "directry.ch"
PROCEDURE Main( ... )
LOCAL cRoot := hb_DirBase() + ".." + hb_ps()
WalkDir( cRoot + "include", { ... }, "core" )
WalkDir( cRoot + "contrib", { ... }, "contrib" )
WalkDir( cRoot + "addons" , { ... }, "addon" )
RETURN
STATIC PROCEDURE WalkDir( cDir, aContains, cComponent )
LOCAL aFile
cDir := hb_DirSepAdd( hb_DirSepToOS( cDir ) )
FOR EACH aFile IN hb_DirScan( cDir, "*.hbx" )
ProcessFile( cDir + aFile[ F_NAME ], aContains, cComponent )
NEXT
RETURN
STATIC PROCEDURE ProcessFile( cFileName, aContains, cComponent )
LOCAL cDynamic
LOCAL lFirst := .T.
FOR EACH cDynamic IN LoadHBX( cFileName )
IF Empty( aContains ) .OR. AScan( aContains, {| tmp | Upper( tmp ) $ Upper( cDynamic ) } ) > 0
IF lFirst
lFirst := .F.
IF cComponent == "core"
cFileName := "(" + cComponent + ")"
ELSE
cFileName := cComponent + " - " + hb_FNameExtSet( hb_FNameName( hb_DirSepToOS( cFileName ) ), ".hbc" )
ENDIF
OutStd( cFileName + ": " + hb_eol() )
ENDIF
OutStd( " " + cDynamic + "()" + hb_eol() )
ENDIF
NEXT
RETURN
STATIC FUNCTION LoadHBX( cFileName )
LOCAL cFile
LOCAL pRegex
LOCAL tmp
LOCAL aDynamic := {}
LOCAL cFilter
IF ! Empty( cFile := hb_MemoRead( cFileName ) )
FOR EACH cFilter IN { ;
"^DYNAMIC ([a-zA-Z0-9_]*)$", ;
"ANNOUNCE ([a-zA-Z0-9_]*)$" }
IF ! Empty( pRegex := hb_regexComp( cFilter, .T., .T. ) )
FOR EACH tmp IN hb_regexAll( pRegex, StrTran( cFile, Chr( 13 ) ),,,,, .T. )
AAdd( aDynamic, tmp[ 2 ] )
NEXT
ENDIF
NEXT
ENDIF
RETURN aDynamic

View File

@@ -84,7 +84,6 @@ PROCEDURE Main( ... )
/* public Harbour scripts */
FOR EACH tmp IN { ;
"bin/3rdpatch.hb", ;
"bin/find.hb", ;
"bin/harbour.ucf" }
mk_hb_FCopy( tmp, GetEnvC( "HB_INSTALL_BIN" ) + hb_ps() )
NEXT

View File

@@ -60,7 +60,7 @@
FUNCTION hb_HPDF_GetErrorString( nStatus )
IF ! HB_ISNUMERIC( nStatus )
RETURN "HB_HPDF_INVALID"
RETURN "HB_HPDF_INVALID"
ENDIF
SWITCH nStatus

View File

@@ -55,7 +55,7 @@
FUNCTION hb_zipErrorStr( nStatus )
IF ! HB_ISNUMERIC( nStatus )
RETURN "ZIP_INVALID"
RETURN "ZIP_INVALID"
ENDIF
DO CASE
@@ -80,7 +80,7 @@ FUNCTION hb_zipErrorStr( nStatus )
FUNCTION hb_unzipErrorStr( nStatus )
IF ! HB_ISNUMERIC( nStatus )
RETURN "UNZ_INVALID"
RETURN "UNZ_INVALID"
ENDIF
DO CASE

View File

@@ -9,6 +9,7 @@
{HB_BUILD_VERBOSE}-quiet-
{HB_BUILD_VERBOSE}-info
{HB_BUILD_VERBOSE}-trace
-exitstr
{!HB_BUILD_DEBUG}-l

View File

@@ -0,0 +1,94 @@
/*
* $Id$
*/
/*
* Harbour Project source code:
* Supplementary functions (error strings)
*
* Copyright 2013 Viktor Szakats (harbour syenar.net)
* Copyright 2009 P.Chornyj <myorg63@mail.ru>
* www - http://harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING.txt. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#include "hbsqlit3.ch"
FUNCTION hb_sqlite3_errstr_short( nError )
IF ! HB_ISNUMERIC( nError )
RETURN "HB_SQLITE_INVALID"
ENDIF
SWITCH nError
CASE SQLITE_OK ; RETURN "SQLITE_OK"
CASE SQLITE_ERROR ; RETURN "SQLITE_ERROR"
CASE SQLITE_INTERNAL ; RETURN "SQLITE_INTERNAL"
CASE SQLITE_PERM ; RETURN "SQLITE_PERM"
CASE SQLITE_ABORT ; RETURN "SQLITE_ABORT"
CASE SQLITE_BUSY ; RETURN "SQLITE_BUSY"
CASE SQLITE_LOCKED ; RETURN "SQLITE_LOCKED"
CASE SQLITE_NOMEM ; RETURN "SQLITE_NOMEM"
CASE SQLITE_READONLY ; RETURN "SQLITE_READONLY"
CASE SQLITE_INTERRUPT ; RETURN "SQLITE_INTERRUPT"
CASE SQLITE_IOERR ; RETURN "SQLITE_IOERR"
CASE SQLITE_CORRUPT ; RETURN "SQLITE_CORRUPT"
CASE SQLITE_NOTFOUND ; RETURN "SQLITE_NOTFOUND"
CASE SQLITE_FULL ; RETURN "SQLITE_FULL"
CASE SQLITE_CANTOPEN ; RETURN "SQLITE_CANTOPEN"
CASE SQLITE_PROTOCOL ; RETURN "SQLITE_PROTOCOL"
CASE SQLITE_EMPTY ; RETURN "SQLITE_EMPTY"
CASE SQLITE_SCHEMA ; RETURN "SQLITE_SCHEMA"
CASE SQLITE_TOOBIG ; RETURN "SQLITE_TOOBIG"
CASE SQLITE_CONSTRAINT ; RETURN "SQLITE_CONSTRAINT"
CASE SQLITE_MISMATCH ; RETURN "SQLITE_MISMATCH"
CASE SQLITE_MISUSE ; RETURN "SQLITE_MISUSE"
CASE SQLITE_NOLFS ; RETURN "SQLITE_NOLFS"
CASE SQLITE_AUTH ; RETURN "SQLITE_AUTH"
CASE SQLITE_FORMAT ; RETURN "SQLITE_FORMAT"
CASE SQLITE_RANGE ; RETURN "SQLITE_RANGE"
CASE SQLITE_NOTADB ; RETURN "SQLITE_NOTADB"
CASE SQLITE_ROW ; RETURN "SQLITE_ROW"
CASE SQLITE_DONE ; RETURN "SQLITE_DONE"
ENDSWITCH
RETURN "HB_SQLITE_UNKNOWN_" + hb_ntos( nError )

View File

@@ -20,6 +20,7 @@
${hb_name}.hbx
core.c
hdbcsqlt.prg
errstr.prg
hdbc.prg
../3rd/sqlite3/sqlite3.hbc{HBMK_HAS_SQLITE3_LOCAL}

View File

@@ -21,6 +21,7 @@
#command DYNAMIC <fncs,...> => EXTERNAL <fncs>
#endif
DYNAMIC hb_sqlite3_errstr_short
DYNAMIC hdbcSQLTConnection
DYNAMIC hdbcSQLTDatabaseMetaData
DYNAMIC hdbcSQLTPreparedStatement

View File

@@ -82,6 +82,8 @@ PROCEDURE Main()
LOCAL cSQLTEXT
LOCAL pDb, cb
CLS
IF Empty( pDb := PrepareDB( cFile ) )
ErrorLevel( 1 )
RETURN
@@ -172,56 +174,16 @@ FUNCTION CallBack( nColCount, aValue, aColName )
STATIC FUNCTION cErrorMsg( nError, lShortMsg )
LOCAL aErrorCodes := { ;
{ SQLITE_ERROR, "SQLITE_ERROR", "SQL error or missing database" }, ;
{ SQLITE_INTERNAL, "SQLITE_INTERNAL", "NOT USED. Internal logic error in SQLite" }, ;
{ SQLITE_PERM, "SQLITE_PERM", "Access permission denied" }, ;
{ SQLITE_ABORT, "SQLITE_ABORT", "Callback routine requested an abort" }, ;
{ SQLITE_BUSY, "SQLITE_BUSY", "The database file is locked" }, ;
{ SQLITE_LOCKED, "SQLITE_LOCKED", "A table in the database is locked" }, ;
{ SQLITE_NOMEM, "SQLITE_NOMEM", "A malloc() failed" }, ;
{ SQLITE_READONLY, "SQLITE_READONLY", "Attempt to write a readonly database" }, ;
{ SQLITE_INTERRUPT, "SQLITE_INTERRUPT", "Operation terminated by sqlite3_interrupt()" }, ;
{ SQLITE_IOERR, "SQLITE_IOERR", "Some kind of disk I/O error occurred" }, ;
{ SQLITE_CORRUPT, "SQLITE_CORRUPT", "The database disk image is malformed" }, ;
{ SQLITE_NOTFOUND, "SQLITE_NOTFOUND", "NOT USED. Table or record not found" }, ;
{ SQLITE_FULL, "SQLITE_FULL", "Insertion failed because database is full" }, ;
{ SQLITE_CANTOPEN, "SQLITE_CANTOPEN", "Unable to open the database file" }, ;
{ SQLITE_PROTOCOL, "SQLITE_PROTOCOL", "NOT USED. Database lock protocol error" }, ;
{ SQLITE_EMPTY, "SQLITE_EMPTY", "Database is empty" }, ;
{ SQLITE_SCHEMA, "SQLITE_SCHEMA", "The database schema changed" }, ;
{ SQLITE_TOOBIG, "SQLITE_TOOBIG", "String or BLOB exceeds size limit" }, ;
{ SQLITE_CONSTRAINT, "SQLITE_CONSTRAINT", "Abort due to constraint violation" }, ;
{ SQLITE_MISMATCH, "SQLITE_MISMATCH", "Data type mismatch" }, ;
{ SQLITE_MISUSE, "SQLITE_MISUSE", "Library used incorrectly" }, ;
{ SQLITE_NOLFS, "SQLITE_NOLFS", "Uses OS features not supported on host" }, ;
{ SQLITE_AUTH, "SQLITE_AUTH", "Authorization denied" }, ;
{ SQLITE_FORMAT, "SQLITE_FORMAT", "Auxiliary database format error" }, ;
{ SQLITE_RANGE, "SQLITE_RANGE", "2nd parameter to sqlite3_bind out of range" }, ;
{ SQLITE_NOTADB, "SQLITE_NOTADB", "File opened that is not a database file" }, ;
{ SQLITE_ROW, "SQLITE_ROW", "sqlite3_step() has another row ready" }, ;
{ SQLITE_DONE, "SQLITE_DONE", "sqlite3_step() has finished executing" } ;
}, nIndex, cErrorMsg := "UNKNOWN"
hb_default( @lShortMsg, .T. )
IF HB_ISNUMERIC( nError )
IF nError == 0
cErrorMsg := "SQLITE_OK"
ELSE
nIndex := AScan( aErrorCodes, {| x | x[ 1 ] == nError } )
cErrorMsg := iif( nIndex > 0, aErrorCodes[ nIndex ][ iif( lShortMsg, 2, 3 ) ], cErrorMsg )
ENDIF
ENDIF
RETURN cErrorMsg
RETURN iif( lShortMsg, hb_sqlite3_errstr_short( nError ), sqlite3_errstr( nError ) )
/**
*/
STATIC FUNCTION PrepareDB( cFile )
LOCAL cSQLTEXT, cMsg
LOCAL cSQLTEXT
LOCAL pDb, pStmt
LOCAL hPerson := { ;
"Bob" => 52, ;
@@ -239,9 +201,7 @@ STATIC FUNCTION PrepareDB( cFile )
ENDIF
cSQLTEXT := "CREATE TABLE person( name TEXT, age INTEGER, pasw TEXT(32) )"
cMsg := cErrorMsg( sqlite3_exec( pDb, cSQLTEXT ) )
IF !( cMsg == "SQLITE_OK" )
IF sqlite3_exec( pDb, cSQLTEXT ) != SQLITE_OK
? "Can't create table : person"
pDb := NIL // close database

View File

@@ -141,56 +141,16 @@ FUNCTION CallBack( nColCount, aValue, aColName )
STATIC FUNCTION cErrorMsg( nError, lShortMsg )
LOCAL aErrorCodes := { ;
{ SQLITE_ERROR, "SQLITE_ERROR", "SQL error or missing database" }, ;
{ SQLITE_INTERNAL, "SQLITE_INTERNAL", "NOT USED. Internal logic error in SQLite" }, ;
{ SQLITE_PERM, "SQLITE_PERM", "Access permission denied" }, ;
{ SQLITE_ABORT, "SQLITE_ABORT", "Callback routine requested an abort" }, ;
{ SQLITE_BUSY, "SQLITE_BUSY", "The database file is locked" }, ;
{ SQLITE_LOCKED, "SQLITE_LOCKED", "A table in the database is locked" }, ;
{ SQLITE_NOMEM, "SQLITE_NOMEM", "A malloc() failed" }, ;
{ SQLITE_READONLY, "SQLITE_READONLY", "Attempt to write a readonly database" }, ;
{ SQLITE_INTERRUPT, "SQLITE_INTERRUPT", "Operation terminated by sqlite3_interrupt()" }, ;
{ SQLITE_IOERR, "SQLITE_IOERR", "Some kind of disk I/O error occurred" }, ;
{ SQLITE_CORRUPT, "SQLITE_CORRUPT", "The database disk image is malformed" }, ;
{ SQLITE_NOTFOUND, "SQLITE_NOTFOUND", "NOT USED. Table or record not found" }, ;
{ SQLITE_FULL, "SQLITE_FULL", "Insertion failed because database is full" }, ;
{ SQLITE_CANTOPEN, "SQLITE_CANTOPEN", "Unable to open the database file" }, ;
{ SQLITE_PROTOCOL, "SQLITE_PROTOCOL", "NOT USED. Database lock protocol error" }, ;
{ SQLITE_EMPTY, "SQLITE_EMPTY", "Database is empty" }, ;
{ SQLITE_SCHEMA, "SQLITE_SCHEMA", "The database schema changed" }, ;
{ SQLITE_TOOBIG, "SQLITE_TOOBIG", "String or BLOB exceeds size limit" }, ;
{ SQLITE_CONSTRAINT, "SQLITE_CONSTRAINT", "Abort due to constraint violation" }, ;
{ SQLITE_MISMATCH, "SQLITE_MISMATCH", "Data type mismatch" }, ;
{ SQLITE_MISUSE, "SQLITE_MISUSE", "Library used incorrectly" }, ;
{ SQLITE_NOLFS, "SQLITE_NOLFS", "Uses OS features not supported on host" }, ;
{ SQLITE_AUTH, "SQLITE_AUTH", "Authorization denied" }, ;
{ SQLITE_FORMAT, "SQLITE_FORMAT", "Auxiliary database format error" }, ;
{ SQLITE_RANGE, "SQLITE_RANGE", "2nd parameter to sqlite3_bind out of range" }, ;
{ SQLITE_NOTADB, "SQLITE_NOTADB", "File opened that is not a database file" }, ;
{ SQLITE_ROW, "SQLITE_ROW", "sqlite3_step() has another row ready" }, ;
{ SQLITE_DONE, "SQLITE_DONE", "sqlite3_step() has finished executing" } ;
}, nIndex, cErrorMsg := "UNKNOWN"
hb_default( @lShortMsg, .T. )
IF HB_ISNUMERIC( nError )
IF nError == 0
cErrorMsg := "SQLITE_OK"
ELSE
nIndex := AScan( aErrorCodes, {| x | x[ 1 ] == nError } )
cErrorMsg := iif( nIndex > 0, aErrorCodes[ nIndex ][ iif( lShortMsg, 2, 3 ) ], cErrorMsg )
ENDIF
ENDIF
RETURN cErrorMsg
RETURN iif( lShortMsg, hb_sqlite3_errstr_short( nError ), sqlite3_errstr( nError ) )
/**
*/
STATIC FUNCTION PrepareDB( cFile )
LOCAL cSQLTEXT, cMsg
LOCAL cSQLTEXT
LOCAL pDb, pStmt
LOCAL hPerson := { ;
"Bob" => 52, ;
@@ -210,9 +170,7 @@ STATIC FUNCTION PrepareDB( cFile )
sqlite3_trace( pDb, .T., "backup.log" )
cSQLTEXT := "CREATE TABLE person( name TEXT, age INTEGER )"
cMsg := cErrorMsg( sqlite3_exec( pDb, cSQLTEXT ) )
IF !( cMsg == "SQLITE_OK" )
IF sqlite3_exec( pDb, cSQLTEXT ) != SQLITE_OK
? "Can't create table : person"
pDb := NIL // close database

View File

@@ -156,52 +156,11 @@ FUNCTION HookRollback()
/**
*/
STATIC FUNCTION cErrorMsg( nError, lShortMsg )
LOCAL aErrorCodes := { ;
{ SQLITE_ERROR, "SQLITE_ERROR", "SQL error or missing database" }, ;
{ SQLITE_INTERNAL, "SQLITE_INTERNAL", "NOT USED. Internal logic error in SQLite" }, ;
{ SQLITE_PERM, "SQLITE_PERM", "Access permission denied" }, ;
{ SQLITE_ABORT, "SQLITE_ABORT", "Callback routine requested an abort" }, ;
{ SQLITE_BUSY, "SQLITE_BUSY", "The database file is locked" }, ;
{ SQLITE_LOCKED, "SQLITE_LOCKED", "A table in the database is locked" }, ;
{ SQLITE_NOMEM, "SQLITE_NOMEM", "A malloc() failed" }, ;
{ SQLITE_READONLY, "SQLITE_READONLY", "Attempt to write a readonly database" }, ;
{ SQLITE_INTERRUPT, "SQLITE_INTERRUPT", "Operation terminated by sqlite3_interrupt()" }, ;
{ SQLITE_IOERR, "SQLITE_IOERR", "Some kind of disk I/O error occurred" }, ;
{ SQLITE_CORRUPT, "SQLITE_CORRUPT", "The database disk image is malformed" }, ;
{ SQLITE_NOTFOUND, "SQLITE_NOTFOUND", "NOT USED. Table or record not found" }, ;
{ SQLITE_FULL, "SQLITE_FULL", "Insertion failed because database is full" }, ;
{ SQLITE_CANTOPEN, "SQLITE_CANTOPEN", "Unable to open the database file" }, ;
{ SQLITE_PROTOCOL, "SQLITE_PROTOCOL", "NOT USED. Database lock protocol error" }, ;
{ SQLITE_EMPTY, "SQLITE_EMPTY", "Database is empty" }, ;
{ SQLITE_SCHEMA, "SQLITE_SCHEMA", "The database schema changed" }, ;
{ SQLITE_TOOBIG, "SQLITE_TOOBIG", "String or BLOB exceeds size limit" }, ;
{ SQLITE_CONSTRAINT, "SQLITE_CONSTRAINT", "Abort due to constraint violation" }, ;
{ SQLITE_MISMATCH, "SQLITE_MISMATCH", "Data type mismatch" }, ;
{ SQLITE_MISUSE, "SQLITE_MISUSE", "Library used incorrectly" }, ;
{ SQLITE_NOLFS, "SQLITE_NOLFS", "Uses OS features not supported on host" }, ;
{ SQLITE_AUTH, "SQLITE_AUTH", "Authorization denied" }, ;
{ SQLITE_FORMAT, "SQLITE_FORMAT", "Auxiliary database format error" }, ;
{ SQLITE_RANGE, "SQLITE_RANGE", "2nd parameter to sqlite3_bind out of range" }, ;
{ SQLITE_NOTADB, "SQLITE_NOTADB", "File opened that is not a database file" }, ;
{ SQLITE_ROW, "SQLITE_ROW", "sqlite3_step() has another row ready" }, ;
{ SQLITE_DONE, "SQLITE_DONE", "sqlite3_step() has finished executing" } ;
}, nIndex, cErrorMsg := "UNKNOWN"
hb_default( @lShortMsg, .T. )
IF HB_ISNUMERIC( nError )
IF nError == 0
cErrorMsg := "SQLITE_OK"
ELSE
nIndex := AScan( aErrorCodes, {| x | x[ 1 ] == nError } )
cErrorMsg := iif( nIndex > 0, aErrorCodes[ nIndex ][ iif( lShortMsg, 2, 3 ) ], cErrorMsg )
ENDIF
ENDIF
RETURN cErrorMsg
RETURN iif( lShortMsg, hb_sqlite3_errstr_short( nError ), sqlite3_errstr( nError ) )
/**
*/

View File

@@ -57,11 +57,9 @@ PROCEDURE Main( cUrl, cFile )
LOCAL oUrl, oClient
LOCAL cData
SetColor( "w+/b" )
CLS
@ 1, 6 SAY "X H A R B O U R - TIP (class based internet client protocol) test"
IF Empty( cUrl )
@ 4, 5 SAY "USAGE: tipTest <URI> [dumpToOrFromFileName]"
Terminate()

View File

@@ -568,33 +568,8 @@ STATIC FUNCTION call_hbmk2( cProjectPath, cOptionsPre, cDynSuffix, cStdErr, cStd
nErrorLevel := mk_hb_processRun( cCommand )
ENDIF
IF nErrorLevel != 0
OutStd( hb_StrFormat( "! '%1$s' returned status: %2$d '%3$s'", cProjectPath, nErrorLevel, hbmk2_errorstr( nErrorLevel ) ) + hb_eol() )
ENDIF
RETURN nErrorLevel
STATIC FUNCTION hbmk2_errorstr( nErrorLevel )
SWITCH nErrorLevel
CASE 0 ; RETURN "no error"
CASE 1 ; RETURN "unknown platform"
CASE 2 ; RETURN "unknown compiler"
CASE 3 ; RETURN "failed Harbour detection"
CASE 5 ; RETURN "failed stub creation"
CASE 6 ; RETURN "failed in compilation"
CASE 7 ; RETURN "failed in final assembly"
CASE 8 ; RETURN "unsupported"
CASE 9 ; RETURN "failed to create working directory"
CASE 19 ; RETURN "help"
CASE 10 ; RETURN "dependency missing or disabled"
CASE 20 ; RETURN "plugin initialization"
CASE 30 ; RETURN "too deep nesting"
CASE 50 ; RETURN "stop requested"
ENDSWITCH
RETURN "unknown"
STATIC FUNCTION mk_hb_processRun( cCommand, ... )
OutStd( cCommand + hb_eol() )

View File

@@ -810,7 +810,7 @@ DYNAMIC hb_StrToExp
DYNAMIC hb_StrToHex
DYNAMIC hb_StrToTS
DYNAMIC hb_StrToUTF8
DYNAMIC hb_StrXChg
DYNAMIC hb_StrReplace
DYNAMIC hb_StrXor
DYNAMIC hb_threadDetach
DYNAMIC hb_threadID

View File

@@ -447,7 +447,6 @@ rm -rf $RPM_BUILD_ROOT
%{_bindir}/hbi18n
%{_bindir}/hbmk2
%{_bindir}/hbmk2.*.hbl
%{_bindir}/find.hb
%{_bindir}/contrib.hbr
%{_mandir}/man1/*.1*
%dir %{_includedir}/%{name}

View File

@@ -1629,6 +1629,15 @@ static int hb_pp_tokenStr( PHB_PP_TOKEN pToken, PHB_MEM_BUFFER pBuffer,
case '\b':
iq = ch = 'b';
break;
case '\f':
iq = ch = 'f';
break;
case '\v':
iq = ch = 'v';
break;
case '\a':
iq = ch = 'a';
break;
case '\0':
iq = ch = '0';
break;

View File

@@ -182,9 +182,9 @@ C_SOURCES := \
strcase.c \
strclear.c \
strmatch.c \
strrepl.c \
strtoexp.c \
strtran.c \
strxchg.c \
strxor.c \
strzero.c \
stuff.c \

View File

@@ -4,7 +4,7 @@
/*
* Harbour Project source code:
* HB_STRXCHG()
* HB_STRREPLACE()
*
* Copyright 2013 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
* www - http://harbour-project.org
@@ -54,10 +54,10 @@
#include "hbapiitm.h"
#include "hbapierr.h"
/* hb_strXChg( <cString>, <cSource> | <acSource>, [ <cDest> | <acDest> ] )
/* hb_StrReplace( <cString>, [ <cSource> | <acSource> | <hReplace> ], [ <cDest> | <acDest> ] )
* -> <cResult>
*/
HB_FUNC( HB_STRXCHG )
HB_FUNC( HB_STRREPLACE )
{
PHB_ITEM pText = hb_param( 1, HB_IT_STRING );
PHB_ITEM pSrc = hb_param( 2, HB_IT_STRING | HB_IT_ARRAY |

View File

@@ -1326,7 +1326,7 @@ METHOD unTransform() CLASS Get
cBuffer := StrTran( cBuffer, Chr( 1 ) )
cBuffer := hb_StrXChg( cBuffer, ;
cBuffer := hb_StrReplace( cBuffer, ;
"$*-()", ;
" " )

View File

@@ -293,7 +293,7 @@ msgstr "Advertencia: No se puede eliminar destino existente '%1$s'."
#: hbmk2.prg:7960 hbmk2.prg:11650 hbmk2.prg:13120
#, c-format
msgid "Certain .hbc lines (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) and corresponding command line parameters will accept macros: ${hb_root}, ${hb_dir}, ${hb_dirname}, ${hb_name}, ${hb_self}, ${hb_curdir}, ${hb_tempdir}, ${hb_targetname}, ${hb_targettype}, ${hb_plat}, ${hb_comp}, ${hb_comp_ver}, ${hb_build}, ${hb_cpu}, ${hb_work}, ${hb_workdynsub}, ${hb_dynprefix}, ${hb_dynsuffix}, ${hb_dynext}, ${hb_ver}, ${hb_verstr}, ${hb_major}, ${hb_minor}, ${hb_release}, ${hb_status}, ${hb_revision}, ${hb_host_plat}, ${hb_host_plat_unix}, ${hb_bin}, ${hb_lib}, ${hb_lib3rd}, ${hb_dyn}, ${hb_inc}, ${hb_first}, ${hb_outputdir}, ${hb_outputname}, ${hb_level}, ${<envvar>}. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
msgid "Most .hbc lines (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) and corresponding command line parameters will accept macros: ${hb_root}, ${hb_dir}, ${hb_dirname}, ${hb_name}, ${hb_self}, ${hb_curdir}, ${hb_tempdir}, ${hb_targetname}, ${hb_targettype}, ${hb_plat}, ${hb_comp}, ${hb_comp_ver}, ${hb_build}, ${hb_cpu}, ${hb_work}, ${hb_workdynsub}, ${hb_dynprefix}, ${hb_dynsuffix}, ${hb_dynext}, ${hb_ver}, ${hb_verstr}, ${hb_major}, ${hb_minor}, ${hb_release}, ${hb_status}, ${hb_revision}, ${hb_host_plat}, ${hb_host_plat_unix}, ${hb_bin}, ${hb_lib}, ${hb_lib3rd}, ${hb_dyn}, ${hb_inc}, ${hb_first}, ${hb_outputdir}, ${hb_outputname}, ${hb_level}, ${<envvar>}. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
msgstr "Algunas opciones del archivo .hbc (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) y sus correspondientes parámetros de línea de comando aceptan las siguientes macros: ${hb_root}, ${hb_dir}, ${hb_dirname}, ${hb_name}, ${hb_self}, ${hb_curdir}, ${hb_tempdir}, ${hb_targetname}, ${hb_targettype}, ${hb_plat}, ${hb_comp}, ${hb_comp_ver}, ${hb_build}, ${hb_cpu}, ${hb_work}, ${hb_workdynsub}, ${hb_dynprefix}, ${hb_dynsuffix}, ${hb_dynext}, ${hb_ver}, ${hb_verstr}, ${hb_major}, ${hb_minor}, ${hb_release}, ${hb_status}, ${hb_revision}, ${hb_host_plat}, ${hb_host_plat_unix}, ${hb_bin}, ${hb_lib}, ${hb_lib3rd}, ${hb_dyn}, ${hb_inc}, ${hb_first}, ${hb_outputdir}, ${hb_outputname}, ${hb_level}, ${<envvar>}. libpaths= tambien acepta %{hb_name} que se traduce en el nombre del archivo. hbc bajo búsqueda."
#: hbmk2.prg:4258 hbmk2.prg:5785 hbmk2.prg:6364
@@ -458,7 +458,7 @@ msgstr "directorio de trabajo para el modo de compilación incremental\n(default
#: hbmk2.prg:7942 hbmk2.prg:11633 hbmk2.prg:13102
#, c-format
msgid "compress executable/dynamic lib (needs UPX)\n<lev> can be: yes, no, min, max"
msgid "compress executable/dynamic lib (needs UPX tool)\n<lev> can be: yes, no, min, max"
msgstr "comprime executable/librería dinamica (necesita UPX)\n<lev> puede ser: yes, no, min, max"
#: hbmk2.prg:7960 hbmk2.prg:11650 hbmk2.prg:13120

View File

@@ -109,7 +109,7 @@ msgstr "Figyelem: C/C++ fordító parancsállománya ne hozható létre, folytat
#: hbmk2.prg:7941 hbmk2.prg:11633 hbmk2.prg:13102
#, c-format
msgid "compress executable/dynamic lib (needs UPX)\n<lev> can be: yes, no, min, max"
msgid "compress executable/dynamic lib (needs UPX tool)\n<lev> can be: yes, no, min, max"
msgstr "tömörítse a végeredményt (UPX szükséges)\n<lev> lehet: yes, no, min, max"
#: hbmk2.prg:7941 hbmk2.prg:11633 hbmk2.prg:13102
@@ -984,8 +984,8 @@ msgstr "GUI/konzol alkalmazás létrehozása"
#: hbmk2.prg:7959 hbmk2.prg:11650 hbmk2.prg:13120
#, c-format
msgid "Certain .hbc lines (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) and corresponding command line parameters will accept macro variables. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
msgstr "Számos .hbc opcióban és parancssori megfelelőikben (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) használhatók makró változókat. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
msgid "Most .hbc lines (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) and corresponding command line parameters will accept macro variables. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
msgstr "A legtöbb .hbc opcióban és parancssori megfelelőikben (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) használhatók makró változókat. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
#: hbmk2.prg:7941 hbmk2.prg:11633 hbmk2.prg:13102
#, c-format

File diff suppressed because it is too large Load Diff

View File

@@ -293,7 +293,7 @@ msgstr "Atenção: Não foi possível excluir o alvo '%1$s'."
#: hbmk2.prg:7960 hbmk2.prg:11650 hbmk2.prg:13120
#, c-format
msgid "Certain .hbc lines (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) and corresponding command line parameters will accept macros: ${hb_root}, ${hb_dir}, ${hb_dirname}, ${hb_name}, ${hb_self}, ${hb_curdir}, ${hb_tempdir}, ${hb_targetname}, ${hb_targettype}, ${hb_plat}, ${hb_comp}, ${hb_comp_ver}, ${hb_build}, ${hb_cpu}, ${hb_work}, ${hb_workdynsub}, ${hb_dynprefix}, ${hb_dynsuffix}, ${hb_dynext}, ${hb_ver}, ${hb_verstr}, ${hb_major}, ${hb_minor}, ${hb_release}, ${hb_status}, ${hb_revision}, ${hb_host_plat}, ${hb_host_plat_unix}, ${hb_bin}, ${hb_lib}, ${hb_lib3rd}, ${hb_dyn}, ${hb_inc}, ${hb_first}, ${hb_outputdir}, ${hb_outputname}, ${hb_level}, ${<envvar>}. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
msgid "Most .hbc lines (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) and corresponding command line parameters will accept macros: ${hb_root}, ${hb_dir}, ${hb_dirname}, ${hb_name}, ${hb_self}, ${hb_curdir}, ${hb_tempdir}, ${hb_targetname}, ${hb_targettype}, ${hb_plat}, ${hb_comp}, ${hb_comp_ver}, ${hb_build}, ${hb_cpu}, ${hb_work}, ${hb_workdynsub}, ${hb_dynprefix}, ${hb_dynsuffix}, ${hb_dynext}, ${hb_ver}, ${hb_verstr}, ${hb_major}, ${hb_minor}, ${hb_release}, ${hb_status}, ${hb_revision}, ${hb_host_plat}, ${hb_host_plat_unix}, ${hb_bin}, ${hb_lib}, ${hb_lib3rd}, ${hb_dyn}, ${hb_inc}, ${hb_first}, ${hb_outputdir}, ${hb_outputname}, ${hb_level}, ${<envvar>}. libpaths= also accepts %{hb_name} which translates to the name of the .hbc file under search."
msgstr "Algumas opções do .hbc (libs=, hbcs=, prgflags=, cflags=, ldflags=, libpaths=, instfiles=, instpaths=, echo=) e seus correspondentes parâmetros de linha-de-comando aceitam as seguintes macros: ${hb_root}, ${hb_dir}, ${hb_dirname}, ${hb_name}, ${hb_self}, ${hb_curdir}, ${hb_tempdir}, ${hb_targetname}, ${hb_targettype}, ${hb_plat}, ${hb_comp}, ${hb_comp_ver}, ${hb_build}, ${hb_cpu}, ${hb_work}, ${hb_workdynsub}, ${hb_dynprefix}, ${hb_dynsuffix}, ${hb_dynext}, ${hb_ver}, ${hb_verstr}, ${hb_major}, ${hb_minor}, ${hb_release}, ${hb_status}, ${hb_revision}, ${hb_host_plat}, ${hb_host_plat_unix}, ${hb_bin}, ${hb_lib}, ${hb_lib3rd}, ${hb_dyn}, ${hb_inc}, ${hb_first}, ${hb_outputdir}, ${hb_outputname}, ${hb_level}, ${<envvar>}. libpaths= também aceitam %{hb_name} que se traduz como o nome do arquivo .hbc sob pesquisa."
#: hbmk2.prg:4258 hbmk2.prg:5785 hbmk2.prg:6364
@@ -458,7 +458,7 @@ msgstr "diretório de trabalho para o modo de compilação incremental\n(default
#: hbmk2.prg:7942 hbmk2.prg:11633 hbmk2.prg:13102
#, c-format
msgid "compress executable/dynamic lib (needs UPX)\n<lev> can be: yes, no, min, max"
msgid "compress executable/dynamic lib (needs UPX tool)\n<lev> can be: yes, no, min, max"
msgstr "comprime o executável/biblioteca dinânica (necessita de UPX)\n<lev> pode ser: yes, no, min, max"
#: hbmk2.prg:7960 hbmk2.prg:11650 hbmk2.prg:13120