On Sun, 06 Dec 2009, Szak�ts Viktor wrote:

Hi,

> If I got it correctly, it should be something like:
> 
> #if ! defined( CRTSCTS )
>    #if defined( HB_OS_LINUX ) || defined( HB_OS_SUNOS )
>       #define CRTSCTS 0x80000000
>    #elif defined( HB_OS_BSD )
>       #define CRTSCTS 0x00010000
>    #elif defined( HB_OS_BEOS )
>       #define CRTSCTS 0x6000
>    #endif
> #endif
> ...
> #if defined( CRTSCTS )
>    ...
> #else
>    int iTODO;
> #endif
> ?

No. It's also wrong. Above constants may change in the future.
I want to add this ugly hack only for compilers used on given
system if it's strictly necessary and someone verified correct
value for CRTSCTS.
So far we have only one such compiler. It's OpenWatcom on Linux so
I want to make:

   HB_FUNC( __TP_CTRLCTS )
   {
   #if !defined( CRTSCTS )
   #  if defined( HB_OS_LINUX ) && defined( __WATCOMC__ )
   #     define CRTSCTS    020000000000
   #  endif
   #endif

   #if !defined( CRTSCTS )
      int iTODO;
      hb_retni( 0 );
   #else
      struct termios options;
      int port = hb_parnl( 1 );
      int newvalue = hb_pcount() == 2 ? hb_parnl( 2 ) : -1;
      int curvalue;
      int rc;

      tcgetattr( port, &options );
      curvalue = ( options.c_cflag & CRTSCTS ) == CRTSCTS;

      if( newvalue == 0 )
         options.c_cflag &= ~CRTSCTS;
      else if( newvalue == 1 )
         options.c_cflag |= CRTSCTS;

      if( newvalue >= 0 )
         rc = tcsetattr( port, TCSAFLUSH, &options );

      hb_retni( curvalue ? 1 : 0 );
   #endif
   }

if someone will find other compiler which also needs this hack
or compiler where CRTSCTS is enum type not macro then I expect
that seeing iTODO warning message he will update the code to
work well with given system and C compiler and only for this
system and C compiler. I.e. if CRTSCTS is enum type in OS XXX
and compiler YYY then he can change the code to:

   #if !defined( CRTSCTS )
   #  if defined( HB_OS_LINUX ) && defined( __WATCOMC__ )
   #     define CRTSCTS    020000000000
   #  elif defined( HB_OS_XXX ) && defined( __YYY__ )
   #     define CRTSCTS    CRTSCTS
   #  endif
   #endif

or if he verify that low level CRTL code support CRTSCTS flow
control and exact value NNN is necessary to activate then he
will make:

   #if !defined( CRTSCTS )
   #  if defined( HB_OS_LINUX ) && defined( __WATCOMC__ )
   #     define CRTSCTS    020000000000
   #  elif defined( HB_OS_XXX ) && defined( __YYY__ )
   #     define CRTSCTS    NNN
   #  endif
   #endif

Otherwise he should leave iTODO warning which quite nicely informs
all developers at compile time that such functionality does not
exists in given build. Maybe it will be possible to add it in the
future if someone will know that it's a problem.
Now you simply pacified potential compile time error or warning
on all existing platforms so we do not hear about the problem
until some user will be clever enough to make deeper test and
check that some type of flow control does not work as expected
(probably it's to complicated for most of Harbour users) so
it's possible that real problem hidden by above modification
will never be fixed.

BTW It will be also nice that he will leave some note about system
or C compiler version he used so in the future we can remove
support for older versions or add additional protection, i.e.:
   #  if defined( HB_OS_LINUX ) && defined( __WATCOMC__ ) && \
         __WATCOMC__ < 1290

best regards,
Przemek
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to