HP 3000 Manuals

Porting between HP C and VMS C [ HP C Programmer's Guide ] MPE/iX 5.0 Documentation


HP C Programmer's Guide

Porting between HP C and VMS C 

The C language itself is easy to port from VMS to HP-UX for two main
reasons:

   *   There is a high degree of compatibility between HP C and other
       common industry implementations of C as well as within the HP-UX
       family.

   *   The C language itself does not consider file manipulation or
       input/output to be part of the core language.  These issues are
       handled via libraries.  Thus, C avoids some of the thorniest
       issues of portability.

In most cases, HP C (in compatibility mode) is a superset of VMS C.
Therefore, porting from VMS to HP-UX is easier than porting in the other
direction.  The next several subsections describe features of C that can
cause problems in porting.

Core Language Features 

   *   Basic data types in VMS have the same general sizes as their
       counterparts on HP-UX. In particular, all integral and floating-
       point types have the same number of bits.  structs and unions do
       not necessarily have the same size because of different alignment
       rules. 

   *   Basic data types are aligned on arbitrary byte boundaries in VMS
       C. HP-UX counterparts generally have more restrictive alignments.

   *   Type char is signed by default on both VMS and HP-UX. 

   *   The unsigned adjective is recognized by both systems and is usable
       on char, short, int, and long.  It can also be used alone to refer
       to unsigned int.

   *   Both VMS and HP-UX support void and enum data types although the
       allowable uses of enum vary between the two systems.  HP-UX is
       generally less restrictive. 

   *   The VMS C storage class specifiers globaldef, globalref, and
       globalvalue have no direct counterparts on HP-UX or other
       implementations of UNIX. On HP-UX, variables are either local or
       global, based strictly on scope or static class specifiers. 

   *   The VMS C class modifiers readonly and noshare have no direct
       counterparts on HP-UX. 

   *   structs are packed differently on the two systems.  All elements
       are byte aligned in VMS whereas they are aligned more
       restrictively on the different HP-UX architectures based upon
       their type.  Organization of fields within the struct differs as
       well.

   *   Bit-fields within structs are more general on HP-UX than on VMS.
       VMS requires that they be of type int or unsigned whereas they may
       be any integral type on HP-UX. 

   *   Assignment of one struct to another is supported on both systems.
       However, VMS permits assignment of structs provided the types of
       both sides have the same size.  HP-UX is more restrictive because
       it requires that the two sides be of the same type.

   *   VMS C stores floating-point data in memory using a proprietary
       scheme.  Floats are stored in F_floating format.  Doubles are
       stored either in D_floating format or G_floating format.
       D_floating format is the default.  HP-UX uses IEEE standard
       formats which are not compatible with VMS types but which are
       compatible with most other industry implementations of UNIX. 

   *   VMS C converts floats to doubles by padding the mantissa with 0s.
       HP-UX uses IEEE formats for floating-point data and therefore must
       do a conversion by means of floating-point hardware or by use of
       library functions.  When doubles are converted to floats in VMS C,
       the mantissa is rounded toward zero, then truncated.  HP-UX uses
       either floating point hardware or library calls for these
       conversions.

       The VMS D_floating format can hide programming errors.  In
       particular, you might not immediately notice that mismatches exist
       between formal and actual function arguments if one is declared
       float and the counterpart is declared double because the only
       difference in the internal representation is the length of the
       mantissa.

   *   Due to the different internal representations of floating-point
       data, the range and precision of floating-point numbers differs on
       the two systems according to the following tables:

          Table 5-3.  VMS C Floating-Point Types 

---------------------------------------------------------------------------------------
|                |                                  |                                 |
|     Format     |     Approximate Range of |x|     |      Approximate Precision      |
|                |                                  |                                 |
---------------------------------------------------------------------------------------
|                |                                  |                                 |
| F_floating     | 0.29E-38 to 1.7E38               | 7 decimal digits                |
|                |                                  |                                 |
| D_floating     | 0.29E-38 to 1.7E38               | 16 decimal digits               |
|                |                                  |                                 |
| G_floating     | 0.56E-308 to 0.99E308            | 15 decimal digits               |
|                |                                  |                                 |
---------------------------------------------------------------------------------------

          Table 5-4.  HP-UX C Floating-Point Types 

---------------------------------------------------------------------------------------
|                |                                  |                                 |
|     Format     |     Approximate Range of |x|     |      Approximate Precision      |
|                |                                  |                                 |
---------------------------------------------------------------------------------------
|                |                                  |                                 |
| float          | 1.17E-38 to 3.40E38              | 7 decimal digits                |
|                |                                  |                                 |
| double         | 2.2E-308 to 1.8E308              | 16 decimal digits               |
|                |                                  |                                 |
| long double    | 3.36E-4932 to 1.19E4932          | 31 decimal digits               |
|                |                                  |                                 |
---------------------------------------------------------------------------------------

   *   VMS C identifiers are significant to the 31st character.  HP-UX C
       identifiers are significant to 255 characters. 

   *   register declarations are handled differently in VMS. The register
       reserved word is regarded by the compiler to be a strong hint to
       assign a dedicated register for the variable.  On Series 300/400,
       the register declaration causes an integral or pointer type to be
       assigned a dedicated register to the limits of the system, unless
       optimization at level +O2 or greater is requested, in which case
       the compiler ignores register declarations.  Series 700/800 treats
       register declarations as hints to the compiler. 

   *   If a variable is declared to be register in VMS and the & address
       operator is used in conjunction with that variable, no error is
       reported.  Instead, the VMS compiler converts the class of that
       variable to auto.  HP-UX compilers will report an error.

   *   Type conversions on both systems follow the usual progression
       found on implementations of UNIX.

   *   Character constants (not to be confused with string constants) are
       different on VMS. Each character constant can contain up to four
       ASCII characters.  If it contains fewer, as is the normal case, it
       is padded on the left by NULLs.  However, only the low order byte
       is printed when the %c descriptor is used with printf.
       Multicharacter character constants are treated as an overflow
       condition on Series 300/400 if the numerical value exceeds 127
       (the overflow is silent).  In compatibility mode, Series 700/800
       detects all multicharacter character constants as error conditions
       and reports them at compile time. 

   *   String constants can have a maximum length of 65535 characters in
       VMS. They are essentially unlimited on HP-UX. 

   *   VMS provides an alternative means of identifying a function as
       being the main program by the use of the adjective main program
       that is placed on the function definition.  This extension is not
       supported on HP-UX. Both systems support the special meaning of
       main(), however. 

   *   VMS implicity initializes pointers to 0.  HP-UX makes no implicit
       initialization of pointers unless they are static, so
       dereferencing an uninitialized pointer is an undefined operation
       on HP-UX. 

   *   VMS permits combining type specifiers with typedef names.  So, for
       example: 

            typedef long t;
            unsigned t x;

       is permitted on VMS. This is permitted only in compatibility mode
       on Series 300/400; it is not allowed in ANSI C mode on any HP-UX
       system.  To accomplish this on Series 700/800, change the typedef
       to include the type specifier:

            typedef unsigned long t;
            t x;

       Or use a #define:

            #define t long
            unsigned t x;

Preprocessor Features 

   *   VMS supports an unlimited nesting of #includes.  HP-UX in
       compatibility mode guarantees 35 levels of nesting.  HP-UX in ANSI
       mode guarantees 57 levels of nesting.

   *   The algorithms for searching for #includes differs on the two
       systems.  VMS has two variables, VAXC$INCLUDE and C$INCLUDE which
       control the order of searching.  HP-UX follows the usual order of
       searching found on most implementations of UNIX.

   *   #dictionary and #module are recognized in VMS but not on HP-UX.

   *   The following symbols are predefined in VMS but not on HP-UX: vms,
       vax, vaxc, vax11c, vms_version, CC$gfloat, VMS, VAX, VAXC, VAX11C,
       and VMS_VERSION.

   *   The following symbols are predefined on all HP-UX systems but not
       in VMS:
              __hp9000s300 on Series 300/400
              __hp9000s700 on Series 700
              __hp9000s800 on Series 700/800
              __hppa on Series 700/800
              __hpux and __unix on all systems

   *   HP-UX preprocessors do not include white space in the replacement
       text of a macro.  The VMS preprocessor does include the trailing
       white space.  If your HP C program depends on the inclusion of the
       white space, you can place white space around the macro
       invocation.

Compiler Environment 

   *   In VMS, files with a suffix of .C are assumed to be C source
       files, .OBJ suffixes imply object files, and .EXE suffixes imply
       executable files.  HP-UX uses the normal conventions on UNIX that
       .c implies a C source file, .o implies an object file, and a.out
       is the default executable file (but there is no other convention
       for executable files).

   *   varargs is supported on VMS and all HP-UX implementations.  See
       vprintf(3S) and varargs(5) for a description and examples. 

   *   curses is supported on VMS and all HP-UX implementations.  See
       curses(3X) for a description. 

   *   VMS supports VAXC$ERRNO and errno as two system variables to
       return error conditions.  HP-UX supports errno although there may
       be differences in the error codes or conditions.

   *   VMS supplies getchar and putchar as functions only, not as macros.
       HP-UX supplies them as macros and also supplies the functions
       fgetc and fputc which are the function versions.

   *   Major differences exist between the file systems of the two
       operating systems.  One of these is that the VMS directory
       SYS$LIBRARY contains many standard definition files for macros.
       The HP-UX directory /usr/include has a rough correspondence but
       the contents differ greatly.

   *   A VMS user must explicitly link the RTL libraries
       SYS$LIBRARY:VAXCURSE.OLB, SYS$LIBRARY:VAXCRTLG.OLB or
       SYS$LIBRARY:VAXCRTL.OLB to perform C input/output operations.  The
       HP-UX input/output utilities are included in /lib/libc, which is
       linked automatically by cc without being specified by the user. 

   *   Certain standard functions may have different interfaces on the
       two systems.  For example, strcpy() copies one string to another
       but the resulting destination may not be NULL terminated on VMS
       whereas it always will be on HP-UX.

   *   The commonly used HP-UX names end, edata and etext are not
       available on VMS.



MPE/iX 5.0 Documentation