create-native-map(1)


NAME

   create-native-map - C/C# Mapping Creator

SYNOPSIS

   create-native-map [OPTIONS]* ASSEMBLY-FILE-NAME OUPUT-PREFIX

OPTIONS

   --autoconf-header=HEADER
          HEADER  is  a header file name in the syntax typically used with
          the C #include statement, e.g.  #include <stdio.h>  or  #include
          "local.h" .

          An  Autoconf-formatted macro is generated from the include name,
          and a #include directive is wrapped within a  #ifdef  block  for
          the Autoconf macro within the generated .c file.

          For  example,  --autoconf-header=<stdio.h>  would  generate  the
          code:

               #ifndef HAVE_STDIO_H
               #include <stdio.h>
               #endif /* ndef HAVE_STDIO_H */

   --autoconf-member=MEMBER
          Specify that any access to MEMBER should  be  wrapped  within  a
          #ifdef  HAVE_MEMBER block.  MEMBER can be either a field-name or
          a class-name .  field-name combination.

          For example, given the C# declaration:

               [Mono.Unix.Native.Map ("struct dirent")]
               struct Dirent {
                    public long d_off;
               }

          then --autoconf-member=d_off would generate the code similar to:

               int
               ToDirent (struct dirent *from, struct Dirent *to)
               {
               #ifdef HAVE_STRUCT_DIRENT_D_OFF
                    to->d_off = from->d_off;
               #endif /* ndef HAVE_STRUCT_DIRENT_D_OFF */
               }

   --exclude-native-symbol=SYMBOL
          SYMBOL is a [DllImport] -marked method that should  not  have  a
          prototype generated for it.

   --impl-header=HEADER
          Insert  a  #include  statement  within the generated .c file for
          HEADER .

          For example, --impl-header=<stdlib.h> generates

               #include <stdlib.h>

   --impl-macro=MACRO
          Insert a #define statement within the generated .c file.   MACRO
          can contain a = to separate the macro name from the macro value.

          For example, --impl-macro=FOO=42 generates

               #define FOO 42

   --library=LIBRARY
          Create   prototypes   for   [DllImport]  -marked  methods  which
          reference the native library LIBRARY into the generated .h file.

   --public-header=HEADER
          Insert a #include statement within the  generated  .h  file  for
          HEADER .

          For example, --public-header=<stdlib.h> generates

               #include <stdlib.h>

   --public-macro=MACRO
          Insert  a #define statement within the generated .h file.  MACRO
          can contain a = to separate the macro name from the macro value.

          For example, --public-macro=FOO=42 generates

               #define FOO 42

   --rename-member=FROM=TO
          This is used when FROM is a C macro, and thus must be altered in
          order  to  be  used  sanely.   All  generated  references to the
          managed representation will use TO instead of FROM .

          For example, given the C# declaration:

               [Mono.Unix.Native.Map ("struct stat")]
               struct Stat {
                    public long st_atime;
               }

          and  the  argument  --rename-member=st_atime=st_atime_   ,   the
          generated .h file would contain:

               struct Stat {
                    gint64 st_atime_;
               };

          (note the altered field name), while the generated .c file would
          contain:

               ToStat (struct stat *from, struct Stat *to)
               {
                    to->st_atime_ = from->st_atime;
               }

   --rename-namespace=FROM=TO
          By  default,  the  C  "namespace"  (symbol  prefix)  is  the  C#
          namespace;  types within the C# namespace Mono.Unix.Native would
          be in  the  C  "namespace"  Mono_Unix_Native  .   Use  --rename-
          namespace    to    modify    the    default,   e.g.    --rename-
          namespace=Mono.Unix.Native=Mono_Posix .

