2000-07-04 04:05 UTC+0100 Victor Szakats <info@szelvesz.hu>

This commit is contained in:
Viktor Szakats
2000-07-04 02:05:28 +00:00
parent 6d13e23d68
commit 2c91d1385e
8 changed files with 391 additions and 369 deletions

View File

@@ -1,3 +1,19 @@
2000-07-04 04:05 UTC+0100 Victor Szakats <info@szelvesz.hu>
* contrib/odbc/bld_b32.bat
! Fixed.
* source/rtl/tget.prg
! Fix by Chen Kedem applied for __GET()/_GET_()/GetNew() not passed
setget block bug.
* source/rtl/filesys.c
* source/rtl/memoline.c
* source/rtl/gtsln/kbsln.c
* source/rtl/gtsln/keytrans.c
* source/vm/classes.c
* Formatting.
2000-07-03 20:00 UTC+0100 Ryszard Glab <rglab@imid.med.pl>
*source/vm/garbage.c

View File

@@ -4,5 +4,6 @@ rem $Id$
rem
..\..\bin\harbour %1 /n /i..\include %2
bcc32 -e%1.exe -O2 -I..\..\include -L..\..\lib\b32 rtl.lib gtwin.lib vm.lib pp.lib rdd.lib hbodbc.lib odbc32.lib macro.lib common.lib %1.c
bcc32 -e%1.exe -O2 -d -I..\..\include -L..\..\lib\b32 %1.c debug.lib vm.lib rtl.lib gtwin.lib lang.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib common.lib hbodbc.lib odbc32.lib
rem del %1.c

View File

@@ -1205,7 +1205,7 @@ USHORT hb_fsCurDirBuff( USHORT uiDrive, BYTE * pbyBuffer, ULONG ulLen )
if( pbyStart[ 1 ] == ':' )
pbyStart += 2;
if( pbyStart[ 0 ] == '\\' )
if( strchr( OS_PATH_DELIMITER_LIST, pbyStart[ 0 ] ) )
pbyStart++;
if( pbyBuffer != pbyStart )

View File

