[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

20050713: wavelet decompression ADDE server code (cont.)



>From:  "Valentijn Venus" <address@hidden>
>Organization:  ITC
>Keywords: 200507011338.j61DcBjo014148 McIDAS MSG wavlet development

Hi Valentijn,

re: is GINI server code in standard McIDAS distribution
>Thanks for the info.

No worries.

>Which lines exactly handle the decompression of the data (in
giniaget.cp?)?

There are several sections that need to deal with compressed 
bytes:

file: giniutil.c

procedures:

int
GetGiniHeader( FILELIST *cur, unsigned char *header )

int
GetGiniLine( FILELIST *cur, READPARM *read, int band, unsigned char *buf,
             char *err )

>I guess this c code for uncompressing the GINI image
>data was already in c?

Yes.

>Any suggestions/advice before we start modding?

McIDAS has a lot of examples of C calling Fortran and Fortran calling
C.  The biggest things to remember are:

- most Fortran compilers add a trailing underscore ('_') after entry point
  names.   This means that compiled entry points will have a trailing
  underscore and calls to routines in Fortran will have a trailing
  underscore

- C strings are null terminated; Fortran strings are not

- Fortran uses call by reference, not by value

>I believe t here are >10.000 lines just to do the wavelett tranform, so
>we'll have to call the c routines form the msgtaget2.for...

Fortran calling C is not hard.  One simple example of C code that
can called directly by C can be found in ~mcidas/mcidas2004/src/swbyt4_.c:

void
swbyt4_(void *buf, Fint *n)
{
        /* determine byte order from first principles */
        union
        {
                char            bytes[sizeof(Mcint4)];
                Mcint4          word;
        }               q;

        q.word = 1;
        if (q.bytes[3] == 1)
                return;

        /* swap bytes */
        fbyte4_(buf, n);
}


Notice:

- source code is C
- the type of the routine is 'void'; it is called by Fortran as a
  subroutine
- entry point has a trailing underscore (swbyt4_)
- the arguments are picked up by reference (i.e., by address)

Here is some Fortran code that calls this C code:

CALL SWBYT4(ICOL,1)

Fortran          C
----------------+-------------------------
ICOL             void *
1                Fint *

Fint (along with other types used in McIDAS) is defined in 'mcidas.h':

/* Fint is the C equivalent of Fortran INTEGER */
#ifndef _Fint
#define _Fint
    typedef int Fint;
#endif

Cheers,

Tom
--
+-----------------------------------------------------------------------------+
* Tom Yoksas                                             UCAR Unidata Program *
* (303) 497-8642 (last resort)                                  P.O. Box 3000 *
* address@hidden                                   Boulder, CO 80307 *
* Unidata WWW Service                             http://www.unidata.ucar.edu/*
+-----------------------------------------------------------------------------+