DESCRIPTION

   create-native-map is a program for a specific  scenario:  keeping  code
   which  is  tightly  coupled  between  C and C# in sync with each other,
   based upon the C# types.

   Platform Invoke is only useful if the  managed  code  knows  the  exact
   types  and layout of all unmanaged structures it uses.  This is usually
   the case on Windows, but it is not the  case  on  Unix.   For  example,
   struct  stat makes use of types with sizes that will vary from platform
   to platform (or even based  on  the  compiler  macros  defined!).   For
   example,  off_t  is usually a signed 32-bit integer on ILP32 platforms,
   but may be a signed 64-bit integer on LP64 platforms, but may also be a
   64-bit signed integer on ILP32 platforms if the _FILE_OFFSET_BITS macro
   has the value 64.  In short, everything is flexible  within  Unix,  and
   managed code can't deal with such flexibility.

   Thus, the niche for create-native-map : assume a fixed ABI that managed
   code  can  target,  and  generate   code   to   "thunk"   the   managed
   representations  to  the  corresponding  native  representations.  This
   needs to be done for everything that can  vary  between  platforms  and
   compiler  flags,  from  enumeration values ( SIGBUS has the value 10 on
   FreeBSD but 7 on Linux) to structure members (how big is off_t ?).

   create-native-map  will  inspect  ASSEMBLY-FILE-NAME  and  output   the
   following files:

          OUTPUT-PREFIX.h
                 Contains   enumeration   values,   class   and  structure
                 declarations,  delegate  declarations,  and   [DllImport]
                 -marked  methods (from the library specified by --library
                 ) within the assembly ASSEMBLY-FILE-NAME .

          OUTPUT-PREFIX.c
                 Contains the implementation of enumeration and  structure
                 conversion functions.

          OUTPUT-PREFIX.cs
                 Contains   a   partial   class  NativeConvert  containing
                 enumeration translation methods.

          OUTPUT-PREFIX.xml
                 Generates  ECMA   XML   documentation   stubs   for   the
                 enumeration translation methods in OUTPUT-PREFIX.cs .

   create-native-map  primarily  looks  for MapAttribute -decorated types,
   and makes use of two MapAttribute properties:

          NativeType
                 Contains  the  corresponding  C  type.   Only  useful  if
                 applied to classes, structures, and fields.

          SuppressFlags
                 When  specified  on  an  enumeration  member of a [Flags]
                 -decorated enumeration type,  disables  the  normal  code
                 generator support for bit-masking enumeration types.

                 This  is  useful when bitmask and non-bitmask information
                 is stored within the  same  type,  and  bitmask  checking
                 shouldn't  be  used for the non-bitmask values.  Example:
                 Mono.Unix.Native.FilePermissions.S_IFREG , which is not a
                 bitmask  value, while most of FilePermissions consists of
                 bitmask    values     (     FilePermissions.S_IRUSR     ,
                 FilePermissions.S_IWUSR , etc.).

   The  MapAttribute  attribute  can  be specified on classes, structures,
   delegates, fields, and enumerations.

   Delegates
          Code     generation     for      delegates      ignores      the
          MapAttribute.NativeType   property,  and  generates  a  function
          pointer typedef that best matches the delegate declaration  into
          the .h file.

          For example,

               namespace Foo {
                    [Map]
                    delegate string MyCallback (string s);
               }

          generates the typedef :

               typedef char* (*Foo_MyCallback) (const char *s);

   Classes and Structures
          A  [Map]  -decorated  class  or structure will get a C structure
          declaration within the .h file:

               [Map]
               struct Foo {
                    public int i;
               }

          becomes

               struct Foo {
                    public int i;
               };

          If the MapAttribute.NativeType property is set, then  conversion
          functions will be declared within the .h file and created within
          the .c file:

               namespace Foo {
                    [Map ("struct stat")]
                    struct Stat {
                         public uint st_uid;
                    }
               }

          becomes

               /* The .h file */
               struct Foo_Stat {
                    unsigned int st_uid;
               };
               int
               Foo_FromStat (struct Foo_Stat *from, struct stat *to);
               int
               Foo_ToStat (struct stat *to, sxtruct Foo_Stat *to);

               /* The .c file */
               int
               Foo_FromStat (struct Foo_Stat *from, struct stat *to)
               {
                    memset (to, 0, sizeof(*to);
                    to->st_uid = from->st_uid;
                    return 0;
               }

               int
               Foo_ToStat (struct stat *to, sxtruct Foo_Stat *to)
               {
                    memset (to, 0, sizeof(*to);
                    to->st_uid = from->st_uid;
                    return 0;
               }

          For classes, the conversion  functions  will  only  copy  fields
          declared  in the class itself. Fields declared in parent classes
          will not be copied. (This is because create-native-map does  not
          know  how the inheritance is implemented in C. Therefore copying
          fields from  parent  classes  is  left  to  the  caller  of  the
          conversion functions.)

   Fields If  a  field (1) has the MapAttribute attribute, and (2) has the
          MapAttribute.NativeType property set, then the specified  native
          type will be used for overflow checking.  For example:

               namespace Foo {
                    [Map ("struct stat")]
                    struct Stat {
                         [Map ("off_t")] public long st_size;
                    }
               }

          generates

               /* The .h file */
               struct Foo_Stat {
                    gint64 st_size;
               };
               int
               Foo_FromStat (struct Foo_Stat *from, struct stat *to);
               int
               Foo_ToStat (struct stat *to, sxtruct Foo_Stat *to);

               /* The .c file */
               int
               Foo_FromStat (struct Foo_Stat *from, struct stat *to)
               {
                    _cnm_return_val_if_overflow (off_t, from->st_size, -1);

                    memset (to, 0, sizeof(*to);
                    to->st_size = from->st_size;
                    return 0;
               }

               int
               Foo_ToStat (struct stat *to, sxtruct Foo_Stat *to)
               {
                    _cnm_return_val_if_overflow (gint64, from->st_size, -1);

                    memset (to, 0, sizeof(*to);
                    to->st_size = from->st_size;
                    return 0;
               }

          This  is  useful for better error checking within the conversion
          functions.  MapAttribute.NativeType  is  required  for  this  as
          there  is  no other way to know what the native type is (without
          parsing the system header files...).

   Enumerations
          Generates a C enumeration and macros for  each  of  the  members
          within the enumeration.  To and From functions are also declared
          in the .h file and implemented in the .c file.

          For example,

               namespace Foo {
                    [Map]
                    enum Errno {
                         EINVAL
                    }
               }

          would generate the following in the .h file:

               enum Foo_Errno {
                    Foo_Errno_EINVAL          = 0,
                    #define Foo_Errno_EINVAL    Foo_Errno_EINVAL
               };
               int Foo_FromErrno (int from, int *to);
               int Foo_ToErrno (int from, int *to);

          and generates the following in the the .c file:

               int
               Foo_FromErrno (int from, int *to)
               {
                    *to = 0;
                    if (from == Foo_Errno_EPERM)
               #ifdef EINVAL
                         {*to = EINVAL;}
               #else
                         {errno = EINVAL; return -1;}
               #endif
                    return 0;
               }

               int
               Foo_ToErrno (int from, int *to)
               {
                    *to = 0;
               #ifdef EINVAL
                    if (from == EINVAL)
                         {*to = Foo_Errno_EPERM; return 0;}
               #endif
                    return -1;
               }

          Different code will be  generated  if  the  managed  enum  is  a
          [Flags]  -decorated  enumeration (to account for bitwise flags),
          but this is the basic idea.

MAILING LISTS

   Visit   http://lists.ximian.com/mailman/listinfo/mono-devel-list    for
   details.

WEB SITE

   Visit http://www.mono-project.com for details

                                                      create-native-map(1)





Opportunity


Personal Opportunity - Free software gives you access to billions of dollars of software at no cost. Use this software for your business, personal use or to develop a profitable skill. Access to source code provides access to a level of capabilities/information that companies protect though copyrights. Open source is a core component of the Internet and it is available to you. Leverage the billions of dollars in resources and capabilities to build a career, establish a business or change the world. The potential is endless for those who understand the opportunity.

Business Opportunity - Goldman Sachs, IBM and countless large corporations are leveraging open source to reduce costs, develop products and increase their bottom lines. Learn what these companies know about open source and how open source can give you the advantage.





Free Software


Free Software provides computer programs and capabilities at no cost but more importantly, it provides the freedom to run, edit, contribute to, and share the software. The importance of free software is a matter of access, not price. Software at no cost is a benefit but ownership rights to the software and source code is far more significant.


Free Office Software - The Libre Office suite provides top desktop productivity tools for free. This includes, a word processor, spreadsheet, presentation engine, drawing and flowcharting, database and math applications. Libre Office is available for Linux or Windows.





Free Books


The Free Books Library is a collection of thousands of the most popular public domain books in an online readable format. The collection includes great classical literature and more recent works where the U.S. copyright has expired. These books are yours to read and use without restrictions.


Source Code - Want to change a program or know how it works? Open Source provides the source code for its programs so that anyone can use, modify or learn how to write those programs themselves. Visit the GNU source code repositories to download the source.





Education


Study at Harvard, Stanford or MIT - Open edX provides free online courses from Harvard, MIT, Columbia, UC Berkeley and other top Universities. Hundreds of courses for almost all major subjects and course levels. Open edx also offers some paid courses and selected certifications.


Linux Manual Pages - A man or manual page is a form of software documentation found on Linux/Unix operating systems. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts.