[fpc-pascal] How to translate this union ?

Ludo Brands ludo.brands at free.fr
Thu May 5 16:59:54 CEST 2011


I guess DOCUMENTATION_ONLY is defined in an external tool such as doxygen.
Applications wouldn't define this. My point is that if the "pseudo" members
are documented, someone will soon or later use them. If this header
translation is for your personal 
use only, then all is fine...
 

-----Message d'origine-----
De : fpc-pascal-bounces at lists.freepascal.org
[mailto:fpc-pascal-bounces at lists.freepascal.org] De la part de ik
Envoyé : jeudi 5 mai 2011 16:15
À : FPC-Pascal users discussions
Objet : Re: RE : RE : RE : RE : [fpc-pascal] How to translate this union ?




On Thu, May 5, 2011 at 17:05, Ludo Brands <ludo.brands at free.fr> wrote:



OK . You have avoided using macros but are loosing the access to "pseudo"
members su_len,su_family,su_port and su_scope_id. The DOCUMENTATION_ONLY
suggests that these members are documented parts of the interface. Also it
will be up to the user to figure out where to get su_len according to
SU_HAVE_SOCKADDR_SA_LEN.


I can not find them in the preprocessor code (the define and the "document
only" members), that's why I avoided them at this point. but if I'll find
them required, I'll invest more time to add them.
 

 
 

 -----Message d'origine-----
De : fpc-pascal-bounces at lists.freepascal.org
[mailto:fpc-pascal-bounces at lists.freepascal.org] De la part de ik

Envoyé : jeudi 5 mai 2011 15:19 

À : FPC-Pascal users discussions

Objet : Re: RE : RE : RE : [fpc-pascal] How to translate this union ?




I've done the following at the moment:

{$IFDEF SU_HAVE_SOCKADDR_SA_LEN}
// #define               su_len          su_sa.sa_len <- unsupported for now
{$ELSE}
// #define               su_len          su_array[0] <- unsupported for now
{$ENDIF}
// #define               su_family       su_sa.sa_family <- unsupported for
now
// #define               su_port         su_sin.sin_port <- unsupported for
now
// #define               su_scope_id     su_array32[6] <- unsupported for
now  

su_sockaddr_u  = record
                     case Byte of
                       0 : (su_dummy   : cshort);                  //< Dummy
member to initialize
                       1 : (su_array   : array[0..31] of char);    //
Presented as chars
                       2 : (su_array16 : array[0..15] of cuint16); //
Presented as 16-bit ints
                       3 : (su_array32 : array[0..8]  of cuint32); //
Presented as 32-bit ints
                       4 : (su_sa      : sockaddr);                //
Address in struct sockaddr format
                       5 : (su_sin     : sockaddr_in);             //
Address in IPv4 format
{$IFDEF SU_HAVE_IN6}
                       6 : (su_sin6    : sockaddr_in6);            //
Address in IPv6 format
{$ENDIF}
                   end;


As I understood by you and C developers that I talked to, the macro create a
shortcut to be used.

Thanks,

Ido


On Sat, Apr 30, 2011 at 11:53, Ludo Brands <ludo.brands at free.fr> wrote:


Using macros, the translation looks like
 
{$MACRO ON}
{$ifndef DOCUMENTATION_ONLY}
{$if SU_HAVE_SOCKADDR_SA_LEN <>0}
  {$define su_len:=su_sa.sa_len}
{$else}
  {$define su_len:=su_array[0]}
{$endif}
{$define su_family:=su_sa.sa_family}
{$define su_port:=su_sin.sin_port}
{$define su_scope_id:=su_array32[6]}
{$endif}
type
    su_sockaddr_u = record
        case longint of
          {$ifdef DOCUMENTATION_ONLY}
          0 : ( su_len : byte );
          1 : ( su_family : byte );
          2 : ( su_port : word );
          {$else}
          3 : ( su_dummy : smallint );
          {$endif}
          4 : ( su_array : array[0..31] of char );
          5 : ( su_array16 : array[0..15] of word );
          6 : ( su_array32 : array[0..7] of longword );
          7 : ( su_sa : sockaddr );
          8 : ( su_sin : sockaddr_in );
          {$if SU_HAVE_IN6 <>0}
          9 : ( su_sin6 : sockaddr_in6 );
          {$endif}
          {$ifdef DOCUMENTATION_ONLY}
          10 : ( su_scope_id : longword );
          {$endif}
        end;



-----Message d'origine-----
De : fpc-pascal-bounces at lists.freepascal.org
[mailto:fpc-pascal-bounces at lists.freepascal.org] De la part de Ludo Brands

Envoyé : samedi 30 avril 2011 10:29 

À : 'FPC-Pascal users discussions'

Objet : RE : RE : [fpc-pascal] How to translate this union ?


Forget my previous reply. I found the original header file on sourceforge. 
 
I have alse a better understanding now of what the code is supposed to do:
in case DOCUMENTATION_ONLY is not defined,  a reference to, for example,
su_sockaddr_u.su_family will be subsstituted by
su_sockaddr_u.susa.sa_family. 
You could use macros and do a {$define su_family:=susa.sa_family} with the
following limitations:
- if you have variables or other record members named su_family, not part of
the su_sockaddr_u record, they will be renamed also. 
- it works only for the units that include your .inc file.
 

-----Message d'origine-----
De : fpc-pascal-bounces at lists.freepascal.org
[mailto:fpc-pascal-bounces at lists.freepascal.org] De la part de Ludo Brands
Envoyé : samedi 30 avril 2011 09:18
À : 'FPC-Pascal users discussions'
Objet : RE : [fpc-pascal] How to translate this union ?


Can you post the original c code? You point to a file that seems to be a
reworked output from h2pas. As it is now, it indeed doesn't make any sense.
I would think the su_len,su_family,su_port should make up a record but they
aren't.
 
I suggest you move the #defines inside the union declaration to somewhere
before the union declaration. It'll double up the ifdef's but make the code
so much more readable.
 
 
-----Message d'origine-----
De : fpc-pascal-bounces at lists.freepascal.org
[mailto:fpc-pascal-bounces at lists.freepascal.org] De la part de ik
Envoyé : vendredi 29 avril 2011 22:15
À : FPC-Pascal users discussions
Objet : [fpc-pascal] How to translate this union ?



Hello list,

I'm trying to translate the following union
<https://github.com/ik5/sofia-sip/blob/master/src/lib/sui.inc#L199>  to
Pascal, but I do not understand it, and so does h2pas.
How to translate it ?

Thanks,

Ido



LINESIP - Opening the source for communication
http://www.linesip.com
http://www.linesip.co.il





_______________________________________________
fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal




_______________________________________________
fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20110505/90478116/attachment.html>


More information about the fpc-pascal mailing list