diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 407bea6465..0779c32703 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,12 +17,43 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-05-17 20:47 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * include/hbextern.ch + * src/rtl/Makefile + + src/rtl/memvarhb.prg + + Added: + HB_MVSAVE( , [], [] ) + HB_MVRESTORE( , [], [], [] ) + + They serve the same purpose with same interface + and similar behavior to __MVSAVE()/__MVRESTORE() + (and __MSAVE()/__MRESTORE(), and 'SAVE TO' command), + only that they support longer than 10 char variable names. + It is not possible to add such support in Clipper-style + .mem files, so these functions will create an incompatible + file format with default '.hbv' extension. + + ; TOFIX: __MVRESTORE() restores variables as PRIVATEs + while HB_MVRESTORE() as PUBLIC. + ; NOTE: GETLIST exclusion is solved with simple trick, + as I couldn't find how it's solved in __MVSAVE(). + ; Consider this experimental solution to the problem. + + * contrib/hbmysql/tmysql.prg + % STOD( "" ) -> STOD() + + * contrib/hbide/ideprojmanager.prg + ! -hbexec -> -hbexe + + * src/rtl/typefile.prg + ! __TYPEFILE(): Fixed both RTEs to be Clipper compatible. + 2010-15-17 07:33 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) * contrib/hbqt/hbqt_hbqplaintextedit.cpp ! Fixed: misbehavior of "Del" key. * contrib/hbide/ideeditor.prg - % Changed: hb_fGetAttr( cFile, nAttr) tested agains + % Changed: hb_fGetAttr( cFile, nAttr) tested agains hb_bitAnd( nAttr, FC_READONLY ) == FC_READONLY * contrib/hbide/ideshortcuts.prg @@ -45,8 +76,8 @@ * contrib/hbide/idesources.prg + Implemented: "new" source opens a file save dialog to provide a valid name with extention. Syntax highlighting will be based on that. - + Implemented: "new" project opens a Select Path dialog to - designate the project location. The path obtained as such is + + Implemented: "new" project opens a Select Path dialog to + designate the project location. The path obtained as such is posted in the "Project Location field of "Project Properties". 2010-15-16 21:05 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) @@ -55,19 +86,19 @@ * contrib/hbide/ideedit.prg * contrib/hbide/ideeditor.prg - + Implemented: plus + + Implemented: plus file's "readonly" attribute obtained by hb_fGetAttr() == 33 ( please correct me if it is not OK on all systems ). - - "Switch ReadOnly Mode" toggles the readonly status of the + + "Switch ReadOnly Mode" toggles the readonly status of the current source in focus only if on disk attribute is normal. - ReadOnly status is permanent if disk attribute equals 33 and + ReadOnly status is permanent if disk attribute equals 33 and cannot be toggled. While in readonly mode, cut/paste/alter operation are suspened, only copy operation is supported. Copy can be performed with mouse and keyboard both and all three modes are available. - + 2010-05-17 00:59 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * contrib/sddfb/sddfb.hbi ! Sync with recent fix in contrib/hbfbird/hbfbird.hbi. diff --git a/harbour/contrib/hbide/ideprojmanager.prg b/harbour/contrib/hbide/ideprojmanager.prg index 412de5e4c6..3cd1f9f83c 100644 --- a/harbour/contrib/hbide/ideprojmanager.prg +++ b/harbour/contrib/hbide/ideprojmanager.prg @@ -443,7 +443,7 @@ METHOD IdeProjManager:pullHbpData( cHbp ) s := hbide_stripRoot( cHome, s ) NEXT - IF ( n := ascan( aOptns, {|e| lower( e ) $ "-hbexec,-hblib,-hbdyn" } ) ) > 0 + IF ( n := ascan( aOptns, {|e| lower( e ) $ "-hbexe,-hblib,-hbdyn" } ) ) > 0 cType := lower( aOptns[ n ] ) cType := iif( cType == "-hblib", "Lib", iif( cType == "-hbdyn", "Dll", "Executable" ) ) ELSE diff --git a/harbour/contrib/hbmysql/tmysql.prg b/harbour/contrib/hbmysql/tmysql.prg index f5ab462794..9d9ca5303a 100644 --- a/harbour/contrib/hbmysql/tmysql.prg +++ b/harbour/contrib/hbmysql/tmysql.prg @@ -542,7 +542,7 @@ METHOD GetRow( nRow ) CLASS TMySQLQuery CASE MYSQL_TYPE_DATE IF Empty( ::aRow[ i ] ) - ::aRow[ i ] := hb_SToD( "" ) + ::aRow[ i ] := hb_SToD() ELSE // Date format YYYY-MM-DD ::aRow[ i ] := hb_SToD( Left( ::aRow[ i ], 4 ) + SubStr( ::aRow[ i ], 6, 2 ) + Right( ::aRow[ i ], 2 ) ) @@ -1167,7 +1167,7 @@ METHOD GetBlankRow( lSetValues ) CLASS TMySQLTable EXIT CASE MYSQL_TYPE_DATE - aRow[ i ] := hb_SToD( "" ) + aRow[ i ] := hb_SToD() EXIT OTHERWISE diff --git a/harbour/include/hbextern.ch b/harbour/include/hbextern.ch index 8d17fc4611..cbbf61b1a8 100644 --- a/harbour/include/hbextern.ch +++ b/harbour/include/hbextern.ch @@ -845,6 +845,8 @@ EXTERNAL HB_ISSYMBOL EXTERNAL HB_ISDATETIME EXTERNAL HB_ISTIMESTAMP EXTERNAL HB_GET +EXTERNAL HB_MVSAVE +EXTERNAL HB_MVRESTORE EXTERNAL HB_DATETIME EXTERNAL HB_CTOD diff --git a/harbour/src/rtl/Makefile b/harbour/src/rtl/Makefile index d13ac7a5fd..69a2f089b3 100644 --- a/harbour/src/rtl/Makefile +++ b/harbour/src/rtl/Makefile @@ -224,6 +224,7 @@ PRG_SOURCES := \ listbox.prg \ memoedit.prg \ memvarbl.prg \ + memvarhb.prg \ menuto.prg \ menusys.prg \ objfunc.prg \ diff --git a/harbour/src/rtl/memvarhb.prg b/harbour/src/rtl/memvarhb.prg new file mode 100644 index 0000000000..581cff487c --- /dev/null +++ b/harbour/src/rtl/memvarhb.prg @@ -0,0 +1,285 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * MEMVAR save/restore functions with >10 variable name support. + * + * Copyright 2010 Viktor Szakats (harbour.01 syenar.hu) + * www - http://www.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. 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. + * + */ + +/* TOFIX: PUBLICs are created on restore, instead of PRIVATEs */ + +#include "hbmemvar.ch" +#include "common.ch" +#include "error.ch" +#include "fileio.ch" + +#define _HBMEM_EXT ".hbv" + +PROCEDURE HB_MVSAVE( cFileName, cMask, lIncludeMask ) + LOCAL nCount + LOCAL xValue + LOCAL cName + LOCAL nScope + LOCAL lMatch + + LOCAL cExt + LOCAL aVars + + LOCAL fhnd + + LOCAL tmp + + LOCAL oError + LOCAL xRecover + LOCAL nRetries + +#ifdef HB_CLP_STRICT + IF PCount() == 3 .AND. ; + ISCHARACTER( cFileName ) .AND. ; + ISCHARACTER( cMask ) .AND. ; + ISLOGICAL( lIncludeMask ) +#else + IF ISCHARACTER( cFileName ) +#endif + IF Set( _SET_DEFEXTENSIONS ) + hb_FNameSplit( cFileName, NIL, NIL, @cExt ) + IF Empty( cExt ) + cFileName += _HBMEM_EXT + ENDIF + ENDIF + + IF ! ISCHARACTER( cMask ) .OR. ; + Empty( cMask ) .OR. Left( cMask, 1 ) == "*" + cMask := "*" + ENDIF + + IF ! ISLOGICAL( lIncludeMask ) + lIncludeMask := .T. + ENDIF + + aVars := {} + + FOR EACH nScope IN { HB_MV_PUBLIC, HB_MV_PRIVATE } + nCount := __mvDbgInfo( nScope ) + FOR tmp := 1 TO nCount + xValue := __mvDbgInfo( nScope, tmp, @cName ) + IF !( cName == "GETLIST" ) + lMatch := hb_WildMatchI( cMask, cName ) + IF iif( lIncludeMask, lMatch, ! lMatch ) + AAdd( aVars, { Upper( cName ), xValue } ) + ENDIF + ENDIF + NEXT + NEXT + + nRetries := 0 + DO WHILE .T. + fhnd := hb_FCreate( cFileName, FC_NORMAL, FO_CREAT + FO_TRUNC + FO_READWRITE + FO_EXCLUSIVE ) + IF fhnd == F_ERROR + oError := ErrorNew() + + oError:severity := ES_ERROR + oError:genCode := EG_OPEN + oError:subSystem := "BASE" + oError:subCode := 2006 + oError:canRetry := .T. + oError:canDefault := .T. + oError:fileName := cFileName + oError:osCode := FError() + oError:tries := ++nRetries + + xRecover := Eval( ErrorBlock(), oError ) + IF ISLOGICAL( xRecover ) .AND. xRecover + LOOP + ENDIF + ENDIF + EXIT + ENDDO + + IF fhnd != F_ERROR + FWrite( fhnd, hb_serialize( aVars ) ) + FClose( fhnd ) + ENDIF + ELSE + oError := ErrorNew() + + oError:severity := ES_ERROR + oError:genCode := EG_ARG + oError:subSystem := "BASE" + oError:subCode := 2008 + oError:canRetry := .F. + oError:canDefault := .F. + oError:Args := hb_AParams() + oError:operation := ProcName() + + Eval( ErrorBlock(), oError ) + ENDIF + + RETURN NIL + +FUNCTION HB_MVRESTORE( cFileName, lAdditive, cMask, lIncludeMask ) + LOCAL item + LOCAL cName + LOCAL lMatch + + LOCAL cExt + LOCAL aVars + LOCAL cBuffer + LOCAL xValue + + LOCAL fhnd + + LOCAL oError + LOCAL xRecover + LOCAL nRetries + +#ifdef HB_CLP_STRICT + IF ISCHARACTER( cFileName ) .AND. ; + ISLOGICAL( lAdditive ) +#else + IF ISCHARACTER( cFileName ) +#endif + + IF ! ISLOGICAL( lAdditive ) + lAdditive := .T. + ENDIF + + IF ! lAdditive + __MVClear() + ENDIF + + IF Set( _SET_DEFEXTENSIONS ) + hb_FNameSplit( cFileName, NIL, NIL, @cExt ) + IF Empty( cExt ) + cFileName += _HBMEM_EXT + ENDIF + ENDIF + + IF ! ISCHARACTER( cFileName ) .OR. ; + Empty( cMask ) .OR. Left( cMask, 1 ) == "*" + cMask := "*" + ENDIF + + IF ! ISLOGICAL( lIncludeMask ) + lIncludeMask := .T. + ENDIF + + nRetries := 0 + DO WHILE .T. + fhnd := FOpen( cFileName, FO_READ ) + IF fhnd == F_ERROR + oError := ErrorNew() + + oError:severity := ES_ERROR + oError:genCode := EG_OPEN + oError:subSystem := "BASE" + oError:subCode := 2005 + oError:canRetry := .T. + oError:canDefault := .T. + oError:fileName := cFileName + oError:osCode := FError() + oError:tries := ++nRetries + + xRecover := Eval( ErrorBlock(), oError ) + IF ISLOGICAL( xRecover ) .AND. xRecover + LOOP + ENDIF + ENDIF + EXIT + ENDDO + + IF fhnd == F_ERROR + RETURN .F. + ENDIF + + cBuffer := Space( FSeek( fhnd, 0, FS_END ) ) + FSeek( fhnd, 0, FS_SET ) + FRead( fhnd, @cBuffer, Len( cBuffer ) ) + FClose( fhnd ) + + aVars := hb_deserialize( cBuffer ) + cBuffer := NIL + + IF ISARRAY( aVars ) + FOR EACH item IN aVars + IF ISARRAY( item ) .AND. Len( item ) == 2 .AND. ; + ISCHARACTER( item[ 1 ] ) .AND. ; + ! Empty( item[ 1 ] ) + + cName := item[ 1 ] + lMatch := hb_WildMatchI( cMask, cName ) + IF iif( lIncludeMask, lMatch, ! lMatch ) + IF xValue == NIL + xValue := item[ 2 ] + ENDIF + IF __MVExist( cName ) + &cName := item[ 2 ] + ELSE + PUBLIC &cName := item[ 2 ] + ENDIF + ENDIF + ENDIF + NEXT + ENDIF + + RETURN xValue + ELSE + oError := ErrorNew() + + oError:severity := ES_ERROR + oError:genCode := EG_ARG + oError:subSystem := "BASE" + oError:subCode := 2007 + oError:canRetry := .F. + oError:canDefault := .F. + oError:Args := hb_AParams() + oError:operation := ProcName() + + Eval( ErrorBlock(), oError ) + ENDIF + + RETURN NIL diff --git a/harbour/src/rtl/typefile.prg b/harbour/src/rtl/typefile.prg index b5f8560cdb..236ddc6e44 100644 --- a/harbour/src/rtl/typefile.prg +++ b/harbour/src/rtl/typefile.prg @@ -80,10 +80,10 @@ PROCEDURE __TypeFile( cFile, lPrint ) IF ! ISCHARACTER( cFile ) oErr := ErrorNew() oErr:severity := ES_ERROR - oErr:genCode := EG_OPEN + oErr:genCode := EG_ARG oErr:subSystem := "BASE" oErr:SubCode := 2009 - oErr:Description := "Argument error: __TYPEFILE" + oErr:Description := ProcName() Eval( ErrorBlock(), oErr ) ENDIF @@ -113,9 +113,9 @@ PROCEDURE __TypeFile( cFile, lPrint ) oErr:genCode := EG_OPEN oErr:subSystem := "BASE" oErr:SubCode := 2011 - oErr:Description := "Open Error: " + cFile oErr:canDefault := .T. oErr:canRetry := .T. + oErr:fileName := cFile oErr:OsCode := FError() oErr:tries := ++nRetries xRecover := Eval( ErrorBlock(), oErr )