@@ -77,25 +77,25 @@
#define ALTR_PRESSED 2
#define CONTROL_PRESSED 4
#define ALTL_PRESSED 8
#define ALT_PRESSED (ALTL_PRESSED || ALTR_PRESSED)
#define ALT_PRESSED ( ALTL_PRESSED || ALTR_PRESSED )
#elif defined(M_UNIX) /* SCO */
#define SHIFT_PRESSED 1
#define ALTR_PRESSED 8
#define CONTROL_PRESSED 2
#define ALTL_PRESSED 4
#define ALT_PRESSED (ALTL_PRESSED || ALTR_PRESSED)
#define ALT_PRESSED ( ALTL_PRESSED || ALTR_PRESSED )
#else /* we don't know how to do this */
#define SHIFT_PRESSED 0
#define ALTR_PRESSED 0
#define CONTROL_PRESSED 0
#define ALTL_PRESSED 0
#define ALT_PRESSED (ALTL_PRESSED || ALTR_PRESSED)
#define ALT_PRESSED ( ALTL_PRESSED || ALTR_PRESSED )
#endif
/* extra keysyms definitions */
#define SL_KEY_MAX 1000
#define SL_KEY_ESC SL_KEY_MAX + 1
#define SL_KEY_ALT_L( ch ) ( SL_KEY_MAX + ( ( unsigned int )ch ) )
#define SL_KEY_ALT_L( ch ) ( SL_KEY_MAX + ( ( unsigned int ) ch ) )
/* indicates that screen size has changed */
extern BOOL hb_gt_sln_bScreen_Size_Changed;
@@ -114,6 +114,7 @@ static void hb_gt_Init_KeyTranslat()
int keynum, i;
#ifdef IBMPC_SYSTEM
keynum = 11;
keyname[ 0 ] = '^';
keyname[ 1 ] = '@';
@@ -123,7 +124,7 @@ static void hb_gt_Init_KeyTranslat()
for( ch = 0x54; ch <= 0x71; ch++ )
{
keyname[ 2 ] = ch;
SLkp_define_keysym( keyname, SL_KEY_F(keynum) );
SLkp_define_keysym( keyname, SL_KEY_F( keynum ) );
keynum++;
}
@@ -132,93 +133,95 @@ static void hb_gt_Init_KeyTranslat()
while( i < sizeof( transDosScanCodeTab ) )
{
i++;
if( transDosScanCodeTab[i] < 32 )
if( transDosScanCodeTab[ i ] < 32 )
{
keyname[ 2 ] = '^';
keyname[ 3 ] = transDosScanCodeTab[i]+'A'-1;
keyname[ 3 ] = transDosScanCodeTab[ i ] + 'A' - 1;
keyname[ 4 ] = 0;
}
/*
else if( transDosScanCodeTab[i] >= 127 )
else if( transDosScanCodeTab[ i ] >= 127 )
{
sprintf( &keyname[ 2 ], "\\x%02X", transDosScanCodeTab[i] );
sprintf( &keyname[ 2 ], "\\x%02X", transDosScanCodeTab[ i ] );
keyname[ 6 ] = 0;
}
*/
else
{
keyname[ 2 ] = transDosScanCodeTab[i];
keyname[ 2 ] = transDosScanCodeTab[ i ];
keyname[ 3 ] = 0;
}
SLkp_define_keysym( keyname, SL_KEY_ALT_L( transDosScanCodeTab[i-1] ) );
SLkp_define_keysym( keyname, SL_KEY_ALT_L( transDosScanCodeTab[ i - 1 ] ) );
i++;
}
#else
char *keyseq;
/* on Unix systems ESC is a special key so let
assume ESC is also a doble pressed ESCkey
*/
SLkp_define_keysym( "^[^[", SL_KEY_ESC );
/* try to define Shft-Fn and Ctrl-Fn keys.
Because we assume terminal has only 10 Fkeys
so F11-F30 is generated with Shift & Ctrl.
This is not guaranteed to work in all cases
*/
keynum = 11;
keyname[ 0 ] = 'F';
keyname[ 2 ] = 0;
/* Shft & Ctrl FKeys definition takes place in two
phases : from '1' to '9' and from 'A' to 'K'
*/
for( i=1; i<=2; i++ )
{
for( ch = ( i==1 ? '1' : 'A' ); ch <= ( i==1 ? '9' : 'K' ); ch++ )
{
keyname[ 1 ] = ch;
keyseq = SLtt_tgetstr( keyname );
if( (keyseq != NULL) && (keyseq[0] != 0) )
{
if( (keyseq != NULL) && (keyseq[0] != 0) )
SLkp_define_keysym( keyseq, SL_KEY_F(keynum) );
}
keynum++;
}
}
/* if we are on linux console pressing Alt generates ^[ before sequence */
if( s_linuxConsole || s_underXTerm )
{
keyname[ 0 ] = 033;
keyname[ 2 ] = 0;
/* Alt+Letter & Alt+digit definition takes place in
two phases : from '0' to '9' and from 'A' to 'Z'
char * keyseq;
/* on Unix systems ESC is a special key so let
assume ESC is also a doble pressed ESCkey
*/
for( i=1; i<=2; i++ )
SLkp_define_keysym( "^[^[", SL_KEY_ESC );
/* try to define Shft-Fn and Ctrl-Fn keys.
Because we assume terminal has only 10 Fkeys
so F11-F30 is generated with Shift & Ctrl.
This is not guaranteed to work in all cases
*/
keynum = 11;
keyname[ 0 ] = 'F';
keyname[ 2 ] = 0;
/* Shft & Ctrl FKeys definition takes place in two
phases : from '1' to '9' and from 'A' to 'K'
*/
for( i = 1; i <= 2; i++ )
{
for( ch = ( i==1 ? '0' : 'A' ); ch <= ( i==1 ? '9' : 'Z' ); ch++ )
for( ch = ( i == 1 ? '1' : 'A' ); ch <= ( i == 1 ? '9' : 'K' ); ch++ )
{
keyname[ 1 ] = ch;
/* QUESTION: why Slang reports error for defining Alt+O ???.
Have I any error in key definitiions ???
*/
if( ch != 'O' )
SLkp_define_keysym( keyname, SL_KEY_ALT_L( ch ) );
keyname[ 1 ] = (ch+' ');
SLkp_define_keysym( keyname, SL_KEY_ALT_L( ch+' ' ) );
keyseq = SLtt_tgetstr( keyname );
if( ( keyseq != NULL ) && ( keyseq[ 0 ] != 0 ) )
{
if( ( keyseq != NULL ) && ( keyseq[ 0 ] != 0 ) )
SLkp_define_keysym( keyseq, SL_KEY_F( keynum ) );
}
keynum++;
}
}
/* if we are on linux console pressing Alt generates ^[ before sequence */
if( s_linuxConsole || s_underXTerm )
{
keyname[ 0 ] = 033;
keyname[ 2 ] = 0;
/* Alt+Letter & Alt+digit definition takes place in
two phases : from '0' to '9' and from 'A' to 'Z'
*/
for( i = 1; i <= 2; i++ )
{
for( ch = ( i == 1 ? '0' : 'A' ); ch <= ( i == 1 ? '9' : 'Z' ); ch++ )
{
keyname[ 1 ] = ch;
/* QUESTION: why Slang reports error for defining Alt+O ???.
Have I any error in key definitiions ???
*/
if( ch != 'O' )
SLkp_define_keysym( keyname, SL_KEY_ALT_L( ch ) );
keyname[ 1 ] = ( ch + ' ' );
SLkp_define_keysym( keyname, SL_KEY_ALT_L( ch + ' ' ) );
}
}
}
}
#endif
}
int hb_gt_Init_Terminal(int phase)
int hb_gt_Init_Terminal( int phase )
{
#ifndef IBMPC_SYSTEM
struct termios newTTY;
@@ -226,17 +229,17 @@ int hb_gt_Init_Terminal(int phase)
int ret = 0;
/* Ctrl-C to abort, no flow-control, no output processing */
if( SLang_init_tty(HB_GT_ABORT_KEY, 0, 0) != (-1) )
if( SLang_init_tty( HB_GT_ABORT_KEY, 0, 0 ) != -1 )
{
#ifndef IBMPC_SYSTEM
/* do missing disable of start/stop processing */
if( tcgetattr( SLang_TT_Read_FD, &newTTY ) == 0 )
{
newTTY.c_cc[VSTOP] = 255; /* disable ^S start/stop processing */
newTTY.c_cc[VSTART] = 255; /* disable ^Q start/stop processing */
newTTY.c_cc[VSUSP] = 255; /* disable ^Z suspend processing */
newTTY.c_cc[ VSTOP ] = 255; /* disable ^S start/stop processing */
newTTY.c_cc[ VSTART ] = 255; /* disable ^Q start/stop processing */
newTTY.c_cc[ VSUSP ] = 255; /* disable ^Z suspend processing */
if( tcsetattr( SLang_TT_Read_FD, TCSADRAIN, &newTTY ) == 0 )
if( tcsetattr( SLang_TT_Read_FD, TCSADRAIN, &newTTY ) == 0 )
/* everything looks ok so far */
#endif
ret = 1;
@@ -248,12 +251,12 @@ int hb_gt_Init_Terminal(int phase)
/* first time init phase - we don't want this
after return from system command ( see run.c )
*/
if( ret && (phase == 0) )
if( ret && ( phase == 0 ) )
{
/* an uncertain way to check if we run under linux console */
s_linuxConsole = ( !strncmp ( getenv("TERM"), "linux", 5 ) );
s_linuxConsole = ( ! strncmp( getenv( "TERM" ), "linux", 5 ) );
/* an uncertain way to check if we run under xterm */
s_underXTerm = ( strstr( getenv("TERM"), "xterm" ) != NULL );
s_underXTerm = ( strstr( getenv( "TERM" ), "xterm" ) != NULL );
/* define keyboard translations */
hb_gt_Init_KeyTranslat();
@@ -288,7 +291,7 @@ int hb_gt_ReadKey( HB_inkey_enum eventmask )
SLsmg_reinit_smg();
#endif
/* TODO: we need here some kind of screen redrawing */
/*SLsmg_refresh ();*/
/*SLsmg_refresh();*/
}
if( SLang_input_pending( 0 ) > 0 )
@@ -300,15 +303,15 @@ int hb_gt_ReadKey( HB_inkey_enum eventmask )
/* NOTE: This will probably not work on slow terminals
or on a very busy lines (i.e. modem lines )
*/
ch = SLang_getkey ();
ch = SLang_getkey();
if( ch == 033 ) /* escape */
{
if( 0 == SLang_input_pending (ESC_TIMEOUT) )
if( 0 == SLang_input_pending( ESC_TIMEOUT ) )
return 033;
}
SLang_ungetkey (ch);
SLang_ungetkey( ch );
/* ------------------------------------------------- */
@@ -332,23 +335,23 @@ int hb_gt_ReadKey( HB_inkey_enum eventmask )
if( ch < 32 ) /* control characters - simply return */
return ch;
else if( ( ch >= 32 ) && ( ch < 256 ) )/* normal characters ? */
else if( ( ch >= 32 ) && ( ch < 256 ) ) /* normal characters ? */
{
if( kbdflags & ALT_PRESSED )
{
/* lower to upper case */
if( (ch >= 'a') && (ch <= 'z') )
if( ( ch >= 'a' ) && ( ch <= 'z' ) )
ch -= ' ';
/* alt + letter */
if( (ch >= 'A') && (ch <= 'Z') )
if( ( ch >= 'A' ) && ( ch <= 'Z' ) )
/* returned value is next in a table */
return transAltKeyLetterTab[ (ch-'A')*2+1 ];
return transAltKeyLetterTab[ ( ch - 'A' ) * 2 + 1 ];
/* alt + digit */
if ( (ch >= '0') && (ch <= '9') )
if( ( ch >= '0' ) && ( ch <= '9' ) )
/* returned value is next in a table */
return transAltKeyDigitTab[ (ch-'0')*2+1 ];
return transAltKeyDigitTab[ ( ch - '0' ) * 2 + 1 ];
}
return ch;
@@ -367,17 +370,17 @@ int hb_gt_ReadKey( HB_inkey_enum eventmask )
/* Linux/Dos Alt+A-Z keys */
else if( ( ch >= SL_KEY_ALT_L( 'A' ) ) && ( ch <= SL_KEY_ALT_L( 'Z' ) ) )
/* returned value is next in a table */
return transAltKeyLetterTab[ (ch-SL_KEY_MAX-'A')*2+1 ];
return transAltKeyLetterTab[ ( ch - SL_KEY_MAX - 'A' ) * 2 + 1 ];
/* Linux Alt+a-z keys - lower to upper conersion */
else if( ( ch >= SL_KEY_ALT_L( 'a' ) ) && ( ch <= SL_KEY_ALT_L( 'z' ) ) )
/* returned value is next in a table */
return transAltKeyLetterTab[ (ch-SL_KEY_MAX-(' ')-('A'))*2+1 ];
return transAltKeyLetterTab[ ( ch - SL_KEY_MAX - ' ' - 'A' ) * 2 + 1 ];
/* Linux/Dos Alt+0-9 keys */
else if( ( ch >= SL_KEY_ALT_L( '0' ) ) && ( ch <= SL_KEY_ALT_L( '9' ) ) )
/* returned value is next in a table */
return transAltKeyDigitTab[ (ch-SL_KEY_MAX-'0')*2+1 ];
return transAltKeyDigitTab[ ( ch - SL_KEY_MAX - '0' ) * 2 + 1 ];
return ch;
}
@@ -392,7 +395,7 @@ static int hb_gt_try_get_Kbd_State()
unsigned char modifiers = 6;
if( ioctl (0, TIOCLINUX, &modifiers) < 0 )
if( ioctl( 0, TIOCLINUX, &modifiers ) < 0 )
return 0;
return ( int ) modifiers;
@@ -402,23 +405,23 @@ static int hb_gt_try_get_Kbd_State()
int modifiers = 0;
int IOcommand = 0;
if( ioctl(0, TCGETSC, &modifiers) >= 0 )
if( ioctl( 0, TCGETSC, &modifiers ) >= 0 )
{
if( modifiers == KB_XSCANCODE )
{
IOcommand = KB_ISSCANCODE;
if( ioctl(0, TCSETSC, &IOcommand) >= 0 )
if( ioctl( 0, TCSETSC, &IOcommand ) >= 0 )
{
if( ioctl(0, KDGKBSTATE, &modifiers) < 0 )
if( ioctl( 0, KDGKBSTATE, &modifiers ) < 0 )
modifiers = 0;
}
else modifiers = 0;
IOcommand = KB_XSCANCODE;
if( ioctl(0, TCSETSC, &IOcommand) < 0 )
if( ioctl( 0, TCSETSC, &IOcommand ) < 0 )
modifiers = 0;
}
else if( ioctl(0, KDGKBSTATE, &modifiers) < 0 )
else if( ioctl( 0, KDGKBSTATE, &modifiers ) < 0 )
modifiers = 0;
return modifiers;
@@ -430,17 +433,17 @@ static int hb_gt_try_get_Kbd_State()
int hb_gt_Shft_Pressed()
{
return (hb_gt_try_get_Kbd_State() & SHIFT_PRESSED) != 0;
return ( hb_gt_try_get_Kbd_State() & SHIFT_PRESSED ) != 0;
}
int hb_gt_Ctrl_Pressed()
{
return (hb_gt_try_get_Kbd_State() & CONTROL_PRESSED) != 0;
return ( hb_gt_try_get_Kbd_State() & CONTROL_PRESSED ) != 0;
}
int hb_gt_Alt_Pressed()
{
return (hb_gt_try_get_Kbd_State() & ALT_PRESSED) != 0;
return ( hb_gt_try_get_Kbd_State() & ALT_PRESSED ) != 0;
}
int hb_gt_Kbd_State()

View File

@@ -36,96 +36,96 @@
/* a table of function keys translation */
static int transKeyFunTab[] =
{
SL_KEY_DOWN, K_DOWN,
SL_KEY_UP, K_UP,
SL_KEY_LEFT, K_LEFT,
SL_KEY_RIGHT, K_RIGHT,
SL_KEY_HOME, K_HOME,
SL_KEY_END, K_END,
SL_KEY_BACKSPACE, K_BS,
SL_KEY_IC, K_INS,
SL_KEY_DELETE, K_DEL,
SL_KEY_NPAGE, K_PGDN,
SL_KEY_PPAGE, K_PGUP,
SL_KEY_ESC, K_ESC,
SL_KEY_F(1), K_F1,
SL_KEY_F(2), K_F2,
SL_KEY_F(3), K_F3,
SL_KEY_F(4), K_F4,
SL_KEY_F(5), K_F5,
SL_KEY_F(6), K_F6,
SL_KEY_F(7), K_F7,
SL_KEY_F(8), K_F8,
SL_KEY_F(9), K_F9,
SL_KEY_F(10), K_F10,
SL_KEY_F(11), K_SH_F1,
SL_KEY_F(12), K_SH_F2,
SL_KEY_F(13), K_SH_F3,
SL_KEY_F(14), K_SH_F4,
SL_KEY_F(15), K_SH_F5,
SL_KEY_F(16), K_SH_F6,
SL_KEY_F(17), K_SH_F7,
SL_KEY_F(18), K_SH_F8,
SL_KEY_F(19), K_SH_F9,
SL_KEY_F(20), K_SH_F10,
SL_KEY_F(21), K_CTRL_F1,
SL_KEY_F(22), K_CTRL_F2,
SL_KEY_F(23), K_CTRL_F3,
SL_KEY_F(24), K_CTRL_F4,
SL_KEY_F(25), K_CTRL_F5,
SL_KEY_F(26), K_CTRL_F6,
SL_KEY_F(27), K_CTRL_F7,
SL_KEY_F(28), K_CTRL_F8,
SL_KEY_F(29), K_CTRL_F9,
SL_KEY_F(30), K_CTRL_F10,
SL_KEY_F(31), K_ALT_F1,
SL_KEY_F(32), K_ALT_F2,
SL_KEY_F(33), K_ALT_F3,
SL_KEY_F(34), K_ALT_F4,
SL_KEY_F(35), K_ALT_F5,
SL_KEY_F(36), K_ALT_F6,
SL_KEY_F(37), K_ALT_F7,
SL_KEY_F(38), K_ALT_F8,
SL_KEY_F(39), K_ALT_F9,
SL_KEY_F(40), K_ALT_F10
SL_KEY_DOWN, K_DOWN,
SL_KEY_UP, K_UP,
SL_KEY_LEFT, K_LEFT,
SL_KEY_RIGHT, K_RIGHT,
SL_KEY_HOME, K_HOME,
SL_KEY_END, K_END,
SL_KEY_BACKSPACE, K_BS,
SL_KEY_IC, K_INS,
SL_KEY_DELETE, K_DEL,
SL_KEY_NPAGE, K_PGDN,
SL_KEY_PPAGE, K_PGUP,
SL_KEY_ESC, K_ESC,
SL_KEY_F(1), K_F1,
SL_KEY_F(2), K_F2,
SL_KEY_F(3), K_F3,
SL_KEY_F(4), K_F4,
SL_KEY_F(5), K_F5,
SL_KEY_F(6), K_F6,
SL_KEY_F(7), K_F7,
SL_KEY_F(8), K_F8,
SL_KEY_F(9), K_F9,
SL_KEY_F(10), K_F10,
SL_KEY_F(11), K_SH_F1,
SL_KEY_F(12), K_SH_F2,
SL_KEY_F(13), K_SH_F3,
SL_KEY_F(14), K_SH_F4,
SL_KEY_F(15), K_SH_F5,
SL_KEY_F(16), K_SH_F6,
SL_KEY_F(17), K_SH_F7,
SL_KEY_F(18), K_SH_F8,
SL_KEY_F(19), K_SH_F9,
SL_KEY_F(20), K_SH_F10,
SL_KEY_F(21), K_CTRL_F1,
SL_KEY_F(22), K_CTRL_F2,
SL_KEY_F(23), K_CTRL_F3,
SL_KEY_F(24), K_CTRL_F4,
SL_KEY_F(25), K_CTRL_F5,
SL_KEY_F(26), K_CTRL_F6,
SL_KEY_F(27), K_CTRL_F7,
SL_KEY_F(28), K_CTRL_F8,
SL_KEY_F(29), K_CTRL_F9,
SL_KEY_F(30), K_CTRL_F10,
SL_KEY_F(31), K_ALT_F1,
SL_KEY_F(32), K_ALT_F2,
SL_KEY_F(33), K_ALT_F3,
SL_KEY_F(34), K_ALT_F4,
SL_KEY_F(35), K_ALT_F5,
SL_KEY_F(36), K_ALT_F6,
SL_KEY_F(37), K_ALT_F7,
SL_KEY_F(38), K_ALT_F8,
SL_KEY_F(39), K_ALT_F9,
SL_KEY_F(40), K_ALT_F10
};
/* a table of alt+letter translation */
static int transAltKeyLetterTab[] =
{
'A' , K_ALT_A , 'B' , K_ALT_B , 'C' , K_ALT_C ,
'D' , K_ALT_D , 'E' , K_ALT_E , 'F' , K_ALT_F ,
'G' , K_ALT_G , 'H' , K_ALT_H , 'I' , K_ALT_I ,
'J' , K_ALT_J , 'K' , K_ALT_K , 'L' , K_ALT_L ,
'M' , K_ALT_M , 'N' , K_ALT_N , 'O' , K_ALT_O ,
'P' , K_ALT_P , 'Q' , K_ALT_Q , 'R' , K_ALT_R ,
'S' , K_ALT_S , 'T' , K_ALT_T , 'U' , K_ALT_U ,
'V' , K_ALT_V , 'W' , K_ALT_W , 'X' , K_ALT_X ,
'Y' , K_ALT_Y , 'Z' , K_ALT_Z
'A' , K_ALT_A , 'B' , K_ALT_B , 'C' , K_ALT_C ,
'D' , K_ALT_D , 'E' , K_ALT_E , 'F' , K_ALT_F ,
'G' , K_ALT_G , 'H' , K_ALT_H , 'I' , K_ALT_I ,
'J' , K_ALT_J , 'K' , K_ALT_K , 'L' , K_ALT_L ,
'M' , K_ALT_M , 'N' , K_ALT_N , 'O' , K_ALT_O ,
'P' , K_ALT_P , 'Q' , K_ALT_Q , 'R' , K_ALT_R ,
'S' , K_ALT_S , 'T' , K_ALT_T , 'U' , K_ALT_U ,
'V' , K_ALT_V , 'W' , K_ALT_W , 'X' , K_ALT_X ,
'Y' , K_ALT_Y , 'Z' , K_ALT_Z
};
/* a table of alt+digit translation */
static int transAltKeyDigitTab[] =
{
'0' , K_ALT_0 , '1' , K_ALT_1 ,
'2' , K_ALT_2 , '3' , K_ALT_3 ,
'4' , K_ALT_4 , '5' , K_ALT_5 ,
'6' , K_ALT_6 , '7' , K_ALT_7 ,
'8' , K_ALT_8 , '9' , K_ALT_9
'0' , K_ALT_0 , '1' , K_ALT_1 ,
'2' , K_ALT_2 , '3' , K_ALT_3 ,
'4' , K_ALT_4 , '5' , K_ALT_5 ,
'6' , K_ALT_6 , '7' , K_ALT_7 ,
'8' , K_ALT_8 , '9' , K_ALT_9
};
#ifdef IBMPC_SYSTEM
/* a table of Dos ScanCode translation - hard coded in Slang */
static unsigned char transDosScanCodeTab[] =
{
'A' , 0x1e , 'B' , 0x30 , 'C' , 0x2e , 'D' , 0x20 , 'E' , 0x12 ,
'F' , 0x21 , 'G' , 0x22 , 'H' , 0x23 , 'I' , 0x17 , 'J' , 0x24 ,
'K' , 0x25 , 'L' , 0x26 , 'M' , 0x32 , 'N' , 0x31 , 'O' , 0x18 ,
'P' , 0x19 , 'Q' , 0x10 , 'R' , 0x13 , 'S' , 0x1f , 'T' , 0x14 ,
'U' , 0x16 , 'V' , 0x2f , 'W' , 0x11 , 'X' , 0x2d , 'Y' , 0x15 ,
'Z' , 0x2c , '1' , 0x78 , '2' , 0x79 , '3' , 0x7a , '4' , 0x7b ,
'5' , 0x7c , '6' , 0x7d , '7' , 0x7e , '8' , 0x7f , '9' , 0x80 ,
'0' , 0x81
'A' , 0x1E , 'B' , 0x30 , 'C' , 0x2E , 'D' , 0x20 , 'E' , 0x12 ,
'F' , 0x21 , 'G' , 0x22 , 'H' , 0x23 , 'I' , 0x17 , 'J' , 0x24 ,
'K' , 0x25 , 'L' , 0x26 , 'M' , 0x32 , 'N' , 0x31 , 'O' , 0x18 ,
'P' , 0x19 , 'Q' , 0x10 , 'R' , 0x13 , 'S' , 0x1F , 'T' , 0x14 ,
'U' , 0x16 , 'V' , 0x2F , 'W' , 0x11 , 'X' , 0x2D , 'Y' , 0x15 ,
'Z' , 0x2C , '1' , 0x78 , '2' , 0x79 , '3' , 0x7A , '4' , 0x7B ,
'5' , 0x7C , '6' , 0x7D , '7' , 0x7E , '8' , 0x7F , '9' , 0x80 ,
'0' , 0x81
};
#endif

View File

@@ -70,10 +70,7 @@ HB_FUNC( MEMOLINE )
case HB_CHAR_LF:
ulCurLength = 0;
ulLastSpace = 0;
if ( ulPos >= 2 )
ulLineEnd = ulPos -2;
else
ulLineEnd = ulLineBegin;
ulLineEnd = ( ulPos >= 2 ) ? ( ulPos - 2 ) : ulLineBegin;
ulLines++;
if( ulLines < ulLineNumber )
{
@@ -131,10 +128,7 @@ HB_FUNC( MEMOLINE )
if( ulLineEnd == 0 )
{
ulLines++;
if ( ulPos == 0)
ulLineEnd = 0;
else
ulLineEnd = ulPos - 1;
ulLineEnd = ( ulPos == 0 ) ? 0 : ( ulPos - 1 );
}
if( ulLineNumber == ulLines && ulLineEnd >= ulLineBegin )
@@ -157,4 +151,5 @@ HB_FUNC( MEMOLINE )
}
else
hb_retc( "" );
}
}

View File

@@ -35,6 +35,7 @@
#include "hbclass.ch"
#include "hbsetup.ch"
#include "color.ch"
#include "common.ch"
#include "setcurs.ch"
@@ -147,30 +148,31 @@ METHOD New( nRow, nCol, bVarBlock, cVarName, cPicture, cColorSpec ) CLASS TGet
DEFAULT nRow TO Row()
DEFAULT nCol TO Col()
DEFAULT cVarName TO ""
DEFAULT bVarBlock TO MemvarBlock( cVarName )
DEFAULT cPicture TO ""
DEFAULT cColorSpec TO hb_ColorIndex( SetColor(), CLR_UNSELECTED ) + "," + hb_ColorIndex( SetColor(), CLR_ENHANCED )
::BadDate := .f.
::Block := bVarBlock
::Changed := .f.
::Clear := .f.
::Col := nCol
::ColorSpec := cColorSpec
::DecPos := Nil
::DecPos := NIL
::ExitState := 0
::HasFocus := .f.
::Minus := .f.
::Name := cVarName
::Original := ::VarGet()
::Picture := cPicture
::Pos := Nil
::PostBlock := Nil
::PreBlock := Nil
::Reader := Nil
::Pos := NIL
::PostBlock := NIL
::PreBlock := NIL
::Reader := NIL
::Rejected := .f.
::Row := nRow
::SubScript := Nil
::Type := Valtype( ::Original )
::SubScript := NIL
::Type := ValType( ::Original )
::TypeOut := .f.
::nDispPos := 1
::nOldPos := 0
@@ -188,7 +190,7 @@ METHOD New( nRow, nCol, bVarBlock, cVarName, cPicture, cColorSpec ) CLASS TGet
endif
if ( nAt := At( "S", ::cPicFunc ) ) > 0
for nFor := nAt + 1 to Len( ::cPicFunc )
if !IsDigit( SubStr( ::cPicFunc, nFor, 1 ) )
if ! IsDigit( SubStr( ::cPicFunc, nFor, 1 ) )
exit
else
cNum += SubStr( ::cPicFunc, nFor, 1 )
@@ -242,7 +244,7 @@ METHOD New( nRow, nCol, bVarBlock, cVarName, cPicture, cColorSpec ) CLASS TGet
::lPicComplex := .f.
if !Empty( ::cPicMask )
if ! Empty( ::cPicMask )
For nFor := 1 to Len( ::cPicMask )
cChar := SubStr( ::cPicMask, nFor, 1 )
if !cChar $ "!ANX9#"
@@ -253,9 +255,9 @@ METHOD New( nRow, nCol, bVarBlock, cVarName, cPicture, cColorSpec ) CLASS TGet
endif
::buffer := ::PutMask( ::Original, .f. )
::nMaxLen := len(::buffer)
::nMaxLen := Len( ::buffer )
if ::nDispLen == Nil
if ::nDispLen == NIL
::nDispLen := ::nMaxLen
endif
@@ -277,19 +279,19 @@ METHOD Display( lForced ) CLASS TGet
DEFAULT lForced TO .t.
if ::HasScroll() .and. ::Pos != Nil
if ::HasScroll() .and. ::Pos != NIL
::nDispPos := Max( 1, Min( ::Pos - Int( ::nDispLen / 2 ), ::nMaxLen - ::nDispLen + 1 ) )
endif
if lForced .or. (::nDispPos != ::nOldPos)
if lForced .or. ( ::nDispPos != ::nOldPos )
DispOutAt( ::Row, ::Col,;
Substr(::buffer, ::nDispPos, ::nDispLen), ;
Substr( ::buffer, ::nDispPos, ::nDispLen ), ;
hb_ColorIndex( ::ColorSpec, iif( ::HasFocus, GET_CLR_ENHANCED, GET_CLR_UNSELECTED ) ) )
endif
::nOldPos := ::nDispPos
if ::Pos != Nil
if ::Pos != NIL
SetPos( ::Row, ::Col + ::Pos - ::nDispPos )
endif
@@ -311,7 +313,7 @@ METHOD End() CLASS TGet
::Pos := ::nMaxLen
endif
::Clear := .f.
::Display(.f.)
::Display( .f. )
endif
return Self
@@ -323,7 +325,7 @@ METHOD Home() CLASS TGet
if ::HasFocus
::Pos := 1
::Clear := .f.
::Display(.f.)
::Display( .f. )
endif
return Self
@@ -368,12 +370,12 @@ METHOD SetFocus() CLASS TGet
::decpos := At( iif( ::lDecRev, ",", "." ), ::buffer )
::minus := ( "-" $ ::buffer .or. "(" $ ::buffer )
else
::decpos := Nil
::decpos := NIL
::minus := .f.
endif
if ::type == "D"
::BadDate := !( Dtoc( Ctod( ::buffer ) ) == ::buffer )
::BadDate := !( DToC( CToD( ::buffer ) ) == ::buffer )
else
::BadDate := .f.
endif
@@ -391,7 +393,7 @@ METHOD KillFocus() CLASS TGet
::buffer := ::PutMask()
::hasfocus := .f.
::pos := Nil
::pos := NIL
return Self
@@ -446,7 +448,7 @@ METHOD Untransform( cBuffer ) CLASS TGet
cBuffer := StrTran( cBuffer, "-", "" )
cBuffer := StrTran( cBuffer, "(", "" )
cBuffer := StrTran( cBuffer, ")", "" )
cBuffer := Alltrim( cBuffer )
cBuffer := AllTrim( cBuffer )
xValue := Val( cBuffer )
if ::minus
xValue := -xValue
@@ -470,7 +472,7 @@ return xValue
METHOD overstrike( cChar ) CLASS TGet
if ::type == "N" .and. !::lEdit
if ::type == "N" .and. ! ::lEdit
::pos := 1
endif
@@ -480,12 +482,12 @@ METHOD overstrike( cChar ) CLASS TGet
::lEdit := .f.
endif
if !::lEdit
if ! ::lEdit
::buffer := ::PutMask( ::VarGet(), .t. )
::lEdit := .t.
endif
do while !::IsEditable( ::pos ) .and. ::pos <= ::nMaxLen
do while ! ::IsEditable( ::pos ) .and. ::pos <= ::nMaxLen
::pos++
enddo
@@ -503,10 +505,10 @@ METHOD overstrike( cChar ) CLASS TGet
::buffer := SubStr( ::buffer, 1, ::Pos - 1 ) + cChar + SubStr( ::buffer, ::Pos + 1 )
::Changed := !( ::unTransform() == ::Original )
::Assign()
::Right(.f.)
::Right( .f. )
if ::type == "D"
::BadDate := !( Dtoc( Ctod( ::buffer ) ) == ::buffer )
::BadDate := !( DToC( CToD( ::buffer ) ) == ::buffer )
else
::BadDate := .f.
endif
@@ -523,7 +525,7 @@ METHOD Insert( cChar ) CLASS TGet
local cTmp
local nPos
if ::type == "N" .and. !::lEdit
if ::type == "N" .and. ! ::lEdit
::pos := 1
endif
@@ -533,12 +535,12 @@ METHOD Insert( cChar ) CLASS TGet
::lEdit := .f.
endif
if !::lEdit
if ! ::lEdit
::buffer := ::PutMask( ::VarGet(), .t. )
::lEdit := .t.
endif
do while !::IsEditable( ::pos ) .and. ::pos <= ::nMaxLen
do while ! ::IsEditable( ::pos ) .and. ::pos <= ::nMaxLen
::pos++
enddo
@@ -570,10 +572,10 @@ METHOD Insert( cChar ) CLASS TGet
::Changed := !( ::unTransform() == ::Original )
::Assign()
::Right(.f.)
::Right( .f. )
if ::type == "D"
::BadDate := !( Dtoc( Ctod( ::buffer ) ) == ::buffer )
::BadDate := !( DToC( CToD( ::buffer ) ) == ::buffer )
else
::BadDate := .f.
endif
@@ -590,7 +592,7 @@ METHOD _Right( lDisplay ) CLASS TGet
DEFAULT lDisplay TO .t.
if !::hasfocus
if ! ::hasfocus
return Self
endif
@@ -604,7 +606,7 @@ METHOD _Right( lDisplay ) CLASS TGet
nPos := ::Pos + 1
do while !::IsEditable( nPos ) .and. nPos <= ::nMaxLen
do while ! ::IsEditable( nPos ) .and. nPos <= ::nMaxLen
nPos++
Enddo
@@ -615,7 +617,7 @@ METHOD _Right( lDisplay ) CLASS TGet
endif
if lDisplay
::Display(.f.)
::Display( .f. )
endif
return Self
@@ -628,7 +630,7 @@ METHOD _Left( lDisplay ) CLASS TGet
DEFAULT lDisplay TO .t.
if !::hasfocus
if ! ::hasfocus
return Self
endif
@@ -642,7 +644,7 @@ METHOD _Left( lDisplay ) CLASS TGet
nPos := ::Pos - 1
do while !::IsEditable( nPos ) .and. nPos > 0
do while ! ::IsEditable( nPos ) .and. nPos > 0
nPos--
Enddo
@@ -653,7 +655,7 @@ METHOD _Left( lDisplay ) CLASS TGet
endif
if lDisplay
::Display(.f.)
::Display( .f. )
endif
@@ -665,7 +667,7 @@ METHOD WordLeft() CLASS TGet
local nPos
if !::hasfocus
if ! ::hasfocus
return Self
endif
@@ -703,7 +705,7 @@ METHOD WordLeft() CLASS TGet
::Pos := nPos
endif
::Display(.f.)
::Display( .f. )
return Self
@@ -713,7 +715,7 @@ METHOD WordRight() CLASS TGet
local nPos
if !::hasfocus
if ! ::hasfocus
return Self
endif
@@ -745,7 +747,7 @@ METHOD WordRight() CLASS TGet
::Pos := nPos
endif
::Display(.f.)
::Display( .f. )
return Self
@@ -753,15 +755,15 @@ return Self
METHOD ToDecPos() CLASS TGet
if !::HasFocus .or. ::DecPos == Nil
Return .f.
if ! ::HasFocus .or. ::DecPos == NIL
return .f.
endif
::Clear := .f.
::buffer := ::PutMask( ::UnTransform(), .t. )
::pos := ::DecPos + 1
::Display(.f.)
::Display( .f. )
return .t.
@@ -833,30 +835,30 @@ METHOD Input( cChar ) CLASS TGet
endcase
if !Empty( ::cPicFunc )
if ! Empty( ::cPicFunc )
cChar := Transform( cChar, ::cPicFunc )
endif
if !Empty( ::cPicMask )
if ! Empty( ::cPicMask )
cPic := Substr( ::cPicMask, ::pos, 1 )
cChar := Transform( cChar, cPic )
do case
case cPic == "A"
if !IsAlpha( cChar )
if ! IsAlpha( cChar )
cChar := ""
endif
case cPic == "N"
if !IsAlpha( cChar ) .and. !IsDigit( cChar )
if ! IsAlpha( cChar ) .and. ! IsDigit( cChar )
cChar := ""
endif
case cPic == "9"
if !IsDigit( cChar )
if ! IsDigit( cChar )
cChar := ""
endif
case cPic == "#"
if !IsDigit( cChar ) .and. !( cChar == " " ) .and. !( cChar$"+-" )
if ! IsDigit( cChar ) .and. !( cChar == " " ) .and. !( cChar $ "+-" )
cChar := ""
endif
end case
@@ -878,13 +880,13 @@ METHOD PutMask( xValue, lEdit ) CLASS TGet
DEFAULT xValue TO ::VarGet()
DEFAULT lEdit TO ::HasFocus
if xValue == Nil
if xValue == NIL
return ""
endif
cBuffer := Transform( xValue, Alltrim( ::cPicFunc + " " + ::cPicMask ) )
cBuffer := Transform( xValue, AllTrim( ::cPicFunc + " " + ::cPicMask ) )
if lEdit .and. ::type == "N" .and. !Empty( ::cPicMask )
if lEdit .and. ::type == "N" .and. ! Empty( ::cPicMask )
nLen := Len( cBuffer )
for nFor := 1 to nLen
cChar := SubStr( ::cPicMask, nFor, 1 )
@@ -892,8 +894,8 @@ METHOD PutMask( xValue, lEdit ) CLASS TGet
cBuffer := SubStr( cBuffer, 1, nFor - 1 ) + cChar + SubStr( cBuffer, nFor + 1 )
endif
next
if cBuffer == Space( len( cBuffer ) - 1 ) + "0"
cBuffer := Space( len( cBuffer ) )
if cBuffer == Space( Len( cBuffer ) - 1 ) + "0"
cBuffer := Space( Len( cBuffer ) )
endif
if ::lDecRev
cBuffer := StrTran( cBuffer, ",", Chr( 1 ) )
@@ -928,8 +930,8 @@ METHOD _Delete( lDisplay ) CLASS TGet
do case
case ::type == "C"
if !::lPicComplex
::buffer := Padr( SubStr( ::buffer, 1, ::Pos - 1 ) + ;
if ! ::lPicComplex
::buffer := PadR( SubStr( ::buffer, 1, ::Pos - 1 ) + ;
SubStr( ::buffer, ::Pos + 1 ), ::nMaxLen )
else
::buffer := SubStr( ::buffer, 1, ::Pos - 1 ) + " " + ;
@@ -989,14 +991,14 @@ METHOD DelEnd() CLASS TGet
local nPos := ::Pos
if !::hasfocus
if ! ::hasfocus
return Self
endif
::Pos := ::nMaxLen
do while ::Pos > nPos
::BackSpace(.f.)
::BackSpace( .f. )
enddo
::Display()
@@ -1007,8 +1009,8 @@ return Self
METHOD DelLeft() CLASS TGet
::Left(.f.)
::Delete(.f.)
::Left( .f. )
::Delete( .f. )
::Right()
return Self
@@ -1017,8 +1019,8 @@ return Self
METHOD DelRight() CLASS TGet
::Right(.f.)
::Delete(.f.)
::Right( .f. )
::Delete( .f. )
::Left()
return Self
@@ -1027,13 +1029,13 @@ return Self
METHOD DelWordLeft() CLASS TGet
if !::hasfocus
if ! ::hasfocus
return Self
endif
if !( SubStr( ::buffer, ::Pos, 1 ) == " " )
if SubStr( ::buffer, ::Pos - 1 , 1 ) == " "
::BackSpace(.f.)
::BackSpace( .f. )
else
::WordRight()
::Left()
@@ -1041,11 +1043,11 @@ METHOD DelWordLeft() CLASS TGet
endif
if SubStr( ::buffer, ::Pos, 1 ) == " "
::Delete(.f.)
::Delete( .f. )
endif
do while ::Pos > 1 .and. !( SubStr( ::buffer, ::Pos - 1, 1 ) == " " )
::BackSpace(.f.)
::BackSpace( .f. )
Enddo
::Display()
@@ -1056,7 +1058,7 @@ return Self
METHOD DelWordRight() CLASS TGet
if !::hasfocus
if ! ::hasfocus
return Self
endif
@@ -1069,11 +1071,11 @@ METHOD DelWordRight() CLASS TGet
endif
do while ::Pos <= ::nMaxLen .and. !( SubStr( ::buffer, ::Pos, 1 ) == " " )
::Delete(.f.)
::Delete( .f. )
Enddo
if ::Pos <= ::nMaxLen
::Delete(.f.)
::Delete( .f. )
endif
::Display()
@@ -1088,19 +1090,27 @@ return TGet():New( nRow, nCol, bVarBlock, cVarName, cPicture, cColor )
//---------------------------------------------------------------------------//
/* TOFIX: Clipper will do a compiler hack to internally generate a setget
block for these function calls when not specified. */
/* NOTE: Same as _GET_() */
function __GET( uVar, cVarName, cPicture, bValid, bWhen, bSetGet )
return _GET_( uVar, cVarName, cPicture, bValid, bWhen, bSetGet )
function _GET_( uVar, cVarName, cPicture, bValid, bWhen, bSetGet )
local oGet := TGet():New(,, bSetGet, cVarName, cPicture )
FUNCTION __GET( uVar, cVarName, cPicture, bValid, bWhen, bSetGet )
LOCAL oGet := TGet():New(,, bSetGet, cVarName, cPicture )
uVar := uVar // Suppress unused variable warning
oGet:PreBlock := bWhen
oGet:PostBlock := bValid
return oGet
RETURN oGet
/* NOTE: Same as __GET() */
FUNCTION _GET_( uVar, cVarName, cPicture, bValid, bWhen, bSetGet )
LOCAL oGet := TGet():New(,, bSetGet, cVarName, cPicture )
uVar := uVar // Suppress unused variable warning
oGet:PreBlock := bWhen
oGet:PostBlock := bValid
RETURN oGet

View File

@@ -338,10 +338,11 @@ BOOL hb_clsIsClassRef( void *pBlock )
{
if( pClass->pInlines )
if( hb_gcItemRef( pClass->pInlines, pBlock ) )
return TRUE;
return TRUE;
if( pClass->pClassDatas )
if( hb_gcItemRef( pClass->pClassDatas, pBlock ) )
return TRUE;
return TRUE;
uiLimit = ( USHORT ) ( pClass->uiHashKey * BUCKET );
pMeth = pClass->pMethods;
@@ -352,6 +353,7 @@ BOOL hb_clsIsClassRef( void *pBlock )
++pClass;
}
return FALSE; /* passed block is not referenced in any class */
}
@@ -497,43 +499,43 @@ char * hb_objGetClsName( PHB_ITEM pObject )
szClassName =
( s_pClasses + pObject->item.asArray.value->uiClass - 1 )->szName;
}
else /* built in types */
else /* built in types */
{
switch( pObject->type )
{
case HB_IT_NIL:
szClassName = "NIL";
break;
szClassName = "NIL";
break;
case HB_IT_STRING:
szClassName = "CHARACTER";
break;
szClassName = "CHARACTER";
break;
case HB_IT_BLOCK:
szClassName = "BLOCK";
break;
szClassName = "BLOCK";
break;
case HB_IT_SYMBOL:
szClassName = "SYMBOL";
break;
szClassName = "SYMBOL";
break;
case HB_IT_DATE:
szClassName = "DATE";
break;
szClassName = "DATE";
break;
case HB_IT_INTEGER:
case HB_IT_LONG:
case HB_IT_DOUBLE:
szClassName = "NUMERIC";
break;
szClassName = "NUMERIC";
break;
case HB_IT_LOGICAL:
szClassName = "LOGICAL";
break;
szClassName = "LOGICAL";
break;
default:
szClassName = "UNKNOWN";
break;
szClassName = "UNKNOWN";
break;
}
}
@@ -571,7 +573,6 @@ PHB_FUNC hb_objGetMethod( PHB_ITEM pObject, PHB_SYMB pMessage )
{
if( pClass->pMethods[ uiAt ].pMessage == pMsg )
{
s_pMethod = pClass->pMethods + uiAt;
hb_clsScope( pObject, s_pMethod );
return s_pMethod->pFunction;
@@ -812,7 +813,6 @@ HB_FUNC( __CLSADDMSG )
* MessageBox(0,cTmp,"AddMsg ClassData Shared",0);
* }
*/
}
break;
@@ -984,75 +984,75 @@ HB_FUNC( __CLSNEW )
for( ui = 0; ui < uiLimit; ui++ )
{
USHORT uiBucket;
USHORT uiBucket;
pMsg = ( PHB_DYNS ) pSprCls->pMethods[ ui ].pMessage;
pMsg = ( PHB_DYNS ) pSprCls->pMethods[ ui ].pMessage;
if( pMsg )
{
uiAt = ( USHORT ) ( ( ( hb_cls_MsgToNum( pMsg ) ) % pNewCls->uiHashKey ) * BUCKET );
if( pMsg )
{
uiAt = ( USHORT ) ( ( ( hb_cls_MsgToNum( pMsg ) ) % pNewCls->uiHashKey ) * BUCKET );
for( uiBucket = 0; uiBucket < BUCKET; uiBucket++ )
{
for( uiBucket = 0; uiBucket < BUCKET; uiBucket++ )
{
#ifdef HB_CLS_MASKHIDDEN /* no hidden methods allowed by the inheritence. */
if( ( pSprCls->pMethods[ ui ].uiScope & HB_OO_CLSTP_HIDDEN ) == HB_OO_CLSTP_HIDDEN )
break;
if( ( pSprCls->pMethods[ ui ].uiScope & HB_OO_CLSTP_HIDDEN ) == HB_OO_CLSTP_HIDDEN )
break;
#endif
if( pNewCls->pMethods[ uiAt+uiBucket ].pMessage == 0 ) /* this message position is empty */
{
/* Now, we can increment the msg count */
pNewCls->uiMethods++;
if( pNewCls->pMethods[ uiAt+uiBucket ].pMessage == 0 ) /* this message position is empty */
{
/* Now, we can increment the msg count */
pNewCls->uiMethods++;
hb_xmemcpy(pNewCls->pMethods + ( uiAt+uiBucket ), pSprCls->pMethods + ui, sizeof( METHOD ) );
hb_xmemcpy(pNewCls->pMethods + ( uiAt+uiBucket ), pSprCls->pMethods + ui, sizeof( METHOD ) );
if(
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgSetClsData
||
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgGetClsData
)
pNewCls->pMethods[ uiAt+uiBucket ].uiData += nLenClsDatas;
if(
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgSetClsData
||
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgGetClsData
)
pNewCls->pMethods[ uiAt+uiBucket ].uiData += nLenClsDatas;
if(
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgSetData
||
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgGetData
||
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgSuper
)
{
pNewCls->pMethods[ uiAt+uiBucket ].uiData += nLenDatas;
}
if(
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgSetData
||
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgGetData
||
pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgSuper
)
{
pNewCls->pMethods[ uiAt+uiBucket ].uiData += nLenDatas;
}
if( pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgEvalInline )
pNewCls->pMethods[ uiAt+uiBucket ].uiData += nLenInlines;
if( pNewCls->pMethods[ uiAt+uiBucket ].pFunction == hb___msgEvalInline )
pNewCls->pMethods[ uiAt+uiBucket ].uiData += nLenInlines;
if( ( pSprCls->pMethods[ ui ].uiScope & HB_OO_CLSTP_SUPER ) != HB_OO_CLSTP_SUPER )
pNewCls->pMethods[ uiAt+uiBucket ].uiScope = ( USHORT ) ( pSprCls->pMethods[ ui ].uiScope + HB_OO_CLSTP_SUPER );
else
pNewCls->pMethods[ uiAt+uiBucket ].uiScope = pSprCls->pMethods[ ui ].uiScope;
if( ( pSprCls->pMethods[ ui ].uiScope & HB_OO_CLSTP_SUPER ) != HB_OO_CLSTP_SUPER )
pNewCls->pMethods[ uiAt+uiBucket ].uiScope = ( USHORT ) ( pSprCls->pMethods[ ui ].uiScope + HB_OO_CLSTP_SUPER );
else
pNewCls->pMethods[ uiAt+uiBucket ].uiScope = pSprCls->pMethods[ ui ].uiScope;
if( pSprCls->pMethods[ ui ].pInitValue )
{
PHB_ITEM pInitValue;
if( pSprCls->pMethods[ ui ].pInitValue )
{
PHB_ITEM pInitValue;
if( HB_IS_ARRAY( pSprCls->pMethods[ ui ].pInitValue ) )
pNewCls->pMethods[ uiAt + uiBucket ].pInitValue = hb_arrayClone( pSprCls->pMethods[ ui ].pInitValue );
else
{
pInitValue = hb_itemNew( NULL );
if( HB_IS_ARRAY( pSprCls->pMethods[ ui ].pInitValue ) )
pNewCls->pMethods[ uiAt + uiBucket ].pInitValue = hb_arrayClone( pSprCls->pMethods[ ui ].pInitValue );
else
{
pInitValue = hb_itemNew( NULL );
hb_itemCopy( pInitValue, pSprCls->pMethods[ ui ].pInitValue );
pNewCls->pMethods[ uiAt + uiBucket ].pInitValue = pInitValue;
}
}
break;
}
else if( pNewCls->pMethods[ uiAt + uiBucket ].pMessage == pMsg ) /*if( strcmp( pNewCls->pMethods[ uiAt+uiBucket ].pMessage->pSymbol->szName, pMsg->pSymbol->szName ) == 0 )*/
break;
}
}
hb_itemCopy( pInitValue, pSprCls->pMethods[ ui ].pInitValue );
pNewCls->pMethods[ uiAt + uiBucket ].pInitValue = pInitValue;
}
}
break;
}
else if( pNewCls->pMethods[ uiAt + uiBucket ].pMessage == pMsg ) /*if( strcmp( pNewCls->pMethods[ uiAt+uiBucket ].pMessage->pSymbol->szName, pMsg->pSymbol->szName ) == 0 )*/
break;
}
}
}
}
}
@@ -1200,24 +1200,24 @@ static PHB_ITEM hb_clsInst( USHORT uiClass, BOOL bInit )
pMeth = pClass->pMethods;
for( uiAt = 0; uiAt < uiLimit; uiAt++, pMeth++ )
{
if( ( pMeth->uiScope & HB_OO_CLSTP_CLASS ) == HB_OO_CLSTP_CLASS
&&
( pMeth->uiScope & HB_OO_CLSTP_SUPER ) != HB_OO_CLSTP_SUPER
)
{
pSprObj = hb_clsInst( pMeth->uiSprClass, FALSE ); /*instance super object*/
hb_arraySet( pSelf, pMeth->uiData, pSprObj );
hb_itemRelease( pSprObj );
if( ( pMeth->uiScope & HB_OO_CLSTP_CLASS ) == HB_OO_CLSTP_CLASS
&&
( pMeth->uiScope & HB_OO_CLSTP_SUPER ) != HB_OO_CLSTP_SUPER
)
{
pSprObj = hb_clsInst( pMeth->uiSprClass, FALSE ); /*instance super object*/
hb_arraySet( pSelf, pMeth->uiData, pSprObj );
hb_itemRelease( pSprObj );
++s_uiSize;
if( s_ppObjects == NULL )
s_ppObjects = ( PHB_ITEM * ) hb_xgrab( sizeof( PHB_ITEM ) );
else
s_ppObjects = ( PHB_ITEM * ) hb_xrealloc( s_ppObjects, s_uiSize * sizeof( PHB_ITEM ) );
++s_uiSize;
if( s_ppObjects == NULL )
s_ppObjects = ( PHB_ITEM * ) hb_xgrab( sizeof( PHB_ITEM ) );
else
s_ppObjects = ( PHB_ITEM * ) hb_xrealloc( s_ppObjects, s_uiSize * sizeof( PHB_ITEM ) );
pTmp = hb_arrayGetItemPtr( pSelf, pMeth->uiData );
s_ppObjects[ s_uiSize - 1 ] = pTmp;
}
pTmp = hb_arrayGetItemPtr( pSelf, pMeth->uiData );
s_ppObjects[ s_uiSize - 1 ] = pTmp;
}
}
/* Phase II Create link between A:C and A:B:C !! */
@@ -1254,18 +1254,17 @@ static PHB_ITEM hb_clsInst( USHORT uiClass, BOOL bInit )
{
/* Init Classdata (inherited and not) if needed */
if( pMeth->pInitValue && pMeth->pFunction == hb___msgGetClsData && !( pMeth->bClsDataInitiated ) )
{
HB_ITEM init;
hb_arrayGet( pClass->pClassDatas, pMeth->uiData, &init );
if( init.type == HB_IT_NIL )
{
hb_arraySet( pClass->pClassDatas, pMeth->uiData, pMeth->pInitValue );
pMeth->bClsDataInitiated = 1;
}
hb_itemClear( &init );
}
if( pMeth->pInitValue && pMeth->pFunction == hb___msgGetClsData && !( pMeth->bClsDataInitiated ) )
{
HB_ITEM init;
hb_arrayGet( pClass->pClassDatas, pMeth->uiData, &init );
if( init.type == HB_IT_NIL )
{
hb_arraySet( pClass->pClassDatas, pMeth->uiData, pMeth->pInitValue );
pMeth->bClsDataInitiated = 1;
}
hb_itemClear( &init );
}
if( ( pMeth->uiScope & HB_OO_CLSTP_SUPER ) == HB_OO_CLSTP_SUPER )
{
@@ -1292,8 +1291,8 @@ static PHB_ITEM hb_clsInst( USHORT uiClass, BOOL bInit )
for( uiBucket = 0; uiBucket < BUCKET; uiBucket++ )
{
if( pMsg == pSprCls->pMethods[ ui+uiBucket ].pMessage /*strcmp( pMsg->pSymbol->szName, pSprCls->pMethods[ ui+uiBucket ].pMessage->pSymbol->szName ) == 0*/ )
break;
if( pMsg == pSprCls->pMethods[ ui+uiBucket ].pMessage /*strcmp( pMsg->pSymbol->szName, pSprCls->pMethods[ ui+uiBucket ].pMessage->pSymbol->szName ) == 0*/ )
break;
}
pDataHrtd = ( PHB_ITEM ) hb_arrayGetItemPtr( pTmp, pSprCls->pMethods[ ui+uiBucket ].uiData );
@@ -1318,8 +1317,7 @@ static PHB_ITEM hb_clsInst( USHORT uiClass, BOOL bInit )
hb_itemRelease( pInitValue );
}
else
hb_arraySet( pSelf, pMeth->uiData,
pMeth->pInitValue );
hb_arraySet( pSelf, pMeth->uiData, pMeth->pInitValue );
}
else if( pMeth->pFunction == hb___msgGetShrData && !( pMeth->bClsDataInitiated ) )
{
@@ -1333,8 +1331,7 @@ static PHB_ITEM hb_clsInst( USHORT uiClass, BOOL bInit )
pMeth->bClsDataInitiated = 1;
}
hb_itemClear( &init );
}
}
}
}
}
@@ -1687,9 +1684,9 @@ HB_FUNC( __CLS_PARAM )
array = hb_itemArrayNew( uiParam );
for( n = 1; n <= uiParam; n++ )
{
PHB_ITEM iTmp = hb_itemParam( n );
hb_itemArrayPut( array, n, iTmp );
hb_itemRelease( iTmp );
PHB_ITEM iTmp = hb_itemParam( n );
hb_itemArrayPut( array, n, iTmp );
hb_itemRelease( iTmp );
}
}
else