Programming in C


Introduction

This section is dedicated to programmers who want to write applications (or service routines) in the ANSI C programming language. Since the GIPSY programming environment supports both Fortran and C as programming languages, there are some restrictions on what type of arguments may be passed to the routines. Also the module names have some restrictions since each operating system interfaces C and Fortran differently.

Function Arguments and Names

Each operating system has different ideas about how to interface Fortran modules with C modules. Therefore a portable Fortran to C (and vice versa) interface was developed at the Kapteyn Institute. This interface sets a number of restraints on the types of arguments passed to other service routines and on the names of servant routines.

Module names

Almost any routine in the GIPSY library is both C callable and Fortran callable. C programmers append `_c' to the lower case Fortran name. For example, a Fortran task would start with `CALL INIT', and a C task with `init_c();'.

Argument Types

The types of arguments which may be passed from one routine to the other, whether the called routines are written in C or Fortran, are:
       Fortran           C
       ----------------- ------
       CHARACTER         fchar
       COMPLEX           complex
       DOUBLE PRECISION  double
       INTEGER           fint
       LOGICAL           bool
       REAL              float
The non-C types in this table are all defined in include file gipsyc.h, so each C program or function must include this file (after the standard C include files but before the definition files).

fint

A fint is an integer which has the same number of bytes as the Fortran integer. Since C supports three integer types (short, int, long) and since the number of bytes occupied by these types is system dependent, C programmers must use fint for portability reasons.

fint will be one of the following, depending on the operating system:

      typedef short  fint;
      typedef int    fint;
      typedef long   fint;

bool

A bool is also an integer which has the same number of bytes as the Fortran logical.

complex

A complex is a struct consisting of two floats, one carrying the real part, the second carrying the imaginary part.
      typedef struct { float r; float i; } complex;

fchar

An fchar is a struct equivalent to a Fortran character variable or constant. fchar carries the address of the first element of the string and the length of the string. Note that this string is not null-terminated!
      typedef struct { char *a; fint l; } fchar;

Function types

The Fortran routines which correspond with C functions are the following:
      Fortran                    C
      -----------------------    -------------------------
      SUBROUTINE       SS(..)    void     ss_c(..)
      CHARACTER*(*)    CC(..)    void     cc_c(fchar r,..)
      COMPLEX          CX(..)    complex  cx_c(..)
      DOUBLE PRECISION DD(..)    double   dd_c(..)
      INTEGER          II(..)    fint     ii_c(..)
      LOGICAL          LL(..)    bool     ll_c(..)
      REAL             RR(..)    float    rr_c(..)
Note that Fortran character functions become voids in C with an extra argument being the destination of the character function.

Standard C library

Although most operating systems support ANSI C, some of them don't have the standard C include files and libraries. Therefore the eXtended C library was developed at the Kapteyn Institute to add the most important missing functions, or to replace those which are available on the operation systems but not working according to ANSI C specifications.

We have tried to supply the C programmer with the most interesting of those functions. These functions are defined in the following ANSI C include files.

Note that these include files reside in $gip_inc, and that they must be included using the "" notation instead of <>.
Programming GIPSY