This archive contains answers to questions sent to Unidata support through mid-2025. Note that the archive is no longer being updated. We provide the archive for reference; many of the answers presented here remain technically correct, even if somewhat outdated. For the most up-to-date information on the use of NSF Unidata software and data services, please consult the Software Documentation first.
>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/* +-----------------------------------------------------------------------------+