LCOV - code coverage report
Current view: top level - frmts/hdf4/hdf-eos - GDapi.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 10 1287 0.8 %
Date: 2025-01-18 12:42:00 Functions: 3 32 9.4 %

          Line data    Source code
       1             : /*****************************************************************************
       2             :  *
       3             :  * This module has a number of additions and improvements over the original
       4             :  * implementation to be suitable for usage in GDAL HDF driver.
       5             :  *
       6             :  * Andrey Kiselev <dron@ak4719.spb.edu> is responsible for all the changes.
       7             :  ****************************************************************************/
       8             : 
       9             : /*
      10             : Copyright (C) 1996 Hughes and Applied Research Corporation
      11             : 
      12             : Permission to use, modify, and distribute this software and its documentation
      13             : for any purpose without fee is hereby granted, provided that the above
      14             : copyright notice appear in all copies and that both that copyright notice and
      15             : this permission notice appear in supporting documentation.
      16             : */
      17             : /*****************************************************************************
      18             : REVISIONS:
      19             : 
      20             : Aug 31, 1999  Abe Taaheri    Changed memory allocation for utility strings to
      21             :                              the size of UTLSTR_MAX_SIZE.
      22             :            Added error check for memory unavailability in
      23             :            several functions.
      24             :            Added check for NULL metabuf returned from
      25             :            EHmeta... functions. NULL pointer returned from
      26             :            EHmeta... functions indicate that memory could not
      27             :            be allocated for metabuf.
      28             : Jun  27, 2000  Abe Taaheri   Added support for EASE grid that uses
      29             :                              Behrmann Cylinderical Equal Area (BCEA) projection
      30             : Oct  23, 2000  Abe Taaheri   Updated for ISINUS projection, so that both codes
      31             :                              31 and 99 can be used for this projection.
      32             : Jan  15, 2003   Abe Taaheri  Modified for generalization of EASE Grid.
      33             : 
      34             : Jun  05, 2003 Bruce Beaumont / Abe Taaheri
      35             : 
      36             :                              Fixed SQUARE definition.
      37             :                              Added static projection number/name translation
      38             :                              Added projection table lookup in GDdefproj.
      39             :                              Removed projection table from GDdefproj
      40             :                              Added projection table lookup in GDprojinfo
      41             :                              Removed projection table from GDprojinfo
      42             :                              Added cast for compcode in call to SDsetcompress
      43             :                                 in GDdeffield to avoid compiler errors
      44             :                              Removed declaration for unused variable endptr
      45             :                                 in GDSDfldsrch
      46             :                              Removed initialization code for unused variables
      47             :                                 in GDSDfldsrch
      48             :                              Removed declarations for unused variables
      49             :                                 BCEA_scale, r0, s0, xMtr0, xMtr1, yMtr0,
      50             :                                 and yMtr1 in GDll2ij
      51             :                              Removed initialization code for unused variables
      52             :                                 in GDll2ij
      53             :                              Added code in GEO projection handling to allow
      54             :                                 map to span dateline in GDll2ij
      55             :                              Changed "for each point" loop in GDll2ij to
      56             :                                 return -2147483648.0 for xVal and yVal if
      57             :                                 for_trans returned an error instead of
      58             :                                 returning an error to the caller
      59             :                                 (Note: MAXLONG is defined as 2147483647.0 in
      60             :                                  function cproj.c of GCTP)
      61             :                              Added code in GDij2ll to use for_trans to
      62             :                                 translate the BCEA corner points from packed
      63             :                                 degrees to meters
      64             :                              Removed declarations for unused variables
      65             :                                 BCEA_scale, r0, s0, xMtr, yMtr, epsilon,
      66             :                                 beta, qp_cea, kz_cea, eccen, eccen_sq,
      67             :                                 phi1, sinphi1, cosphi1, lon, lat, xcor,
      68             :                                 ycor, and nlatlon from GDij2ll
      69             :                              Removed initialization code for unused variables
      70             :                                 in GDij2ll
      71             :                              Added declarations for xMtr0, yMtr0, xMtr1, and
      72             :                                 yMtr1 in GDij2ll
      73             :                              Added special-case code for BCEA
      74             :                              Changed "for each point" loop in GDij2ll to
      75             :                                 return PGSd_GCT_IN_ERROR (1.0e51) for
      76             :                                 longitude and latitude values if inv_trans
      77             :                                 returned an error instead of return an error
      78             :                                 to the caller
      79             :                              Removed declaration for unused variable ii in
      80             :                                 GDgetpixvalues
      81             :                              Removed declaration for unused variable
      82             :                                 numTileDims in GDtileinfo
      83             :                              Added error message and error return at the
      84             :                                 end of GDll2mm_cea
      85             :                              Added return statement to GDll2mm_cea
      86             : ******************************************************************************/
      87             : #include "cpl_string.h"
      88             : #include "stdio.h"
      89             : #include "mfhdf.h"
      90             : #include "hcomp.h"
      91             : #include <math.h>
      92             : #include "HdfEosDef.h"
      93             : 
      94             : #include "hdf4compat.h"
      95             : 
      96             : extern  void for_init(int32, int32, float64 *, int32, const char *, const char *, int32 *,
      97             :                       int32 (*for_trans[])(double, double, double*, double*));
      98             : extern  void inv_init(int32, int32, float64 *, int32, const char *, const char *, int32 *,
      99             :                       int32 (*inv_trans[])(double, double, double*, double*));
     100             : 
     101             : #define GDIDOFFSET 4194304
     102             : #define SQUARE(x)       ((x) * (x))   /* x**2 */
     103             : 
     104             : 
     105             : #define NGRID 200
     106             : /* Grid Structure External Arrays */
     107             : struct gridStructure
     108             : {
     109             :     int32 active;
     110             :     int32 IDTable;
     111             :     int32 VIDTable[2];
     112             :     int32 fid;
     113             :     int32 nSDS;
     114             :     int32 *sdsID;
     115             :     int32 compcode;
     116             :     intn  compparm[5];
     117             :     int32 tilecode;
     118             :     int32 tilerank;
     119             :     int32 tiledims[8];
     120             : };
     121             : static struct gridStructure GDXGrid[NGRID];
     122             : 
     123             : 
     124             : 
     125             : #define NGRIDREGN 256
     126             : struct gridRegion
     127             : {
     128             :     int32 fid;
     129             :     int32 gridID;
     130             :     int32 xStart;
     131             :     int32 xCount;
     132             :     int32 yStart;
     133             :     int32 yCount;
     134             :     int32 somStart;
     135             :     int32 somCount;
     136             :     float64 upleftpt[2];
     137             :     float64 lowrightpt[2];
     138             :     int32 StartVertical[8];
     139             :     int32 StopVertical[8];
     140             :     char *DimNamePtr[8];
     141             : };
     142             : static struct gridRegion *GDXRegion[NGRIDREGN];
     143             : 
     144             : /* define a macro for the string size of the utility strings and some dimension
     145             :    list strings. The value of 80 in the previous version of this code
     146             :    may not be enough in some cases. The length now is 512 which seems to
     147             :    be more than enough to hold larger strings. */
     148             : 
     149             : #define UTLSTR_MAX_SIZE 512
     150             : 
     151             : /* Static projection table */
     152             : static const struct {
     153             :     int32 projcode;
     154             :     const char *projname;
     155             : } Projections[] = {
     156             :     {GCTP_GEO,     "GCTP_GEO"},
     157             :     {GCTP_UTM,     "GCTP_UTM"},
     158             :     {GCTP_SPCS,    "GCTP_SPCS"},
     159             :     {GCTP_ALBERS,  "GCTP_ALBERS"},
     160             :     {GCTP_LAMCC,   "GCTP_LAMCC"},
     161             :     {GCTP_MERCAT,  "GCTP_MERCAT"},
     162             :     {GCTP_PS,    "GCTP_PS"},
     163             :     {GCTP_POLYC,   "GCTP_POLYC"},
     164             :     {GCTP_EQUIDC,  "GCTP_EQUIDC"},
     165             :     {GCTP_TM,    "GCTP_TM"},
     166             :     {GCTP_STEREO,  "GCTP_STEREO"},
     167             :     {GCTP_LAMAZ,   "GCTP_LAMAZ"},
     168             :     {GCTP_AZMEQD,  "GCTP_AZMEQD"},
     169             :     {GCTP_GNOMON,  "GCTP_GNOMON"},
     170             :     {GCTP_ORTHO,   "GCTP_ORTHO"},
     171             :     {GCTP_GVNSP,   "GCTP_GVNSP"},
     172             :     {GCTP_SNSOID,  "GCTP_SNSOID"},
     173             :     {GCTP_EQRECT,  "GCTP_EQRECT"},
     174             :     {GCTP_MILLER,  "GCTP_MILLER"},
     175             :     {GCTP_VGRINT,  "GCTP_VGRINT"},
     176             :     {GCTP_HOM,     "GCTP_HOM"},
     177             :     {GCTP_ROBIN,   "GCTP_ROBIN"},
     178             :     {GCTP_SOM,     "GCTP_SOM"},
     179             :     {GCTP_ALASKA,  "GCTP_ALASKA"},
     180             :     {GCTP_GOOD,    "GCTP_GOOD"},
     181             :     {GCTP_MOLL,    "GCTP_MOLL"},
     182             :     {GCTP_IMOLL,   "GCTP_IMOLL"},
     183             :     {GCTP_HAMMER,  "GCTP_HAMMER"},
     184             :     {GCTP_WAGIV,   "GCTP_WAGIV"},
     185             :     {GCTP_WAGVII,  "GCTP_WAGVII"},
     186             :     {GCTP_OBLEQA,  "GCTP_OBLEQA"},
     187             :     {GCTP_ISINUS1, "GCTP_ISINUS1"},
     188             :     {GCTP_CEA,     "GCTP_CEA"},
     189             :     {GCTP_BCEA,    "GCTP_BCEA"},
     190             :     {GCTP_ISINUS,  "GCTP_ISINUS"},
     191             :     {-1,     NULL}
     192             : };
     193             : 
     194             : /* Compression Codes */
     195             : static const char * const HDFcomp[] = {
     196             :     "HDFE_COMP_NONE",
     197             :     "HDFE_COMP_RLE",
     198             :     "HDFE_COMP_NBIT",
     199             :     "HDFE_COMP_SKPHUFF",
     200             :     "HDFE_COMP_DEFLATE"
     201             : };
     202             : 
     203             : /* Origin Codes */
     204             : static const char * const originNames[] = {
     205             :     "HDFE_GD_UL",
     206             :     "HDFE_GD_UR",
     207             :     "HDFE_GD_LL",
     208             :     "HDFE_GD_LR"
     209             : };
     210             : 
     211             : /* Pixel Registration Codes */
     212             : static const char * const pixregNames[] = {
     213             :     "HDFE_CENTER",
     214             :     "HDFE_CORNER"
     215             : };
     216             : 
     217             : /* Grid Function Prototypes (internal routines) */
     218             : static intn GDchkgdid(int32, const char *, int32 *, int32 *, int32 *);
     219             : static intn GDSDfldsrch(int32, int32, const char *, int32 *, int32 *,
     220             :                         int32 *, int32 *, int32 [], int32 *);
     221             : static intn GDwrrdfield(int32, const char *, const char *,
     222             :                         int32 [], int32 [], int32 [], VOIDP datbuf);
     223             : static intn GDwrrdattr(int32, const char *, int32, int32, const char *, VOIDP);
     224             : static intn GDll2ij(int32, int32, float64 [], int32, int32, int32, float64[],
     225             :                     float64[], int32, float64[], float64[], int32[], int32[],
     226             :                     float64[], float64[]);
     227             : static intn  GDgetdefaults(int32, int32, float64[], int32,
     228             :                            float64[], float64[]);
     229             : static intn GDwrrdtile(int32, const char *, const char *, int32 [], VOIDP);
     230             : 
     231             : /*----------------------------------------------------------------------------|
     232             : |  BEGIN_PROLOG                                                               |
     233             : |                                                                             |
     234             : |  FUNCTION: GDopen                                                           |
     235             : |                                                                             |
     236             : |  DESCRIPTION: Opens or creates HDF file in order to create, read, or write  |
     237             : |                a grid.                                                      |
     238             : |                                                                             |
     239             : |                                                                             |
     240             : |  Return Value    Type     Units     Description                             |
     241             : |  ============   ======  =========   =====================================   |
     242             : |  fid            int32               HDF-EOS file ID                         |
     243             : |                                                                             |
     244             : |  INPUTS:                                                                    |
     245             : |  filename       char                Filename                                |
     246             : |  l_access         intn                HDF l_access code                         |
     247             : |                                                                             |
     248             : |                                                                             |
     249             : |  OUTPUTS:                                                                   |
     250             : |             None                                                            |
     251             : |                                                                             |
     252             : |  NOTES:                                                                     |
     253             : |                                                                             |
     254             : |                                                                             |
     255             : |   Date     Programmer   Description                                         |
     256             : |  ======   ============  =================================================   |
     257             : |  Jun 96   Joel Gales    Original Programmer                                 |
     258             : |                                                                             |
     259             : |  END_PROLOG                                                                 |
     260             : -----------------------------------------------------------------------------*/
     261             : int32
     262           4 : GDopen(const char *filename, intn l_access)
     263             : 
     264             : {
     265             :     int32           fid /* HDF-EOS file ID */ ;
     266             : 
     267             :     /* Call EHopen to perform file l_access */
     268             :     /* ---------------------------------- */
     269           4 :     fid = EHopen(filename, l_access);
     270             : 
     271           4 :     return (fid);
     272             : 
     273             : }
     274             : 
     275             : 
     276             : /*----------------------------------------------------------------------------|
     277             : |  BEGIN_PROLOG                                                               |
     278             : |                                                                             |
     279             : |  FUNCTION: GDattach                                                         |
     280             : |                                                                             |
     281             : |  DESCRIPTION: Attaches to an existing grid within the file.                 |
     282             : |                                                                             |
     283             : |                                                                             |
     284             : |  Return Value    Type     Units     Description                             |
     285             : |  ============   ======  =========   =====================================   |
     286             : |  gridID         int32               grid structure ID                       |
     287             : |                                                                             |
     288             : |  INPUTS:                                                                    |
     289             : |  fid            int32               HDF-EOS file id                         |
     290             : |  gridname       char                grid structure name                     |
     291             : |                                                                             |
     292             : |                                                                             |
     293             : |  OUTPUTS:                                                                   |
     294             : |             None                                                            |
     295             : |                                                                             |
     296             : |  NOTES:                                                                     |
     297             : |                                                                             |
     298             : |                                                                             |
     299             : |   Date     Programmer   Description                                         |
     300             : |  ======   ============  =================================================   |
     301             : |  Jun 96   Joel Gales    Original Programmer                                 |
     302             : |  Sep 99   Abe Taaheri   Modified test for memory allocation check when no   |
     303             : |                         SDSs are in the grid, NCR24147                    |
     304             : |                                                                             |
     305             : |  END_PROLOG                                                                 |
     306             : -----------------------------------------------------------------------------*/
     307             : int32
     308           0 : GDattach(int32 fid, const char *gridname)
     309             : 
     310             : {
     311             :     intn            i;    /* Loop index */
     312             :     intn            j;    /* Loop index */
     313           0 :     intn            ngridopen = 0;  /* # of grid structures open */
     314             :     intn            status; /* routine return status variable */
     315             : 
     316             :     uint8           acs;  /* Read/Write file l_access code */
     317             : 
     318             :     int32           HDFfid; /* HDF file id */
     319             :     int32           vgRef;  /* Vgroup reference number */
     320             :     int32           vgid[3];  /* Vgroup ID array */
     321           0 :     int32           gridID = -1;/* HDF-EOS grid ID */
     322             :     int32          *tags; /* Pnt to Vgroup object tags array */
     323             :     int32          *refs; /* Pnt to Vgroup object refs array */
     324             :     int32           dum;  /* dummy variable */
     325             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
     326             :     int32           nObjects; /* # of objects in Vgroup */
     327             :     int32           nSDS; /* SDS counter */
     328             :     int32           l_index;  /* SDS l_index */
     329             :     int32           sdid; /* SDS object ID */
     330           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
     331             : 
     332             :     char            name[80]; /* Vgroup name */
     333             :     char            class[80];  /* Vgroup class */
     334             :     char            errbuf[256];/* Buffer for error message */
     335             :     char            acsCode[1]; /* Read/Write l_access char: "r/w" */
     336             : 
     337             : 
     338             :     /* Check HDF-EOS file ID, get back HDF file ID and l_access code */
     339             :     /* ----------------------------------------------------------- */
     340           0 :     status = EHchkfid(fid, gridname, &HDFfid, &dum, &acs);
     341             : 
     342             : 
     343           0 :     if (status == 0)
     344             :     {
     345             :   /* Convert numeric l_access code to character */
     346             :   /* ---------------------------------------- */
     347             : 
     348           0 :   acsCode[0] = (acs == 1) ? 'w' : 'r';
     349             : 
     350             :   /* Determine number of grids currently opened */
     351             :   /* ------------------------------------------- */
     352           0 :   for (i = 0; i < NGRID; i++)
     353             :   {
     354           0 :       ngridopen += GDXGrid[i].active;
     355             :   }
     356             : 
     357             : 
     358             :   /* If room for more ... */
     359             :   /* -------------------- */
     360           0 :   if (ngridopen < NGRID)
     361             :   {
     362             : 
     363             :       /* Search Vgroups for Grid */
     364             :       /* ------------------------ */
     365           0 :       vgRef = -1;
     366             : 
     367             :       while (1)
     368             :       {
     369           0 :     vgRef = Vgetid(HDFfid, vgRef);
     370             : 
     371             :     /* If no more Vgroups then exist while loop */
     372             :     /* ---------------------------------------- */
     373           0 :     if (vgRef == -1)
     374             :     {
     375           0 :         break;
     376             :     }
     377             : 
     378             :     /* Get name and class of Vgroup */
     379             :     /* ---------------------------- */
     380           0 :     vgid[0] = Vattach(HDFfid, vgRef, "r");
     381           0 :     Vgetname(vgid[0], name);
     382           0 :     Vgetclass(vgid[0], class);
     383             : 
     384             : 
     385             :     /*
     386             :      * If Vgroup with gridname and class GRID found, load tables
     387             :      */
     388             : 
     389           0 :     if (strcmp(name, gridname) == 0 &&
     390           0 :         strcmp(class, "GRID") == 0)
     391             :     {
     392             :         /* Attach to "Data Fields" and "Grid Attributes" Vgroups */
     393             :         /* ----------------------------------------------------- */
     394           0 :         tags = (int32 *) malloc(sizeof(int32) * 2);
     395           0 :         if(tags == NULL)
     396             :         {
     397           0 :       HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
     398           0 :       return(-1);
     399             :         }
     400           0 :         refs = (int32 *) malloc(sizeof(int32) * 2);
     401           0 :         if(refs == NULL)
     402             :         {
     403           0 :       HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
     404           0 :       free(tags);
     405           0 :       return(-1);
     406             :         }
     407           0 :         Vgettagrefs(vgid[0], tags, refs, 2);
     408           0 :         vgid[1] = Vattach(HDFfid, refs[0], acsCode);
     409           0 :         vgid[2] = Vattach(HDFfid, refs[1], acsCode);
     410           0 :         free(tags);
     411           0 :         free(refs);
     412             : 
     413             : 
     414             :         /* Setup External Arrays */
     415             :         /* --------------------- */
     416           0 :         for (i = 0; i < NGRID; i++)
     417             :         {
     418             :       /* Find empty entry in array */
     419             :       /* ------------------------- */
     420           0 :       if (GDXGrid[i].active == 0)
     421             :       {
     422             :           /*
     423             :            * Set gridID, Set grid entry active, Store root
     424             :            * Vgroup ID, Store sub Vgroup IDs, Store HDF-EOS
     425             :            * file ID
     426             :            */
     427           0 :           gridID = i + idOffset;
     428           0 :           GDXGrid[i].active = 1;
     429           0 :           GDXGrid[i].IDTable = vgid[0];
     430           0 :           GDXGrid[i].VIDTable[0] = vgid[1];
     431           0 :           GDXGrid[i].VIDTable[1] = vgid[2];
     432           0 :           GDXGrid[i].fid = fid;
     433           0 :           break;
     434             :       }
     435             :         }
     436             : 
     437             :         /* Get SDS interface ID */
     438             :         /* -------------------- */
     439           0 :         status = GDchkgdid(gridID, "GDattach", &dum,
     440             :                &sdInterfaceID, &dum);
     441             : 
     442             : 
     443             :         /* Get # of entries within Data Vgroup & search for SDS */
     444             :         /* ---------------------------------------------------- */
     445           0 :         nObjects = Vntagrefs(vgid[1]);
     446             : 
     447           0 :         if (nObjects > 0)
     448             :         {
     449             :       /* Get tag and ref # for Data Vgroup objects */
     450             :       /* ----------------------------------------- */
     451           0 :       tags = (int32 *) malloc(sizeof(int32) * nObjects);
     452           0 :       if(tags == NULL)
     453             :       {
     454           0 :           HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
     455           0 :           return(-1);
     456             :       }
     457           0 :       refs = (int32 *) malloc(sizeof(int32) * nObjects);
     458           0 :       if(refs == NULL)
     459             :       {
     460           0 :           HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
     461           0 :           free(tags);
     462           0 :           return(-1);
     463             :       }
     464           0 :       Vgettagrefs(vgid[1], tags, refs, nObjects);
     465             : 
     466             :       /* Count number of SDS & allocate SDS ID array */
     467             :       /* ------------------------------------------- */
     468           0 :       nSDS = 0;
     469           0 :       for (j = 0; j < nObjects; j++)
     470             :       {
     471           0 :           if (tags[j] == DFTAG_NDG)
     472             :           {
     473           0 :         nSDS++;
     474             :           }
     475             :       }
     476           0 :       GDXGrid[i].sdsID = (int32 *) calloc(nSDS, 4);
     477           0 :       if(GDXGrid[i].sdsID == NULL && nSDS != 0)
     478             :       {
     479           0 :           HEpush(DFE_NOSPACE,"GDattach", __FILE__, __LINE__);
     480           0 :           free(tags);
     481           0 :           free(refs);
     482           0 :           return(-1);
     483             :       }
     484           0 :       nSDS = 0;
     485             : 
     486             : 
     487             : 
     488             :       /* Fill SDS ID array */
     489             :       /* ----------------- */
     490           0 :       for (j = 0; j < nObjects; j++)
     491             :       {
     492             :           /* If object is SDS then get id */
     493             :           /* ---------------------------- */
     494           0 :           if (tags[j] == DFTAG_NDG)
     495             :           {
     496           0 :         l_index = SDreftoindex(sdInterfaceID, refs[j]);
     497           0 :         sdid = SDselect(sdInterfaceID, l_index);
     498           0 :         GDXGrid[i].sdsID[nSDS] = sdid;
     499           0 :         nSDS++;
     500           0 :         GDXGrid[i].nSDS++;
     501             :           }
     502             :       }
     503           0 :       free(tags);
     504           0 :       free(refs);
     505             :         }
     506           0 :         break;
     507             :     }
     508             : 
     509             :     /* Detach Vgroup if not desired Grid */
     510             :     /* --------------------------------- */
     511           0 :     Vdetach(vgid[0]);
     512             :       }
     513             : 
     514             :       /* If Grid not found then set up error message */
     515             :       /* ------------------------------------------- */
     516           0 :       if (gridID == -1)
     517             :       {
     518           0 :     HEpush(DFE_RANGE, "GDattach", __FILE__, __LINE__);
     519           0 :     HEreport("Grid: \"%s\" does not exist within HDF file.\n",
     520             :        gridname);
     521             :       }
     522             :   }
     523             :   else
     524             :   {
     525             :       /* Too many files opened */
     526             :       /* --------------------- */
     527           0 :       gridID = -1;
     528           0 :       strcpy(errbuf,
     529             :        "No more than %d grids may be open simultaneously");
     530           0 :       strcat(errbuf, " (%s)");
     531           0 :       HEpush(DFE_DENIED, "GDattach", __FILE__, __LINE__);
     532           0 :       HEreport(errbuf, NGRID, gridname);
     533             :   }
     534             : 
     535             :     }
     536           0 :     return (gridID);
     537             : }
     538             : 
     539             : 
     540             : /*----------------------------------------------------------------------------|
     541             : |  BEGIN_PROLOG                                                               |
     542             : |                                                                             |
     543             : |  FUNCTION: GDchkgdid                                                        |
     544             : |                                                                             |
     545             : |  DESCRIPTION:                                                               |
     546             : |                                                                             |
     547             : |                                                                             |
     548             : |  Return Value    Type     Units     Description                             |
     549             : |  ============   ======  =========   =====================================   |
     550             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     551             : |                                                                             |
     552             : |  INPUTS:                                                                    |
     553             : |  gridID         int32               grid structure ID                       |
     554             : |  routname       char                Name of routine calling GDchkgdid       |
     555             : |                                                                             |
     556             : |  OUTPUTS:                                                                   |
     557             : |  fid            int32               File ID                                 |
     558             : |  sdInterfaceID  int32               SDS interface ID                        |
     559             : |  gdVgrpID       int32               grid Vgroup ID                          |
     560             : |                                                                             |
     561             : |                                                                             |
     562             : |  OUTPUTS:                                                                   |
     563             : |             None                                                            |
     564             : |                                                                             |
     565             : |  NOTES:                                                                     |
     566             : |                                                                             |
     567             : |                                                                             |
     568             : |   Date     Programmer   Description                                         |
     569             : |  ======   ============  =================================================   |
     570             : |  Jun 96   Joel Gales    Original Programmer                                 |
     571             : |                                                                             |
     572             : |  END_PROLOG                                                                 |
     573             : -----------------------------------------------------------------------------*/
     574             : static intn
     575           0 : GDchkgdid(int32 gridID, const char *routname,
     576             :     int32 * fid, int32 * sdInterfaceID, int32 * gdVgrpID)
     577             : {
     578           0 :     intn            status = 0; /* routine return status variable */
     579             :     uint8           l_access; /* Read/Write l_access code */
     580             :     int32           gID;  /* Grid ID - offset */
     581             : 
     582           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
     583             : 
     584             :     static const char message1[] =
     585             :         "Invalid grid id: %d in routine \"%s\".  ID must be >= %d and < %d.\n";
     586             :     static const char message2[] =
     587             :         "Grid id %d in routine \"%s\" not active.\n";
     588             : 
     589             : 
     590             : 
     591             :     /* Check for valid grid id */
     592             : 
     593           0 :     if (gridID < idOffset || gridID >= NGRID + idOffset)
     594             :     {
     595           0 :   status = -1;
     596           0 :   HEpush(DFE_RANGE, "GDchkgdid", __FILE__, __LINE__);
     597           0 :   HEreport(message1, gridID, routname, idOffset, NGRID + idOffset);
     598             :     }
     599             :     else
     600             :     {
     601             : 
     602             :   /* Compute "reduced" ID */
     603             :   /* -------------------- */
     604           0 :   gID = gridID % idOffset;
     605             : 
     606             :   /* Check for active grid ID */
     607             :   /* ------------------------ */
     608           0 :   if (GDXGrid[gID].active == 0)
     609             :   {
     610           0 :       status = -1;
     611           0 :       HEpush(DFE_GENAPP, "GDchkgdid", __FILE__, __LINE__);
     612           0 :       HEreport(message2, gridID, routname);
     613             :   }
     614             :   else
     615             :   {
     616             : 
     617             :       /* Get file & SDS ids and Grid key */
     618             :       /* -------------------------------- */
     619           0 :       status = EHchkfid(GDXGrid[gID].fid, " ",
     620             :             fid, sdInterfaceID, &l_access);
     621           0 :       *gdVgrpID = GDXGrid[gID].IDTable;
     622             :   }
     623             :     }
     624           0 :     return (status);
     625             : 
     626             : }
     627             : 
     628             : 
     629             : /*----------------------------------------------------------------------------|
     630             : |  BEGIN_PROLOG                                                               |
     631             : |                                                                             |
     632             : |  FUNCTION: GDdiminfo                                                        |
     633             : |                                                                             |
     634             : |  DESCRIPTION: Retrieve size of specified dimension.                         |
     635             : |                                                                             |
     636             : |                                                                             |
     637             : |  Return Value    Type     Units     Description                             |
     638             : |  ============   ======  =========   =====================================   |
     639             : |  size           int32               Size of dimension                       |
     640             : |                                                                             |
     641             : |  INPUTS:                                                                    |
     642             : |  gridID         int32               grid structure id                       |
     643             : |  dimname        char                Dimension name                          |
     644             : |                                                                             |
     645             : |                                                                             |
     646             : |  OUTPUTS:                                                                   |
     647             : |             None                                                            |
     648             : |                                                                             |
     649             : |  NOTES:                                                                     |
     650             : |                                                                             |
     651             : |                                                                             |
     652             : |   Date     Programmer   Description                                         |
     653             : |  ======   ============  =================================================   |
     654             : |  Jun 96   Joel Gales    Original Programmer                                 |
     655             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
     656             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
     657             : |                                                                             |
     658             : |  END_PROLOG                                                                 |
     659             : -----------------------------------------------------------------------------*/
     660             : int32
     661           0 : GDdiminfo(int32 gridID, const char *dimname)
     662             : 
     663             : {
     664             :     intn            status; /* routine return status variable */
     665             : 
     666             :     int32           fid;  /* HDF-EOS file ID */
     667             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
     668             :     int32           gdVgrpID; /* Grid root Vgroup ID */
     669             :     int32           size; /* Dimension size */
     670           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
     671             : 
     672             : 
     673             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
     674             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
     675             :     char            gridname[80]; /* Grid Name */
     676             :     char           *utlstr; /* Utility string */
     677             : 
     678             :     /* Allocate space for utility string */
     679             :     /* --------------------------------- */
     680           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
     681           0 :     if(utlstr == NULL)
     682             :     {
     683           0 :   HEpush(DFE_NOSPACE,"GDdiminfo", __FILE__, __LINE__);
     684           0 :   return(-1);
     685             :     }
     686             :     /* Initialize return value */
     687             :     /* ----------------------- */
     688           0 :     size = -1;
     689             : 
     690             : 
     691             :     /* Check Grid ID */
     692             :     /* ------------- */
     693           0 :     status = GDchkgdid(gridID, "GDdiminfo", &fid, &sdInterfaceID, &gdVgrpID);
     694             : 
     695             : 
     696           0 :     if (status == 0)
     697             :     {
     698             :   /* Get grid name */
     699             :   /* ------------- */
     700           0 :   int gID = gridID % idOffset;
     701           0 :   if (gID >= NGRID)
     702             :   {
     703           0 :      free(utlstr);
     704           0 :      return -1;
     705             :   }
     706           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
     707             : 
     708             : 
     709             :   /* Get pointers to "Dimension" section within SM */
     710             :   /* --------------------------------------------- */
     711           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
     712             :                "Dimension", metaptrs);
     713             : 
     714           0 :   if(metabuf == NULL)
     715             :   {
     716           0 :       free(utlstr);
     717           0 :       return(-1);
     718             :   }
     719             : 
     720             :   /* Search for dimension name (surrounded by quotes) */
     721             :   /* ------------------------------------------------ */
     722           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", dimname, "\"\n");
     723           0 :   metaptrs[0] = strstr(metaptrs[0], utlstr);
     724             : 
     725             :   /*
     726             :    * If dimension found within grid structure then get dimension value
     727             :    */
     728           0 :   if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
     729             :   {
     730             :       /* Set endptr at end of dimension definition entry */
     731             :       /* ----------------------------------------------- */
     732           0 :       metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
     733             : 
     734           0 :       status = EHgetmetavalue(metaptrs, "Size", utlstr);
     735             : 
     736           0 :       if (status == 0)
     737             :       {
     738           0 :     size = atoi(utlstr);
     739             :       }
     740             :       else
     741             :       {
     742           0 :     HEpush(DFE_GENAPP, "GDdiminfo", __FILE__, __LINE__);
     743           0 :     HEreport("\"Size\" string not found in metadata.\n");
     744             :       }
     745             :   }
     746             :   else
     747             :   {
     748           0 :       HEpush(DFE_GENAPP, "GDdiminfo", __FILE__, __LINE__);
     749           0 :       HEreport("Dimension \"%s\" not found.\n", dimname);
     750             :   }
     751             : 
     752           0 :   free(metabuf);
     753             :     }
     754           0 :     free(utlstr);
     755           0 :     return (size);
     756             : }
     757             : 
     758             : 
     759             : 
     760             : 
     761             : 
     762             : /*----------------------------------------------------------------------------|
     763             : |  BEGIN_PROLOG                                                               |
     764             : |                                                                             |
     765             : |  FUNCTION: GDgridinfo                                                       |
     766             : |                                                                             |
     767             : |  DESCRIPTION: Returns xdim, ydim and location of upper left and lower       |
     768             : |                right corners, in meters.                                    |
     769             : |                                                                             |
     770             : |                                                                             |
     771             : |  Return Value    Type     Units     Description                             |
     772             : |  ============   ======  =========   =====================================   |
     773             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     774             : |                                                                             |
     775             : |  INPUTS:                                                                    |
     776             : |  fid            int32               File ID                                 |
     777             : |  gridname       char                Grid structure name                     |
     778             : |                                                                             |
     779             : |  OUTPUTS:                                                                   |
     780             : |  xdimsize       int32               Number of columns in grid               |
     781             : |  ydimsize       int32               Number of rows in grid                  |
     782             : |  upleftpt       float64             Location (m/deg) of upper left corner   |
     783             : |  lowrightpt     float64             Location (m/deg) of lower right corner  |
     784             : |                                                                             |
     785             : |  NOTES:                                                                     |
     786             : |                                                                             |
     787             : |                                                                             |
     788             : |   Date     Programmer   Description                                         |
     789             : |  ======   ============  =================================================   |
     790             : |  Jun 96   Joel Gales    Original Programmer                                 |
     791             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
     792             : |                                                                             |
     793             : |  END_PROLOG                                                                 |
     794             : -----------------------------------------------------------------------------*/
     795             : intn
     796           0 : GDgridinfo(int32 gridID, int32 * xdimsize, int32 * ydimsize,
     797             :      float64 upleftpt[], float64 lowrightpt[])
     798             : 
     799             : {
     800           0 :     intn            status = 0; /* routine return status variable */
     801           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
     802             : 
     803             :     int32           fid;  /* HDF-EOS file ID */
     804             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
     805             :     int32           gdVgrpID; /* Grid root Vgroup ID */
     806           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
     807             : 
     808             : 
     809             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
     810             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
     811             :     char            gridname[80]; /* Grid Name */
     812             :     char           *utlstr; /* Utility string */
     813             : 
     814             :     /* Allocate space for utility string */
     815             :     /* --------------------------------- */
     816           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
     817           0 :     if(utlstr == NULL)
     818             :     {
     819           0 :   HEpush(DFE_NOSPACE,"GDgridinfo", __FILE__, __LINE__);
     820           0 :   return(-1);
     821             :     }
     822             :     /* Check Grid ID */
     823             :     /* ------------- */
     824           0 :     status = GDchkgdid(gridID, "GDgridinfo", &fid, &sdInterfaceID, &gdVgrpID);
     825             : 
     826           0 :     if (status == 0)
     827             :     {
     828             :   /* Get grid name */
     829             :   /* ------------- */
     830           0 :   int gID = gridID % idOffset;
     831           0 :   if (gID >= NGRID)
     832             :   {
     833           0 :      free(utlstr);
     834           0 :      return -1;
     835             :   }
     836           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
     837             : 
     838             : 
     839             :   /* Get pointers to grid structure section within SM */
     840             :   /* ------------------------------------------------ */
     841           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
     842             :                NULL, metaptrs);
     843             : 
     844           0 :   if(metabuf == NULL)
     845             :   {
     846           0 :       free(utlstr);
     847           0 :       return(-1);
     848             :   }
     849             : 
     850             : 
     851             :   /* Get xdimsize if requested */
     852             :   /* ------------------------- */
     853           0 :   if (xdimsize != NULL)
     854             :   {
     855           0 :       statmeta = EHgetmetavalue(metaptrs, "XDim", utlstr);
     856           0 :       if (statmeta == 0)
     857             :       {
     858           0 :     *xdimsize = atoi(utlstr);
     859             :       }
     860             :       else
     861             :       {
     862           0 :     status = -1;
     863           0 :     HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
     864           0 :     HEreport("\"XDim\" string not found in metadata.\n");
     865             :       }
     866             :   }
     867             : 
     868             : 
     869             :   /* Get ydimsize if requested */
     870             :   /* ------------------------- */
     871           0 :   if (ydimsize != NULL)
     872             :   {
     873           0 :       statmeta = EHgetmetavalue(metaptrs, "YDim", utlstr);
     874           0 :       if (statmeta == 0)
     875             :       {
     876           0 :     *ydimsize = atoi(utlstr);
     877             :       }
     878             :       else
     879             :       {
     880           0 :     status = -1;
     881           0 :     HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
     882           0 :     HEreport("\"YDim\" string not found in metadata.\n");
     883             :       }
     884             :   }
     885             : 
     886             : 
     887             :   /* Get upleftpt if requested */
     888             :   /* ------------------------- */
     889           0 :   if (upleftpt != NULL)
     890             :   {
     891           0 :       statmeta = EHgetmetavalue(metaptrs, "UpperLeftPointMtrs", utlstr);
     892           0 :       if (statmeta == 0)
     893             :       {
     894             :     /* If value is "DEFAULT" then return zeros */
     895             :     /* --------------------------------------- */
     896           0 :     if (strcmp(utlstr, "DEFAULT") == 0)
     897             :     {
     898           0 :         upleftpt[0] = 0;
     899           0 :         upleftpt[1] = 0;
     900             :     }
     901             :     else
     902             :     {
     903           0 :         sscanf(utlstr, "(%lf,%lf)",
     904             :          &upleftpt[0], &upleftpt[1]);
     905             :     }
     906             :       }
     907             :       else
     908             :       {
     909           0 :     status = -1;
     910           0 :     HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
     911           0 :     HEreport(
     912             :       "\"UpperLeftPointMtrs\" string not found in metadata.\n");
     913             :       }
     914             : 
     915             :   }
     916             : 
     917             :   /* Get lowrightpt if requested */
     918             :   /* --------------------------- */
     919           0 :   if (lowrightpt != NULL)
     920             :   {
     921           0 :       statmeta = EHgetmetavalue(metaptrs, "LowerRightMtrs", utlstr);
     922           0 :       if (statmeta == 0)
     923             :       {
     924             :     /* If value is "DEFAULT" then return zeros */
     925           0 :     if (strcmp(utlstr, "DEFAULT") == 0)
     926             :     {
     927           0 :         lowrightpt[0] = 0;
     928           0 :         lowrightpt[1] = 0;
     929             :     }
     930             :     else
     931             :     {
     932           0 :         sscanf(utlstr, "(%lf,%lf)",
     933             :          &lowrightpt[0], &lowrightpt[1]);
     934             :     }
     935             :       }
     936             :       else
     937             :       {
     938           0 :     status = -1;
     939           0 :     HEpush(DFE_GENAPP, "GDgridinfo", __FILE__, __LINE__);
     940           0 :     HEreport(
     941             :           "\"LowerRightMtrs\" string not found in metadata.\n");
     942             :       }
     943             :   }
     944             : 
     945           0 :   free(metabuf);
     946             :     }
     947           0 :     free(utlstr);
     948           0 :     return (status);
     949             : }
     950             : 
     951             : 
     952             : 
     953             : 
     954             : 
     955             : 
     956             : 
     957             : /*----------------------------------------------------------------------------|
     958             : |  BEGIN_PROLOG                                                               |
     959             : |                                                                             |
     960             : |  FUNCTION: GDprojinfo                                                       |
     961             : |                                                                             |
     962             : |  DESCRIPTION: Returns GCTP projection code, zone code, spheroid code        |
     963             : |                and projection parameters.                                   |
     964             : |                                                                             |
     965             : |                                                                             |
     966             : |  Return Value    Type     Units     Description                             |
     967             : |  ============   ======  =========   =====================================   |
     968             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     969             : |                                                                             |
     970             : |  INPUTS:                                                                    |
     971             : |  gridID         int32               Grid structure ID                       |
     972             : |                                                                             |
     973             : |  OUTPUTS:                                                                   |
     974             : |  projcode       int32               GCTP projection code                    |
     975             : |  zonecode       int32               UTM zone code                           |
     976             : |  spherecode     int32               GCTP spheriod code                      |
     977             : |  projparm       float64             Projection parameters                   |
     978             : |                                                                             |
     979             : |  NOTES:                                                                     |
     980             : |                                                                             |
     981             : |                                                                             |
     982             : |   Date     Programmer   Description                                         |
     983             : |  ======   ============  =================================================   |
     984             : |  Jun 96   Joel Gales    Original Programmer                                 |
     985             : |  Oct 96   Joel Gales    Add check for no projection code                    |
     986             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
     987             : |  Jun 00   Abe Taaheri   Added support for EASE grid                         |
     988             : |                                                                             |
     989             : |  END_PROLOG                                                                 |
     990             : -----------------------------------------------------------------------------*/
     991             : intn
     992           0 : GDprojinfo(int32 gridID, int32 * projcode, int32 * zonecode,
     993             :      int32 * spherecode, float64 projparm[])
     994             : 
     995             : {
     996             :     intn            i;    /* Loop index */
     997             :     intn            projx;    /* Loop index */
     998           0 :     intn            status = 0; /* routine return status variable */
     999           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
    1000             : 
    1001             :     int32           fid;  /* HDF-EOS file ID */
    1002             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1003             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    1004           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    1005             : 
    1006             : 
    1007             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1008             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1009             :     char            gridname[80]; /* Grid Name */
    1010             :     char           *utlstr; /* Utility string */
    1011             :     char            fmt[96];  /* Format String */
    1012             : 
    1013             :     /* Allocate space for utility string */
    1014             :     /* --------------------------------- */
    1015           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1016           0 :     if(utlstr == NULL)
    1017             :     {
    1018           0 :   HEpush(DFE_NOSPACE,"GDprojinfo", __FILE__, __LINE__);
    1019           0 :   return(-1);
    1020             :     }
    1021             : 
    1022             :     /* Check Grid ID */
    1023             :     /* ------------- */
    1024           0 :     status = GDchkgdid(gridID, "GDprojinfo", &fid, &sdInterfaceID, &gdVgrpID);
    1025             : 
    1026           0 :     if (status == 0)
    1027             :     {
    1028             :   /* Get grid name */
    1029             :   /* ------------- */
    1030           0 :   int gID = gridID % idOffset;
    1031           0 :   if (gID >= NGRID)
    1032             :   {
    1033           0 :      free(utlstr);
    1034           0 :      return -1;
    1035             :   }
    1036             : 
    1037           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
    1038             : 
    1039             : 
    1040             :   /* Get pointers to grid structure section within SM */
    1041             :   /* ------------------------------------------------ */
    1042           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    1043             :                NULL, metaptrs);
    1044             : 
    1045           0 :   if(metabuf == NULL)
    1046             :   {
    1047           0 :       free(utlstr);
    1048           0 :       return(-1);
    1049             :   }
    1050             : 
    1051             : 
    1052             :   /* Get projcode if requested */
    1053             :   /* ------------------------- */
    1054           0 :   if (projcode != NULL)
    1055             :   {
    1056           0 :       *projcode = -1;
    1057             : 
    1058           0 :       statmeta = EHgetmetavalue(metaptrs, "Projection", utlstr);
    1059           0 :       if (statmeta == 0)
    1060             :       {
    1061             :     /* Loop through projection codes until found */
    1062             :     /* ----------------------------------------- */
    1063           0 :     for (projx = 0; Projections[projx].projcode != -1; projx++)
    1064           0 :         if (strcmp(utlstr, Projections[projx].projname) == 0)
    1065           0 :       break;
    1066           0 :     if (Projections[projx].projname != NULL)
    1067           0 :         *projcode = Projections[projx].projcode;
    1068             :       }
    1069             :       else
    1070             :       {
    1071           0 :     status = -1;
    1072           0 :     HEpush(DFE_GENAPP, "GDprojinfo", __FILE__, __LINE__);
    1073           0 :     HEreport("Projection Code not defined for \"%s\".\n",
    1074             :        gridname);
    1075             : 
    1076           0 :     if (projparm != NULL)
    1077             :     {
    1078           0 :         for (i = 0; i < 13; i++)
    1079             :         {
    1080           0 :       projparm[i] = -1;
    1081             :         }
    1082             :     }
    1083             :       }
    1084             :   }
    1085             : 
    1086             : 
    1087             :   /* Get zonecode if requested */
    1088             :   /* ------------------------- */
    1089           0 :   if (projcode && zonecode != NULL)
    1090             :   {
    1091           0 :       *zonecode = -1;
    1092             : 
    1093             : 
    1094             :       /* Zone code only relevant for UTM and State Code projections */
    1095             :       /* ---------------------------------------------------------- */
    1096           0 :       if (*projcode == GCTP_UTM || *projcode == GCTP_SPCS)
    1097             :       {
    1098           0 :     statmeta = EHgetmetavalue(metaptrs, "ZoneCode", utlstr);
    1099           0 :     if (statmeta == 0)
    1100             :     {
    1101           0 :         *zonecode = atoi(utlstr);
    1102             :     }
    1103             :     else
    1104             :     {
    1105           0 :         status = -1;
    1106           0 :         HEpush(DFE_GENAPP, "GDprojinfo", __FILE__, __LINE__);
    1107           0 :         HEreport("Zone Code not defined for \"%s\".\n",
    1108             :            gridname);
    1109             :     }
    1110             :       }
    1111             :   }
    1112             : 
    1113             : 
    1114             :   /* Get projection parameters if requested */
    1115             :   /* -------------------------------------- */
    1116           0 :   if (projcode && projparm != NULL)
    1117             :   {
    1118             : 
    1119             :       /*
    1120             :        * Note: No projection parameters for GEO, UTM, and State Code
    1121             :        * projections
    1122             :        */
    1123           0 :       if (*projcode == GCTP_GEO || *projcode == GCTP_UTM ||
    1124           0 :     *projcode == GCTP_SPCS)
    1125             :       {
    1126           0 :     for (i = 0; i < 13; i++)
    1127             :     {
    1128           0 :         projparm[i] = 0.0;
    1129             :     }
    1130             : 
    1131             :       }
    1132             :       else
    1133             :       {
    1134           0 :     statmeta = EHgetmetavalue(metaptrs, "ProjParams", utlstr);
    1135             : 
    1136           0 :     if (statmeta == 0)
    1137             :     {
    1138             : 
    1139             :         /* Build format string to read projection parameters */
    1140             :         /* ------------------------------------------------- */
    1141           0 :         strcpy(fmt, "%lf,");
    1142           0 :         for (i = 1; i <= 11; i++)
    1143           0 :       strcat(fmt, "%lf,");
    1144           0 :         strcat(fmt, "%lf");
    1145             : 
    1146             : 
    1147             :         /* Read parameters from numeric list */
    1148             :         /* --------------------------------- */
    1149           0 :         sscanf(&utlstr[1], fmt,
    1150             :          &projparm[0], &projparm[1],
    1151             :          &projparm[2], &projparm[3],
    1152             :          &projparm[4], &projparm[5],
    1153             :          &projparm[6], &projparm[7],
    1154             :          &projparm[8], &projparm[9],
    1155             :          &projparm[10], &projparm[11],
    1156             :          &projparm[12]);
    1157             :     }
    1158             :     else
    1159             :     {
    1160           0 :         status = -1;
    1161           0 :         HEpush(DFE_GENAPP, "GDprojinfo", __FILE__, __LINE__);
    1162           0 :         HEreport("Projection parameters not defined for \"%s\".\n",
    1163             :            gridname);
    1164             : 
    1165             :     }
    1166             :       }
    1167             :   }
    1168             : 
    1169             : 
    1170             :   /* Get spherecode if requested */
    1171             :   /* --------------------------- */
    1172           0 :   if (projcode && spherecode != NULL)
    1173             :   {
    1174           0 :       *spherecode = 0;
    1175             : 
    1176             :       /* Note: Spherecode not defined for GEO projection */
    1177             :       /* ----------------------------------------------- */
    1178           0 :       if ((*projcode != GCTP_GEO))
    1179             :       {
    1180           0 :     EHgetmetavalue(metaptrs, "SphereCode", utlstr);
    1181           0 :     if (statmeta == 0)
    1182             :     {
    1183           0 :         *spherecode = atoi(utlstr);
    1184             :     }
    1185             :       }
    1186             :   }
    1187           0 :   free(metabuf);
    1188             : 
    1189             :     }
    1190           0 :     free(utlstr);
    1191           0 :     return (status);
    1192             : }
    1193             : 
    1194             : 
    1195             : 
    1196             : /*----------------------------------------------------------------------------|
    1197             : |  BEGIN_PROLOG                                                               |
    1198             : |                                                                             |
    1199             : |  FUNCTION: GDorigininfo                                                     |
    1200             : |                                                                             |
    1201             : |  DESCRIPTION: Returns origin code                                           |
    1202             : |                                                                             |
    1203             : |                                                                             |
    1204             : |  Return Value    Type     Units     Description                             |
    1205             : |  ============   ======  =========   =====================================   |
    1206             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1207             : |                                                                             |
    1208             : |  INPUTS:                                                                    |
    1209             : |  gridID         int32               Grid structure ID                       |
    1210             : |                                                                             |
    1211             : |                                                                             |
    1212             : |  OUTPUTS:                                                                   |
    1213             : |  origincode     int32               grid origin code                        |
    1214             : |                                                                             |
    1215             : |  NOTES:                                                                     |
    1216             : |                                                                             |
    1217             : |                                                                             |
    1218             : |   Date     Programmer   Description                                         |
    1219             : |  ======   ============  =================================================   |
    1220             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1221             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
    1222             : |                                                                             |
    1223             : |  END_PROLOG                                                                 |
    1224             : -----------------------------------------------------------------------------*/
    1225             : intn
    1226           0 : GDorigininfo(int32 gridID, int32 * origincode)
    1227             : {
    1228             :     intn            i;    /* Loop index */
    1229           0 :     intn            status = 0; /* routine return status variable */
    1230           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
    1231             : 
    1232             :     int32           fid;  /* HDF-EOS file ID */
    1233             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1234             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    1235           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    1236             : 
    1237             : 
    1238             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1239             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1240             :     char            gridname[80]; /* Grid Name */
    1241             :     char           *utlstr; /* Utility string */
    1242             : 
    1243             :     /* Allocate space for utility string */
    1244             :     /* --------------------------------- */
    1245           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1246           0 :     if(utlstr == NULL)
    1247             :     {
    1248           0 :   HEpush(DFE_NOSPACE,"GDorigininfo", __FILE__, __LINE__);
    1249           0 :   return(-1);
    1250             :     }
    1251             :     /* Check Grid ID */
    1252             :     /* ------------- */
    1253           0 :     status = GDchkgdid(gridID, "GDorigininfo",
    1254             :            &fid, &sdInterfaceID, &gdVgrpID);
    1255             : 
    1256             : 
    1257             :     /* Initialize pixreg code to -1 (in case of error) */
    1258             :     /* ----------------------------------------------- */
    1259           0 :     *origincode = -1;
    1260             : 
    1261           0 :     if (status == 0)
    1262             :     {
    1263             :   /* Set default origin code */
    1264             :   /* ----------------------- */
    1265           0 :   *origincode = 0;
    1266             : 
    1267             : 
    1268             :   /* Get grid name */
    1269             :   /* ------------- */
    1270           0 :   int gID = gridID % idOffset;
    1271           0 :   if (gID >= NGRID)
    1272             :   {
    1273           0 :      free(utlstr);
    1274           0 :      return -1;
    1275             :   }
    1276             : 
    1277           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
    1278             : 
    1279             : 
    1280             :   /* Get pointers to grid structure section within SM */
    1281             :   /* ------------------------------------------------ */
    1282           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    1283             :                NULL, metaptrs);
    1284             : 
    1285           0 :   if(metabuf == NULL)
    1286             :   {
    1287           0 :       free(utlstr);
    1288           0 :       return(-1);
    1289             :   }
    1290             : 
    1291             : 
    1292           0 :   statmeta = EHgetmetavalue(metaptrs, "GridOrigin", utlstr);
    1293             : 
    1294           0 :   if (statmeta == 0)
    1295             :   {
    1296             :       /*
    1297             :        * If "GridOrigin" string found in metadata then convert to
    1298             :        * numeric origin code (fixed added: Jan 97)
    1299             :        */
    1300           0 :       for (i = 0; i < (intn)(sizeof(originNames) / sizeof(originNames[0])); i++)
    1301             :       {
    1302           0 :     if (strcmp(utlstr, originNames[i]) == 0)
    1303             :     {
    1304           0 :         *origincode = i;
    1305           0 :         break;
    1306             :     }
    1307             :       }
    1308             :   }
    1309             : 
    1310           0 :   free(metabuf);
    1311             :     }
    1312           0 :     free(utlstr);
    1313           0 :     return (status);
    1314             : }
    1315             : 
    1316             : 
    1317             : 
    1318             : 
    1319             : 
    1320             : 
    1321             : /*----------------------------------------------------------------------------|
    1322             : |  BEGIN_PROLOG                                                               |
    1323             : |                                                                             |
    1324             : |  FUNCTION: GDpixreginfo                                                     |
    1325             : |                                                                             |
    1326             : |  DESCRIPTION:                                                               |
    1327             : |                                                                             |
    1328             : |                                                                             |
    1329             : |  Return Value    Type     Units     Description                             |
    1330             : |  ============   ======  =========   =====================================   |
    1331             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1332             : |                                                                             |
    1333             : |  INPUTS:                                                                    |
    1334             : |  gridID         int32               Grid structure ID                       |
    1335             : |                                                                             |
    1336             : |                                                                             |
    1337             : |  OUTPUTS:                                                                   |
    1338             : |  pixregcode     int32               Pixel registration code                 |
    1339             : |                                                                             |
    1340             : |                                                                             |
    1341             : |  OUTPUTS:                                                                   |
    1342             : |             None                                                            |
    1343             : |                                                                             |
    1344             : |  NOTES:                                                                     |
    1345             : |                                                                             |
    1346             : |                                                                             |
    1347             : |   Date     Programmer   Description                                         |
    1348             : |  ======   ============  =================================================   |
    1349             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1350             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
    1351             : |                                                                             |
    1352             : |  END_PROLOG                                                                 |
    1353             : -----------------------------------------------------------------------------*/
    1354             : intn
    1355           0 : GDpixreginfo(int32 gridID, int32 * pixregcode)
    1356             : {
    1357             :     intn            i;    /* Loop index */
    1358           0 :     intn            status = 0; /* routine return status variable */
    1359           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
    1360             : 
    1361             :     int32           fid;  /* HDF-EOS file ID */
    1362             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1363             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    1364           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    1365             : 
    1366             : 
    1367             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1368             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1369             :     char            gridname[80]; /* Grid Name */
    1370             :     char           *utlstr; /* Utility string */
    1371             : 
    1372             :     /* Allocate space for utility string */
    1373             :     /* --------------------------------- */
    1374           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1375           0 :     if(utlstr == NULL)
    1376             :     {
    1377           0 :   HEpush(DFE_NOSPACE,"GDpixreginfo", __FILE__, __LINE__);
    1378           0 :   return(-1);
    1379             :     }
    1380             :     /* Check Grid ID */
    1381           0 :     status = GDchkgdid(gridID, "GDpixreginfo",
    1382             :            &fid, &sdInterfaceID, &gdVgrpID);
    1383             : 
    1384             :     /* Initialize pixreg code to -1 (in case of error) */
    1385           0 :     *pixregcode = -1;
    1386             : 
    1387           0 :     if (status == 0)
    1388             :     {
    1389             :   /* Set default pixreg code */
    1390           0 :   *pixregcode = 0;
    1391             : 
    1392             :   /* Get grid name */
    1393           0 :   int gID = gridID % idOffset;
    1394           0 :   if (gID >= NGRID)
    1395             :   {
    1396           0 :      free(utlstr);
    1397           0 :      return -1;
    1398             :   }
    1399             : 
    1400           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
    1401             : 
    1402             :   /* Get pointers to grid structure section within SM */
    1403           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    1404             :                NULL, metaptrs);
    1405             : 
    1406           0 :   if(metabuf == NULL)
    1407             :   {
    1408           0 :       free(utlstr);
    1409           0 :       return(-1);
    1410             :   }
    1411             : 
    1412             : 
    1413           0 :   statmeta = EHgetmetavalue(metaptrs, "PixelRegistration", utlstr);
    1414             : 
    1415           0 :   if (statmeta == 0)
    1416             :   {
    1417             :       /*
    1418             :        * If "PixelRegistration" string found in metadata then convert
    1419             :        * to numeric origin code (fixed added: Jan 97)
    1420             :        */
    1421             : 
    1422           0 :       for (i = 0; i < (intn)(sizeof(pixregNames) / sizeof(pixregNames[0])); i++)
    1423             :       {
    1424           0 :     if (strcmp(utlstr, pixregNames[i]) == 0)
    1425             :     {
    1426           0 :         *pixregcode = i;
    1427           0 :         break;
    1428             :     }
    1429             :       }
    1430             :   }
    1431           0 :   free(metabuf);
    1432             :     }
    1433           0 :     free(utlstr);
    1434           0 :     return (status);
    1435             : }
    1436             : 
    1437             : 
    1438             : 
    1439             : /*----------------------------------------------------------------------------|
    1440             : |  BEGIN_PROLOG                                                               |
    1441             : |                                                                             |
    1442             : |  FUNCTION: GDcompinfo                                                       |
    1443             : |                                                                             |
    1444             : |  DESCRIPTION:                                                               |
    1445             : |                                                                             |
    1446             : |                                                                             |
    1447             : |  Return Value    Type     Units     Description                             |
    1448             : |  ============   ======  =========   =====================================   |
    1449             : |  status         intn                                                        |
    1450             : |                                                                             |
    1451             : |  INPUTS:                                                                    |
    1452             : |  gridID         int32                                                       |
    1453             : |  compcode       int32                                                       |
    1454             : |  compparm       intn                                                        |
    1455             : |                                                                             |
    1456             : |                                                                             |
    1457             : |  OUTPUTS:                                                                   |
    1458             : |             None                                                            |
    1459             : |                                                                             |
    1460             : |  NOTES:                                                                     |
    1461             : |                                                                             |
    1462             : |                                                                             |
    1463             : |   Date     Programmer   Description                                         |
    1464             : |  ======   ============  =================================================   |
    1465             : |  Oct 96   Joel Gales    Original Programmer                                 |
    1466             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
    1467             : |                                                                             |
    1468             : |  END_PROLOG                                                                 |
    1469             : -----------------------------------------------------------------------------*/
    1470             : intn
    1471           0 : GDcompinfo(int32 gridID, const char *fieldname, int32 * compcode, intn compparm[])
    1472             : {
    1473             :     intn            i;    /* Loop index */
    1474           0 :     intn            status = 0; /* routine return status variable */
    1475           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
    1476             : 
    1477             :     int32           fid;  /* HDF-EOS file ID */
    1478             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1479             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    1480           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    1481             : 
    1482             : 
    1483             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1484             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1485             :     char            gridname[80]; /* Grid Name */
    1486             :     char           *utlstr;/* Utility string */
    1487             : 
    1488             :     /* Allocate space for utility string */
    1489             :     /* --------------------------------- */
    1490           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1491           0 :     if(utlstr == NULL)
    1492             :     {
    1493           0 :   HEpush(DFE_NOSPACE,"GDcompinfo", __FILE__, __LINE__);
    1494           0 :   return(-1);
    1495             :     }
    1496             :     /* Check Grid ID */
    1497           0 :     status = GDchkgdid(gridID, "GDcompinfo", &fid, &sdInterfaceID, &gdVgrpID);
    1498             : 
    1499             : 
    1500           0 :     if (status == 0)
    1501             :     {
    1502             :   /* Get grid name */
    1503           0 :   int gID = gridID % idOffset;
    1504           0 :   if (gID >= NGRID)
    1505             :   {
    1506           0 :     free(utlstr);
    1507           0 :     return -1;
    1508             :   }
    1509           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
    1510             : 
    1511             :   /* Get pointers to "DataField" section within SM */
    1512           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    1513             :                "DataField", metaptrs);
    1514           0 :   if(metabuf == NULL)
    1515             :   {
    1516           0 :       free(utlstr);
    1517           0 :       return(-1);
    1518             :   }
    1519             : 
    1520             : 
    1521             :   /* Search for field */
    1522           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"\n");
    1523           0 :   metaptrs[0] = strstr(metaptrs[0], utlstr);
    1524             : 
    1525             : 
    1526             :   /* If field found and user wants compression code ... */
    1527           0 :   if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    1528             :   {
    1529           0 :       if (compcode != NULL)
    1530             :       {
    1531             :     /* Set endptr at end of field's definition entry */
    1532           0 :     metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
    1533             : 
    1534             :     /* Get compression type */
    1535           0 :     statmeta = EHgetmetavalue(metaptrs, "CompressionType", utlstr);
    1536             : 
    1537             :     /*
    1538             :      * Default is no compression if "CompressionType" string not
    1539             :      * in metadata
    1540             :      */
    1541           0 :     *compcode = HDFE_COMP_NONE;
    1542             : 
    1543             :     /* If compression code is found ... */
    1544           0 :     if (statmeta == 0)
    1545             :     {
    1546             :         /* Loop through compression types until match */
    1547           0 :         for (i = 0; i < (intn)(sizeof(HDFcomp) / sizeof(HDFcomp[0])); i++)
    1548             :         {
    1549           0 :       if (strcmp(utlstr, HDFcomp[i]) == 0)
    1550             :       {
    1551           0 :           *compcode = i;
    1552           0 :           break;
    1553             :       }
    1554             :         }
    1555             :     }
    1556             :       }
    1557             : 
    1558             :       /* If user wants compression parameters ... */
    1559           0 :       if (compparm != NULL && compcode != NULL)
    1560             :       {
    1561             :     /* Initialize to zero */
    1562           0 :     for (i = 0; i < 4; i++)
    1563             :     {
    1564           0 :         compparm[i] = 0;
    1565             :     }
    1566             : 
    1567             :     /*
    1568             :      * Get compression parameters if NBIT or DEFLATE compression
    1569             :      */
    1570           0 :     if (*compcode == HDFE_COMP_NBIT)
    1571             :     {
    1572             :         statmeta =
    1573           0 :       EHgetmetavalue(metaptrs, "CompressionParams", utlstr);
    1574           0 :         if (statmeta == 0)
    1575             :         {
    1576           0 :       sscanf(utlstr, "(%d,%d,%d,%d)",
    1577             :              &compparm[0], &compparm[1],
    1578             :              &compparm[2], &compparm[3]);
    1579             :         }
    1580             :         else
    1581             :         {
    1582           0 :       status = -1;
    1583           0 :       HEpush(DFE_GENAPP, "GDcompinfo", __FILE__, __LINE__);
    1584           0 :       HEreport(
    1585             :          "\"CompressionParams\" string not found in metadata.\n");
    1586             :         }
    1587             :     }
    1588           0 :     else if (*compcode == HDFE_COMP_DEFLATE)
    1589             :     {
    1590             :         statmeta =
    1591           0 :       EHgetmetavalue(metaptrs, "DeflateLevel", utlstr);
    1592           0 :         if (statmeta == 0)
    1593             :         {
    1594           0 :       sscanf(utlstr, "%d", &compparm[0]);
    1595             :         }
    1596             :         else
    1597             :         {
    1598           0 :       status = -1;
    1599           0 :       HEpush(DFE_GENAPP, "GDcompinfo", __FILE__, __LINE__);
    1600           0 :       HEreport(
    1601             :       "\"DeflateLevel\" string not found in metadata.\n");
    1602             :         }
    1603             :     }
    1604             :       }
    1605             :   }
    1606             :   else
    1607             :   {
    1608           0 :       HEpush(DFE_GENAPP, "GDcompinfo", __FILE__, __LINE__);
    1609           0 :       HEreport("Fieldname \"%s\" not found.\n", fieldname);
    1610             :   }
    1611             : 
    1612           0 :   free(metabuf);
    1613             : 
    1614             :     }
    1615           0 :     free(utlstr);
    1616           0 :     return (status);
    1617             : }
    1618             : 
    1619             : 
    1620             : 
    1621             : 
    1622             : 
    1623             : 
    1624             : /*----------------------------------------------------------------------------|
    1625             : |  BEGIN_PROLOG                                                               |
    1626             : |                                                                             |
    1627             : |  FUNCTION: GDfieldinfo                                                      |
    1628             : |                                                                             |
    1629             : |  DESCRIPTION: Retrieve information about a specific geolocation or data     |
    1630             : |                field in the grid.                                           |
    1631             : |                                                                             |
    1632             : |                                                                             |
    1633             : |  Return Value    Type     Units     Description                             |
    1634             : |  ============   ======  =========   =====================================   |
    1635             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1636             : |                                                                             |
    1637             : |  INPUTS:                                                                    |
    1638             : |  gridID         int32               grid structure id                       |
    1639             : |  fieldname      char                name of field                           |
    1640             : |                                                                             |
    1641             : |                                                                             |
    1642             : |  OUTPUTS:                                                                   |
    1643             : |  rank           int32               rank of field (# of dims)               |
    1644             : |  dims           int32               field dimensions                        |
    1645             : |  numbertype     int32               field number type                       |
    1646             : |  dimlist        char                field dimension list                    |
    1647             : |                                                                             |
    1648             : |                                                                             |
    1649             : |  OUTPUTS:                                                                   |
    1650             : |             None                                                            |
    1651             : |                                                                             |
    1652             : |  NOTES:                                                                     |
    1653             : |                                                                             |
    1654             : |                                                                             |
    1655             : |   Date     Programmer   Description                                         |
    1656             : |  ======   ============  =================================================   |
    1657             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1658             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    1659             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
    1660             : |  Feb 99   Abe Taaheri   Changed memcpy to memmove to avoid overlapping      |
    1661             : |                         problem when copying strings                        |
    1662             : |                                                                             |
    1663             : |  END_PROLOG                                                                 |
    1664             : -----------------------------------------------------------------------------*/
    1665             : intn
    1666           0 : GDfieldinfo(int32 gridID, const char *fieldname, int32 * rank, int32 dims[],
    1667             :       int32 * numbertype, char *dimlist)
    1668             : 
    1669             : {
    1670             :     intn            i;        /* Loop index */
    1671             :     intn            status;     /* routine return status variable */
    1672           0 :     intn            statmeta = 0;   /* EHgetmetavalue return status */
    1673             : 
    1674             :     int32           fid;      /* HDF-EOS file ID */
    1675             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1676           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    1677           0 :     int32           ndims = 0;      /* Number of dimensions */
    1678             :     int32           slen[8];      /* Length of each entry in parsed string */
    1679             :     int32           dum;      /* Dummy variable */
    1680             :     int32           xdim;     /* X dim size */
    1681             :     int32           ydim;     /* Y dim size */
    1682             :     int32           sdid;     /* SDS id */
    1683             : 
    1684             :     char           *metabuf;      /* Pointer to structural metadata (SM) */
    1685             :     char           *metaptrs[2];    /* Pointers to begin and end of SM section */
    1686             :     char            gridname[80];   /* Grid Name */
    1687             :     char           *utlstr;     /* Utility string */
    1688             :     char           *ptr[8];     /* String pointers for parsed string */
    1689             :     char            dimstr[64];     /* Individual dimension entry string */
    1690             : 
    1691             : 
    1692             :     /* Allocate space for utility string */
    1693             :     /* --------------------------------- */
    1694           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1695           0 :     if(utlstr == NULL)
    1696             :     {
    1697           0 :   HEpush(DFE_NOSPACE,"GDfieldinfo", __FILE__, __LINE__);
    1698           0 :   return(-1);
    1699             :     }
    1700           0 :     *rank = -1;
    1701           0 :     *numbertype = -1;
    1702             : 
    1703           0 :     status = GDchkgdid(gridID, "GDfieldinfo", &fid, &sdInterfaceID, &dum);
    1704             : 
    1705           0 :     if (status == 0)
    1706             :     {
    1707           0 :   int gID = gridID % idOffset;
    1708           0 :   if (gID >= NGRID)
    1709             :   {
    1710           0 :       free(utlstr);
    1711           0 :       return -1;
    1712             :     }
    1713           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
    1714             : 
    1715           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    1716             :                "DataField", metaptrs);
    1717           0 :   if(metabuf == NULL)
    1718             :   {
    1719           0 :       free(utlstr);
    1720           0 :       return(-1);
    1721             :   }
    1722             : 
    1723             : 
    1724             :   /* Search for field */
    1725           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"\n");
    1726           0 :   metaptrs[0] = strstr(metaptrs[0], utlstr);
    1727             : 
    1728             :   /* If field found ... */
    1729           0 :   if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    1730             :   {
    1731             : 
    1732             :       /* Set endptr at end of dimension definition entry */
    1733           0 :       metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
    1734             : 
    1735             :       /* Get DataType string */
    1736           0 :       statmeta = EHgetmetavalue(metaptrs, "DataType", utlstr);
    1737             : 
    1738             :       /* Convert to numbertype code */
    1739           0 :       if (statmeta == 0)
    1740           0 :     *numbertype = EHnumstr(utlstr);
    1741             :       else
    1742             :       {
    1743           0 :     status = -1;
    1744           0 :     HEpush(DFE_GENAPP, "GDfieldinfo", __FILE__, __LINE__);
    1745           0 :     HEreport("\"DataType\" string not found in metadata.\n");
    1746             :       }
    1747             : 
    1748             :       /*
    1749             :        * Get DimList string and trim off leading and trailing parens
    1750             :        * "()"
    1751             :        */
    1752           0 :       statmeta = EHgetmetavalue(metaptrs, "DimList", utlstr);
    1753             : 
    1754           0 :       if (statmeta == 0)
    1755             :       {
    1756           0 :     memmove(utlstr, utlstr + 1, strlen(utlstr) - 2);
    1757           0 :     utlstr[strlen(utlstr) - 2] = 0;
    1758             : 
    1759             :     /* Parse trimmed DimList string and get rank */
    1760           0 :     ndims = EHparsestr(utlstr, ',', ptr, slen);
    1761           0 :     *rank = ndims;
    1762             :       }
    1763             :       else
    1764             :       {
    1765           0 :     status = -1;
    1766           0 :     HEpush(DFE_GENAPP, "GDfieldinfo", __FILE__, __LINE__);
    1767           0 :     HEreport("\"DimList\" string not found in metadata.\n");
    1768             :       }
    1769             : 
    1770             : 
    1771           0 :       if (status == 0)
    1772             :       {
    1773           0 :     status = GDgridinfo(gridID, &xdim, &ydim, NULL, NULL);
    1774             : 
    1775           0 :     for (i = 0; i < ndims; i++)
    1776             :     {
    1777           0 :         memcpy(dimstr, ptr[i] + 1, slen[i] - 2);
    1778           0 :         dimstr[slen[i] - 2] = 0;
    1779             : 
    1780           0 :         if (strcmp(dimstr, "XDim") == 0)
    1781             :         {
    1782           0 :       dims[i] = xdim;
    1783             :         }
    1784           0 :         else if (strcmp(dimstr, "YDim") == 0)
    1785             :         {
    1786           0 :       dims[i] = ydim;
    1787             :         }
    1788             :         else
    1789             :         {
    1790           0 :       dims[i] = GDdiminfo(gridID, dimstr);
    1791             :         }
    1792             : 
    1793             : 
    1794           0 :         if (dimlist != NULL)
    1795             :         {
    1796           0 :       if (i == 0)
    1797             :       {
    1798           0 :           dimlist[0] = 0;
    1799             :       }
    1800             : 
    1801           0 :       if (i > 0)
    1802             :       {
    1803           0 :           strcat(dimlist, ",");
    1804             :       }
    1805           0 :       strcat(dimlist, dimstr);
    1806             :         }
    1807             :     }
    1808             : 
    1809             : 
    1810           0 :     if (dims[0] == 0)
    1811             :     {
    1812           0 :         status = GDSDfldsrch(gridID, sdInterfaceID, fieldname,
    1813             :            &sdid, &dum, &dum, &dum, dims,
    1814             :            &dum);
    1815             :     }
    1816             :       }
    1817             :   }
    1818             : 
    1819           0 :   free(metabuf);
    1820             :     }
    1821             : 
    1822           0 :     if (*rank == -1)
    1823             :     {
    1824           0 :   status = -1;
    1825             : 
    1826           0 :   HEpush(DFE_GENAPP, "GDfieldinfo", __FILE__, __LINE__);
    1827           0 :   HEreport("Fieldname \"%s\" not found.\n", fieldname);
    1828             :     }
    1829           0 :     free(utlstr);
    1830           0 :     return (status);
    1831             : }
    1832             : 
    1833             : 
    1834             : 
    1835             : /*----------------------------------------------------------------------------|
    1836             : |  BEGIN_PROLOG                                                               |
    1837             : |                                                                             |
    1838             : |  FUNCTION: GDSDfldsrch                                                      |
    1839             : |                                                                             |
    1840             : |  DESCRIPTION: Retrieves information from SDS fields                         |
    1841             : |                                                                             |
    1842             : |                                                                             |
    1843             : |  Return Value    Type     Units     Description                             |
    1844             : |  ============   ======  =========   =====================================   |
    1845             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1846             : |                                                                             |
    1847             : |  INPUTS:                                                                    |
    1848             : |  gridID         int32               grid structure ID                       |
    1849             : |  sdInterfaceID  int32               SD interface ID                         |
    1850             : |  fieldname      char                field name                              |
    1851             : |                                                                             |
    1852             : |                                                                             |
    1853             : |  OUTPUTS:                                                                   |
    1854             : |  sdid           int32               SD element ID                           |
    1855             : |  rankSDS        int32               Rank of SDS                             |
    1856             : |  rankFld        int32               True rank of field (merging)            |
    1857             : |  offset         int32               Offset of field within merged field     |
    1858             : |  dims           int32               Dimensions of field                     |
    1859             : |  solo           int32               Solo field flag                         |
    1860             : |                                                                             |
    1861             : |  NOTES:                                                                     |
    1862             : |                                                                             |
    1863             : |                                                                             |
    1864             : |   Date     Programmer   Description                                         |
    1865             : |  ======   ============  =================================================   |
    1866             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1867             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    1868             : |                                                                             |
    1869             : |  END_PROLOG                                                                 |
    1870             : -----------------------------------------------------------------------------*/
    1871             : static intn
    1872           0 : GDSDfldsrch(int32 gridID, int32 sdInterfaceID, const char *fieldname,
    1873             :             int32 * sdid, int32 * rankSDS, int32 * rankFld, int32 * offset,
    1874             :             int32 dims[], int32 * solo)
    1875             : {
    1876             :     intn            i;    /* Loop index */
    1877           0 :     intn            status = -1;/* routine return status variable */
    1878             : 
    1879             :     int32           gID;  /* GridID - offset */
    1880           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    1881             :     int32           dum;  /* Dummy variable */
    1882             :     int32           dums[128];  /* Dummy array */
    1883             :     int32           attrIndex;  /* Attribute l_index */
    1884             : 
    1885             :     char            name[2048]; /* Merged-Field Names */
    1886             :     char            gridname[80]; /* Grid Name */
    1887             :     char           *utlstr;/* Utility string */
    1888             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1889             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1890             : #ifdef broken_logic
    1891             :     char           *oldmetaptr; /* Pointer within SM section */
    1892             :     char           *metaptr;  /* Pointer within SM section */
    1893             : #endif
    1894             : 
    1895             :     /* Allocate space for utility string */
    1896             :     /* --------------------------------- */
    1897           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1898           0 :     if(utlstr == NULL)
    1899             :     {
    1900           0 :   HEpush(DFE_NOSPACE,"GDSDfldsrch", __FILE__, __LINE__);
    1901           0 :   return(-1);
    1902             :     }
    1903             :     /* Set solo flag to 0 (no) */
    1904             :     /* ----------------------- */
    1905           0 :     *solo = 0;
    1906             : 
    1907             : 
    1908             :     /* Compute "reduced" grid ID */
    1909             :     /* ------------------------- */
    1910           0 :     gID = gridID % idOffset;
    1911           0 :     if (gID >= NGRID)
    1912             :     {
    1913           0 :         free(utlstr);
    1914           0 :         return -1;
    1915             :     }
    1916             : 
    1917             :     /* Loop through all SDSs in grid */
    1918             :     /* ----------------------------- */
    1919           0 :     for (i = 0; i < GDXGrid[gID].nSDS; i++)
    1920             :     {
    1921             :   /* If active SDS ... */
    1922             :   /* ----------------- */
    1923           0 :   if (GDXGrid[gID].sdsID[i] != 0)
    1924             :   {
    1925             :       /* Get SDS ID, name, rankSDS, and dimensions */
    1926             :       /* ----------------------------------------- */
    1927           0 :       *sdid = GDXGrid[gID].sdsID[i];
    1928           0 :       SDgetinfo(*sdid, name, rankSDS, dims, &dum, &dum);
    1929           0 :       *rankFld = *rankSDS;
    1930             : 
    1931             : 
    1932             :       /* If merged field ... */
    1933             :       /* ------------------- */
    1934           0 :       if (strstr(name, "MRGFLD_") == &name[0])
    1935             :       {
    1936             :     /* Get grid name */
    1937             :     /* ------------- */
    1938           0 :     Vgetname(GDXGrid[gID].IDTable, gridname);
    1939             : 
    1940             : 
    1941             :     /* Get pointers to "MergedFields" section within SM */
    1942             :     /* ------------------------------------------------ */
    1943           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    1944             :                  "MergedFields", metaptrs);
    1945           0 :     if(metabuf == NULL)
    1946             :     {
    1947           0 :         free(utlstr);
    1948           0 :         return(-1);
    1949             :     }
    1950             : 
    1951             : #ifdef broken_logic
    1952             :     /* Initialize metaptr to beg. of section */
    1953             :     /* ------------------------------------- */
    1954             :     metaptr = metaptrs[0];
    1955             : 
    1956             : 
    1957             :     /* Store metaptr in order to recover */
    1958             :     /* --------------------------------- */
    1959             :     oldmetaptr = metaptr;
    1960             : 
    1961             : 
    1962             :     /* Search for Merged field name */
    1963             :     /* ---------------------------- */
    1964             :     snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "MergedFieldName=\"",
    1965             :       name, "\"\n");
    1966             :     metaptr = strstr(metaptr, utlstr);
    1967             : 
    1968             : 
    1969             :     /* If not found check for old metadata */
    1970             :     /* ----------------------------------- */
    1971             :     if (metaptr == NULL)
    1972             :     {
    1973             :         snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "OBJECT=\"", name, "\"\n");
    1974             :         metaptr = strstr(oldmetaptr, utlstr);
    1975             :     }
    1976             : #endif
    1977             : 
    1978             :     /* Get field list and strip off leading and trailing quotes */
    1979             :     /* -------------------------------------------------------- */
    1980           0 :     EHgetmetavalue(metaptrs, "FieldList", name);
    1981           0 :     memmove(name, name + 1, strlen(name) - 2);
    1982           0 :     name[strlen(name) - 2] = 0;
    1983             : 
    1984             : 
    1985             :     /* Search for desired field within merged field list */
    1986             :     /* ------------------------------------------------- */
    1987           0 :     snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"");
    1988           0 :     dum = EHstrwithin(utlstr, name, ',');
    1989             : 
    1990           0 :     free(metabuf);
    1991             :       }
    1992             :       else
    1993             :       {
    1994             :     /* If solo (unmerged) check if SDS name matches fieldname */
    1995             :     /* ------------------------------------------------------ */
    1996           0 :     dum = EHstrwithin(fieldname, name, ',');
    1997           0 :     if (dum != -1)
    1998             :     {
    1999           0 :         *solo = 1;
    2000           0 :         *offset = 0;
    2001             :     }
    2002             :       }
    2003             : 
    2004             : 
    2005             : 
    2006             :       /* If field found ... */
    2007             :       /* ------------------ */
    2008           0 :       if (dum != -1)
    2009             :       {
    2010           0 :     status = 0;
    2011             : 
    2012             :     /* If merged field ... */
    2013             :     /* ------------------- */
    2014           0 :     if (*solo == 0)
    2015             :     {
    2016             :         /* Get "Field Offsets" SDS attribute l_index */
    2017             :         /* --------------------------------------- */
    2018           0 :         attrIndex = SDfindattr(*sdid, "Field Offsets");
    2019             : 
    2020             :         /*
    2021             :          * If attribute exists then get offset of desired field
    2022             :          * within merged field
    2023             :          */
    2024           0 :         if (attrIndex != -1)
    2025             :         {
    2026           0 :       SDreadattr(*sdid, attrIndex, (VOIDP) dums);
    2027           0 :       *offset = dums[dum];
    2028             :         }
    2029             : 
    2030             : 
    2031             :         /* Get "Field Dims" SDS attribute l_index */
    2032             :         /* ------------------------------------ */
    2033           0 :         attrIndex = SDfindattr(*sdid, "Field Dims");
    2034             : 
    2035             :         /*
    2036             :          * If attribute exists then get 0th dimension of desired
    2037             :          * field within merged field
    2038             :          */
    2039           0 :         if (attrIndex != -1)
    2040             :         {
    2041           0 :       SDreadattr(*sdid, attrIndex, (VOIDP) dums);
    2042           0 :       dims[0] = dums[dum];
    2043             : 
    2044             :       /* If this dimension = 1 then field is really 2 dim */
    2045             :       /* ------------------------------------------------ */
    2046           0 :       if (dums[dum] == 1)
    2047             :       {
    2048           0 :           *rankFld = 2;
    2049             :       }
    2050             :         }
    2051             :     }
    2052             : 
    2053             : 
    2054             :     /* Break out of SDS loop */
    2055             :     /* --------------------- */
    2056           0 :     break;
    2057             :       }     /* End of found field section */
    2058             :   }
    2059             :   else
    2060             :   {
    2061             :       /* First non-active SDS signifies no more, break out of SDS loop */
    2062             :       /* ------------------------------------------------------------- */
    2063           0 :       break;
    2064             :   }
    2065             :     }
    2066           0 :     free(utlstr);
    2067           0 :     return (status);
    2068             : }
    2069             : 
    2070             : 
    2071             : 
    2072             : 
    2073             : /*----------------------------------------------------------------------------|
    2074             : |  BEGIN_PROLOG                                                               |
    2075             : |                                                                             |
    2076             : |  FUNCTION: GDwrrdfield                                                      |
    2077             : |                                                                             |
    2078             : |  DESCRIPTION: Writes/Reads fields                                           |
    2079             : |                                                                             |
    2080             : |                                                                             |
    2081             : |  Return Value    Type     Units     Description                             |
    2082             : |  ============   ======  =========   =====================================   |
    2083             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2084             : |                                                                             |
    2085             : |  INPUTS:                                                                    |
    2086             : |  gridID         int32               grid structure ID                       |
    2087             : |  fieldname      char                fieldname                               |
    2088             : |  code           char                Write/Read code (w/r)                   |
    2089             : |  start          int32               start array                             |
    2090             : |  stride         int32               stride array                            |
    2091             : |  edge           int32               edge array                              |
    2092             : |  datbuf         void                data buffer for read                    |
    2093             : |                                                                             |
    2094             : |                                                                             |
    2095             : |  OUTPUTS:                                                                   |
    2096             : |  datbuf         void                data buffer for write                   |
    2097             : |                                                                             |
    2098             : |                                                                             |
    2099             : |  NOTES:                                                                     |
    2100             : |                                                                             |
    2101             : |                                                                             |
    2102             : |   Date     Programmer   Description                                         |
    2103             : |  ======   ============  =================================================   |
    2104             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2105             : |  Feb 97   Joel Gales    Stride = 1 HDF compression workaround               |
    2106             : |                                                                             |
    2107             : |  END_PROLOG                                                                 |
    2108             : -----------------------------------------------------------------------------*/
    2109             : static intn
    2110           0 : GDwrrdfield(int32 gridID, const char *fieldname, const char *code,
    2111             :       int32 start[], int32 stride[], int32 edge[], VOIDP datbuf)
    2112             : 
    2113             : {
    2114             :     intn            i;    /* Loop index */
    2115           0 :     intn            status = 0; /* routine return status variable */
    2116             : 
    2117             :     int32           fid;  /* HDF-EOS file ID */
    2118             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2119             :     int32           sdid; /* SDS ID */
    2120             :     int32           dum;  /* Dummy variable */
    2121             :     int32           rankSDS;  /* Rank of SDS */
    2122             :     int32           rankFld;  /* Rank of field */
    2123             : 
    2124             :     int32           offset[8];  /* I/O offset (start) */
    2125             :     int32           incr[8];  /* I/O increment (stride) */
    2126             :     int32           count[8]; /* I/O count (edge) */
    2127             :     int32           dims[8];  /* Field/SDS dimensions */
    2128             :     int32           mrgOffset;  /* Merged field offset */
    2129             :     int32           strideOne;  /* Strides = 1 flag */
    2130             : 
    2131             : 
    2132             :     /* Check for valid grid ID */
    2133             :     /* ----------------------- */
    2134           0 :     status = GDchkgdid(gridID, "GDwrrdfield", &fid, &sdInterfaceID, &dum);
    2135             : 
    2136             : 
    2137           0 :     if (status == 0)
    2138             :     {
    2139             :   /* Check that field exists */
    2140             :   /* ----------------------- */
    2141           0 :   status = GDfieldinfo(gridID, fieldname, &rankSDS, dims, &dum, NULL);
    2142             : 
    2143             : 
    2144           0 :   if (status != 0)
    2145             :   {
    2146           0 :       HEpush(DFE_GENAPP, "GDwrrdfield", __FILE__, __LINE__);
    2147           0 :       HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
    2148           0 :       status = -1;
    2149             : 
    2150             :   }
    2151             : 
    2152             : 
    2153           0 :   if (status == 0)
    2154             :   {
    2155           0 :       status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
    2156             :          &rankSDS, &rankFld, &mrgOffset, dims, &dum);
    2157             : 
    2158             : 
    2159             :       /* Set I/O offset Section */
    2160             :       /* ---------------------- */
    2161             : 
    2162             :       /*
    2163             :        * If start == NULL (default) set I/O offset of 0th field to
    2164             :        * offset within merged field (if any) and the rest to 0
    2165             :        */
    2166           0 :       if (start == NULL)
    2167             :       {
    2168           0 :     for (i = 0; i < rankSDS; i++)
    2169             :     {
    2170           0 :         offset[i] = 0;
    2171             :     }
    2172           0 :     offset[0] = mrgOffset;
    2173             :       }
    2174             :       else
    2175             :       {
    2176             :     /*
    2177             :      * ... otherwise set I/O offset to user values, adjusting the
    2178             :      * 0th field with the merged field offset (if any)
    2179             :      */
    2180           0 :     if (rankFld == rankSDS)
    2181             :     {
    2182           0 :         for (i = 0; i < rankSDS; i++)
    2183             :         {
    2184           0 :       offset[i] = start[i];
    2185             :         }
    2186           0 :         offset[0] += mrgOffset;
    2187             :     }
    2188             :     else
    2189             :     {
    2190             :         /*
    2191             :          * If field really 2-dim merged in 3-dim field then set
    2192             :          * 0th field offset to merge offset and then next two to
    2193             :          * the user values
    2194             :          */
    2195           0 :         for (i = 0; i < rankFld; i++)
    2196             :         {
    2197           0 :       offset[i + 1] = start[i];
    2198             :         }
    2199           0 :         offset[0] = mrgOffset;
    2200             :     }
    2201             :       }
    2202             : 
    2203             : 
    2204             : 
    2205             :       /* Set I/O stride Section */
    2206             :       /* ---------------------- */
    2207             : 
    2208             :       /*
    2209             :        * If stride == NULL (default) set I/O stride to 1
    2210             :        */
    2211           0 :       if (stride == NULL)
    2212             :       {
    2213           0 :     for (i = 0; i < rankSDS; i++)
    2214             :     {
    2215           0 :         incr[i] = 1;
    2216             :     }
    2217             :       }
    2218             :       else
    2219             :       {
    2220             :     /*
    2221             :      * ... otherwise set I/O stride to user values
    2222             :      */
    2223           0 :     if (rankFld == rankSDS)
    2224             :     {
    2225           0 :         for (i = 0; i < rankSDS; i++)
    2226             :         {
    2227           0 :       incr[i] = stride[i];
    2228             :         }
    2229             :     }
    2230             :     else
    2231             :     {
    2232             :         /*
    2233             :          * If field really 2-dim merged in 3-dim field then set
    2234             :          * 0th field stride to 1 and then next two to the user
    2235             :          * values.
    2236             :          */
    2237           0 :         for (i = 0; i < rankFld; i++)
    2238             :         {
    2239           0 :       incr[i + 1] = stride[i];
    2240             :         }
    2241           0 :         incr[0] = 1;
    2242             :     }
    2243             :       }
    2244             : 
    2245             : 
    2246             : 
    2247             :       /* Set I/O count Section */
    2248             :       /* --------------------- */
    2249             : 
    2250             :       /*
    2251             :        * If edge == NULL (default) set I/O count to number of remaining
    2252             :        * entries (dims - start) / increment.  Note that 0th field
    2253             :        * offset corrected for merged field offset (if any).
    2254             :        */
    2255           0 :       if (edge == NULL)
    2256             :       {
    2257           0 :     for (i = 1; i < rankSDS; i++)
    2258             :     {
    2259           0 :         count[i] = (dims[i] - offset[i]) / incr[i];
    2260             :     }
    2261           0 :     count[0] = (dims[0] - (offset[0] - mrgOffset)) / incr[0];
    2262             :       }
    2263             :       else
    2264             :       {
    2265             :     /*
    2266             :      * ... otherwise set I/O count to user values
    2267             :      */
    2268           0 :     if (rankFld == rankSDS)
    2269             :     {
    2270           0 :         for (i = 0; i < rankSDS; i++)
    2271             :         {
    2272           0 :       count[i] = edge[i];
    2273             :         }
    2274             :     }
    2275             :     else
    2276             :     {
    2277             :         /*
    2278             :          * If field really 2-dim merged in 3-dim field then set
    2279             :          * 0th field count to 1 and then next two to the user
    2280             :          * values.
    2281             :          */
    2282           0 :         for (i = 0; i < rankFld; i++)
    2283             :         {
    2284           0 :       count[i + 1] = edge[i];
    2285             :         }
    2286           0 :         count[0] = 1;
    2287             :     }
    2288             :       }
    2289             : 
    2290             : 
    2291             :       /* Perform I/O with relevant HDF I/O routine */
    2292             :       /* ----------------------------------------- */
    2293           0 :       if (strcmp(code, "w") == 0)
    2294             :       {
    2295             :     /* Set strideOne to true (1) */
    2296             :     /* ------------------------- */
    2297           0 :     strideOne = 1;
    2298             : 
    2299             : 
    2300             :     /* If incr[i] != 1 set strideOne to false (0) */
    2301             :     /* ------------------------------------------ */
    2302           0 :     for (i = 0; i < rankSDS; i++)
    2303             :     {
    2304           0 :         if (incr[i] != 1)
    2305             :         {
    2306           0 :       strideOne = 0;
    2307           0 :       break;
    2308             :         }
    2309             :     }
    2310             : 
    2311             : 
    2312             :     /*
    2313             :      * If strideOne is true use NULL parameter for stride. This
    2314             :      * is a work-around to HDF compression problem
    2315             :      */
    2316           0 :     if (strideOne == 1)
    2317             :     {
    2318           0 :         status = SDwritedata(sdid, offset, NULL, count,
    2319             :            (VOIDP) datbuf);
    2320             :     }
    2321             :     else
    2322             :     {
    2323           0 :         status = SDwritedata(sdid, offset, incr, count,
    2324             :            (VOIDP) datbuf);
    2325             :     }
    2326             :       }
    2327             :       else
    2328             :       {
    2329           0 :     status = SDreaddata(sdid, offset, incr, count,
    2330             :             (VOIDP) datbuf);
    2331             :       }
    2332             :   }
    2333             :     }
    2334             : 
    2335           0 :     return (status);
    2336             : }
    2337             : 
    2338             : 
    2339             : /*----------------------------------------------------------------------------|
    2340             : |  BEGIN_PROLOG                                                               |
    2341             : |                                                                             |
    2342             : |  FUNCTION: GDreadfield                                                      |
    2343             : |                                                                             |
    2344             : |  DESCRIPTION: Reads data from a grid field.                                 |
    2345             : |                                                                             |
    2346             : |                                                                             |
    2347             : |  Return Value    Type     Units     Description                             |
    2348             : |  ============   ======  =========   =====================================   |
    2349             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2350             : |                                                                             |
    2351             : |  INPUTS:                                                                    |
    2352             : |  gridID         int32               grid structure ID                       |
    2353             : |  fieldname      char                fieldname                               |
    2354             : |  start          int32               start array                             |
    2355             : |  stride         int32               stride array                            |
    2356             : |  edge           int32               edge array                              |
    2357             : |  buffer         void                data buffer for read                    |
    2358             : |                                                                             |
    2359             : |                                                                             |
    2360             : |  OUTPUTS:                                                                   |
    2361             : |     None                                                                    |
    2362             : |                                                                             |
    2363             : |  NOTES:                                                                     |
    2364             : |                                                                             |
    2365             : |                                                                             |
    2366             : |   Date     Programmer   Description                                         |
    2367             : |  ======   ============  =================================================   |
    2368             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2369             : |                                                                             |
    2370             : |  END_PROLOG                                                                 |
    2371             : -----------------------------------------------------------------------------*/
    2372             : intn
    2373           0 : GDreadfield(int32 gridID, const char *fieldname,
    2374             :       int32 start[], int32 stride[], int32 edge[], VOIDP buffer)
    2375             : 
    2376             : {
    2377           0 :     intn            status = 0; /* routine return status variable */
    2378             : 
    2379           0 :     status = GDwrrdfield(gridID, fieldname, "r", start, stride, edge,
    2380             :        buffer);
    2381           0 :     return (status);
    2382             : }
    2383             : 
    2384             : 
    2385             : 
    2386             : 
    2387             : /*----------------------------------------------------------------------------|
    2388             : |  BEGIN_PROLOG                                                               |
    2389             : |                                                                             |
    2390             : |  FUNCTION: GDwrrdattr                                                       |
    2391             : |                                                                             |
    2392             : |  DESCRIPTION:                                                               |
    2393             : |                                                                             |
    2394             : |                                                                             |
    2395             : |  Return Value    Type     Units     Description                             |
    2396             : |  ============   ======  =========   =====================================   |
    2397             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2398             : |                                                                             |
    2399             : |  INPUTS:                                                                    |
    2400             : |  gridID         int32               grid structure ID                       |
    2401             : |  attrname       char                attribute name                          |
    2402             : |  numbertype     int32               attribute HDF numbertype                |
    2403             : |  count          int32               Number of attribute elements            |
    2404             : |  wrcode         char                Read/Write Code "w/r"                   |
    2405             : |  datbuf         void                I/O buffer                              |
    2406             : |                                                                             |
    2407             : |  OUTPUTS:                                                                   |
    2408             : |  datbuf                                                                     |
    2409             : |                                                                             |
    2410             : |  NOTES:                                                                     |
    2411             : |                                                                             |
    2412             : |                                                                             |
    2413             : |   Date     Programmer   Description                                         |
    2414             : |  ======   ============  =================================================   |
    2415             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2416             : |  Oct 96   Joel Gales    Get Attribute Vgroup ID from external array         |
    2417             : |                                                                             |
    2418             : |  END_PROLOG                                                                 |
    2419             : -----------------------------------------------------------------------------*/
    2420             : static intn
    2421           0 : GDwrrdattr(int32 gridID, const char *attrname, int32 numbertype, int32 count,
    2422             :      const char *wrcode, VOIDP datbuf)
    2423             : 
    2424             : {
    2425             :     intn            status; /* routine return status variable */
    2426             : 
    2427             :     int32           fid;  /* HDF-EOS file ID */
    2428             :     int32           attrVgrpID; /* Grid attribute ID */
    2429             :     int32           dum;  /* dummy variable */
    2430           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    2431             : 
    2432             : 
    2433             :     /* Check Grid id */
    2434           0 :     status = GDchkgdid(gridID, "GDwrrdattr", &fid, &dum, &dum);
    2435             : 
    2436           0 :     if (status == 0)
    2437             :     {
    2438             :   /* Perform Attribute I/O */
    2439             :   /* --------------------- */
    2440           0 :   int gID = gridID % idOffset;
    2441           0 :   if (gID >= NGRID)
    2442             :   {
    2443           0 :     return -1;
    2444             :   }
    2445           0 :   attrVgrpID = GDXGrid[gID].VIDTable[1];
    2446           0 :   status = EHattr(fid, attrVgrpID, attrname, numbertype, count,
    2447             :       wrcode, datbuf);
    2448             :     }
    2449           0 :     return (status);
    2450             : }
    2451             : 
    2452             : /*----------------------------------------------------------------------------|
    2453             : |  BEGIN_PROLOG                                                               |
    2454             : |                                                                             |
    2455             : |  FUNCTION: GDreadattr                                                       |
    2456             : |                                                                             |
    2457             : |  DESCRIPTION: Reads attribute from a grid.                                  |
    2458             : |                                                                             |
    2459             : |                                                                             |
    2460             : |  Return Value    Type     Units     Description                             |
    2461             : |  ============   ======  =========   =====================================   |
    2462             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2463             : |                                                                             |
    2464             : |  INPUTS:                                                                    |
    2465             : |  gridID         int32               grid structure ID                       |
    2466             : |  attrname       char                attribute name                          |
    2467             : |                                                                             |
    2468             : |  OUTPUTS:                                                                   |
    2469             : |  datbuf         void                I/O buffer                              |
    2470             : |                                                                             |
    2471             : |  NOTES:                                                                     |
    2472             : |                                                                             |
    2473             : |                                                                             |
    2474             : |   Date     Programmer   Description                                         |
    2475             : |  ======   ============  =================================================   |
    2476             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2477             : |                                                                             |
    2478             : |  END_PROLOG                                                                 |
    2479             : -----------------------------------------------------------------------------*/
    2480             : intn
    2481           0 : GDreadattr(int32 gridID, const char *attrname, VOIDP datbuf)
    2482             : {
    2483           0 :     intn            status = 0; /* routine return status variable */
    2484           0 :     int32           dum = 0;  /* dummy variable */
    2485             : 
    2486             :     /* Call GDwrrdattr routine to read attribute */
    2487             :     /* ----------------------------------------- */
    2488           0 :     status = GDwrrdattr(gridID, attrname, dum, dum, "r", datbuf);
    2489             : 
    2490           0 :     return (status);
    2491             : }
    2492             : 
    2493             : 
    2494             : 
    2495             : 
    2496             : 
    2497             : /*----------------------------------------------------------------------------|
    2498             : |  BEGIN_PROLOG                                                               |
    2499             : |                                                                             |
    2500             : |  FUNCTION: GDattrinfo                                                       |
    2501             : |                                                                             |
    2502             : |  DESCRIPTION:                                                               |
    2503             : |                                                                             |
    2504             : |                                                                             |
    2505             : |  Return Value    Type     Units     Description                             |
    2506             : |  ============   ======  =========   =====================================   |
    2507             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2508             : |                                                                             |
    2509             : |  INPUTS:                                                                    |
    2510             : |  gridID         int32               grid structure ID                       |
    2511             : |  attrname       char                attribute name                          |
    2512             : |                                                                             |
    2513             : |  OUTPUTS:                                                                   |
    2514             : |  numbertype     int32               attribute HDF numbertype                |
    2515             : |  count          int32               Number of attribute elements            |
    2516             : |                                                                             |
    2517             : |                                                                             |
    2518             : |  OUTPUTS:                                                                   |
    2519             : |             None                                                            |
    2520             : |                                                                             |
    2521             : |  NOTES:                                                                     |
    2522             : |                                                                             |
    2523             : |                                                                             |
    2524             : |   Date     Programmer   Description                                         |
    2525             : |  ======   ============  =================================================   |
    2526             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2527             : |  Oct 96   Joel Gales    Get Attribute Vgroup ID from external array         |
    2528             : |                                                                             |
    2529             : |  END_PROLOG                                                                 |
    2530             : -----------------------------------------------------------------------------*/
    2531             : intn
    2532           0 : GDattrinfo(int32 gridID, const char *attrname, int32 * numbertype, int32 * count)
    2533             : {
    2534           0 :     intn            status = 0; /* routine return status variable */
    2535             : 
    2536             :     int32           fid;  /* HDF-EOS file ID */
    2537             :     int32           attrVgrpID; /* Grid attribute ID */
    2538             :     int32           dum;  /* dummy variable */
    2539           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    2540             : 
    2541           0 :     status = GDchkgdid(gridID, "GDattrinfo", &fid, &dum, &dum);
    2542             : 
    2543           0 :     int gID = gridID % idOffset;
    2544           0 :     if (gID >= NGRID)
    2545             :     {
    2546           0 :         return -1;
    2547             :     }
    2548           0 :     attrVgrpID = GDXGrid[gID].VIDTable[1];
    2549             : 
    2550           0 :     status = EHattrinfo(fid, attrVgrpID, attrname, numbertype,
    2551             :       count);
    2552             : 
    2553           0 :     return (status);
    2554             : }
    2555             : 
    2556             : 
    2557             : 
    2558             : 
    2559             : 
    2560             : 
    2561             : /*----------------------------------------------------------------------------|
    2562             : |  BEGIN_PROLOG                                                               |
    2563             : |                                                                             |
    2564             : |  FUNCTION: GDinqattrs                                                       |
    2565             : |                                                                             |
    2566             : |  DESCRIPTION:                                                               |
    2567             : |                                                                             |
    2568             : |                                                                             |
    2569             : |  Return Value    Type     Units     Description                             |
    2570             : |  ============   ======  =========   =====================================   |
    2571             : |  nattr          int32               Number of attributes in swath struct    |
    2572             : |                                                                             |
    2573             : |  INPUTS:                                                                    |
    2574             : |  grid ID        int32               grid structure ID                       |
    2575             : |                                                                             |
    2576             : |  OUTPUTS:                                                                   |
    2577             : |  attrnames      char                Attribute names in swath struct         |
    2578             : |                                     (Comma-separated list)                  |
    2579             : |  strbufsize     int32               Attributes name list string length      |
    2580             : |                                                                             |
    2581             : |  OUTPUTS:                                                                   |
    2582             : |             None                                                            |
    2583             : |                                                                             |
    2584             : |  NOTES:                                                                     |
    2585             : |                                                                             |
    2586             : |                                                                             |
    2587             : |   Date     Programmer   Description                                         |
    2588             : |  ======   ============  =================================================   |
    2589             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2590             : |  Oct 96   Joel Gales    Initialize nattr                                    |
    2591             : |  Oct 96   Joel Gales    Get Attribute Vgroup ID from external array         |
    2592             : |                                                                             |
    2593             : |  END_PROLOG                                                                 |
    2594             : -----------------------------------------------------------------------------*/
    2595             : int32
    2596           0 : GDinqattrs(int32 gridID, char *attrnames, int32 * strbufsize)
    2597             : {
    2598             :     intn            status; /* routine return status variable */
    2599             : 
    2600             :     int32           fid;  /* HDF-EOS file ID */
    2601             :     int32           attrVgrpID; /* Grid attribute ID */
    2602             :     int32           dum;  /* dummy variable */
    2603           0 :     int32           nattr = 0;  /* Number of attributes */
    2604           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    2605             : 
    2606             : 
    2607             :     /* Check Grid id */
    2608           0 :     status = GDchkgdid(gridID, "GDinqattrs", &fid, &dum, &dum);
    2609             : 
    2610           0 :     if (status == 0)
    2611             :     {
    2612           0 :   int gID = gridID % idOffset;
    2613           0 :   if (gID >= NGRID)
    2614             :   {
    2615           0 :       return -1;
    2616             :     }
    2617           0 :   attrVgrpID = GDXGrid[gID].VIDTable[1];
    2618           0 :   nattr = EHattrcat(fid, attrVgrpID, attrnames, strbufsize);
    2619             :     }
    2620             : 
    2621           0 :     return (nattr);
    2622             : }
    2623             : 
    2624             : 
    2625             : 
    2626             : 
    2627             : 
    2628             : 
    2629             : #define REMQUOTE(x) do { \
    2630             :     char* l_x = x; \
    2631             :     const size_t l_x_len = strlen(l_x); \
    2632             :     if (l_x_len >= 2 && l_x[0] == '"' && l_x[l_x_len - 1] == '"') {\
    2633             :         memmove(l_x, l_x + 1, l_x_len - 2); \
    2634             :         l_x[l_x_len - 2] = 0; \
    2635             :     } \
    2636             :   } while(0)
    2637             : 
    2638             : 
    2639             : /*----------------------------------------------------------------------------|
    2640             : |  BEGIN_PROLOG                                                               |
    2641             : |                                                                             |
    2642             : |  FUNCTION: GDinqdims                                                        |
    2643             : |                                                                             |
    2644             : |  DESCRIPTION: Retrieve information about all dimensions defined in a grid.  |
    2645             : |                                                                             |
    2646             : |                                                                             |
    2647             : |  Return Value    Type     Units     Description                             |
    2648             : |  ============   ======  =========   =====================================   |
    2649             : |  nDim           int32               Number of defined dimensions            |
    2650             : |                                                                             |
    2651             : |  INPUTS:                                                                    |
    2652             : |  gridID         int32               grid structure ID                       |
    2653             : |                                                                             |
    2654             : |  OUTPUTS:                                                                   |
    2655             : |  dimnames       char                Dimension names (comma-separated)       |
    2656             : |  dims           int32               Dimension values                        |
    2657             : |                                                                             |
    2658             : |                                                                             |
    2659             : |  OUTPUTS:                                                                   |
    2660             : |             None                                                            |
    2661             : |                                                                             |
    2662             : |  NOTES:                                                                     |
    2663             : |                                                                             |
    2664             : |                                                                             |
    2665             : |   Date     Programmer   Description                                         |
    2666             : |  ======   ============  =================================================   |
    2667             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2668             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    2669             : |  Feb 97   Joel Gales    Set nDim to -1 if status = -1                       |
    2670             : |                                                                             |
    2671             : |  END_PROLOG                                                                 |
    2672             : -----------------------------------------------------------------------------*/
    2673             : int32
    2674           0 : GDinqdims(int32 gridID, char *dimnames, int32 dims[])
    2675             : {
    2676             :     intn            status; /* routine return status variable */
    2677             : 
    2678             :     int32           fid;  /* HDF-EOS file ID */
    2679             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2680             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    2681             :     int32           size; /* Dimension size */
    2682           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    2683           0 :     int32           nDim = 0; /* Number of dimensions */
    2684             : 
    2685             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    2686             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    2687             :     char            gridname[80]; /* Grid Name */
    2688             :     char           *utlstr;/* Utility string */
    2689             : 
    2690             :     /* Allocate space for utility string */
    2691             :     /* --------------------------------- */
    2692           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    2693           0 :     if(utlstr == NULL)
    2694             :     {
    2695           0 :   HEpush(DFE_NOSPACE,"GDinqdims", __FILE__, __LINE__);
    2696           0 :   return(-1);
    2697             :     }
    2698             :     /* Check for valid grid id */
    2699             :     /* ----------------------- */
    2700           0 :     status = GDchkgdid(gridID, "GDinqdims", &fid, &sdInterfaceID, &gdVgrpID);
    2701             : 
    2702           0 :     if (status == 0)
    2703             :     {
    2704             :   /* If dimension names or sizes are requested */
    2705             :   /* ----------------------------------------- */
    2706           0 :   if (dimnames != NULL || dims != NULL)
    2707             :   {
    2708             :       /* Get grid name */
    2709             :       /* ------------- */
    2710           0 :       int gID = gridID % idOffset;
    2711           0 :       if (gID >= NGRID)
    2712             :       {
    2713           0 :          free(utlstr);
    2714           0 :          return -1;
    2715             :       }
    2716           0 :       Vgetname(GDXGrid[gID].IDTable, gridname);
    2717             : 
    2718             : 
    2719             :       /* Get pointers to "Dimension" section within SM */
    2720             :       /* --------------------------------------------- */
    2721           0 :       metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    2722             :              "Dimension", metaptrs);
    2723           0 :       if(metabuf == NULL)
    2724             :       {
    2725           0 :     free(utlstr);
    2726           0 :     return(-1);
    2727             :       }
    2728             : 
    2729             : 
    2730             :       /* If dimension names are requested then "clear" name buffer */
    2731             :       /* --------------------------------------------------------- */
    2732           0 :       if (dimnames != NULL)
    2733             :       {
    2734           0 :     dimnames[0] = 0;
    2735             :       }
    2736             : 
    2737           0 :       while (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    2738             :       {
    2739           0 :     strcpy(utlstr, "\t\tOBJECT=");
    2740           0 :     metaptrs[0] = strstr(metaptrs[0], utlstr);
    2741           0 :     if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    2742             :     {
    2743             :         /* Get Dimension Name */
    2744             :         /* ------------------ */
    2745           0 :         if (dimnames != NULL)
    2746             :         {
    2747             :       /* Check 1st for old meta data then new */
    2748             :       /* ------------------------------------ */
    2749           0 :       EHgetmetavalue(metaptrs, "OBJECT", utlstr);
    2750           0 :       if (utlstr[0] != '"')
    2751             :       {
    2752           0 :           metaptrs[0] =
    2753           0 :         strstr(metaptrs[0], "\t\t\t\tDimensionName=");
    2754           0 :           EHgetmetavalue(metaptrs, "DimensionName", utlstr);
    2755             :       }
    2756             : 
    2757             :       /* Strip off double quotes */
    2758             :       /* ----------------------- */
    2759           0 :       memmove(utlstr, utlstr + 1, strlen(utlstr) - 2);
    2760           0 :       utlstr[strlen(utlstr) - 2] = 0;
    2761             : 
    2762           0 :       if (nDim > 0)
    2763             :       {
    2764           0 :           strcat(dimnames, ",");
    2765             :       }
    2766           0 :       strcat(dimnames, utlstr);
    2767             :         }
    2768             : 
    2769             :         /* Get Dimension Size */
    2770             :         /* ------------------ */
    2771           0 :         if (dims != NULL)
    2772             :         {
    2773           0 :       EHgetmetavalue(metaptrs, "Size", utlstr);
    2774           0 :       size = atoi(utlstr);
    2775           0 :       dims[nDim] = size;
    2776             :         }
    2777           0 :         nDim++;
    2778             :     }
    2779             :       }
    2780           0 :       free(metabuf);
    2781             : 
    2782             :   }
    2783             :     }
    2784             : 
    2785             : 
    2786             :     /* Set nDim to -1 if error status exists */
    2787             :     /* ------------------------------------- */
    2788           0 :     if (status == -1)
    2789             :     {
    2790           0 :   nDim = -1;
    2791             :     }
    2792           0 :     free(utlstr);
    2793           0 :     return (nDim);
    2794             : }
    2795             : 
    2796             : 
    2797             : 
    2798             : 
    2799             : 
    2800             : 
    2801             : /*----------------------------------------------------------------------------|
    2802             : |  BEGIN_PROLOG                                                               |
    2803             : |                                                                             |
    2804             : |  FUNCTION: GDinqfields                                                      |
    2805             : |                                                                             |
    2806             : |  DESCRIPTION: Retrieve information about all data fields defined in a grid. |
    2807             : |                                                                             |
    2808             : |                                                                             |
    2809             : |  Return Value    Type     Units     Description                             |
    2810             : |  ============   ======  =========   =====================================   |
    2811             : |  nFld           int32               Number of fields in swath               |
    2812             : |                                                                             |
    2813             : |  INPUTS:                                                                    |
    2814             : |  gridID         int32               grid structure ID                       |
    2815             : |                                                                             |
    2816             : |                                                                             |
    2817             : |  OUTPUTS:                                                                   |
    2818             : |  fieldlist      char                Field names (comma-separated)           |
    2819             : |  rank           int32               Array of ranks                          |
    2820             : |  numbertype     int32               Array of HDF number types               |
    2821             : |                                                                             |
    2822             : |  NOTES:                                                                     |
    2823             : |                                                                             |
    2824             : |                                                                             |
    2825             : |   Date     Programmer   Description                                         |
    2826             : |  ======   ============  =================================================   |
    2827             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2828             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    2829             : |  Feb 97   Joel Gales    Set nFld to -1 if status = -1                       |
    2830             : |                                                                             |
    2831             : |  END_PROLOG                                                                 |
    2832             : -----------------------------------------------------------------------------*/
    2833             : int32
    2834           0 : GDinqfields(int32 gridID, char *fieldlist, int32 rank[],
    2835             :       int32 numbertype[])
    2836             : {
    2837             :     intn            status; /* routine return status variable */
    2838             : 
    2839             :     int32           fid;  /* HDF-EOS file ID */
    2840             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2841             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    2842           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    2843           0 :     int32           nFld = 0; /* Number of mappings */
    2844             :     int32           slen[8];  /* String length array */
    2845             : 
    2846             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    2847             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    2848             :     char            gridname[80]; /* Grid Name */
    2849             :     char           *utlstr;/* Utility string */
    2850             :     char           *ptr[8]; /* String pointer array */
    2851             : 
    2852             :     /* Allocate space for utility string */
    2853             :     /* --------------------------------- */
    2854           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    2855           0 :     if(utlstr == NULL)
    2856             :     {
    2857           0 :   HEpush(DFE_NOSPACE,"GDinqfields", __FILE__, __LINE__);
    2858           0 :   return(-1);
    2859             :     }
    2860             :     /* Check for valid grid id */
    2861             :     /* ----------------------- */
    2862           0 :     status = GDchkgdid(gridID, "GDinqfields", &fid, &sdInterfaceID, &gdVgrpID);
    2863           0 :     if (status == 0)
    2864             :     {
    2865             : 
    2866             :   /* If field names, ranks,  or number types desired ... */
    2867             :   /* --------------------------------------------------- */
    2868           0 :   if (fieldlist != NULL || rank != NULL || numbertype != NULL)
    2869             :   {
    2870             :       /* Get grid name */
    2871             :       /* ------------- */
    2872           0 :       int gID = gridID % idOffset;
    2873           0 :       if (gID >= NGRID)
    2874             :       {
    2875           0 :          free(utlstr);
    2876           0 :          return -1;
    2877             :       }
    2878           0 :       Vgetname(GDXGrid[gID].IDTable, gridname);
    2879             : 
    2880             : 
    2881             :       /* Get pointers to "DataField" section within SM */
    2882             :       /* --------------------------------------------- */
    2883           0 :       metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    2884             :              "DataField", metaptrs);
    2885           0 :       if(metabuf == NULL)
    2886             :       {
    2887           0 :     free(utlstr);
    2888           0 :     return(-1);
    2889             :       }
    2890             : 
    2891             : 
    2892             :       /* If field names are desired then "clear" name buffer */
    2893             :       /* --------------------------------------------------- */
    2894           0 :       if (fieldlist != NULL)
    2895             :       {
    2896           0 :     fieldlist[0] = 0;
    2897             :       }
    2898             : 
    2899             : 
    2900             :       /* Begin loop through mapping entries in metadata */
    2901             :       /* ---------------------------------------------- */
    2902             :       while (1)
    2903             :       {
    2904             :     /* Search for OBJECT string */
    2905             :     /* ------------------------ */
    2906           0 :     metaptrs[0] = strstr(metaptrs[0], "\t\tOBJECT=");
    2907             : 
    2908             : 
    2909             :     /* If found within "Data" Field metadata section .. */
    2910             :     /* ------------------------------------------------ */
    2911           0 :     if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    2912             :     {
    2913             :         /* Get Fieldnames (if desired) */
    2914             :         /* --------------------------- */
    2915           0 :         if (fieldlist != NULL)
    2916             :         {
    2917             :       /* Check 1st for old meta data then new */
    2918             :       /* ------------------------------------ */
    2919           0 :       EHgetmetavalue(metaptrs, "OBJECT", utlstr);
    2920             : 
    2921             :       /*
    2922             :        * If OBJECT value begins with double quote then old
    2923             :        * metadata, field name is OBJECT value. Otherwise
    2924             :        * search for "DataFieldName" string
    2925             :        */
    2926             : 
    2927           0 :       if (utlstr[0] != '"')
    2928             :       {
    2929           0 :           strcpy(utlstr, "\t\t\t\t");
    2930           0 :           strcat(utlstr, "DataFieldName");
    2931           0 :           strcat(utlstr, "=");
    2932           0 :           metaptrs[0] = strstr(metaptrs[0], utlstr);
    2933           0 :           EHgetmetavalue(metaptrs, "DataFieldName", utlstr);
    2934             :       }
    2935             : 
    2936             :       /* Strip off double quotes */
    2937             :       /* ----------------------- */
    2938           0 :       REMQUOTE(utlstr);
    2939             : 
    2940             : 
    2941             :       /* Add to fieldlist */
    2942             :       /* ---------------- */
    2943           0 :           if (nFld > 0)
    2944             :       {
    2945           0 :           strcat(fieldlist, ",");
    2946             :       }
    2947           0 :       strcat(fieldlist, utlstr);
    2948             : 
    2949             :         }
    2950             :         /* Get Numbertype */
    2951           0 :         if (numbertype != NULL)
    2952             :         {
    2953           0 :       EHgetmetavalue(metaptrs, "DataType", utlstr);
    2954           0 :       numbertype[nFld] = EHnumstr(utlstr);
    2955             :         }
    2956             :         /*
    2957             :          * Get Rank (if desired) by counting # of dimensions in
    2958             :          * "DimList" string
    2959             :          */
    2960           0 :         if (rank != NULL)
    2961             :         {
    2962           0 :       EHgetmetavalue(metaptrs, "DimList", utlstr);
    2963           0 :       rank[nFld] = EHparsestr(utlstr, ',', ptr, slen);
    2964             :         }
    2965             :         /* Increment number of fields */
    2966           0 :         nFld++;
    2967             :     }
    2968             :     else
    2969             :         /* No more fields found */
    2970             :     {
    2971             :         break;
    2972             :     }
    2973             :       }
    2974           0 :       free(metabuf);
    2975             :   }
    2976             :     }
    2977             : 
    2978             :     /* Set nFld to -1 if error status exists */
    2979             :     /* ------------------------------------- */
    2980           0 :     if (status == -1)
    2981             :     {
    2982           0 :   nFld = -1;
    2983             :     }
    2984           0 :     free(utlstr);
    2985           0 :     return (nFld);
    2986             : }
    2987             : 
    2988             : 
    2989             : 
    2990             : 
    2991             : 
    2992             : /*----------------------------------------------------------------------------|
    2993             : |  BEGIN_PROLOG                                                               |
    2994             : |                                                                             |
    2995             : |  FUNCTION: GDnentries                                                       |
    2996             : |                                                                             |
    2997             : |  DESCRIPTION: Returns number of entries and descriptive string buffer       |
    2998             : |                size for a specified entity.                                 |
    2999             : |                                                                             |
    3000             : |                                                                             |
    3001             : |  Return Value    Type     Units     Description                             |
    3002             : |  ============   ======  =========   =====================================   |
    3003             : |  nEntries       int32               Number of entries                       |
    3004             : |                                                                             |
    3005             : |  INPUTS:                                                                    |
    3006             : |  gridID         int32               grid structure ID                       |
    3007             : |  entrycode      int32               Entry code                              |
    3008             : |                               HDFE_NENTDIM  (0)                       |
    3009             : |                               HDFE_NENTDFLD (4)                       |
    3010             : |                                                                             |
    3011             : |                                                                             |
    3012             : |  OUTPUTS:                                                                   |
    3013             : |  strbufsize     int32               Length of comma-separated list          |
    3014             : |                                     (Does not include null-terminator       |
    3015             : |                                                                             |
    3016             : |  NOTES:                                                                     |
    3017             : |                                                                             |
    3018             : |                                                                             |
    3019             : |   Date     Programmer   Description                                         |
    3020             : |  ======   ============  =================================================   |
    3021             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3022             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    3023             : |  Feb 97   Joel Gales    Set nEntries to -1 if status = -1                   |
    3024             : |                                                                             |
    3025             : |  END_PROLOG                                                                 |
    3026             : -----------------------------------------------------------------------------*/
    3027             : int32
    3028           0 : GDnentries(int32 gridID, int32 entrycode, int32 * strbufsize)
    3029             : 
    3030             : {
    3031             :     intn            status; /* routine return status variable */
    3032             :     intn            i;    /* Loop index */
    3033             : 
    3034             :     int32           fid;  /* HDF-EOS file ID */
    3035             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    3036             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    3037           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    3038           0 :     int32           nEntries = 0; /* Number of entries */
    3039             :     int32           metaflag; /* Old (0), New (1) metadata flag) */
    3040           0 :     int32           nVal = 0; /* Number of strings to search for */
    3041             : 
    3042           0 :     char           *metabuf = NULL; /* Pointer to structural metadata (SM) */
    3043           0 :     char           *metaptrs[2] = {NULL, NULL};/* Pointers to begin and end of SM section */
    3044             :     char            gridname[80]; /* Grid Name */
    3045             :     char           *utlstr;/* Utility string */
    3046             :     char            valName[2][32]; /* Strings to search for */
    3047             : 
    3048           0 :     memset(valName, 0, sizeof(valName));
    3049             : 
    3050             :     /* Allocate space for utility string */
    3051             :     /* --------------------------------- */
    3052           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    3053           0 :     if(utlstr == NULL)
    3054             :     {
    3055           0 :   HEpush(DFE_NOSPACE,"GDnentries", __FILE__, __LINE__);
    3056           0 :   return(-1);
    3057             :     }
    3058           0 :     status = GDchkgdid(gridID, "GDnentries", &fid, &sdInterfaceID, &gdVgrpID);
    3059             : 
    3060           0 :     if (status == 0)
    3061             :     {
    3062             :   /* Get grid name */
    3063           0 :   int gID = gridID % idOffset;
    3064           0 :   if (gID >= NGRID)
    3065             :   {
    3066           0 :      free(utlstr);
    3067           0 :      return -1;
    3068             :   }
    3069             : 
    3070           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
    3071             : 
    3072             :   /* Zero out string buffer size */
    3073           0 :   *strbufsize = 0;
    3074             : 
    3075             : 
    3076             :   /*
    3077             :    * Get pointer to  relevant section within SM and Get names of
    3078             :    * metadata strings to inquire about
    3079             :    */
    3080           0 :   switch (entrycode)
    3081             :   {
    3082           0 :   case HDFE_NENTDIM:
    3083             :       {
    3084           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    3085             :                  "Dimension", metaptrs);
    3086           0 :     if(metabuf == NULL)
    3087             :     {
    3088           0 :         free(utlstr);
    3089           0 :         return(-1);
    3090             :     }
    3091             : 
    3092           0 :     nVal = 1;
    3093           0 :     strcpy(&valName[0][0], "DimensionName");
    3094             :       }
    3095           0 :       break;
    3096             : 
    3097           0 :   case HDFE_NENTDFLD:
    3098             :       {
    3099           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, gridname, "g",
    3100             :                  "DataField", metaptrs);
    3101           0 :     if(metabuf == NULL)
    3102             :     {
    3103           0 :         free(utlstr);
    3104           0 :         return(-1);
    3105             :     }
    3106             : 
    3107           0 :     nVal = 1;
    3108           0 :     strcpy(&valName[0][0], "DataFieldName");
    3109             :       }
    3110           0 :       break;
    3111             :   }
    3112             : 
    3113           0 :   if (!metabuf || metaptrs[0] == NULL)
    3114             :     {
    3115           0 :         free(metabuf);
    3116           0 :         free(utlstr);
    3117           0 :         return -1;
    3118             :     }
    3119             : 
    3120             :   /*
    3121             :    * Check for presence of 'GROUP="' string If found then old metadata,
    3122             :    * search on OBJECT string
    3123             :    */
    3124           0 :   metaflag = (strstr(metabuf, "GROUP=\"") == NULL) ? 1 : 0;
    3125           0 :   if (metaflag == 0)
    3126             :   {
    3127           0 :       nVal = 1;
    3128           0 :       strcpy(&valName[0][0], "\t\tOBJECT");
    3129             :   }
    3130             : 
    3131             : 
    3132             :   /* Begin loop through entries in metadata */
    3133             :   /* -------------------------------------- */
    3134             :   while (1)
    3135             :   {
    3136             :       /* Search for first string */
    3137           0 :       strcpy(utlstr, &valName[0][0]);
    3138           0 :       strcat(utlstr, "=");
    3139           0 :       metaptrs[0] = strstr(metaptrs[0], utlstr);
    3140             : 
    3141             :       /* If found within relevant metadata section ... */
    3142           0 :       if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    3143             :       {
    3144           0 :     for (i = 0; i < nVal; i++)
    3145             :     {
    3146             :         /*
    3147             :          * Get all string values Don't count quotes
    3148             :          */
    3149           0 :         EHgetmetavalue(metaptrs, &valName[i][0], utlstr);
    3150           0 :         *strbufsize += (int32)strlen(utlstr) - 2;
    3151             :     }
    3152             :     /* Increment number of entries */
    3153           0 :     nEntries++;
    3154             : 
    3155             :     /* Go to end of OBJECT */
    3156           0 :     metaptrs[0] = strstr(metaptrs[0], "END_OBJECT");
    3157             :       }
    3158             :       else
    3159             :     /* No more entries found */
    3160             :       {
    3161             :     break;
    3162             :       }
    3163             :   }
    3164           0 :   free(metabuf);
    3165             : 
    3166             : 
    3167             :   /* Count comma separators & slashes (if mappings) */
    3168             :   /* ---------------------------------------------- */
    3169           0 :   if (nEntries > 0)
    3170             :   {
    3171           0 :       *strbufsize += nEntries - 1;
    3172           0 :       *strbufsize += (nVal - 1) * nEntries;
    3173             :   }
    3174             :     }
    3175             : 
    3176             : 
    3177             :     /* Set nEntries to -1 if error status exists */
    3178             :     /* ----------------------------------------- */
    3179           0 :     if (status == -1)
    3180             :     {
    3181           0 :   nEntries = -1;
    3182             :     }
    3183             : 
    3184           0 :     free(utlstr);
    3185           0 :     return (nEntries);
    3186             : }
    3187             : 
    3188             : 
    3189             : 
    3190             : 
    3191             : 
    3192             : /*----------------------------------------------------------------------------|
    3193             : |  BEGIN_PROLOG                                                               |
    3194             : |                                                                             |
    3195             : |  FUNCTION: GDinqgrid                                                        |
    3196             : |                                                                             |
    3197             : |  DESCRIPTION: Returns number and names of grid structures in file           |
    3198             : |                                                                             |
    3199             : |                                                                             |
    3200             : |  Return Value    Type     Units     Description                             |
    3201             : |  ============   ======  =========   =====================================   |
    3202             : |  nGrid          int32               Number of grid structures in file       |
    3203             : |                                                                             |
    3204             : |  INPUTS:                                                                    |
    3205             : |  filename       char                HDF-EOS filename                        |
    3206             : |                                                                             |
    3207             : |  OUTPUTS:                                                                   |
    3208             : |  gridlist       char                List of grid names (comma-separated)    |
    3209             : |  strbufsize     int32               Length of gridlist                      |
    3210             : |                                                                             |
    3211             : |  NOTES:                                                                     |
    3212             : |                                                                             |
    3213             : |                                                                             |
    3214             : |   Date     Programmer   Description                                         |
    3215             : |  ======   ============  =================================================   |
    3216             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3217             : |                                                                             |
    3218             : |  END_PROLOG                                                                 |
    3219             : -----------------------------------------------------------------------------*/
    3220             : int32
    3221           4 : GDinqgrid(const char *filename, char *gridlist, int32 * strbufsize)
    3222             : {
    3223             :     int32           nGrid;  /* Number of grid structures in file */
    3224             : 
    3225             :     /* Call "EHinquire" routine */
    3226             :     /* ------------------------ */
    3227           4 :     nGrid = EHinquire(filename, "GRID", gridlist, strbufsize);
    3228             : 
    3229           4 :     return (nGrid);
    3230             : }
    3231             : 
    3232             : 
    3233             : 
    3234             : /*----------------------------------------------------------------------------|
    3235             : |  BEGIN_PROLOG                                                               |
    3236             : |                                                                             |
    3237             : |  FUNCTION: GDgetfillvalue                                                   |
    3238             : |                                                                             |
    3239             : |  DESCRIPTION: Retrieves fill value for a specified field.                   |
    3240             : |                                                                             |
    3241             : |                                                                             |
    3242             : |  Return Value    Type     Units     Description                             |
    3243             : |  ============   ======  =========   =====================================   |
    3244             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3245             : |                                                                             |
    3246             : |  INPUTS:                                                                    |
    3247             : |  gridID         int32               grid structure ID                       |
    3248             : |  fieldname      char                field name                              |
    3249             : |                                                                             |
    3250             : |  OUTPUTS:                                                                   |
    3251             : |  fillval        void                fill value                              |
    3252             : |                                                                             |
    3253             : |  NOTES:                                                                     |
    3254             : |                                                                             |
    3255             : |                                                                             |
    3256             : |   Date     Programmer   Description                                         |
    3257             : |  ======   ============  =================================================   |
    3258             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3259             : |                                                                             |
    3260             : |  END_PROLOG                                                                 |
    3261             : -----------------------------------------------------------------------------*/
    3262             : intn
    3263           0 : GDgetfillvalue(int32 gridID, const char *fieldname, VOIDP fillval)
    3264             : {
    3265             :     intn            status; /* routine return status variable */
    3266             : 
    3267             :     int32           nt;   /* Number type */
    3268             :     int32           dims[8];  /* Dimensions array */
    3269             :     int32           dum;  /* Dummy variable */
    3270             : 
    3271             :     char            name[80]; /* Fill value "attribute" name */
    3272             : 
    3273           0 :     status = GDchkgdid(gridID, "GDgetfillvalue", &dum, &dum, &dum);
    3274             : 
    3275             :     /* Check for valid grid ID */
    3276           0 :     if (status == 0)
    3277             :     {
    3278             :   /* Get field info */
    3279           0 :   status = GDfieldinfo(gridID, fieldname, &dum, dims, &nt, NULL);
    3280             : 
    3281           0 :   if (status == 0)
    3282             :   {
    3283             :       /* Read fill value attribute */
    3284           0 :       strcpy(name, "_FV_");
    3285           0 :       strcat(name, fieldname);
    3286           0 :       status = GDreadattr(gridID, name, fillval);
    3287             :   }
    3288             :   else
    3289             :   {
    3290           0 :       HEpush(DFE_GENAPP, "GDgetfillvalue", __FILE__, __LINE__);
    3291           0 :       HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
    3292             :   }
    3293             : 
    3294             :     }
    3295           0 :     return (status);
    3296             : }
    3297             : 
    3298             : 
    3299             : 
    3300             : 
    3301             : 
    3302             : /*----------------------------------------------------------------------------|
    3303             : |  BEGIN_PROLOG                                                               |
    3304             : |                                                                             |
    3305             : |  FUNCTION: GDdetach                                                         |
    3306             : |                                                                             |
    3307             : |  DESCRIPTION: Detaches from grid interface and performs file housekeeping.  |
    3308             : |                                                                             |
    3309             : |                                                                             |
    3310             : |  Return Value    Type     Units     Description                             |
    3311             : |  ============   ======  =========   =====================================   |
    3312             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3313             : |                                                                             |
    3314             : |  INPUTS:                                                                    |
    3315             : |  gridID         int32               grid structure ID                       |
    3316             : |                                                                             |
    3317             : |                                                                             |
    3318             : |  OUTPUTS:                                                                   |
    3319             : |             None                                                            |
    3320             : |                                                                             |
    3321             : |  NOTES:                                                                     |
    3322             : |                                                                             |
    3323             : |                                                                             |
    3324             : |   Date     Programmer   Description                                         |
    3325             : |  ======   ============  =================================================   |
    3326             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3327             : |  Sep 96   Joel Gales    Setup dim names for SDsetdimname in dimbuf1 rather  |
    3328             : |                         that utlstr                                         |
    3329             : |  Oct 96   Joel Gales    Detach Grid Vgroups                                 |
    3330             : |  Oct 96   Joel Gales    "Detach" from SDS                                   |
    3331             : |  Nov 96   Joel Gales    Call GDchkgdid to check for proper grid ID          |
    3332             : |  Dec 96   Joel Gales    Add multiple vertical subsetting garbage collection |
    3333             : |  Oct 98   Abe Taaheri   Added GDXRegion[k]->DimNamePtr[i] =0; after freeing |
    3334             : |                         memory                                              |
    3335             : |  Sep 99   Abe Taaheri   Changed memcpy to memmove because of overlapping    |
    3336             : |                         source and destination for GDXSDcomb, nameptr, and  |
    3337             : |                         dimptr. memcpy may cause unexpected results.        |
    3338             : |                                                                             |
    3339             : |  END_PROLOG                                                                 |
    3340             : -----------------------------------------------------------------------------*/
    3341             : intn
    3342           0 : GDdetach(int32 gridID)
    3343             : 
    3344             : {
    3345             :     intn            i;    /* Loop index */
    3346             :     intn            k;    /* Loop index */
    3347           0 :     intn            status = 0; /* routine return status variable */
    3348             : 
    3349             :     int32           sdInterfaceID;  /* SDS interface ID */
    3350             :     int32           gID;  /* Grid ID - offset */
    3351           0 :     int32           idOffset = GDIDOFFSET;  /* Grid ID offset */
    3352             :     int32           dum;  /* Dummy variable */
    3353             : 
    3354             :     char            gridname[VGNAMELENMAX + 1]; /* Grid name */
    3355             : 
    3356             : 
    3357           0 :     status = GDchkgdid(gridID, "GDdetach", &dum, &sdInterfaceID, &dum);
    3358             : 
    3359           0 :     if (status == 0)
    3360             :     {
    3361           0 :   gID = gridID % idOffset;
    3362           0 :   if (gID >= NGRID)
    3363             :   {
    3364           0 :      return -1;
    3365             :   }
    3366           0 :   Vgetname(GDXGrid[gID].IDTable, gridname);
    3367             : 
    3368             : 
    3369             :   /* "Detach" from previously attached SDSs */
    3370             :   /* -------------------------------------- */
    3371           0 :   for (k = 0; k < GDXGrid[gID].nSDS; k++)
    3372             :   {
    3373           0 :       SDendaccess(GDXGrid[gID].sdsID[k]);
    3374             :   }
    3375           0 :   free(GDXGrid[gID].sdsID);
    3376           0 :   GDXGrid[gID].sdsID = 0;
    3377           0 :   GDXGrid[gID].nSDS = 0;
    3378             : 
    3379             : 
    3380             : 
    3381             :   /* Detach Grid Vgroups */
    3382             :   /* ------------------- */
    3383           0 :   Vdetach(GDXGrid[gID].VIDTable[0]);
    3384           0 :   Vdetach(GDXGrid[gID].VIDTable[1]);
    3385           0 :   Vdetach(GDXGrid[gID].IDTable);
    3386             : 
    3387           0 :   GDXGrid[gID].active = 0;
    3388           0 :   GDXGrid[gID].VIDTable[0] = 0;
    3389           0 :   GDXGrid[gID].VIDTable[1] = 0;
    3390           0 :   GDXGrid[gID].IDTable = 0;
    3391           0 :   GDXGrid[gID].fid = 0;
    3392             : 
    3393             : 
    3394             : 
    3395             : 
    3396             :   /* Free Region Pointers */
    3397             :   /* -------------------- */
    3398           0 :   for (k = 0; k < NGRIDREGN; k++)
    3399             :   {
    3400           0 :       if (GDXRegion[k] != 0 &&
    3401           0 :     GDXRegion[k]->gridID == gridID)
    3402             :       {
    3403           0 :     for (i = 0; i < 8; i++)
    3404             :     {
    3405           0 :         if (GDXRegion[k]->DimNamePtr[i] != 0)
    3406             :         {
    3407           0 :       free(GDXRegion[k]->DimNamePtr[i]);
    3408           0 :       GDXRegion[k]->DimNamePtr[i] = 0;
    3409             :         }
    3410             :     }
    3411             : 
    3412           0 :     free(GDXRegion[k]);
    3413           0 :     GDXRegion[k] = 0;
    3414             :       }
    3415             :   }
    3416             :     }
    3417           0 :     return (status);
    3418             : }
    3419             : 
    3420             : 
    3421             : /*----------------------------------------------------------------------------|
    3422             : |  BEGIN_PROLOG                                                               |
    3423             : |                                                                             |
    3424             : |  FUNCTION: GDclose                                                          |
    3425             : |                                                                             |
    3426             : |  DESCRIPTION: Closes file.                                                  |
    3427             : |                                                                             |
    3428             : |                                                                             |
    3429             : |  Return Value    Type     Units     Description                             |
    3430             : |  ============   ======  =========   =====================================   |
    3431             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3432             : |                                                                             |
    3433             : |  INPUTS:                                                                    |
    3434             : |  fid            int32               File ID                                 |
    3435             : |                                                                             |
    3436             : |                                                                             |
    3437             : |  OUTPUTS:                                                                   |
    3438             : |             None                                                            |
    3439             : |                                                                             |
    3440             : |  NOTES:                                                                     |
    3441             : |                                                                             |
    3442             : |                                                                             |
    3443             : |   Date     Programmer   Description                                         |
    3444             : |  ======   ============  =================================================   |
    3445             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3446             : |                                                                             |
    3447             : |  END_PROLOG                                                                 |
    3448             : -----------------------------------------------------------------------------*/
    3449             : intn
    3450           4 : GDclose(int32 fid)
    3451             : 
    3452             : {
    3453           4 :     intn            status = 0; /* routine return status variable */
    3454             : 
    3455             :     /* Call EHclose to perform file close */
    3456             :     /* ---------------------------------- */
    3457           4 :     status = EHclose(fid);
    3458             : 
    3459           4 :     return (status);
    3460             : }
    3461             : 
    3462             : 
    3463             : /*----------------------------------------------------------------------------|
    3464             : |  BEGIN_PROLOG                                                               |
    3465             : |                                                                             |
    3466             : |  FUNCTION: GDgetdefaults                                                    |
    3467             : |                                                                             |
    3468             : |  DESCRIPTION:                                                               |
    3469             : |                                                                             |
    3470             : |                                                                             |
    3471             : |  Return Value    Type     Units     Description                             |
    3472             : |  ============   ======  =========   =====================================   |
    3473             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3474             : |                                                                             |
    3475             : |  INPUTS:                                                                    |
    3476             : |  projcode       int32               GCTP projection code                    |
    3477             : |  zonecode       int32               UTM zone code                           |
    3478             : |  projparm       float64             Projection parameters                   |
    3479             : |  spherecode     int32               GCTP spheriod code                      |
    3480             : |  upleftpt       float64             upper left corner coordinates           |
    3481             : |  lowrightpt     float64             lower right corner coordinates          |
    3482             : |                                                                             |
    3483             : |                                                                             |
    3484             : |  OUTPUTS:                                                                   |
    3485             : |  upleftpt       float64             upper left corner coordinates           |
    3486             : |  lowrightpt     float64             lower right corner coordinates          |
    3487             : |                                                                             |
    3488             : |  NOTES:                                                                     |
    3489             : |                                                                             |
    3490             : |                                                                             |
    3491             : |   Date     Programmer   Description                                         |
    3492             : |  ======   ============  =================================================   |
    3493             : |  Aug 96   Joel Gales    Original Programmer                                 |
    3494             : |  Sep 96   Raj Gejjaga   Fixed  bugs in Polar Stereographic and Goode        | |                         Homolosine default calculations.                    |
    3495             : |  Sep 96   Raj Gejjaga   Added code to compute default boundary points       |
    3496             : |                         for Lambert Azimuthal Polar and Equatorial          |
    3497             : |                         projections.                                        |
    3498             : |  Feb 97   Raj Gejjaga   Added code to compute default boundary points       |
    3499             : |                         for Integerized Sinusoidal Grid.  Added error       |
    3500             : |                         handling code.                                      |
    3501             : |  Jun 00   Abe Taaheri   Added support for EASE grid                         |
    3502             : |                                                                             |
    3503             : |  END_PROLOG                                                                 |
    3504             : -----------------------------------------------------------------------------*/
    3505             : static intn
    3506           0 : GDgetdefaults(int32 projcode, int32 zonecode, float64 projparm[],
    3507             :         int32 spherecode, float64 upleftpt[], float64 lowrightpt[])
    3508             : {
    3509           0 :     int32           errorcode = 0, status = 0;
    3510             :     int32(*for_trans[100]) (double, double, double*, double*);
    3511             : 
    3512             :     float64         lon, lat, plat, x, y;
    3513             :     float64         plon, tlon, llon, rlon, pplon, LLon, LLat, RLon, RLat;
    3514             : 
    3515             : 
    3516             :     /* invoke GCTP initialization routine */
    3517             :     /* ---------------------------------- */
    3518           0 :     for_init(projcode, zonecode, projparm, spherecode, NULL, NULL,
    3519             :        &errorcode, for_trans);
    3520             : 
    3521             :     /* Report error if any */
    3522             :     /* ------------------- */
    3523           0 :     if (errorcode != 0)
    3524             :     {
    3525           0 :   status = -1;
    3526           0 :   HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3527           0 :   HEreport("GCTP Error: %d\n", errorcode);
    3528           0 :   return (status);
    3529             :     }
    3530             : 
    3531             :     /* Compute Default Boundary Points for EASE Grid          */
    3532             :     /* Use Global coverage */
    3533             :     /* ------------------------------------------------------ */
    3534           0 :     if (projcode == GCTP_BCEA &&
    3535           0 :   upleftpt[0] == 0 && upleftpt[1] == 0 &&
    3536           0 :   lowrightpt[0] == 0 && lowrightpt[1] == 0)
    3537             :     {
    3538           0 :   upleftpt[0] = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LON, HDFE_DEG_DMS);
    3539           0 :   upleftpt[1] = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LAT, HDFE_DEG_DMS);
    3540           0 :   lowrightpt[0] = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LON, HDFE_DEG_DMS);
    3541           0 :   lowrightpt[1] = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LAT, HDFE_DEG_DMS);
    3542             :     }
    3543             : 
    3544             : /* Compute Default Boundary Points for CEA     */
    3545             :    /* --------------------------------------------*/
    3546           0 :    if (projcode == GCTP_CEA &&
    3547           0 :       upleftpt[0] == 0 && upleftpt[1] == 0 &&
    3548           0 :       lowrightpt[0] == 0 && lowrightpt[1] == 0)
    3549             :     {
    3550           0 :       LLon = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LON, HDFE_DEG_RAD);
    3551           0 :       LLat = EHconvAng(EASE_GRID_DEFAULT_UPLEFT_LAT, HDFE_DEG_RAD);
    3552           0 :       RLon = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LON, HDFE_DEG_RAD);
    3553           0 :       RLat = EHconvAng(EASE_GRID_DEFAULT_LOWRGT_LAT, HDFE_DEG_RAD);
    3554             : 
    3555           0 :       errorcode = for_trans[projcode] (LLon, LLat, &x, &y);
    3556           0 :       if (errorcode != 0)
    3557             :       {
    3558           0 :            status = -1;
    3559           0 :            HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3560           0 :            HEreport("GCTP Error: %d\n", errorcode);
    3561           0 :            return (status);
    3562             :       }
    3563           0 :         upleftpt[0] = x;
    3564           0 :         upleftpt[1] = y;
    3565             : 
    3566           0 :       errorcode = for_trans[projcode] (RLon, RLat, &x, &y);
    3567           0 :       if (errorcode != 0)
    3568             :       {
    3569           0 :            status = -1;
    3570           0 :            HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3571           0 :            HEreport("GCTP Error: %d\n", errorcode);
    3572           0 :            return (status);
    3573             :       }
    3574           0 :       lowrightpt[0] = x;
    3575           0 :       lowrightpt[1] = y;
    3576             : 
    3577             :     }
    3578             : 
    3579             : 
    3580             :     /* Compute Default Boundary Points for Polar Sterographic */
    3581             :     /* ------------------------------------------------------ */
    3582           0 :     if (projcode == GCTP_PS &&
    3583           0 :   upleftpt[0] == 0 && upleftpt[1] == 0 &&
    3584           0 :   lowrightpt[0] == 0 && lowrightpt[1] == 0)
    3585             :     {
    3586             :   /*
    3587             :    * Convert the longitude and latitude from the DMS to decimal degree
    3588             :    * format.
    3589             :    */
    3590           0 :   plon = EHconvAng(projparm[4], HDFE_DMS_DEG);
    3591           0 :   plat = EHconvAng(projparm[5], HDFE_DMS_DEG);
    3592             : 
    3593             :   /*
    3594             :    * Compute the longitudes at 90, 180 and 270 degrees from the central
    3595             :    * longitude.
    3596             :    */
    3597             : 
    3598           0 :   if (plon <= 0.0)
    3599             :   {
    3600           0 :       tlon = 180.0 + plon;
    3601           0 :       pplon = plon + 360.0;
    3602             :   }
    3603             :   else
    3604             :   {
    3605           0 :       tlon = plon - 180.0;
    3606           0 :       pplon = plon;
    3607             :   }
    3608             : 
    3609           0 :   rlon = pplon + 90.0;
    3610           0 :   if (rlon > 360.0)
    3611           0 :       rlon = rlon - 360;
    3612             : 
    3613           0 :   if (rlon > 180.0)
    3614           0 :       rlon = rlon - 360.0;
    3615             : 
    3616           0 :   if (rlon <= 0.0)
    3617           0 :       llon = 180.0 + rlon;
    3618             :   else
    3619           0 :       llon = rlon - 180.0;
    3620             : 
    3621             : 
    3622             :   /* Convert all four longitudes from decimal degrees to radians */
    3623           0 :   plon = EHconvAng(plon, HDFE_DEG_RAD);
    3624           0 :   tlon = EHconvAng(tlon, HDFE_DEG_RAD);
    3625           0 :   llon = EHconvAng(llon, HDFE_DEG_RAD);
    3626           0 :   rlon = EHconvAng(rlon, HDFE_DEG_RAD);
    3627             : 
    3628           0 :   errorcode = for_trans[projcode] (llon, 0.0, &x, &y);
    3629           0 :   if (errorcode != 0)
    3630             :   {
    3631           0 :       status = -1;
    3632           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3633           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3634           0 :       return (status);
    3635             :   }
    3636             : 
    3637           0 :   upleftpt[0] = x;
    3638             : 
    3639           0 :   errorcode = for_trans[projcode] (rlon, 0.0, &x, &y);
    3640           0 :   if (errorcode != 0)
    3641             :   {
    3642           0 :       status = -1;
    3643           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3644           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3645           0 :       return (status);
    3646             :   }
    3647             : 
    3648           0 :   lowrightpt[0] = x;
    3649             : 
    3650             :   /*
    3651             :    * Compute the upperleft and lowright y values based on the south or
    3652             :    * north polar projection
    3653             :    */
    3654             : 
    3655           0 :   if (plat < 0.0)
    3656             :   {
    3657           0 :       errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
    3658           0 :       if (errorcode != 0)
    3659             :       {
    3660           0 :     status = -1;
    3661           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3662           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3663           0 :     return (status);
    3664             :       }
    3665             : 
    3666           0 :       upleftpt[1] = y;
    3667             : 
    3668           0 :       errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
    3669           0 :       if (errorcode != 0)
    3670             :       {
    3671           0 :     status = -1;
    3672           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3673           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3674           0 :     return (status);
    3675             :       }
    3676             : 
    3677           0 :       lowrightpt[1] = y;
    3678             : 
    3679             :   }
    3680             :   else
    3681             :   {
    3682           0 :       errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
    3683           0 :       if (errorcode != 0)
    3684             :       {
    3685           0 :     status = -1;
    3686           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3687           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3688           0 :     return (status);
    3689             :       }
    3690             : 
    3691           0 :       upleftpt[1] = y;
    3692             : 
    3693           0 :       errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
    3694           0 :       if (errorcode != 0)
    3695             :       {
    3696           0 :     status = -1;
    3697           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3698           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3699           0 :     return (status);
    3700             :       }
    3701             : 
    3702           0 :       lowrightpt[1] = y;
    3703             : 
    3704             :   }
    3705             :     }
    3706             : 
    3707             : 
    3708             :     /* Compute Default Boundary Points for Goode Homolosine */
    3709             :     /* ---------------------------------------------------- */
    3710           0 :     if (projcode == GCTP_GOOD &&
    3711           0 :   upleftpt[0] == 0 && upleftpt[1] == 0 &&
    3712           0 :   lowrightpt[0] == 0 && lowrightpt[1] == 0)
    3713             :     {
    3714           0 :   lon = EHconvAng(-180, HDFE_DEG_RAD);
    3715           0 :   lat = 0.0;
    3716             : 
    3717           0 :   errorcode = for_trans[projcode] (lon, lat, &x, &y);
    3718           0 :   if (errorcode != 0)
    3719             :   {
    3720           0 :       status = -1;
    3721           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3722           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3723           0 :       return (status);
    3724             :   }
    3725             : 
    3726           0 :   upleftpt[0] = -fabs(x);
    3727           0 :   lowrightpt[0] = +fabs(x);
    3728             : 
    3729           0 :   lat = EHconvAng(90, HDFE_DEG_RAD);
    3730             : 
    3731           0 :   errorcode = for_trans[projcode] (lon, lat, &x, &y);
    3732           0 :   if (errorcode != 0)
    3733             :   {
    3734           0 :       status = -1;
    3735           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3736           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3737           0 :       return (status);
    3738             :   }
    3739             : 
    3740           0 :   upleftpt[1] = +fabs(y);
    3741           0 :   lowrightpt[1] = -fabs(y);
    3742             :     }
    3743             : 
    3744             :     /* Compute Default Boundary Points for Lambert Azimuthal */
    3745             :     /* ----------------------------------------------------- */
    3746           0 :     if (projcode == GCTP_LAMAZ &&
    3747           0 :   upleftpt[0] == 0 && upleftpt[1] == 0 &&
    3748           0 :   lowrightpt[0] == 0 && lowrightpt[1] == 0)
    3749             :     {
    3750             :   /*
    3751             :    * Convert the longitude and latitude from the DMS to decimal degree
    3752             :    * format.
    3753             :    */
    3754           0 :   plon = EHconvAng(projparm[4], HDFE_DMS_DEG);
    3755           0 :   plat = EHconvAng(projparm[5], HDFE_DMS_DEG);
    3756             : 
    3757             :   /*
    3758             :    * Compute the longitudes at 90, 180 and 270 degrees from the central
    3759             :    * longitude.
    3760             :    */
    3761             : 
    3762           0 :   if (plon <= 0.0)
    3763             :   {
    3764           0 :       tlon = 180.0 + plon;
    3765           0 :       pplon = plon + 360.0;
    3766             :   }
    3767             :   else
    3768             :   {
    3769           0 :       tlon = plon - 180.0;
    3770           0 :       pplon = plon;
    3771             :   }
    3772             : 
    3773           0 :   rlon = pplon + 90.0;
    3774           0 :   if (rlon > 360.0)
    3775           0 :       rlon = rlon - 360;
    3776             : 
    3777           0 :   if (rlon > 180.0)
    3778           0 :       rlon = rlon - 360.0;
    3779             : 
    3780           0 :   if (rlon <= 0.0)
    3781           0 :       llon = 180.0 + rlon;
    3782             :   else
    3783           0 :       llon = rlon - 180.0;
    3784             : 
    3785             :   /* Convert all four longitudes from decimal degrees to radians */
    3786           0 :   plon = EHconvAng(plon, HDFE_DEG_RAD);
    3787           0 :   tlon = EHconvAng(tlon, HDFE_DEG_RAD);
    3788           0 :   llon = EHconvAng(llon, HDFE_DEG_RAD);
    3789           0 :   rlon = EHconvAng(rlon, HDFE_DEG_RAD);
    3790             : 
    3791           0 :   errorcode = for_trans[projcode] (llon, 0.0, &x, &y);
    3792           0 :   if (errorcode != 0)
    3793             :   {
    3794           0 :       status = -1;
    3795           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3796           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3797           0 :       return (status);
    3798             :   }
    3799             : 
    3800           0 :   upleftpt[0] = x;
    3801             : 
    3802           0 :   errorcode = for_trans[projcode] (rlon, 0.0, &x, &y);
    3803           0 :   if (errorcode != 0)
    3804             :   {
    3805           0 :       status = -1;
    3806           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3807           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3808           0 :       return (status);
    3809             :   }
    3810             : 
    3811           0 :   lowrightpt[0] = x;
    3812             : 
    3813             :   /*
    3814             :    * Compute upperleft and lowerright values based on whether the
    3815             :    * projection is south polar, north polar or equatorial
    3816             :    */
    3817             : 
    3818           0 :   if (plat == -90.0)
    3819             :   {
    3820           0 :       errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
    3821           0 :       if (errorcode != 0)
    3822             :       {
    3823           0 :     status = -1;
    3824           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3825           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3826           0 :     return (status);
    3827             :       }
    3828             : 
    3829           0 :       upleftpt[1] = y;
    3830             : 
    3831           0 :       errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
    3832           0 :       if (errorcode != 0)
    3833             :       {
    3834           0 :     status = -1;
    3835           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3836           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3837           0 :     return (status);
    3838             :       }
    3839             : 
    3840           0 :       lowrightpt[1] = y;
    3841             :   }
    3842           0 :   else if (plat == 90.0)
    3843             :   {
    3844           0 :       errorcode = for_trans[projcode] (tlon, 0.0, &x, &y);
    3845           0 :       if (errorcode != 0)
    3846             :       {
    3847           0 :     status = -1;
    3848           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3849           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3850           0 :     return (status);
    3851             :       }
    3852             : 
    3853           0 :       upleftpt[1] = y;
    3854             : 
    3855           0 :       errorcode = for_trans[projcode] (plon, 0.0, &x, &y);
    3856           0 :       if (errorcode != 0)
    3857             :       {
    3858           0 :     status = -1;
    3859           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3860           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3861           0 :     return (status);
    3862             :       }
    3863             : 
    3864           0 :       lowrightpt[1] = y;
    3865             :   }
    3866             :   else
    3867             :   {
    3868           0 :       lat = EHconvAng(90, HDFE_DEG_RAD);
    3869           0 :       errorcode = for_trans[projcode] (plon, lat, &x, &y);
    3870           0 :       if (errorcode != 0)
    3871             :       {
    3872           0 :     status = -1;
    3873           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3874           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3875           0 :     return (status);
    3876             :       }
    3877             : 
    3878           0 :       upleftpt[1] = y;
    3879             : 
    3880           0 :       lat = EHconvAng(-90, HDFE_DEG_RAD);
    3881           0 :       errorcode = for_trans[projcode] (plon, lat, &x, &y);
    3882           0 :       if (errorcode != 0)
    3883             :       {
    3884           0 :     status = -1;
    3885           0 :     HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3886           0 :     HEreport("GCTP Error: %d\n", errorcode);
    3887           0 :     return (status);
    3888             :       }
    3889             : 
    3890           0 :       lowrightpt[1] = y;
    3891             :   }
    3892             :     }
    3893             : 
    3894             :     /* Compute Default Boundary Points for Integerized Sinusoidal Grid */
    3895             :     /* --------------------------------------------------------------- */
    3896           0 :     if (((projcode == GCTP_ISINUS) || (projcode == GCTP_ISINUS1)) &&
    3897           0 :   upleftpt[0] == 0 && upleftpt[1] == 0 &&
    3898           0 :   lowrightpt[0] == 0 && lowrightpt[1] == 0)
    3899             :     {
    3900             :   /*
    3901             :    * Convert the longitude and latitude from the DMS to decimal degree
    3902             :    * format.
    3903             :    */
    3904           0 :   plon = EHconvAng(projparm[4], HDFE_DMS_DEG);
    3905             :   /*plat = EHconvAng(projparm[5], HDFE_DMS_DEG); */
    3906             : 
    3907             :   /*
    3908             :    * Compute the longitudes at 90, 180 and 270 degrees from the central
    3909             :    * longitude.
    3910             :    */
    3911             : 
    3912           0 :   if (plon <= 0.0)
    3913             :   {
    3914           0 :       tlon = 180.0 + plon;
    3915           0 :       pplon = plon + 360.0;
    3916             :   }
    3917             :   else
    3918             :   {
    3919           0 :       tlon = plon - 180.0;
    3920           0 :       pplon = plon;
    3921             :   }
    3922             : 
    3923           0 :   rlon = pplon + 90.0;
    3924           0 :   if (rlon > 360.0)
    3925           0 :       rlon = rlon - 360;
    3926             : 
    3927           0 :   if (rlon > 180.0)
    3928           0 :       rlon = rlon - 360.0;
    3929             : 
    3930           0 :   if (rlon <= 0.0)
    3931           0 :       llon = 180.0 + rlon;
    3932             :   else
    3933           0 :       llon = rlon - 180.0;
    3934             : 
    3935             :   /* Convert all four longitudes from decimal degrees to radians */
    3936           0 :   plon = EHconvAng(plon, HDFE_DEG_RAD);
    3937           0 :   tlon = EHconvAng(tlon, HDFE_DEG_RAD);
    3938           0 :   llon = EHconvAng(llon, HDFE_DEG_RAD);
    3939           0 :   rlon = EHconvAng(rlon, HDFE_DEG_RAD);
    3940             : 
    3941           0 :   errorcode = for_trans[projcode] (llon, 0.0, &x, &y);
    3942           0 :   if (errorcode != 0)
    3943             :   {
    3944           0 :       status = -1;
    3945           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3946           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3947           0 :       return (status);
    3948             :   }
    3949             : 
    3950           0 :   upleftpt[0] = x;
    3951             : 
    3952           0 :   errorcode = for_trans[projcode] (rlon, 0.0, &x, &y);
    3953           0 :   if (errorcode != 0)
    3954             :   {
    3955           0 :       status = -1;
    3956           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3957           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3958           0 :       return (status);
    3959             :   }
    3960             : 
    3961           0 :   lowrightpt[0] = x;
    3962             : 
    3963           0 :   lat = EHconvAng(90, HDFE_DEG_RAD);
    3964           0 :   errorcode = for_trans[projcode] (plon, lat, &x, &y);
    3965           0 :   if (errorcode != 0)
    3966             :   {
    3967           0 :       status = -1;
    3968           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3969           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3970           0 :       return (status);
    3971             :   }
    3972             : 
    3973           0 :   upleftpt[1] = y;
    3974             : 
    3975           0 :   lat = EHconvAng(-90, HDFE_DEG_RAD);
    3976           0 :   errorcode = for_trans[projcode] (plon, lat, &x, &y);
    3977           0 :   if (errorcode != 0)
    3978             :   {
    3979           0 :       status = -1;
    3980           0 :       HEpush(DFE_GENAPP, "GDgetdefaults", __FILE__, __LINE__);
    3981           0 :       HEreport("GCTP Error: %d\n", errorcode);
    3982           0 :       return (status);
    3983             :   }
    3984             : 
    3985           0 :   lowrightpt[1] = y;
    3986             :     }
    3987           0 :     return (errorcode);
    3988             : }
    3989             : 
    3990             : /*----------------------------------------------------------------------------|
    3991             : |  BEGIN_PROLOG                                                               |
    3992             : |                                                                             |
    3993             : |  FUNCTION: GDll2ij                                                          |
    3994             : |                                                                             |
    3995             : |  DESCRIPTION:                                                               |
    3996             : |                                                                             |
    3997             : |                                                                             |
    3998             : |  Return Value    Type     Units     Description                             |
    3999             : |  ============   ======  =========   =====================================   |
    4000             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    4001             : |                                                                             |
    4002             : |  INPUTS:                                                                    |
    4003             : |  projcode       int32               GCTP projection code                    |
    4004             : |  zonecode       int32               UTM zone code                           |
    4005             : |  projparm       float64             Projection parameters                   |
    4006             : |  spherecode     int32               GCTP spheriod code                      |
    4007             : |  xdimsize       int32               xdimsize from GDcreate                  |
    4008             : |  ydimsize       int32               ydimsize from GDcreate                  |
    4009             : |  upleftpt       float64             upper left corner coordinates           |
    4010             : |  lowrightpt     float64             lower right corner coordinates          |
    4011             : |  npnts          int32               number of lon-lat points                |
    4012             : |  longitude      float64             longitude array (radians)               |
    4013             : |  latitude       float64             latitude array (radians)                |
    4014             : |                                                                             |
    4015             : |  OUTPUTS:                                                                   |
    4016             : |  row            int32               Row array                               |
    4017             : |  col            int32               Column array                            |
    4018             : |  xval           float64             X value array                           |
    4019             : |  yval           float64             Y value array                           |
    4020             : |                                                                             |
    4021             : |                                                                             |
    4022             : |  NOTES:                                                                     |
    4023             : |                                                                             |
    4024             : |                                                                             |
    4025             : |   Date     Programmer   Description                                         |
    4026             : |  ======   ============  =================================================   |
    4027             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4028             : |  Aug 96   Joel Gales    Return x and y values if requested                  |
    4029             : |  Jun 00   Abe Taaheri   Added support for EASE grid                         |
    4030             : |                                                                             |
    4031             : |  END_PROLOG                                                                 |
    4032             : -----------------------------------------------------------------------------*/
    4033             : static intn
    4034           0 : GDll2ij(int32 projcode, int32 zonecode, float64 projparm[],
    4035             :   int32 spherecode, int32 xdimsize, int32 ydimsize,
    4036             :   float64 upleftpt[], float64 lowrightpt[],
    4037             :   int32 npnts, float64 longitude[], float64 latitude[],
    4038             :   int32 row[], int32 col[], float64 xval[], float64 yval[])
    4039             : 
    4040             : 
    4041             : {
    4042             :     intn            i;    /* Loop index */
    4043           0 :     intn            status = 0; /* routine return status variable */
    4044             : 
    4045           0 :     int32           errorcode = 0;  /* GCTP error code */
    4046             :     int32(*for_trans[100]) (double, double, double*, double*);  /* GCTP function pointer */
    4047             : 
    4048             :     float64         xVal; /* Scaled x distance */
    4049             :     float64         yVal; /* Scaled y distance */
    4050             :     float64         xMtr; /* X value in meters from GCTP */
    4051             :     float64         yMtr; /* Y value in meters from GCTP */
    4052             :     float64         lonrad0;  /* Longitude in radians of upleft point */
    4053           0 :     float64         latrad0 = 0;  /* Latitude in radians of upleft point */
    4054             :     float64         lonrad; /* Longitude in radians of point */
    4055             :     float64         latrad; /* Latitude in radians of point */
    4056             :     float64         scaleX; /* X scale factor */
    4057             :     float64         scaleY; /* Y scale factor */
    4058           0 :     float64         xMtr0 = 0, xMtr1, yMtr0 = 0, yMtr1;
    4059             :     float64         lonrad1;  /* Longitude in radians of lowright point */
    4060             : 
    4061             :     /* If projection not GEO call GCTP initialization routine */
    4062             :     /* ------------------------------------------------------ */
    4063           0 :     if (projcode != GCTP_GEO)
    4064             :     {
    4065           0 :   for_init(projcode, zonecode, projparm, spherecode, NULL, NULL,
    4066             :      &errorcode, for_trans);
    4067             : 
    4068             :   /* Report error if any */
    4069             :   /* ------------------- */
    4070           0 :   if (errorcode != 0)
    4071             :   {
    4072           0 :       status = -1;
    4073           0 :       HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
    4074           0 :       HEreport("GCTP Error: %d\n", errorcode);
    4075             :   }
    4076             :     }
    4077             : 
    4078             : 
    4079           0 :     if (status == 0)
    4080             :     {
    4081             :   /* GEO projection */
    4082             :   /* -------------- */
    4083           0 :   if (projcode == GCTP_GEO)
    4084             :   {
    4085             :       /* Convert upleft and lowright X coords from DMS to radians */
    4086             :       /* -------------------------------------------------------- */
    4087           0 :       lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
    4088           0 :       lonrad = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
    4089             : 
    4090             :       /* Compute x scale factor */
    4091             :       /* ---------------------- */
    4092           0 :       scaleX = (lonrad - lonrad0) / xdimsize;
    4093             : 
    4094             : 
    4095             :       /* Convert upleft and lowright Y coords from DMS to radians */
    4096             :       /* -------------------------------------------------------- */
    4097           0 :       latrad0 = EHconvAng(upleftpt[1], HDFE_DMS_RAD);
    4098           0 :       latrad = EHconvAng(lowrightpt[1], HDFE_DMS_RAD);
    4099             : 
    4100             : 
    4101             :       /* Compute y scale factor */
    4102             :       /* ---------------------- */
    4103           0 :       scaleY = (latrad - latrad0) / ydimsize;
    4104             :   }
    4105             : 
    4106             :   /* BCEA projection */
    4107             :         /* -------------- */
    4108           0 :   else if ( projcode == GCTP_BCEA)
    4109             :   {
    4110             :       /* Convert upleft and lowright X coords from DMS to radians */
    4111             :       /* -------------------------------------------------------- */
    4112             : 
    4113           0 :       lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
    4114           0 :       lonrad = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
    4115             : 
    4116             :       /* Convert upleft and lowright Y coords from DMS to radians */
    4117             :       /* -------------------------------------------------------- */
    4118           0 :       latrad0 = EHconvAng(upleftpt[1], HDFE_DMS_RAD);
    4119           0 :       latrad = EHconvAng(lowrightpt[1], HDFE_DMS_RAD);
    4120             : 
    4121             :       /* Convert from lon/lat to meters(or whatever unit is, i.e unit
    4122             :          of r_major and r_minor) using GCTP */
    4123             :       /* ----------------------------------------- */
    4124           0 :       errorcode = for_trans[projcode] (lonrad0, latrad0, &xMtr0, &yMtr0);
    4125             : 
    4126             : 
    4127             :       /* Report error if any */
    4128             :       /* ------------------- */
    4129           0 :       if (errorcode != 0)
    4130             :       {
    4131           0 :     status = -1;
    4132           0 :     HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
    4133           0 :     HEreport("GCTP Error: %d\n", errorcode);
    4134           0 :     return (status);
    4135             :       }
    4136             : 
    4137             :       /* Convert from lon/lat to meters(or whatever unit is, i.e unit
    4138             :          of r_major and r_minor) using GCTP */
    4139             :       /* ----------------------------------------- */
    4140           0 :       errorcode = for_trans[projcode] (lonrad, latrad, &xMtr1, &yMtr1);
    4141             : 
    4142             : 
    4143             :       /* Report error if any */
    4144             :       /* ------------------- */
    4145           0 :       if (errorcode != 0)
    4146             :       {
    4147           0 :     status = -1;
    4148           0 :     HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
    4149           0 :     HEreport("GCTP Error: %d\n", errorcode);
    4150           0 :     return (status);
    4151             :       }
    4152             : 
    4153             :       /* Compute x scale factor */
    4154             :       /* ---------------------- */
    4155           0 :       scaleX = (xMtr1 - xMtr0) / xdimsize;
    4156             : 
    4157             :       /* Compute y scale factor */
    4158             :       /* ---------------------- */
    4159           0 :       scaleY = (yMtr1 - yMtr0) / ydimsize;
    4160             :   }
    4161             :   else
    4162             :   {
    4163             :       /* Non-GEO, Non_BCEA projections */
    4164             :       /* ---------------------------- */
    4165             : 
    4166             :       /* Compute x & y scale factors */
    4167             :       /* --------------------------- */
    4168           0 :       scaleX = (lowrightpt[0] - upleftpt[0]) / xdimsize;
    4169           0 :       scaleY = (lowrightpt[1] - upleftpt[1]) / ydimsize;
    4170             :   }
    4171             : 
    4172             : 
    4173             : 
    4174             :   /* Loop through all points */
    4175             :   /* ----------------------- */
    4176           0 :   for (i = 0; i < npnts; i++)
    4177             :   {
    4178             :       /* Convert lon & lat from decimal degrees to radians */
    4179             :       /* ------------------------------------------------- */
    4180           0 :       lonrad = EHconvAng(longitude[i], HDFE_DEG_RAD);
    4181           0 :       latrad = EHconvAng(latitude[i], HDFE_DEG_RAD);
    4182             : 
    4183             : 
    4184             :       /* GEO projection */
    4185             :       /* -------------- */
    4186           0 :       if (projcode == GCTP_GEO)
    4187             :       {
    4188             :           /* allow map to span dateline */
    4189           0 :           lonrad0 = EHconvAng(upleftpt[0], HDFE_DMS_RAD);
    4190           0 :           lonrad1 = EHconvAng(lowrightpt[0], HDFE_DMS_RAD);
    4191             :     /* if time-line is passed */
    4192           0 :     if(lonrad < lonrad1)
    4193             :       {
    4194           0 :         if (lonrad < lonrad0) lonrad += 2.0 * M_PI;
    4195           0 :         if (lonrad > lonrad1) lonrad -= 2.0 * M_PI;
    4196             :       }
    4197             : 
    4198             :     /* Compute scaled distance to point from origin */
    4199             :     /* -------------------------------------------- */
    4200           0 :     xVal = (lonrad - lonrad0) / scaleX;
    4201           0 :     yVal = (latrad - latrad0) / scaleY;
    4202             :       }
    4203             :       else
    4204             :       {
    4205             :     /* Convert from lon/lat to meters using GCTP */
    4206             :     /* ----------------------------------------- */
    4207           0 :     errorcode = for_trans[projcode] (lonrad, latrad, &xMtr, &yMtr);
    4208             : 
    4209             : 
    4210             :     /* Report error if any */
    4211             :     /* ------------------- */
    4212           0 :     if (errorcode != 0)
    4213             :     {
    4214             :       /*status = -1;
    4215             :         HEpush(DFE_GENAPP, "GDll2ij", __FILE__, __LINE__);
    4216             :         HEreport("GCTP Error: %d\n", errorcode);
    4217             :         return (status); */                  /* Bruce Beaumont */
    4218           0 :         xVal = -2147483648.0;          /* Bruce Beaumont */
    4219           0 :         yVal = -2147483648.0;          /* Bruce Beaumont */
    4220             :     }/* (Note: MAXLONG is defined as 2147483647.0 in
    4221             :         function cproj.c of GCTP) */
    4222             :     else {
    4223             :       /* if projection is BCEA normalize x and y by cell size and
    4224             :          measure it from the upperleft corner of the grid */
    4225             : 
    4226             :       /* Compute scaled distance to point from origin */
    4227             :       /* -------------------------------------------- */
    4228           0 :       if(  projcode == GCTP_BCEA)
    4229             :         {
    4230           0 :           xVal = (xMtr - xMtr0) / scaleX;
    4231           0 :           yVal = (yMtr - yMtr0) / scaleY;
    4232             :         }
    4233             :       else
    4234             :         {
    4235           0 :           xVal = (xMtr - upleftpt[0]) / scaleX;
    4236           0 :           yVal = (yMtr - upleftpt[1]) / scaleY;
    4237             :         }
    4238             :     }
    4239             :       }
    4240             : 
    4241             : 
    4242             :       /* Compute row and col from scaled distance */
    4243             :       /* ---------------------------------------- */
    4244           0 :       col[i] = (int32) xVal;
    4245           0 :       row[i] = (int32) yVal;
    4246             : 
    4247             :       /* Store scaled distances if requested */
    4248             :       /* ----------------------------------- */
    4249           0 :       if (xval != NULL)
    4250             :       {
    4251           0 :     xval[i] = xVal;
    4252             :       }
    4253             : 
    4254           0 :       if (yval != NULL)
    4255             :       {
    4256           0 :     yval[i] = yVal;
    4257             :       }
    4258             :   }
    4259             :     }
    4260           0 :     return (status);
    4261             : }
    4262             : 
    4263             : /*----------------------------------------------------------------------------|
    4264             : |  BEGIN_PROLOG                                                               |
    4265             : |                                                                             |
    4266             : |  FUNCTION: GDgetpixels                                                      |
    4267             : |                                                                             |
    4268             : |  DESCRIPTION: Finds row and columns for specified lon/lat values            |
    4269             : |                                                                             |
    4270             : |                                                                             |
    4271             : |  Return Value    Type     Units     Description                             |
    4272             : |  ============   ======  =========   =====================================   |
    4273             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    4274             : |                                                                             |
    4275             : |  INPUTS:                                                                    |
    4276             : |  gridID         int32               Grid structure ID                       |
    4277             : |  nLonLat        int32               Number of lonlat values                 |
    4278             : |  lonVal         float64  dec deg    Longitude values                        |
    4279             : |  latVal         float64  dec deg    Latitude values                         |
    4280             : |                                                                             |
    4281             : |                                                                             |
    4282             : |  OUTPUTS:                                                                   |
    4283             : |  pixRow         int32               Pixel rows                              |
    4284             : |  pixCol         int32               Pixel columns                           |
    4285             : |                                                                             |
    4286             : |  NOTES:                                                                     |
    4287             : |                                                                             |
    4288             : |                                                                             |
    4289             : |   Date     Programmer   Description                                         |
    4290             : |  ======   ============  =================================================   |
    4291             : |  Aug 96   Joel Gales    Original Programmer                                 |
    4292             : |  Oct 96   Joel Gales    Set row/col to -1 if outside boundary               |
    4293             : |  Mar 97   Joel Gales    Adjust row/col for CORNER pixel registration        |
    4294             : |                                                                             |
    4295             : |  END_PROLOG                                                                 |
    4296             : -----------------------------------------------------------------------------*/
    4297             : intn
    4298           0 : GDgetpixels(int32 gridID, int32 nLonLat, float64 lonVal[], float64 latVal[],
    4299             :       int32 pixRow[], int32 pixCol[])
    4300             : {
    4301             :     intn            i;    /* Loop index */
    4302           0 :     intn            status = 0; /* routine return status variable */
    4303             : 
    4304             :     int32           fid;  /* HDF-EOS file ID */
    4305             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    4306             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    4307             : 
    4308             :     int32           xdimsize; /* Size of "XDim" */
    4309             :     int32           ydimsize; /* Size of "YDim" */
    4310             :     int32           projcode; /* GCTP projection code */
    4311             :     int32           zonecode; /* Zone code */
    4312             :     int32           spherecode; /* Sphere code */
    4313             :     int32           origincode; /* Origin code */
    4314             :     int32           pixregcode; /* Pixel registration code */
    4315             : 
    4316             :     float64         upleftpt[2];/* Upper left point */
    4317             :     float64         lowrightpt[2];  /* Lower right point */
    4318             :     float64         projparm[16]; /* Projection parameters */
    4319             :     float64        *xVal; /* Pointer to point x location values */
    4320             :     float64        *yVal; /* Pointer to point y location values */
    4321             : 
    4322             : 
    4323             :     /* Check for valid grid ID */
    4324             :     /* ----------------------- */
    4325           0 :     status = GDchkgdid(gridID, "GDgetpixels", &fid, &sdInterfaceID, &gdVgrpID);
    4326             : 
    4327           0 :     if (status == 0)
    4328             :     {
    4329             :   /* Get grid info */
    4330             :   /* ------------- */
    4331           0 :   status = GDgridinfo(gridID, &xdimsize, &ydimsize,
    4332             :           upleftpt, lowrightpt);
    4333             : 
    4334             : 
    4335             :   /* Get projection info */
    4336             :   /* ------------------- */
    4337           0 :   status = GDprojinfo(gridID, &projcode, &zonecode,
    4338             :           &spherecode, projparm);
    4339             : 
    4340             : 
    4341             :   /* Get explicit upleftpt & lowrightpt if defaults are used */
    4342             :   /* ------------------------------------------------------- */
    4343           0 :   status = GDgetdefaults(projcode, zonecode, projparm, spherecode,
    4344             :              upleftpt, lowrightpt);
    4345             : 
    4346             : 
    4347             :   /* Get pixel registration and origin info */
    4348             :   /* -------------------------------------- */
    4349           0 :   status = GDorigininfo(gridID, &origincode);
    4350           0 :   status = GDpixreginfo(gridID, &pixregcode);
    4351             : 
    4352             : 
    4353             :   /* Allocate space for x & y locations */
    4354             :   /* ---------------------------------- */
    4355           0 :   xVal = (float64 *) calloc(nLonLat, sizeof(float64));
    4356           0 :   if(xVal == NULL)
    4357             :   {
    4358           0 :       HEpush(DFE_NOSPACE,"GDgetpixels", __FILE__, __LINE__);
    4359           0 :       return(-1);
    4360             :   }
    4361           0 :   yVal = (float64 *) calloc(nLonLat, sizeof(float64));
    4362           0 :   if(yVal == NULL)
    4363             :   {
    4364           0 :       HEpush(DFE_NOSPACE,"GDgetpixels", __FILE__, __LINE__);
    4365           0 :       free(xVal);
    4366           0 :       return(-1);
    4367             :   }
    4368             : 
    4369             : 
    4370             :   /* Get pixRow, pixCol, xVal, & yVal */
    4371             :   /* -------------------------------- */
    4372           0 :   status = GDll2ij(projcode, zonecode, projparm, spherecode,
    4373             :        xdimsize, ydimsize, upleftpt, lowrightpt,
    4374             :        nLonLat, lonVal, latVal, pixRow, pixCol,
    4375             :        xVal, yVal);
    4376             : 
    4377             : 
    4378             : 
    4379             :   /* Loop through all lon/lat values */
    4380             :   /* ------------------------------- */
    4381           0 :   for (i = 0; i < nLonLat; i++)
    4382             :   {
    4383             :       /* Adjust columns & rows for "corner" registered grids */
    4384             :       /* --------------------------------------------------- */
    4385           0 :       if (pixregcode == HDFE_CORNER)
    4386             :       {
    4387           0 :     if (origincode == HDFE_GD_UL)
    4388             :     {
    4389           0 :         if (xVal[i] - pixCol[i] > 0.5)
    4390             :         {
    4391           0 :       ++pixCol[i];
    4392             :         }
    4393             : 
    4394           0 :         if (yVal[i] - pixRow[i] > 0.5)
    4395             :         {
    4396           0 :       ++pixRow[i];
    4397             :         }
    4398             :     }
    4399           0 :     else if (origincode == HDFE_GD_UR)
    4400             :     {
    4401           0 :         if (xVal[i] - pixCol[i] <= 0.5)
    4402             :         {
    4403           0 :       --pixCol[i];
    4404             :         }
    4405             : 
    4406           0 :         if (yVal[i] - pixRow[i] > 0.5)
    4407             :         {
    4408           0 :       ++pixRow[i];
    4409             :         }
    4410             :     }
    4411           0 :     else if (origincode == HDFE_GD_LL)
    4412             :     {
    4413           0 :         if (xVal[i] - pixCol[i] > 0.5)
    4414             :         {
    4415           0 :       ++pixCol[i];
    4416             :         }
    4417             : 
    4418           0 :         if (yVal[i] - pixRow[i] <= 0.5)
    4419             :         {
    4420           0 :       --pixRow[i];
    4421             :         }
    4422             :     }
    4423           0 :     else if (origincode == HDFE_GD_LR)
    4424             :     {
    4425           0 :         if (xVal[i] - pixCol[i] <= 0.5)
    4426             :         {
    4427           0 :       --pixCol[i];
    4428             :         }
    4429             : 
    4430           0 :         if (yVal[i] - pixRow[i] <= 0.5)
    4431             :         {
    4432           0 :       --pixRow[i];
    4433             :         }
    4434             :     }
    4435             :       }
    4436             : 
    4437             : 
    4438             :       /* If outside grid boundaries then set to -1 */
    4439             :       /* ----------------------------------------- */
    4440           0 :       if (pixCol[i] < 0 || pixCol[i] >= xdimsize ||
    4441           0 :     pixRow[i] < 0 || pixRow[i] >= ydimsize)
    4442             :       {
    4443           0 :     pixCol[i] = -1;
    4444           0 :     pixRow[i] = -1;
    4445             :       }
    4446             :   }
    4447           0 :   free(xVal);
    4448           0 :   free(yVal);
    4449             :     }
    4450           0 :     return (status);
    4451             : }
    4452             : 
    4453             : 
    4454             : 
    4455             : 
    4456             : 
    4457             : /*----------------------------------------------------------------------------|
    4458             : |  BEGIN_PROLOG                                                               |
    4459             : |                                                                             |
    4460             : |  FUNCTION: GDgetpixvalues                                                   |
    4461             : |                                                                             |
    4462             : |  DESCRIPTION: Retrieves data from specified pixels.                         |
    4463             : |                                                                             |
    4464             : |                                                                             |
    4465             : |  Return Value    Type     Units     Description                             |
    4466             : |  ============   ======  =========   =====================================   |
    4467             : |  size*nPixels   int32               Size of data buffer                     |
    4468             : |                                                                             |
    4469             : |  INPUTS:                                                                    |
    4470             : |  gridID         int32               Grid structure ID                       |
    4471             : |  nPixels        int32               Number of pixels                        |
    4472             : |  pixRow         int32               Pixel row numbers                       |
    4473             : |  pixCol         int32               Pixel column numbers                    |
    4474             : |  fieldname      char                Fieldname                               |
    4475             : |                                                                             |
    4476             : |  OUTPUTS:                                                                   |
    4477             : |  buffer         void                Data buffer                             |
    4478             : |                                                                             |
    4479             : |                                                                             |
    4480             : |  NOTES:                                                                     |
    4481             : |                                                                             |
    4482             : |                                                                             |
    4483             : |   Date     Programmer   Description                                         |
    4484             : |  ======   ============  =================================================   |
    4485             : |  Aug 96   Joel Gales    Original Programmer                                 |
    4486             : |  Oct 96   Joel Gales    Check for pixels outside boundaries (-1)            |
    4487             : |  Mar 98   Abe Taaheri   revised to reduce overhead for rechecking           |
    4488             : |                         for gridid, fieldname, etc in GDreadfield.          |
    4489             : |  June 98  AT            fixed bug with 2-dim field merged in 3-dim field    |
    4490             : |                         (for offset and count)                              |
    4491             : |  END_PROLOG                                                                 |
    4492             : -----------------------------------------------------------------------------*/
    4493             : int32
    4494           0 : GDgetpixvalues(int32 gridID, int32 nPixels, int32 pixRow[], int32 pixCol[],
    4495             :          const char *fieldname, VOIDP buffer)
    4496             : {
    4497             :     intn            i;    /* Loop index */
    4498             :     intn            j;    /* Loop index */
    4499           0 :     intn            status = 0; /* routine return status variable */
    4500             : 
    4501             :     int32           fid;  /* HDF-EOS file ID */
    4502             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    4503             :     int32           gdVgrpID; /* Grid root Vgroup ID */
    4504             : 
    4505             :     int32           start[8]; /* GDreadfield start array */
    4506             :     int32           edge[8];  /* GDreadfield edge array */
    4507             :     int32           dims[8];  /* Field dimensions */
    4508             :     int32           rank; /* Field rank */
    4509           0 :     int32           xdum = 0; /* Location of "XDim" within field list */
    4510           0 :     int32           ydum = 0; /* Location of "YDim" within field list */
    4511             :     int32           ntype;  /* Field number type */
    4512             :     int32           origincode; /* Origin code */
    4513             :     int32           bufOffset;  /* Data buffer offset */
    4514           0 :     int32           size = 0; /* Size of returned data buffer for each
    4515             :          * value in bytes */
    4516             :     int32           offset[8];  /* I/O offset (start) */
    4517             :     int32           incr[8];  /* I/O increment (stride) */
    4518             :     int32           count[8]; /* I/O count (edge) */
    4519             :     int32           sdid; /* SDS ID */
    4520             :     int32           rankSDS;  /* Rank of SDS */
    4521             :     int32           rankFld;  /* Rank of field */
    4522             :     int32           dum;  /* Dummy variable */
    4523             :     int32           mrgOffset;  /* Merged field offset */
    4524             : 
    4525             :     char           *dimlist;  /* Dimension list */
    4526             : 
    4527             : 
    4528             : 
    4529             :     /* Allocate space for dimlist */
    4530             :     /* --------------------------------- */
    4531           0 :     dimlist = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    4532           0 :     if(dimlist == NULL)
    4533             :     {
    4534           0 :   HEpush(DFE_NOSPACE,"GDgetpixvalues", __FILE__, __LINE__);
    4535           0 :   return(-1);
    4536             :     }
    4537             :     /* Check for valid grid ID */
    4538             :     /* ----------------------- */
    4539           0 :     status = GDchkgdid(gridID, "GDgetpixvalues",
    4540             :            &fid, &sdInterfaceID, &gdVgrpID);
    4541             : 
    4542             : 
    4543           0 :     if (status == 0)
    4544             :     {
    4545             :   /* Get field list */
    4546             :   /* -------------- */
    4547           0 :   status = GDfieldinfo(gridID, fieldname, &rank, dims, &ntype, dimlist);
    4548             : 
    4549             : 
    4550             :   /* Check for "XDim" & "YDim" in dimension list */
    4551             :   /* ------------------------------------------- */
    4552           0 :   if (status == 0)
    4553             :   {
    4554           0 :       xdum = EHstrwithin("XDim", dimlist, ',');
    4555           0 :       ydum = EHstrwithin("YDim", dimlist, ',');
    4556             : 
    4557           0 :       if (xdum == -1)
    4558             :       {
    4559           0 :     status = -1;
    4560           0 :     HEpush(DFE_GENAPP, "GDgetpixvalues", __FILE__, __LINE__);
    4561           0 :     HEreport(
    4562             :          "\"XDim\" not present in dimlist for field: \"%s\".\n",
    4563             :        fieldname);
    4564             :       }
    4565             : 
    4566             : 
    4567           0 :       if (ydum == -1)
    4568             :       {
    4569           0 :     status = -1;
    4570           0 :     HEpush(DFE_GENAPP, "GDgetpixvalues", __FILE__, __LINE__);
    4571           0 :     HEreport(
    4572             :          "\"YDim\" not present in dimlist for field: \"%s\".\n",
    4573             :        fieldname);
    4574             :       }
    4575             :   }
    4576             :   else
    4577             :   {
    4578           0 :       status = -1;
    4579           0 :       HEpush(DFE_GENAPP, "GDgetpixvalues", __FILE__, __LINE__);
    4580           0 :       HEreport("Fieldname \"%s\" not found.\n", fieldname);
    4581             :   }
    4582             : 
    4583             : 
    4584           0 :   if (status == 0)
    4585             :   {
    4586             : 
    4587             :       /* Get origin order info */
    4588             :       /* --------------------- */
    4589           0 :       status = GDorigininfo(gridID, &origincode);
    4590             : 
    4591             : 
    4592             :       /* Initialize start & edge arrays */
    4593             :       /* ------------------------------ */
    4594           0 :       for (i = 0; i < rank; i++)
    4595             :       {
    4596           0 :     start[i] = 0;
    4597           0 :     edge[i] = dims[i];
    4598             :       }
    4599             : 
    4600             : 
    4601             :       /* Compute size of data buffer for each pixel */
    4602             :       /* ------------------------------------------ */
    4603           0 :       edge[xdum] = 1;
    4604           0 :       edge[ydum] = 1;
    4605           0 :       size = edge[0];
    4606           0 :       for (j = 1; j < rank; j++)
    4607             :       {
    4608           0 :     size *= edge[j];
    4609             :       }
    4610           0 :       size *= DFKNTsize(ntype);
    4611             : 
    4612             : 
    4613             : 
    4614             :       /* If data values are requested ... */
    4615             :       /* -------------------------------- */
    4616           0 :       if (buffer != NULL)
    4617             :       {
    4618             :     /* get sdid */
    4619           0 :     status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
    4620             :           &rankSDS, &rankFld, &mrgOffset, dims, &dum);
    4621             : 
    4622             :     /* Loop through all pixels */
    4623             :     /* ----------------------- */
    4624           0 :     for (i = 0; i < nPixels; i++)
    4625             :     {
    4626             :         /* Conmpute offset within returned data buffer */
    4627             :         /* ------------------------------------------- */
    4628           0 :         bufOffset = size * i;
    4629             : 
    4630             : 
    4631             :         /* If pixel row & column OK ... */
    4632             :         /* ---------------------------- */
    4633           0 :         if (pixCol[i] != -1 && pixRow[i] != -1)
    4634             :         {
    4635           0 :       start[xdum] = pixCol[i];
    4636           0 :       start[ydum] = pixRow[i];
    4637             : 
    4638             : 
    4639             :       /* Adjust X-dim start if origin on right edge */
    4640             :       /* ------------------------------------------ */
    4641           0 :       if ((origincode & 1) == 1)
    4642             :       {
    4643           0 :           start[xdum] = dims[xdum] - (start[xdum] + 1);
    4644             :       }
    4645             : 
    4646             : 
    4647             :       /* Adjust Y-dim start if origin on lower edge */
    4648             :       /* ------------------------------------------ */
    4649           0 :       if ((origincode & 2) == 2)
    4650             :       {
    4651           0 :           start[ydum] = dims[ydum] - (start[ydum] + 1);
    4652             :       }
    4653             : 
    4654             :       /* Set I/O offset and count Section */
    4655             :       /* ---------------------- */
    4656             : 
    4657             :       /*
    4658             :        * start and edge != NULL, set I/O offset and count to
    4659             :        * user values, adjusting the
    4660             :        * 0th field with the merged field offset (if any)
    4661             :        */
    4662           0 :       if (rankFld == rankSDS)
    4663             :       {
    4664           0 :           for (j = 0; j < rankSDS; j++)
    4665             :           {
    4666           0 :         offset[j] = start[j];
    4667           0 :         count[j] = edge[j];
    4668             :           }
    4669           0 :           offset[0] += mrgOffset;
    4670             :       }
    4671             :       else
    4672             :       {
    4673             :           /*
    4674             :            * If field really 2-dim merged in 3-dim field then set
    4675             :            * 0th field offset to merge offset and then next two to
    4676             :            * the user values
    4677             :            */
    4678           0 :           for (j = 0; j < rankFld; j++)
    4679             :           {
    4680           0 :         offset[j + 1] = start[j];
    4681           0 :         count[j + 1] = edge[j];
    4682             :           }
    4683           0 :           offset[0] = mrgOffset;
    4684           0 :           count[0] = 1;
    4685             :       }
    4686             : 
    4687             : 
    4688             : 
    4689             :       /* Set I/O stride Section */
    4690             :       /* ---------------------- */
    4691             : 
    4692             :       /* In original code stride entered as NULL.
    4693             :          Abe Taaheri June 12, 1998 */
    4694             :       /*
    4695             :        * If stride == NULL (default) set I/O stride to 1
    4696             :        */
    4697           0 :       for (j = 0; j < rankSDS; j++)
    4698             :       {
    4699           0 :           incr[j] = 1;
    4700             :       }
    4701             : 
    4702             : 
    4703             :       /* Read into data buffer */
    4704             :       /* --------------------- */
    4705           0 :       status = SDreaddata(sdid,
    4706             :               offset, incr, count,
    4707             :          (VOIDP) ((uint8 *) buffer + bufOffset));
    4708             :         }
    4709             :     }
    4710             :       }
    4711             :   }
    4712             :     }
    4713             : 
    4714             : 
    4715             :     /* If successful return size of returned data in bytes */
    4716             :     /* --------------------------------------------------- */
    4717           0 :     if (status == 0)
    4718             :     {
    4719           0 :   free(dimlist);
    4720           0 :   return (size * nPixels);
    4721             :     }
    4722             :     else
    4723             :     {
    4724           0 :   free(dimlist);
    4725           0 :   return ((int32) status);
    4726             :     }
    4727             : }
    4728             : 
    4729             : /***********************************************
    4730             : GDwrrdtile --
    4731             :      This function is the underlying function below GDwritetile and
    4732             :      GDreadtile.
    4733             : 
    4734             : 
    4735             : Author--
    4736             : Alexis Zubrow
    4737             : 
    4738             : ********************************************************/
    4739             : 
    4740             : static intn
    4741           0 : GDwrrdtile(int32 gridID, const char *fieldname, const char *code, int32 start[],
    4742             :      VOIDP datbuf)
    4743             : {
    4744             :     intn            i;    /* Loop index */
    4745           0 :     intn            status = 0; /* routine return status variable */
    4746             : 
    4747             :     int32           fid;  /* HDF-EOS file ID */
    4748             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    4749             :     int32           sdid; /* SDS ID */
    4750             : 
    4751             :     int32           dum;  /* Dummy variable */
    4752             :     int32           rankSDS;  /* Rank of SDS/Field */
    4753             : 
    4754             :     int32           dims[8];  /* Field/SDS dimensions */
    4755             :     int32           tileFlags;  /* flag to determine if field is tiled */
    4756             :     int32           numTileDims;/* number of tiles spanning a dimension */
    4757             :     HDF_CHUNK_DEF   tileDef;  /* union holding tiling info. */
    4758             : 
    4759             : 
    4760             :     /* Get gridID */
    4761           0 :     status = GDchkgdid(gridID, "GDwrrdtile", &fid, &sdInterfaceID, &dum);
    4762           0 :     if (status == 0)
    4763             :     {
    4764             : 
    4765             :   /* Get field info */
    4766           0 :   status = GDfieldinfo(gridID, fieldname, &rankSDS, dims, &dum, NULL);
    4767             : 
    4768           0 :   if (status == 0)
    4769             :   {
    4770             : 
    4771             :       /* Check whether fieldname is in SDS (multi-dim field) */
    4772             :       /* --------------------------------------------------- */
    4773           0 :       status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
    4774             :          &rankSDS, &dum, &dum, dims, &dum);
    4775             : 
    4776             : 
    4777             : 
    4778             :       /*
    4779             :        * Check for errors in parameters passed to GDwritetile or
    4780             :        * GDreadtile
    4781             :        */
    4782             : 
    4783             :       /* Check if untiled field */
    4784           0 :       status = SDgetchunkinfo(sdid, &tileDef, &tileFlags);
    4785           0 :       if (tileFlags == HDF_NONE)
    4786             :       {
    4787           0 :     HEpush(DFE_GENAPP, "GDwrrdtile", __FILE__, __LINE__);
    4788           0 :     HEreport("Field \"%s\" is not tiled.\n", fieldname);
    4789           0 :     status = -1;
    4790           0 :     return (status);
    4791             : 
    4792             :       }
    4793             : 
    4794             :       /*
    4795             :        * Check if rd/wr tilecoords are within the extent of the field
    4796             :        */
    4797           0 :       for (i = 0; i < rankSDS; i++)
    4798             :       {
    4799             :     /*
    4800             :      * Calculate the number of tiles which span a dimension of
    4801             :      * the field
    4802             :      */
    4803           0 :     numTileDims = dims[i] / tileDef.chunk_lengths[i];
    4804           0 :     if ((start[i] >= numTileDims) || (start[i] < 0))
    4805             :     {
    4806             :         /*
    4807             :          * ERROR INDICATING BEYOND EXTENT OF THAT DIMENSION OR
    4808             :          * NEGATIVE TILECOORDS
    4809             :          */
    4810           0 :         HEpush(DFE_GENAPP, "GDwrrdtile", __FILE__, __LINE__);
    4811           0 :         HEreport("Tilecoords for dimension \"%d\" ...\n", i);
    4812           0 :         HEreport("is beyond the extent of dimension length\n");
    4813           0 :         status = -1;
    4814             : 
    4815             :     }
    4816             :       }
    4817             : 
    4818           0 :       if (status == -1)
    4819             :       {
    4820           0 :     return (status);
    4821             :       }
    4822             : 
    4823             : 
    4824             :       /* Actually write/read to the field */
    4825             : 
    4826           0 :       if (strcmp(code, "w") == 0) /* write tile */
    4827             :       {
    4828           0 :     status = SDwritechunk(sdid, start, (VOIDP) datbuf);
    4829             :       }
    4830           0 :       else if (strcmp(code, "r") == 0)  /* read tile */
    4831             :       {
    4832           0 :     status = SDreadchunk(sdid, start, (VOIDP) datbuf);
    4833             :       }
    4834             : 
    4835             : 
    4836             :   }
    4837             : 
    4838             :   /* Non-existent fieldname */
    4839             :   else
    4840             :   {
    4841           0 :       HEpush(DFE_GENAPP, "GDwrrdtile", __FILE__, __LINE__);
    4842           0 :       HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
    4843           0 :       status = -1;
    4844             :   }
    4845             : 
    4846             :     }
    4847             : 
    4848           0 :     return (status);
    4849             : }
    4850             : 
    4851             : /***********************************************
    4852             : GDtileinfo --
    4853             :      This function queries the field to determine if it is tiled.  If it is
    4854             :      tile, one can retrieve some of the characteristics of the tiles.
    4855             : 
    4856             : Author--  Alexis Zubrow
    4857             : 
    4858             : ********************************************************/
    4859             : 
    4860             : 
    4861             : intn
    4862           0 : GDtileinfo(int32 gridID, const char *fieldname, int32 * tilecode, int32 * tilerank,
    4863             :      int32 tiledims[])
    4864             : 
    4865             : {
    4866             :     intn            i;    /* Loop index */
    4867           0 :     intn            status = 0; /* routine return status variable */
    4868             : 
    4869             :     int32           fid;  /* HDF-EOS file ID */
    4870             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    4871             :     int32           sdid; /* SDS ID */
    4872             : 
    4873             :     int32           dum;  /* Dummy variable */
    4874             :     int32           rankSDS;  /* Rank of SDS/Field/tile */
    4875             : 
    4876             :     int32           dims[8];  /* Field/SDS dimensions */
    4877             :     int32           tileFlags;  /* flag to determine if field is tiled */
    4878             :     HDF_CHUNK_DEF   tileDef;  /* union holding tiling info. */
    4879             : 
    4880             : 
    4881             :     /* Check if improper gridID */
    4882           0 :     status = GDchkgdid(gridID, "GDtileinfo", &fid, &sdInterfaceID, &dum);
    4883           0 :     if (status == 0)
    4884             :     {
    4885             : 
    4886             :   /* Get field info */
    4887           0 :   status = GDfieldinfo(gridID, fieldname, &rankSDS, dims, &dum, NULL);
    4888             : 
    4889           0 :   if (status == 0)
    4890             :   {
    4891             : 
    4892             :       /* Check whether fieldname is in SDS (multi-dim field) */
    4893             :       /* --------------------------------------------------- */
    4894           0 :       status = GDSDfldsrch(gridID, sdInterfaceID, fieldname, &sdid,
    4895             :          &rankSDS, &dum, &dum, dims, &dum);
    4896             : 
    4897             : 
    4898             : 
    4899             :       /* Query field for tiling information */
    4900           0 :       status = SDgetchunkinfo(sdid, &tileDef, &tileFlags);
    4901             : 
    4902             :       /* If field is untiled, return untiled flag */
    4903           0 :       if (tileFlags == HDF_NONE)
    4904             :       {
    4905           0 :     *tilecode = HDFE_NOTILE;
    4906           0 :     return (status);
    4907             :       }
    4908             : 
    4909             :       /* IF field is tiled or tiled with compression */
    4910           0 :       else if ((tileFlags == HDF_CHUNK) ||
    4911           0 :          (tileFlags == (HDF_CHUNK | HDF_COMP)))
    4912             :       {
    4913           0 :     if (tilecode != NULL)
    4914             :     {
    4915           0 :         *tilecode = HDFE_TILE;
    4916             :     }
    4917           0 :     if (tilerank != NULL)
    4918             :     {
    4919           0 :         *tilerank = rankSDS;
    4920             :     }
    4921           0 :     if (tiledims != NULL)
    4922             :     {
    4923             :         /* Assign size of tile dimensions */
    4924           0 :         for (i = 0; i < rankSDS; i++)
    4925             :         {
    4926           0 :       tiledims[i] = tileDef.chunk_lengths[i];
    4927             :         }
    4928             :     }
    4929             :       }
    4930             :   }
    4931             : 
    4932             :   /* Non-existent fieldname */
    4933             :   else
    4934             :   {
    4935           0 :       HEpush(DFE_GENAPP, "GDtileinfo", __FILE__, __LINE__);
    4936           0 :       HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
    4937           0 :       status = -1;
    4938             :   }
    4939             : 
    4940             :     }
    4941           0 :     return (status);
    4942             : }
    4943             : 
    4944             : /***********************************************
    4945             : GDreadtile --
    4946             :      This function reads one tile from a particular field.
    4947             : 
    4948             : 
    4949             : Author--
    4950             : Alexis Zubrow
    4951             : 
    4952             : ********************************************************/
    4953             : 
    4954             : intn
    4955           0 : GDreadtile(int32 gridID, const char *fieldname, int32 tilecoords[],
    4956             :      VOIDP tileData)
    4957             : {
    4958           0 :     char            code[] = "r"; /* read tile code */
    4959           0 :     intn            status = 0; /* routine return status variable */
    4960             : 
    4961           0 :     status = GDwrrdtile(gridID, fieldname, code, tilecoords, tileData);
    4962             : 
    4963           0 :     return (status);
    4964             : }
    4965             : 
    4966             : /*----------------------------------------------------------------------------|
    4967             : |  BEGIN_PROLOG                                                               |
    4968             : |                                                                             |
    4969             : |  FUNCTION: GDsdid                                                           |
    4970             : |                                                                             |
    4971             : |  DESCRIPTION: Returns SD element ID for grid field                          |
    4972             : |                                                                             |
    4973             : |                                                                             |
    4974             : |  Return Value    Type     Units     Description                             |
    4975             : |  ============   ======  =========   =====================================   |
    4976             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    4977             : |                                                                             |
    4978             : |  INPUTS:                                                                    |
    4979             : |  gridID         int32               grid structure ID                       |
    4980             : |  fieldname      const char          field name                              |
    4981             : |                                                                             |
    4982             : |                                                                             |
    4983             : |  OUTPUTS:                                                                   |
    4984             : |  sdid           int32               SD element ID                           |
    4985             : |                                                                             |
    4986             : |  NOTES:                                                                     |
    4987             : |                                                                             |
    4988             : |                                                                             |
    4989             : |   Date     Programmer   Description                                         |
    4990             : |  ======   ============  =================================================   |
    4991             : |  Oct 07   Andrey Kiselev  Original Programmer                               |
    4992             : |                                                                             |
    4993             : |  END_PROLOG                                                                 |
    4994             : -----------------------------------------------------------------------------*/
    4995             : intn
    4996           0 : GDsdid(int32 gridID, const char *fieldname, int32 *sdid)
    4997             : {
    4998             :     intn            status;         /* routine return status variable */
    4999             :     int32           fid;          /* HDF-EOS file ID */
    5000             :     int32           sdInterfaceID;      /* HDF SDS interface ID */
    5001             :     int32           dum;          /* Dummy variable */
    5002             :     int32           dims[H4_MAX_VAR_DIMS]; /* Field/SDS dimensions */
    5003             : 
    5004           0 :     status = GDchkgdid(gridID, "GDsdid", &fid, &sdInterfaceID, &dum);
    5005           0 :     if (status != -1)
    5006             :     {
    5007           0 :         status = GDSDfldsrch(gridID, sdInterfaceID, fieldname,
    5008             :                              sdid, &dum, &dum, &dum, dims, &dum);
    5009             :     }
    5010             : 
    5011           0 :     return (status);
    5012             : }

Generated by: LCOV version 1.14