diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 12c99c78ae..315d833d94 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,19 @@ +19991018-23:04 GMT+1 Victor Szel + + source/rtl/natmsg.c (added) + source/rtl/Makefile + source/rtl/dummy.prg + tests/rtl_test.prg + + National message related functions added. + ISAFFIRM(), ISNEGATIVE(), NATIONMSG() (by Jose Lalin) + + _NATSORTVER(), _NATMSGVER() function added. + ! Fixes and cleanup for IS*() and NATIONMSG() functions. + + Regression tests added for these new functions. + WARNING ! Please update non-GNU make systems. + * source/rtl/dircmd.prg + + NOTE added about a small anomaly in Clipper. + * source/rtl/tbrowse.prg + * Small changes. + 19991018-14:54 GMT+1 Victor Szel * source/rtl/tbrowse.prg ! PgUp() fixed to set HitTop instead of HitBottom, now the cursor will diff --git a/harbour/source/rtl/Makefile b/harbour/source/rtl/Makefile index a13141aded..8ece9fa017 100644 --- a/harbour/source/rtl/Makefile +++ b/harbour/source/rtl/Makefile @@ -31,6 +31,7 @@ C_SOURCES=\ mlcount.c \ mouseapi.c \ mtran.c \ + natmsg.c \ oldbox.c \ oldclear.c \ samples.c \ diff --git a/harbour/source/rtl/dircmd.prg b/harbour/source/rtl/dircmd.prg index daa5fec650..ede1d588a4 100644 --- a/harbour/source/rtl/dircmd.prg +++ b/harbour/source/rtl/dircmd.prg @@ -43,6 +43,10 @@ PROCEDURE __Dir( cFileMask ) IF Empty( cFileMask ) + /* NOTE: Although Cl*pper has this string in the national language + modul, it will not use it from here. + This is hard wired to English. */ + QOut( "Database Files # Records Last Update Size" ) aEval( Directory( hb_FNameMerge( Set( _SET_DEFAULT ), "*", ".dbf" ) ),; diff --git a/harbour/source/rtl/dummy.prg b/harbour/source/rtl/dummy.prg index 3b91599441..881fdbf200 100644 --- a/harbour/source/rtl/dummy.prg +++ b/harbour/source/rtl/dummy.prg @@ -108,9 +108,3 @@ FUNCTION ReadUpdated() ; RETURN .T. FUNCTION Updated() ; RETURN .T. FUNCTION __SetFormat() ; RETURN NIL -FUNCTION _NatSortVer() ; RETURN "" -FUNCTION IsAffirm() ; RETURN .F. -FUNCTION IsNegative() ; RETURN .F. -FUNCTION NationMsg() ; RETURN "" -FUNCTION _NatMsgVer() ; RETURN "" - diff --git a/harbour/source/rtl/natmsg.c b/harbour/source/rtl/natmsg.c new file mode 100644 index 0000000000..fe256bfb9e --- /dev/null +++ b/harbour/source/rtl/natmsg.c @@ -0,0 +1,228 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * NATION undocumented functions + * + * Copyright 1999 Jose Lalin + * 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 of the License, or + * (at your option) any later version, with one exception: + * + * The exception is that if you link the Harbour Runtime Library (HRL) + * and/or the Harbour Virtual Machine (HVM) 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 HRL + * and/or HVM code into it. + * + * 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/). + * + */ + +/* + * The following parts are Copyright of the individual authors. + * www - http://www.harbour-project.org + * + * Copyright 1999 Victor Szel + * HB__NATSORTVER() + * HB__NATMSGVER() + * + * See doc/license.txt for licensing terms. + * + */ + +#include + +#include "extend.h" +#include "itemapi.h" + +/* TODO: Use the Language API to retrieve these strings. */ +/* NOTE: Ad-hoc names mostly taken from various Clipper source files. + These should be named properly if exported outside this file. */ + +#define _DIR_HEADER 1 /* "Database Files # Records Last Update Size" */ +#define _LF_SAMPLES 2 /* "Do you want more samples?" */ +#define _RF_PAGENO 3 /* "Page No." */ +#define _RF_SUBTOTAL 4 /* "** Subtotal **" */ +#define _RF_SUBSUBTOTAL 5 /* "* Subsubtotal *" */ +#define _RF_TOTAL 6 /* "*** Total ***" */ +#define _GET_INSERT_ON 7 /* "Ins" */ +#define _GET_INSERT_OFF 8 /* " " */ +#define _GET_INVD_DATE 9 /* "Invalid Date" */ +#define _GET_RANGE_FROM 10 /* "Range: " */ +#define _GET_RANGE_TO 11 /* " - " */ +#define _LF_YN 12 /* "Y/N" */ /* NOTE: This should be in uppercase. */ +#define _INVALID_EXPR 13 /* "INVALID EXPRESSION" */ + +static char * s_szMessages[] = +{ + "Database Files # Records Last Update Size", + "Do you want more samples?", + "Page No.", + "** Subtotal **", + "* Subsubtotal *", + "*** Total ***", + "Ins", + " ", + "Invalid date", + "Range: ", + " - ", + "Y/N", + "INVALID EXPRESSION" +}; + +char * hb_nationGetMsg( USHORT uiMsg ) +{ + return ( uiMsg >= 1 && uiMsg <= ( sizeof( s_szMessages ) / sizeof( char * ) ) ) ? s_szMessages[ uiMsg - 1 ] : ""; +} + +/* $DOC$ + * $FUNCNAME$ + * ISAFFIRM + * $CATEGORY$ + * + * $ONELINER$ + * Checks if passed char is an affirmation char + * $SYNTAX$ + * ISAFFIRM( ) --> + * $ARGUMENTS$ + * is a char or string of chars + * $RETURNS$ + * True if passed char is an affirmation char, false otherwise + * $DESCRIPTION$ + * This function it is used to check if a user input is true or not + * regarding of the msgxxx module used. + * $EXAMPLES$ + * // Wait until user enters Y + * DO WHILE !ISAFFIRM( cYesNo ) + * ACCEPT "Sure: " TO cYesNo + * END DO + * $STATUS$ + * C + * $COMPLIANCE$ + * ISAFFIRM is fully CA-Clipper compliant. + * $SEEALSO$ + * ISNEGATIVE, NATIONMSG + * $END$ + */ + +HARBOUR HB_ISAFFIRM( void ) +{ + PHB_ITEM pItem = hb_param( 1, IT_STRING ); + + hb_retl( pItem && hb_itemGetCLen( pItem ) >= 1 && toupper( hb_itemGetCPtr( pItem )[ 0 ] ) == s_szMessages[ _LF_YN - 1 ][ 0 ] ); +} + +/* $DOC$ + * $FUNCNAME$ + * ISNEGATIVE + * $CATEGORY$ + * + * $ONELINER$ + * Checks if passed char is a negation char + * $SYNTAX$ + * ISNEGATIVE( ) --> + * $ARGUMENTS$ + * is a char or string of chars + * $RETURNS$ + * True if passed char is a negation char, false otherwise + * $DESCRIPTION$ + * This function it is used to check if a user input is true or not + * regarding of the msgxxx module used. + * $EXAMPLES$ + * // Wait until user enters N + * DO WHILE !ISNEGATIVE( cYesNo ) + * ACCEPT "Sure: " TO cYesNo + * END DO + * $STATUS$ + * C + * $COMPLIANCE$ + * ISNEGATIVE is fully CA-Clipper compliant. + * $SEEALSO$ + * ISAFFIRM, NATIONMSG + * $END$ + */ + +HARBOUR HB_ISNEGATIVE( void ) +{ + PHB_ITEM pItem = hb_param( 1, IT_STRING ); + + hb_retl( pItem && hb_itemGetCLen( pItem ) >= 1 && toupper( hb_itemGetCPtr( pItem )[ 0 ] ) == s_szMessages[ _LF_YN - 1 ][ 2 ] ); +} + +/* $DOC$ + * $FUNCNAME$ + * NATIONMSG + * $CATEGORY$ + * + * $ONELINER$ + * Returns international strings messages. + * $SYNTAX$ + * NATIONMSG( ) --> + * $ARGUMENTS$ + * is the message number you want to get + * $RETURNS$ + * If is a valid message selector return the message, if + * is nil returns "Invalid Argument" and if is any other type it + * returns an empty string. + * $DESCRIPTION$ + * This functions returns international message descriptions. + * $EXAMPLES$ + * // Displays "Sure Y/N: " and waits until user enters Y + * // Y/N is the string for NATIONMSG( 12 ) with default natmsg module. + * DO WHILE !ISAFFIRM( cYesNo ) + * ACCEPT "Sure " + NATIONMSG( 12 ) + ": " TO cYesNo + * END DO + * $STATUS$ + * C + * $COMPLIANCE$ + * ISNEGATIVE is fully CA-Clipper compliant. + * $SEEALSO$ + * ISAFFIRM, ISNEGATIVE + * $END$ + */ + +HARBOUR HB_NATIONMSG( void ) +{ + if( hb_pcount() == 0 ) + /* TODO: Replace this with Language API call. */ + hb_retc( "Invalid argument" ); + else if( ISNUM( 1 ) ) + hb_retc( hb_nationGetMsg( hb_parni( 1 ) ) ); + else + hb_retc( "" ); +} + +/* NOTE: Intentionally using one leading underscore, like in Clipper */ + +HARBOUR HB__NATSORTVER( void ) +{ + /* NOTE: CA-Cl*pper 5.2e will return: "NATSORT v1.2i x14 19/Mar/93" */ + /* NOTE: CA-Cl*pper 5.3 will return: "NATSORT v1.3i x19 06/Mar/95" */ + + hb_retc( "NATSORT (Harbour)" ); +} + +/* NOTE: Intentionally using one leading underscore, like in Clipper */ + +HARBOUR HB__NATMSGVER( void ) +{ + /* NOTE: CA-Cl*pper 5.2e will return: "NATMSGS v1.2i x14 19/Mar/93" */ + /* NOTE: CA-Cl*pper 5.3 will return: "NATMSGS v1.3i x19 06/Mar/95" */ + + hb_retc( "NATMSGS (Harbour)" ); +} diff --git a/harbour/source/rtl/tbrowse.prg b/harbour/source/rtl/tbrowse.prg index 1902e45b62..22a8c71d0d 100644 --- a/harbour/source/rtl/tbrowse.prg +++ b/harbour/source/rtl/tbrowse.prg @@ -508,7 +508,7 @@ METHOD Stabilize() CLASS TBrowse else oCol = ::aColumns[ If( ::rightVisible != 0, ::rightVisible, 1 ) ] oCol2 = ::aColumns[ If( ::Freeze > 0, 1, ::leftVisible ) ] - nColsWidth = If( oCol != nil, oCol:ColPos, 0 ) + ; + nColsWidth = If( oCol != nil, oCol:ColPos, 0 ) + ; If( oCol != nil, oCol:Width, 0 ) - oCol2:ColPos lFooters = ( ::RowCount != ::nBottom - ::nTop + 1 - If( ::lHeaders, 1, 0 ) - ; - If( Empty( ::HeadSep ), 0, 1 ) - If( Empty( ::FootSep ), 0, 1 ) ) @@ -571,7 +571,7 @@ METHOD Stabilize() CLASS TBrowse endif if lFooters // Drawing footers DispOutAt( ::nBottom, ::nLeft, Space( ( nWidth - nColsWidth ) / 2 ), ::ColorSpec ) - for n = If( ::Freeze > 0, 1, ::leftVisible ) to ::rightVisible + for n = If( ::Freeze > 0, 1, ::leftVisible ) to ::rightVisible if ::Freeze > 0 .and. n == ::Freeze + 1 n = ::leftVisible endif diff --git a/harbour/tests/rtl_test.prg b/harbour/tests/rtl_test.prg index d9ef19e1b3..69e3fcc108 100644 --- a/harbour/tests/rtl_test.prg +++ b/harbour/tests/rtl_test.prg @@ -1726,6 +1726,66 @@ STATIC FUNCTION Main_MISC() TEST_LINE( SoundEx( "Colt" ) , "C430" ) TEST_LINE( SoundEx( "C"+Chr(0)+"olt" ) , "C430" ) + /* NATION functions */ + + TEST_LINE( NationMsg() , "Invalid argument" ) + TEST_LINE( NationMsg("A") , "" ) + TEST_LINE( NationMsg(-1) , "" ) + TEST_LINE( NationMsg(0) , "" ) + TEST_LINE( NationMsg(1) , "Database Files # Records Last Update Size" ) + TEST_LINE( NationMsg(2) , "Do you want more samples?" ) + TEST_LINE( NationMsg(3) , "Page No." ) + TEST_LINE( NationMsg(4) , "** Subtotal **" ) + TEST_LINE( NationMsg(5) , "* Subsubtotal *" ) + TEST_LINE( NationMsg(6) , "*** Total ***" ) + TEST_LINE( NationMsg(7) , "Ins" ) + TEST_LINE( NationMsg(8) , " " ) + TEST_LINE( NationMsg(9) , "Invalid date" ) + TEST_LINE( NationMsg(10) , "Range: " ) + TEST_LINE( NationMsg(11) , " - " ) + TEST_LINE( NationMsg(12) , "Y/N" ) + TEST_LINE( NationMsg(13) , "INVALID EXPRESSION" ) + TEST_LINE( NationMsg(14) , "" ) + TEST_LINE( NationMsg(200) , "" ) /* Bug in CA-Cl*pper, it will return "74?" */ + +/* These will cause a GPF in CA-Cl*pper (5.2e) */ +#ifndef __CLIPPER__ + TEST_LINE( IsAffirm() , .F. ) + TEST_LINE( IsAffirm(.F.) , .F. ) + TEST_LINE( IsAffirm(.T.) , .F. ) + TEST_LINE( IsAffirm(0) , .F. ) + TEST_LINE( IsAffirm(1) , .F. ) +#endif + TEST_LINE( IsAffirm("") , .F. ) + TEST_LINE( IsAffirm("I") , .F. ) + TEST_LINE( IsAffirm("y") , .T. ) + TEST_LINE( IsAffirm("Y") , .T. ) + TEST_LINE( IsAffirm("yes") , .T. ) + TEST_LINE( IsAffirm("YES") , .T. ) + TEST_LINE( IsAffirm("n") , .F. ) + TEST_LINE( IsAffirm("N") , .F. ) + TEST_LINE( IsAffirm("no") , .F. ) + TEST_LINE( IsAffirm("NO") , .F. ) + +/* These will cause a GPF in CA-Cl*pper (5.2e) */ +#ifndef __CLIPPER__ + TEST_LINE( IsNegative() , .F. ) + TEST_LINE( IsNegative(.F.) , .F. ) + TEST_LINE( IsNegative(.T.) , .F. ) + TEST_LINE( IsNegative(0) , .F. ) + TEST_LINE( IsNegative(1) , .F. ) +#endif + TEST_LINE( IsNegative("") , .F. ) + TEST_LINE( IsNegative("I") , .F. ) + TEST_LINE( IsNegative("y") , .F. ) + TEST_LINE( IsNegative("Y") , .F. ) + TEST_LINE( IsNegative("yes") , .F. ) + TEST_LINE( IsNegative("YES") , .F. ) + TEST_LINE( IsNegative("n") , .T. ) + TEST_LINE( IsNegative("N") , .T. ) + TEST_LINE( IsNegative("no") , .T. ) + TEST_LINE( IsNegative("NO") , .T. ) + /* FOR/NEXT */ TEST_LINE( TFORNEXT( .F., .T., NIL ) , "E BASE 1086 Argument error ++ F:S" )