LCOV - code coverage report
Current view: top level - frmts/hdf4/hdf-eos - SWapi.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 10 3493 0.3 %
Date: 2024-11-21 22:18:42 Functions: 3 56 5.4 %

          Line data    Source code
       1             : /*****************************************************************************
       2             :  * $Id$
       3             :  *
       4             :  * This module has a number of additions and improvements over the original
       5             :  * implementation to be suitable for usage in GDAL HDF driver.
       6             :  *
       7             :  * Andrey Kiselev <dron@ak4719.spb.edu> is responsible for all the changes.
       8             :  ****************************************************************************/
       9             : 
      10             : /*
      11             : Copyright (C) 1996 Hughes and Applied Research Corporation
      12             : 
      13             : Permission to use, modify, and distribute this software and its documentation 
      14             : for any purpose without fee is hereby granted, provided that the above 
      15             : copyright notice appear in all copies and that both that copyright notice and 
      16             : this permission notice appear in supporting documentation.
      17             : */
      18             : /*****************************************************************************
      19             : REVISIONS:
      20             : 
      21             : Aug 31, 1999  Abe Taaheri    Changed memory allocation for utility strings to
      22             :                              the size of UTLSTR_MAX_SIZE.
      23             :            Added error check for memory unavailability in
      24             :            several functions.
      25             :            Added check for NULL metabuf returned from
      26             :            EHmeta... functions. NULL pointer returned from
      27             :            EHmeta... functions indicate that memory could not
      28             :            be allocated for metabuf.
      29             : 
      30             : June 05, 2003 Abe Taaheri / Bruce Beaumont
      31             : 
      32             :                             Changed MAXNREGIONS to 1024 to support MOPITT data
      33             :           Supplied cast for compcode in call to 
      34             :             SDsetcompress to avoid compiler error
      35             :           Removed declaration for unused variable rstatus 
      36             :             in SWwrrdfield
      37             :           Removed initialization code for unused variables 
      38             :             in SWwrrdfield
      39             :           Removed declaration for unused variable tmpVal 
      40             :             in SWdefboxregion
      41             :           Added code in SWdefboxregion to check for l_index k
      42             :             exceeding NSWATHREGN to avoid overwriting 
      43             :             memory
      44             :           Removed declaration for unused variable retchar 
      45             :             in SWregionl_index
      46             :           Removed initialization code for unused variables 
      47             :             in SWregionl_index
      48             :           Removed declarations for unused variables tstatus,
      49             :             nfields, nflgs, and swathname in SWextractregion
      50             :           Removed initialization code for unused variables 
      51             :             in SWextractregion
      52             :           Removed declaration for unused variable 
      53             :             land_status in SWscan2longlat
      54             :           Removed initialization code for unused variables 
      55             :             in SWscan2longlat
      56             :           Added clear (0) of timeflag in SWextractperiod if 
      57             :             return status from SWextractregion is non-zero
      58             :           Removed declarations for unused variables tstatus,
      59             :             scandim, ndfields, ndflds, and swathname in 
      60             :             SWregioninfo
      61             :           Removed initialization code for unused variables 
      62             :             in SWregioninfo
      63             :           Added clear (0) of timeflag in SWperiodinfo if 
      64             :             return status from SWregioninfo is non-zero
      65             :           Removed declarations for unused variables size, 
      66             :             nfields, nflds, nswath, idxsz, cornerlon, and 
      67             :             cornerlat in SWdefscanregion
      68             :           Removed initialization code for unused variables 
      69             :             in SWdefscanregion
      70             :           Removed declarations for unused variables dims2, 
      71             :             rank, nt, swathname, dimlist, and buffer in 
      72             :             SWupdateidxmap
      73             :           Removed declaration for unused variable statmeta 
      74             :             in SWgeomapinfo
      75             : ******************************************************************************/
      76             : 
      77             : #include "cpl_port.h" /* for M_PI */
      78             : #include "cpl_string.h" /* for CPLsnprintf */
      79             : 
      80             : #include "mfhdf.h"
      81             : #include "hcomp.h"
      82             : #include "HdfEosDef.h"
      83             : #include <math.h>
      84             : 
      85             : #include "hdf4compat.h"
      86             : 
      87             : #define SWIDOFFSET 1048576
      88             : 
      89             : 
      90             : static int32 SWX1dcomb[512*3];
      91             : static int32 SWXSDcomb[512*5];
      92             : static char  SWXSDname[HDFE_NAMBUFSIZE];
      93             : static char  SWXSDdims[HDFE_DIMBUFSIZE];
      94             : 
      95             : /* This flag was added to allow the Time field to have different Dimensions
      96             : ** than Longitude and Latitude and still be used for subsetting
      97             : ** 23 June,1997  DaW
      98             : */
      99             : static intn  timeflag = 0;
     100             : 
     101             : 
     102             : /* Added for routine that converts scanline to Lat/long
     103             : ** for floating scene subsetting
     104             : ** Jul 1999 DaW
     105             : */
     106             : #define RADOE 6371.0    /* Radius of Earth in Km */
     107             : 
     108             : #define NSWATH 200
     109             : /* Swath Structure External Arrays */
     110             : struct swathStructure 
     111             : {
     112             :     int32 active;
     113             :     int32 IDTable;
     114             :     int32 VIDTable[3];
     115             :     int32 fid;
     116             :     int32 nSDS;
     117             :     int32 *sdsID;
     118             :     int32 compcode;
     119             :     intn  compparm[5];
     120             :     int32 tilecode;
     121             :     int32 tilerank;
     122             :     int32 tiledims[8];
     123             : };
     124             : static struct swathStructure SWXSwath[NSWATH];
     125             : 
     126             : 
     127             : 
     128             : #define NSWATHREGN 256
     129             : #define MAXNREGIONS 1024
     130             : struct swathRegion
     131             : {
     132             :     int32 fid;
     133             :     int32 swathID;
     134             :     int32 nRegions;
     135             :     int32 StartRegion[MAXNREGIONS];
     136             :     int32 StopRegion[MAXNREGIONS];
     137             :     int32 StartVertical[8];
     138             :     int32 StopVertical[8];
     139             :     int32 StartScan[8];
     140             :     int32 StopScan[8];
     141             :     char *DimNamePtr[8];
     142             :     intn band8flag;
     143             :     intn  scanflag;
     144             : };
     145             : static struct swathRegion *SWXRegion[NSWATHREGN];
     146             : 
     147             : /* define a macro for the string size of the utility strings. The value
     148             :    of 80 in previous version of this code was resulting in core dump (Array 
     149             :    Bounds Write and Array Bounds Read problem in SWfinfo function and the 
     150             :    functions called from there) for 7-8 dimensional fields where the 
     151             :    string length for "DimList" can exceed 80 characters, including " and 
     152             :    commas in the string. The length now is 512 which seems to be more 
     153             :    than enough to avoid the problem mentioned above. */
     154             :    
     155             : #define UTLSTR_MAX_SIZE 512
     156             : 
     157             : /* Swath Prototypes (internal routines) */
     158             : static intn SWchkswid(int32, const char *, int32 *, int32 *, int32 *);
     159             : static int32 SWfinfo(int32, const char *, const char *, int32 *,
     160             :                      int32 [], int32 *, char *);
     161             : static intn SWdefinefield(int32, const char *, const char *, const char *, int32, int32);
     162             : static intn SWwrrdattr(int32, const char *, int32, int32, const char *, VOIDP);
     163             : static intn SW1dfldsrch(int32, int32, const char *, const char *, int32 *,
     164             :                         int32 *, int32 *);
     165             : static intn SWSDfldsrch(int32, int32, const char *, int32 *, int32 *, 
     166             :                         int32 *, int32 *, int32 [], int32 *);
     167             : static intn SWwrrdfield(int32, const char *, const char *,
     168             :                         int32 [], int32 [], int32 [], VOIDP);
     169             : static int32 SWinqfields(int32, const char *, char *, int32 [], int32 []);
     170             : static intn SWscan2longlat(int32, const char *, VOIDP, int32 [], int32 [],
     171             :                            int32 *, int32, int32);
     172             : 
     173             : 
     174             : /*----------------------------------------------------------------------------|
     175             : |  BEGIN_PROLOG                                                               |
     176             : |                                                                             |
     177             : |  FUNCTION: SWopen                                                           |
     178             : |                                                                             |
     179             : |  DESCRIPTION:                                                               |
     180             : |                                                                             |
     181             : |                                                                             |
     182             : |  Return Value    Type     Units     Description                             |
     183             : |  ============   ======  =========   =====================================   |
     184             : |  fid            int32               HDF-EOS file ID                         |
     185             : |                                                                             |
     186             : |  INPUTS:                                                                    |
     187             : |  filename       char                Filename                                |
     188             : |  access         intn                HDF access code                         |
     189             : |                                                                             |
     190             : |                                                                             |
     191             : |  OUTPUTS:                                                                   |
     192             : |             None                                                            |
     193             : |                                                                             |
     194             : |  NOTES:                                                                     |
     195             : |                                                                             |
     196             : |                                                                             |
     197             : |   Date     Programmer   Description                                         |
     198             : |  ======   ============  =================================================   |
     199             : |  Jun 96   Joel Gales    Original Programmer                                 |
     200             : |                                                                             |
     201             : |  END_PROLOG                                                                 |
     202             : -----------------------------------------------------------------------------*/
     203             : int32
     204           4 : SWopen(const char *filename, intn i_access)
     205             : 
     206             : {
     207             :     int32           fid /* HDF-EOS file ID */ ;
     208             : 
     209             :     /* Call EHopen to perform file access */
     210             :     /* ---------------------------------- */
     211           4 :     fid = EHopen(filename, i_access);
     212             : 
     213           4 :     return (fid);
     214             : }
     215             : 
     216             : /*----------------------------------------------------------------------------|
     217             : |  BEGIN_PROLOG                                                               |
     218             : |                                                                             |
     219             : |  FUNCTION: SWcreate                                                         |
     220             : |                                                                             |
     221             : |  DESCRIPTION: Creates a new swath structure and returns swath ID            |
     222             : |                                                                             |
     223             : |                                                                             |
     224             : |  Return Value    Type     Units     Description                             |
     225             : |  ============   ======  =========   =====================================   |
     226             : |  swathID        int32               Swath structure ID                      |
     227             : |                                                                             |
     228             : |  INPUTS:                                                                    |
     229             : |  fid            int32               File ID                                 |
     230             : |  swathname      char                Swath structure name                    |
     231             : |                                                                             |
     232             : |  OUTPUTS:                                                                   |
     233             : |             None                                                            |
     234             : |                                                                             |
     235             : |  NOTES:                                                                     |
     236             : |                                                                             |
     237             : |                                                                             |
     238             : |   Date     Programmer   Description                                         |
     239             : |  ======   ============  =================================================   |
     240             : |  Jun 96   Joel Gales    Original Programmer                                 |
     241             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
     242             : |  Sep 96   Joel Gales    Check swath name for length                         |
     243             : |  Mar 97   Joel Gales    Enlarge utlbuf to 512                               |
     244             : |                                                                             |
     245             : |  END_PROLOG                                                                 |
     246             : -----------------------------------------------------------------------------*/
     247             : int32
     248           0 : SWcreate(int32 fid, const char *swathname)
     249             : {
     250             :     intn            i;    /* Loop index */
     251           0 :     intn            nswathopen = 0; /* # of swath structures open */
     252           0 :     intn            status = 0; /* routine return status variable */
     253             : 
     254             :     uint8           l_access; /* Read/Write file access code */
     255             : 
     256             :     int32           HDFfid; /* HDF file id */
     257             :     int32           vgRef;  /* Vgroup reference number */
     258             :     int32           vgid[4];  /* Vgroup ID array */
     259           0 :     int32           swathID = -1; /* HDF-EOS swath ID */
     260             : 
     261             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
     262           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
     263           0 :     int32           nSwath = 0; /* Swath counter */
     264             : 
     265             :     char            name[80]; /* Vgroup name */
     266             :     char            class[80];  /* Vgroup class */
     267             :     char            errbuf[256];/* Buffer for error message */
     268             :     char            utlbuf[512];/* Utility buffer */
     269             :     char            utlbuf2[32];/* Utility buffer 2 */
     270             : 
     271             :     /*
     272             :      * Check HDF-EOS file ID, get back HDF file ID, SD interface ID  and
     273             :      * access code
     274             :      */
     275           0 :     status = EHchkfid(fid, swathname, &HDFfid, &sdInterfaceID, &l_access);
     276             : 
     277             : 
     278             :     /* Check swathname for length */
     279             :     /* -------------------------- */
     280           0 :     if ((intn) strlen(swathname) > VGNAMELENMAX)
     281             :     {
     282           0 :   status = -1;
     283           0 :   HEpush(DFE_GENAPP, "SWcreate", __FILE__, __LINE__);
     284           0 :   HEreport("Swathname \"%s\" must be less than %d characters.\n",
     285             :      swathname, VGNAMELENMAX);
     286             :     }
     287             : 
     288             : 
     289           0 :     if (status == 0)
     290             :     {
     291             : 
     292             :   /* Determine number of swaths currently opened */
     293             :   /* ------------------------------------------- */
     294           0 :   for (i = 0; i < NSWATH; i++)
     295             :   {
     296           0 :       nswathopen += SWXSwath[i].active;
     297             :   }
     298             : 
     299             : 
     300             :   /* Setup file interface */
     301             :   /* -------------------- */
     302           0 :   if (nswathopen < NSWATH)
     303             :   {
     304             : 
     305             :       /* Check that swath has not been previously opened */
     306             :       /* ----------------------------------------------- */
     307           0 :       vgRef = -1;
     308             : 
     309             :       while (1)
     310             :       {
     311           0 :     vgRef = Vgetid(HDFfid, vgRef);
     312             : 
     313             :     /* If no more Vgroups then exist while loop */
     314             :     /* ---------------------------------------- */
     315           0 :     if (vgRef == -1)
     316             :     {
     317           0 :         break;
     318             :     }
     319             : 
     320             :     /* Get name and class of Vgroup */
     321             :     /* ---------------------------- */
     322           0 :     vgid[0] = Vattach(HDFfid, vgRef, "r");
     323           0 :     Vgetname(vgid[0], name);
     324           0 :     Vgetclass(vgid[0], class);
     325           0 :     Vdetach(vgid[0]);
     326             : 
     327             :     /* If SWATH then increment # swath counter */
     328             :     /* --------------------------------------- */
     329           0 :     if (strcmp(class, "SWATH") == 0)
     330             :     {
     331           0 :         nSwath++;
     332             :     }
     333             : 
     334             :     /* If swath already exist, return error */
     335             :     /* ------------------------------------ */
     336           0 :     if (strcmp(name, swathname) == 0 &&
     337           0 :         strcmp(class, "SWATH") == 0)
     338             :     {
     339           0 :         status = -1;
     340           0 :         HEpush(DFE_GENAPP, "SWcreate", __FILE__, __LINE__);
     341           0 :         HEreport("\"%s\" already exists.\n", swathname);
     342           0 :         break;
     343             :     }
     344             :       }
     345             : 
     346             : 
     347           0 :       if (status == 0)
     348             :       {
     349             : 
     350             :     /* Create Root Vgroup for Swath */
     351             :     /* ---------------------------- */
     352           0 :     vgid[0] = Vattach(HDFfid, -1, "w");
     353             : 
     354             : 
     355             :     /* Set Name and Class (SWATH) */
     356             :     /* -------------------------- */
     357           0 :     Vsetname(vgid[0], swathname);
     358           0 :     Vsetclass(vgid[0], "SWATH");
     359             : 
     360             : 
     361             : 
     362             :     /* Create Geolocation Fields Vgroup */
     363             :     /* -------------------------------- */
     364           0 :     vgid[1] = Vattach(HDFfid, -1, "w");
     365           0 :     Vsetname(vgid[1], "Geolocation Fields");
     366           0 :     Vsetclass(vgid[1], "SWATH Vgroup");
     367           0 :     Vinsert(vgid[0], vgid[1]);
     368             : 
     369             : 
     370             : 
     371             :     /* Create Data Fields Vgroup */
     372             :     /* ------------------------- */
     373           0 :     vgid[2] = Vattach(HDFfid, -1, "w");
     374           0 :     Vsetname(vgid[2], "Data Fields");
     375           0 :     Vsetclass(vgid[2], "SWATH Vgroup");
     376           0 :     Vinsert(vgid[0], vgid[2]);
     377             : 
     378             : 
     379             : 
     380             :     /* Create Attributes Vgroup */
     381             :     /* ------------------------ */
     382           0 :     vgid[3] = Vattach(HDFfid, -1, "w");
     383           0 :     Vsetname(vgid[3], "Swath Attributes");
     384           0 :     Vsetclass(vgid[3], "SWATH Vgroup");
     385           0 :     Vinsert(vgid[0], vgid[3]);
     386             : 
     387             : 
     388             : 
     389             :     /* Establish Swath in Structural MetaData Block */
     390             :     /* -------------------------------------------- */
     391           0 :     snprintf(utlbuf, sizeof(utlbuf), "%s%ld%s%s%s",
     392           0 :       "\tGROUP=SWATH_", (long)nSwath + 1,
     393             :       "\n\t\tSwathName=\"", swathname, "\"\n");
     394             : 
     395           0 :     strcat(utlbuf, "\t\tGROUP=Dimension\n");
     396           0 :     strcat(utlbuf, "\t\tEND_GROUP=Dimension\n");
     397           0 :     strcat(utlbuf, "\t\tGROUP=DimensionMap\n");
     398           0 :     strcat(utlbuf, "\t\tEND_GROUP=DimensionMap\n");
     399           0 :     strcat(utlbuf, "\t\tGROUP=IndexDimensionMap\n");
     400           0 :     strcat(utlbuf, "\t\tEND_GROUP=IndexDimensionMap\n");
     401           0 :     strcat(utlbuf, "\t\tGROUP=GeoField\n");
     402           0 :     strcat(utlbuf, "\t\tEND_GROUP=GeoField\n");
     403           0 :     strcat(utlbuf, "\t\tGROUP=DataField\n");
     404           0 :     strcat(utlbuf, "\t\tEND_GROUP=DataField\n");
     405           0 :     strcat(utlbuf, "\t\tGROUP=MergedFields\n");
     406           0 :     strcat(utlbuf, "\t\tEND_GROUP=MergedFields\n");
     407           0 :     CPLsnprintf(utlbuf2, sizeof(utlbuf2), "%s%ld%s",
     408           0 :       "\tEND_GROUP=SWATH_", (long)nSwath + 1, "\n");
     409           0 :     strcat(utlbuf, utlbuf2);
     410             : 
     411             : 
     412           0 :     status = EHinsertmeta(sdInterfaceID, "", "s", 1001L,
     413             :               utlbuf, NULL);
     414             :       }
     415             :   }
     416             :   else
     417             :   {
     418             :       /* Too many files opened */
     419             :       /* --------------------- */
     420           0 :       status = -1;
     421           0 :       strcpy(errbuf,
     422             :        "No more than %d swaths may be open simultaneously");
     423           0 :       strcat(errbuf, " (%s)");
     424           0 :       HEpush(DFE_DENIED, "SWcreate", __FILE__, __LINE__);
     425           0 :       HEreport(errbuf, NSWATH, swathname);
     426             :   }
     427             : 
     428             : 
     429             :   /* Assign swathID # & Load swath and SWXSwath table entries */
     430             :   /* -------------------------------------------------------- */
     431           0 :   if (status == 0)
     432             :   {
     433             : 
     434           0 :       for (i = 0; i < NSWATH; i++)
     435             :       {
     436           0 :     if (SWXSwath[i].active == 0)
     437             :     {
     438             :         /*
     439             :          * Set swathID, Set swath entry active, Store root Vgroup
     440             :          * ID, Store sub Vgroup IDs, Store HDF-EOS file ID
     441             :          */
     442           0 :         swathID = i + idOffset;
     443           0 :         SWXSwath[i].active = 1;
     444           0 :         SWXSwath[i].IDTable = vgid[0];
     445           0 :         SWXSwath[i].VIDTable[0] = vgid[1];
     446           0 :         SWXSwath[i].VIDTable[1] = vgid[2];
     447           0 :         SWXSwath[i].VIDTable[2] = vgid[3];
     448           0 :         SWXSwath[i].fid = fid;
     449           0 :         status = 0;
     450           0 :         break;
     451             :     }
     452             :       }
     453             : 
     454             :   }
     455             :     }
     456           0 :     return (swathID);
     457             : }
     458             : 
     459             : 
     460             : /*----------------------------------------------------------------------------|
     461             : |  BEGIN_PROLOG                                                               |
     462             : |                                                                             |
     463             : |  FUNCTION: SWattach                                                         |
     464             : |                                                                             |
     465             : |  DESCRIPTION:  Attaches to an existing swath within the file.               |
     466             : |                                                                             |
     467             : |                                                                             |
     468             : |  Return Value    Type     Units     Description                             |
     469             : |  ============   ======  =========   =====================================   |
     470             : |  swathID        int32               swath structure ID                      |
     471             : |                                                                             |
     472             : |  INPUTS:                                                                    |
     473             : |  fid            int32               HDF-EOS file ID                         |
     474             : |  swathname      char                swath structure name                    |
     475             : |                                                                             |
     476             : |  OUTPUTS:                                                                   |
     477             : |             None                                                            |
     478             : |                                                                             |
     479             : |  NOTES:                                                                     |
     480             : |                                                                             |
     481             : |                                                                             |
     482             : |   Date     Programmer   Description                                         |
     483             : |  ======   ============  =================================================   |
     484             : |  Jun 96   Joel Gales    Original Programmer                                 |
     485             : |  Apr 99   David Wynne   Modified test for memory allocation check when no   |
     486             : |                         SDSs are in the Swath, NCR22513                     |
     487             : |                                                                             |
     488             : |  END_PROLOG                                                                 |
     489             : -----------------------------------------------------------------------------*/
     490             : int32
     491           0 : SWattach(int32 fid, const char *swathname)
     492             : 
     493             : {
     494             :     intn            i;    /* Loop index */
     495             :     intn            j;    /* Loop index */
     496           0 :     intn            nswathopen = 0; /* # of swath structures open */
     497             :     intn            status; /* routine return status variable */
     498             : 
     499             :     uint8           acs;  /* Read/Write file access code */
     500             : 
     501             :     int32           HDFfid; /* HDF file id */
     502             :     int32           vgRef;  /* Vgroup reference number */
     503             :     int32           vgid[4];  /* Vgroup ID array */
     504           0 :     int32           swathID = -1; /* HDF-EOS swath ID */
     505             :     int32          *tags; /* Pnt to Vgroup object tags array */
     506             :     int32          *refs; /* Pnt to Vgroup object refs array */
     507             :     int32           dum;  /* dummy variable */
     508             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
     509             :     int32           nObjects; /* # of objects in Vgroup */
     510             :     int32           nSDS; /* SDS counter */
     511             :     int32           l_index;  /* SDS l_index */
     512             :     int32           sdid; /* SDS object ID */
     513           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
     514             : 
     515             :     char            name[80]; /* Vgroup name */
     516             :     char            class[80];  /* Vgroup class */
     517             :     char            errbuf[256];/* Buffer for error message */
     518             :     char            acsCode[1]; /* Read/Write access char: "r/w" */
     519             : 
     520             : 
     521             :     /* Check HDF-EOS file ID, get back HDF file ID and access code */
     522             :     /* ----------------------------------------------------------- */
     523           0 :     status = EHchkfid(fid, swathname, &HDFfid, &dum, &acs);
     524             : 
     525             : 
     526           0 :     if (status == 0)
     527             :     {
     528             :   /* Convert numeric access code to character */
     529             :   /* ---------------------------------------- */
     530           0 :   acsCode[0] = (acs == 1) ? 'w' : 'r';
     531             : 
     532             :   /* Determine number of swaths currently opened */
     533             :   /* ------------------------------------------- */
     534           0 :   for (i = 0; i < NSWATH; i++)
     535             :   {
     536           0 :       nswathopen += SWXSwath[i].active;
     537             :   }
     538             : 
     539             :   /* If room for more ... */
     540             :   /* -------------------- */
     541           0 :   if (nswathopen < NSWATH)
     542             :   {
     543             : 
     544             :       /* Search Vgroups for Swath */
     545             :       /* ------------------------ */
     546           0 :       vgRef = -1;
     547             : 
     548             :       while (1)
     549             :       {
     550           0 :     vgRef = Vgetid(HDFfid, vgRef);
     551             : 
     552             : 
     553             :     /* If no more Vgroups then exist while loop */
     554             :     /* ---------------------------------------- */
     555           0 :     if (vgRef == -1)
     556             :     {
     557           0 :         break;
     558             :     }
     559             : 
     560             :     /* Get name and class of Vgroup */
     561             :     /* ---------------------------- */
     562           0 :     vgid[0] = Vattach(HDFfid, vgRef, "r");
     563           0 :     Vgetname(vgid[0], name);
     564           0 :     Vgetclass(vgid[0], class);
     565             : 
     566             : 
     567             :     /*
     568             :      * If Vgroup with swathname and class SWATH found, load
     569             :      * tables
     570             :      */
     571             : 
     572           0 :     if (strcmp(name, swathname) == 0 &&
     573           0 :         strcmp(class, "SWATH") == 0)
     574             :     {
     575             :         /* Attach to "Fields" and "Swath Attributes" Vgroups */
     576             :         /* ------------------------------------------------- */
     577           0 :         tags = (int32 *) malloc(sizeof(int32) * 3);
     578           0 :         if(tags == NULL)
     579             :         { 
     580           0 :       HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     581           0 :       return(-1);
     582             :         }
     583           0 :         refs = (int32 *) malloc(sizeof(int32) * 3);
     584           0 :         if(refs == NULL)
     585             :         { 
     586           0 :       HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     587           0 :       free(tags);
     588           0 :       return(-1);
     589             :         }
     590           0 :         Vgettagrefs(vgid[0], tags, refs, 3);
     591           0 :         vgid[1] = Vattach(HDFfid, refs[0], acsCode);
     592           0 :         vgid[2] = Vattach(HDFfid, refs[1], acsCode);
     593           0 :         vgid[3] = Vattach(HDFfid, refs[2], acsCode);
     594           0 :         free(tags);
     595           0 :         free(refs);
     596             : 
     597             :         /* Setup External Arrays */
     598             :         /* --------------------- */
     599           0 :         for (i = 0; i < NSWATH; i++)
     600             :         {
     601             :       /* Find empty entry in array */
     602             :       /* ------------------------- */
     603           0 :       if (SWXSwath[i].active == 0)
     604             :       {
     605             :           /*
     606             :            * Set swathID, Set swath entry active, Store
     607             :            * root Vgroup ID, Store sub Vgroup IDs, Store
     608             :            * HDF-EOS file ID
     609             :            */
     610           0 :           swathID = i + idOffset;
     611           0 :           SWXSwath[i].active = 1;
     612           0 :           SWXSwath[i].IDTable = vgid[0];
     613           0 :           SWXSwath[i].VIDTable[0] = vgid[1];
     614           0 :           SWXSwath[i].VIDTable[1] = vgid[2];
     615           0 :           SWXSwath[i].VIDTable[2] = vgid[3];
     616           0 :           SWXSwath[i].fid = fid;
     617           0 :           break;
     618             :       }
     619             :         }
     620             : 
     621             :         /* Get SDS interface ID */
     622             :         /* -------------------- */
     623           0 :         status = SWchkswid(swathID, "SWattach", &dum,
     624             :                &sdInterfaceID, &dum);
     625             : 
     626             : 
     627             :         /* Access swath "Geolocation" SDS */
     628             :         /* ------------------------------ */
     629             : 
     630             :         /* Get # of entries within this Vgroup & search for SDS */
     631             :         /* ---------------------------------------------------- */
     632           0 :         nObjects = Vntagrefs(vgid[1]);
     633             : 
     634           0 :         if (nObjects > 0)
     635             :         {
     636             :       /* Get tag and ref # for Geolocation Vgroup objects */
     637             :       /* ------------------------------------------------ */
     638           0 :       tags = (int32 *) malloc(sizeof(int32) * nObjects);
     639           0 :       if(tags == NULL)
     640             :       { 
     641           0 :           HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     642           0 :           return(-1);
     643             :       }
     644           0 :       refs = (int32 *) malloc(sizeof(int32) * nObjects);
     645           0 :       if(refs == NULL)
     646             :       { 
     647           0 :           HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     648           0 :           free(tags);
     649           0 :           return(-1);
     650             :       }
     651           0 :       Vgettagrefs(vgid[1], tags, refs, nObjects);
     652             : 
     653             :       /* Count number of SDS & allocate SDS ID array */
     654             :       /* ------------------------------------------- */
     655           0 :       nSDS = 0;
     656           0 :       for (j = 0; j < nObjects; j++)
     657             :       {
     658           0 :           if (tags[j] == DFTAG_NDG)
     659             :           {
     660           0 :         nSDS++;
     661             :           }
     662             :       }
     663           0 :       SWXSwath[i].sdsID = (int32 *) calloc(nSDS, 4);
     664           0 :       if(SWXSwath[i].sdsID == NULL && nSDS != 0)
     665             :       { 
     666           0 :           HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     667           0 :           free(tags);
     668           0 :           free(refs);
     669           0 :           return(-1);
     670             :       }
     671           0 :       nSDS = 0;
     672             : 
     673             : 
     674             :       /* Fill SDS ID array */
     675             :       /* ----------------- */
     676           0 :       for (j = 0; j < nObjects; j++)
     677             :       {
     678             :           /* If object is SDS then get id */
     679             :           /* ---------------------------- */
     680           0 :           if (tags[j] == DFTAG_NDG)
     681             :           {
     682           0 :         l_index = SDreftoindex(sdInterfaceID, refs[j]);
     683           0 :         sdid = SDselect(sdInterfaceID, l_index);
     684           0 :         SWXSwath[i].sdsID[nSDS] = sdid;
     685           0 :         nSDS++;
     686           0 :         SWXSwath[i].nSDS++;
     687             :           }
     688             :       }
     689           0 :       free(tags);
     690           0 :       free(refs);
     691             :         }
     692             : 
     693             :         /* Access swath "Data" SDS */
     694             :         /* ----------------------- */
     695             : 
     696             :         /* Get # of entries within this Vgroup & search for SDS */
     697             :         /* ---------------------------------------------------- */
     698           0 :         nObjects = Vntagrefs(vgid[2]);
     699             : 
     700           0 :         if (nObjects > 0)
     701             :         {
     702             :       /* Get tag and ref # for Data Vgroup objects */
     703             :       /* ----------------------------------------- */
     704           0 :       tags = (int32 *) malloc(sizeof(int32) * nObjects);
     705           0 :       if(tags == NULL)
     706             :       { 
     707           0 :           HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     708           0 :           return(-1);
     709             :       }
     710           0 :       refs = (int32 *) malloc(sizeof(int32) * nObjects);
     711           0 :       if(refs == NULL)
     712             :       { 
     713           0 :           HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     714           0 :           free(tags);
     715           0 :           return(-1);
     716             :       }
     717           0 :       Vgettagrefs(vgid[2], tags, refs, nObjects);
     718             : 
     719             : 
     720             :       /* Count number of SDS & allocate SDS ID array */
     721             :       /* ------------------------------------------- */
     722           0 :       nSDS = 0;
     723           0 :       for (j = 0; j < nObjects; j++)
     724             :       {
     725           0 :           if (tags[j] == DFTAG_NDG)
     726             :           {
     727           0 :         nSDS++;
     728             :           }
     729             :       }
     730           0 :       SWXSwath[i].sdsID = (int32 *)
     731           0 :           realloc((void *) SWXSwath[i].sdsID,
     732           0 :             (SWXSwath[i].nSDS + nSDS) * 4);
     733           0 :       if(SWXSwath[i].sdsID == NULL && nSDS != 0)
     734             :       { 
     735           0 :           HEpush(DFE_NOSPACE,"SWattach", __FILE__, __LINE__);
     736           0 :           return(-1);
     737             :       }
     738             : 
     739             :       /* Fill SDS ID array */
     740             :       /* ----------------- */
     741           0 :       for (j = 0; j < nObjects; j++)
     742             :       {
     743             :           /* If object is SDS then get id */
     744             :           /* ---------------------------- */
     745           0 :           if (tags[j] == DFTAG_NDG)
     746             :           {
     747           0 :         l_index = SDreftoindex(sdInterfaceID, refs[j]);
     748           0 :         sdid = SDselect(sdInterfaceID, l_index);
     749           0 :         SWXSwath[i].sdsID[SWXSwath[i].nSDS] = sdid;
     750           0 :         SWXSwath[i].nSDS++;
     751             :           }
     752             :       }
     753           0 :       free(tags);
     754           0 :       free(refs);
     755             :         }
     756           0 :         break;
     757             :     }
     758             : 
     759             :     /* Detach Vgroup if not desired Swath */
     760             :     /* ---------------------------------- */
     761           0 :     Vdetach(vgid[0]);
     762             :       }
     763             : 
     764             :       /* If Swath not found then set up error message */
     765             :       /* -------------------------------------------- */
     766           0 :       if (swathID == -1)
     767             :       {
     768           0 :     HEpush(DFE_RANGE, "SWattach", __FILE__, __LINE__);
     769           0 :     HEreport("Swath: \"%s\" does not exist within HDF file.\n",
     770             :        swathname);
     771             :       }
     772             :   }
     773             :   else
     774             :   {
     775             :       /* Too many files opened */
     776             :       /* --------------------- */
     777           0 :       swathID = -1;
     778           0 :       strcpy(errbuf,
     779             :        "No more than %d swaths may be open simultaneously");
     780           0 :       strcat(errbuf, " (%s)");
     781           0 :       HEpush(DFE_DENIED, "SWattach", __FILE__, __LINE__);
     782           0 :       HEreport(errbuf, NSWATH, swathname);
     783             :   }
     784             : 
     785             :     }
     786           0 :     return (swathID);
     787             : }
     788             : 
     789             : /*----------------------------------------------------------------------------|
     790             : |  BEGIN_PROLOG                                                               |
     791             : |                                                                             |
     792             : |  FUNCTION: SWchkswid                                                        |
     793             : |                                                                             |
     794             : |  DESCRIPTION: Checks for valid swathID and returns file ID, SDS ID, and     |
     795             : |               swath Vgroup ID                                               |
     796             : |                                                                             |
     797             : |                                                                             |
     798             : |  Return Value    Type     Units     Description                             |
     799             : |  ============   ======  =========   =====================================   |
     800             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     801             : |                                                                             |
     802             : |  INPUTS:                                                                    |
     803             : |  swathID        int32               swath structure ID                      |
     804             : |  routname       char                Name of routine calling SWchkswid       |
     805             : |                                                                             |
     806             : |  OUTPUTS:                                                                   |
     807             : |  fid            int32               File ID                                 |
     808             : |  sdInterfaceID  int32               SDS interface ID                        |
     809             : |  swVgrpID       int32               swath Vgroup ID                         |
     810             : |                                                                             |
     811             : |  NOTES:                                                                     |
     812             : |                                                                             |
     813             : |                                                                             |
     814             : |   Date     Programmer   Description                                         |
     815             : |  ======   ============  =================================================   |
     816             : |  Jun 96   Joel Gales    Original Programmer                                 |
     817             : |                                                                             |
     818             : |  END_PROLOG                                                                 |
     819             : -----------------------------------------------------------------------------*/
     820             : static intn
     821           0 : SWchkswid(int32 swathID, const char *routname,
     822             :     int32 * fid, int32 * sdInterfaceID, int32 * swVgrpID)
     823             : 
     824             : {
     825           0 :     intn            status = 0; /* routine return status variable */
     826             :     uint8           l_access; /* Read/Write access code */
     827             : 
     828           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
     829             : 
     830           0 :     char            message1[] =
     831             :     "Invalid swath id: %d in routine \"%s\".  ID must be >= %d and < %d.\n";
     832           0 :     char            message2[] =
     833             :     "Swath id %d in routine \"%s\" not active.\n";
     834             : 
     835             : 
     836             :     /* Check for valid swath id */
     837             :     /* ------------------------ */
     838           0 :     if (swathID < idOffset || swathID >= NSWATH + idOffset)
     839             :     {
     840           0 :   status = -1;
     841           0 :   HEpush(DFE_RANGE, "SWchkswid", __FILE__, __LINE__);
     842           0 :   HEreport(message1, swathID, routname, idOffset, NSWATH + idOffset);
     843             :     }
     844             :     else
     845             :     {
     846             :   /* Check for active swath ID */
     847             :   /* ------------------------- */
     848           0 :   if (SWXSwath[swathID % idOffset].active == 0)
     849             :   {
     850           0 :       status = -1;
     851           0 :       HEpush(DFE_GENAPP, "SWchkswid", __FILE__, __LINE__);
     852           0 :       HEreport(message2, swathID, routname);
     853             :   }
     854             :   else
     855             :   {
     856             : 
     857             :       /* Get file & SDS ids and Swath Vgroup */
     858             :       /* ----------------------------------- */
     859           0 :       status = EHchkfid(SWXSwath[swathID % idOffset].fid, " ", fid,
     860             :             sdInterfaceID, &l_access);
     861           0 :       *swVgrpID = SWXSwath[swathID % idOffset].IDTable;
     862             :   }
     863             :     }
     864           0 :     return (status);
     865             : }
     866             : 
     867             : 
     868             : 
     869             : 
     870             : 
     871             : 
     872             : 
     873             : /*----------------------------------------------------------------------------|
     874             : |  BEGIN_PROLOG                                                               |
     875             : |                                                                             |
     876             : |  FUNCTION: SWdefdim                                                         |
     877             : |                                                                             |
     878             : |  DESCRIPTION: Defines numerical value of dimension                          |
     879             : |                                                                             |
     880             : |                                                                             |
     881             : |  Return Value    Type     Units     Description                             |
     882             : |  ============   ======  =========   =====================================   |
     883             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     884             : |                                                                             |
     885             : |  INPUTS:                                                                    |
     886             : |  swathID        int32               swath structure ID                      |
     887             : |  dimname        char                Dimension name to define                |
     888             : |  dim            int32               Dimension value                         |
     889             : |                                                                             |
     890             : |  OUTPUTS:                                                                   |
     891             : |             None                                                            |
     892             : |                                                                             |
     893             : |  NOTES:                                                                     |
     894             : |                                                                             |
     895             : |                                                                             |
     896             : |   Date     Programmer   Description                                         |
     897             : |  ======   ============  =================================================   |
     898             : |  Jun 96   Joel Gales    Original Programmer                                 |
     899             : |  Dec 96   Joel Gales    Check that dim value >= 0                           |
     900             : |                                                                             |
     901             : |  END_PROLOG                                                                 |
     902             : -----------------------------------------------------------------------------*/
     903             : intn
     904           0 : SWdefdim(int32 swathID, char *dimname, int32 dim)
     905             : 
     906             : {
     907             :     intn            status; /* routine return status variable */
     908             : 
     909             :     int32           fid;  /* HDF-EOS file id */
     910             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
     911             :     int32           swVgrpID; /* Swath root Vgroup ID */
     912           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
     913             : 
     914             :     char            swathname[80] /* Swath name */ ;
     915             : 
     916             : 
     917             :     /* Check for valid swath id */
     918             :     /* ------------------------ */
     919           0 :     status = SWchkswid(swathID, "SWdefdim", &fid, &sdInterfaceID, &swVgrpID);
     920             : 
     921             : 
     922             :     /* Make sure dimension >= 0 */
     923             :     /* ------------------------ */
     924           0 :     if (dim < 0)
     925             :     {
     926           0 :   status = -1;
     927           0 :   HEpush(DFE_GENAPP, "SWdefdim", __FILE__, __LINE__);
     928           0 :   HEreport("Dimension value for \"%s\" less than zero: %d.\n",
     929             :      dimname, dim);
     930             :     }
     931             : 
     932             : 
     933             :     /* Write Dimension to Structural MetaData */
     934             :     /* -------------------------------------- */
     935           0 :     if (status == 0)
     936             :     {
     937           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
     938           0 :   status = EHinsertmeta(sdInterfaceID, swathname, "s", 0L,
     939             :             dimname, &dim);
     940             :     }
     941           0 :     return (status);
     942             : }
     943             : 
     944             : 
     945             : 
     946             : /*----------------------------------------------------------------------------|
     947             : |  BEGIN_PROLOG                                                               |
     948             : |                                                                             |
     949             : |  FUNCTION: SWdiminfo                                                        |
     950             : |                                                                             |
     951             : |  DESCRIPTION: Returns size in bytes of named dimension                      |
     952             : |                                                                             |
     953             : |                                                                             |
     954             : |  Return Value    Type     Units     Description                             |
     955             : |  ============   ======  =========   =====================================   |
     956             : |  size           int32               Size of dimension                       |
     957             : |                                                                             |
     958             : |  INPUTS:                                                                    |
     959             : |  swathID        int32               swath structure id                      |
     960             : |  dimname        char                Dimension name                          |
     961             : |                                                                             |
     962             : |                                                                             |
     963             : |  OUTPUTS:                                                                   |
     964             : |             None                                                            |
     965             : |                                                                             |
     966             : |  NOTES:                                                                     |
     967             : |                                                                             |
     968             : |                                                                             |
     969             : |   Date     Programmer   Description                                         |
     970             : |  ======   ============  =================================================   |
     971             : |  Jun 96   Joel Gales    Original Programmer                                 |
     972             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
     973             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
     974             : |                                                                             |
     975             : |  END_PROLOG                                                                 |
     976             : -----------------------------------------------------------------------------*/
     977             : int32
     978           0 : SWdiminfo(int32 swathID, const char *dimname)
     979             : 
     980             : {
     981             :     intn            status; /* routine return status variable */
     982             : 
     983             :     int32           fid;  /* HDF-EOS file ID */
     984             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
     985             :     int32           swVgrpID; /* Swath root Vgroup ID */
     986             :     int32           size; /* Dimension size */
     987           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
     988             : 
     989             : 
     990             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
     991             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
     992             :     char            swathname[80];  /* Swath Name */
     993             :     char           *utlstr; /* Utility string */
     994             : 
     995             : 
     996             :     /* Allocate space for utility string */
     997             :     /* --------------------------------- */
     998           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
     999           0 :     if(utlstr == NULL)
    1000             :     { 
    1001           0 :   HEpush(DFE_NOSPACE,"SWdiminfo", __FILE__, __LINE__);
    1002           0 :   return(-1);
    1003             :     }
    1004             :     /* Initialize return value */
    1005           0 :     size = -1;
    1006             : 
    1007             :     /* Check Swath ID */
    1008           0 :     status = SWchkswid(swathID, "SWdiminfo", &fid, &sdInterfaceID, &swVgrpID);
    1009             : 
    1010           0 :     if (status == 0)
    1011             :     {
    1012             :   /* Get swath name */
    1013           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    1014             : 
    1015             :   /* Get pointers to "Dimension" section within SM */
    1016           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    1017             :                "Dimension", metaptrs);
    1018             : 
    1019           0 :   if(metabuf == NULL)
    1020             :   {
    1021           0 :       free(utlstr);
    1022           0 :       return(-1);
    1023             :   }  
    1024             : 
    1025             :   /* Search for dimension name (surrounded by quotes) */
    1026           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", dimname, "\"\n");
    1027           0 :   metaptrs[0] = strstr(metaptrs[0], utlstr);
    1028             : 
    1029             :   /*
    1030             :    * If dimension found within swath structure then get dimension value
    1031             :    */
    1032           0 :   if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    1033             :   {
    1034             :       /* Set endptr at end of dimension definition entry */
    1035           0 :       metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
    1036             : 
    1037           0 :       status = EHgetmetavalue(metaptrs, "Size", utlstr);
    1038             : 
    1039           0 :       if (status == 0)
    1040             :       {
    1041           0 :     size = atoi(utlstr);
    1042             :       }
    1043             :       else
    1044             :       {
    1045           0 :     HEpush(DFE_GENAPP, "SWdiminfo", __FILE__, __LINE__);
    1046           0 :     HEreport("\"Size\" string not found in metadata.\n");
    1047             :       }
    1048             :   }
    1049             :   else
    1050             :   {
    1051           0 :       HEpush(DFE_GENAPP, "SWdiminfo", __FILE__, __LINE__);
    1052           0 :       HEreport("Dimension \"%s\" not found.\n", dimname);
    1053             :   }
    1054             : 
    1055           0 :   free(metabuf);
    1056             :     }
    1057           0 :     free(utlstr);
    1058             : 
    1059           0 :     return (size);
    1060             : }
    1061             : 
    1062             : 
    1063             : 
    1064             : 
    1065             : /*----------------------------------------------------------------------------|
    1066             : |  BEGIN_PROLOG                                                               |
    1067             : |                                                                             |
    1068             : |  FUNCTION: SWmapinfo                                                        |
    1069             : |                                                                             |
    1070             : |  DESCRIPTION: Returns dimension mapping information                         |
    1071             : |                                                                             |
    1072             : |                                                                             |
    1073             : |  Return Value    Type     Units     Description                             |
    1074             : |  ============   ======  =========   =====================================   |
    1075             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1076             : |                                                                             |
    1077             : |  INPUTS:                                                                    |
    1078             : |  swathID        int32               swath structure id                      |
    1079             : |  geodim         char                geolocation dimension name              |
    1080             : |  datadim        char                data dimension name                     |
    1081             : |                                                                             |
    1082             : |  OUTPUTS:                                                                   |
    1083             : |  offset         int32               mapping offset                          |
    1084             : |  increment      int32               mapping increment                       |
    1085             : |                                                                             |
    1086             : |  NOTES:                                                                     |
    1087             : |                                                                             |
    1088             : |                                                                             |
    1089             : |   Date     Programmer   Description                                         |
    1090             : |  ======   ============  =================================================   |
    1091             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1092             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    1093             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
    1094             : |                                                                             |
    1095             : |  END_PROLOG                                                                 |
    1096             : -----------------------------------------------------------------------------*/
    1097             : intn
    1098           0 : SWmapinfo(int32 swathID, const char *geodim, const char *datadim, int32 * offset,
    1099             :     int32 * increment)
    1100             : 
    1101             : {
    1102             :     intn            status; /* routine return status variable */
    1103           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
    1104             : 
    1105             :     int32           fid;  /* HDF-EOS file ID */
    1106             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1107             :     int32           swVgrpID; /* Swath root Vgroup ID */
    1108           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    1109             : 
    1110             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1111             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1112             :     char            swathname[80];  /* Swath Name */
    1113             :     char           *utlstr; /* Utility string */
    1114             : 
    1115             : 
    1116             :     /* Allocate space for utility string */
    1117             :     /* --------------------------------- */
    1118           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1119           0 :     if(utlstr == NULL)
    1120             :     { 
    1121           0 :   HEpush(DFE_NOSPACE,"SWmapinfo", __FILE__, __LINE__);
    1122           0 :   return(-1);
    1123             :     }
    1124             :     /* Initialize return values */
    1125           0 :     *offset = -1;
    1126           0 :     *increment = -1;
    1127             : 
    1128             :     /* Check Swath ID */
    1129           0 :     status = SWchkswid(swathID, "SWmapinfo", &fid, &sdInterfaceID, &swVgrpID);
    1130             : 
    1131           0 :     if (status == 0)
    1132             :     {
    1133             :   /* Get swath name */
    1134           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    1135             : 
    1136             :   /* Get pointers to "DimensionMap" section within SM */
    1137           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    1138             :                "DimensionMap", metaptrs);
    1139           0 :   if(metabuf == NULL)
    1140             :   {
    1141           0 :       free(utlstr);
    1142           0 :       return(-1);
    1143             :   }
    1144             : 
    1145             :   /* Search for mapping - GeoDim/DataDim (surrounded by quotes) */
    1146           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s%s%s", "\t\t\t\tGeoDimension=\"", geodim,
    1147             :     "\"\n\t\t\t\tDataDimension=\"", datadim, "\"\n");
    1148           0 :   metaptrs[0] = strstr(metaptrs[0], utlstr);
    1149             : 
    1150             :   /*
    1151             :    * If mapping found within swath structure then get offset and
    1152             :    * increment value
    1153             :    */
    1154           0 :   if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    1155             :   {
    1156             :       /* Get Offset */
    1157           0 :       statmeta = EHgetmetavalue(metaptrs, "Offset", utlstr);
    1158           0 :       if (statmeta == 0)
    1159             :       {
    1160           0 :     *offset = atoi(utlstr);
    1161             :       }
    1162             :       else
    1163             :       {
    1164           0 :     status = -1;
    1165           0 :     HEpush(DFE_GENAPP, "SWmapinfo", __FILE__, __LINE__);
    1166           0 :     HEreport("\"Offset\" string not found in metadata.\n");
    1167             :       }
    1168             : 
    1169             : 
    1170             :       /* Get Increment */
    1171           0 :       statmeta = EHgetmetavalue(metaptrs, "Increment", utlstr);
    1172           0 :       if (statmeta == 0)
    1173             :       {
    1174           0 :     *increment = atoi(utlstr);
    1175             :       }
    1176             :       else
    1177             :       {
    1178           0 :     status = -1;
    1179           0 :     HEpush(DFE_GENAPP, "SWmapinfo", __FILE__, __LINE__);
    1180           0 :     HEreport("\"Increment\" string not found in metadata.\n");
    1181             :       }
    1182             :   }
    1183             :   else
    1184             :   {
    1185           0 :       status = -1;
    1186           0 :       HEpush(DFE_GENAPP, "SWmapinfo", __FILE__, __LINE__);
    1187           0 :       HEreport("Mapping \"%s/%s\" not found.\n", geodim, datadim);
    1188             :   }
    1189             : 
    1190           0 :   free(metabuf);
    1191             :     }
    1192           0 :     free(utlstr);
    1193           0 :     return (status);
    1194             : }
    1195             : 
    1196             : 
    1197             : 
    1198             : 
    1199             : /*----------------------------------------------------------------------------|
    1200             : |  BEGIN_PROLOG                                                               |
    1201             : |                                                                             |
    1202             : |  FUNCTION: SWidxmapinfo                                                     |
    1203             : |                                                                             |
    1204             : |  DESCRIPTION: Returns l_indexed mapping information                           |
    1205             : |                                                                             |
    1206             : |                                                                             |
    1207             : |  Return Value    Type     Units     Description                             |
    1208             : |  ============   ======  =========   =====================================   |
    1209             : |  gsize          int32               Number of l_index values (sz of geo dim)  |
    1210             : |                                                                             |
    1211             : |  INPUTS:                                                                    |
    1212             : |  swathID        int32               swath structure id                      |
    1213             : |  geodim         char                geolocation dimension name              |
    1214             : |  datadim        char                data dimension name                     |
    1215             : |                                                                             |
    1216             : |                                                                             |
    1217             : |  OUTPUTS:                                                                   |
    1218             : |  l_index          int32               array of l_index values                   |
    1219             : |                                                                             |
    1220             : |  NOTES:                                                                     |
    1221             : |                                                                             |
    1222             : |                                                                             |
    1223             : |   Date     Programmer   Description                                         |
    1224             : |  ======   ============  =================================================   |
    1225             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1226             : |                                                                             |
    1227             : |  END_PROLOG                                                                 |
    1228             : -----------------------------------------------------------------------------*/
    1229             : int32
    1230           0 : SWidxmapinfo(int32 swathID, const char *geodim, const char *datadim, int32 l_index[])
    1231             : {
    1232             :     intn            status; /* routine return status variable */
    1233             : 
    1234             :     int32           fid;  /* HDF-EOS file ID */
    1235             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1236             :     int32           swVgrpID; /* Swath root Vgroup ID */
    1237           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    1238             :     int32           vgid; /* Swath Attributes Vgroup ID */
    1239             :     int32           vdataID;  /* Index Mapping Vdata ID */
    1240           0 :     int32           gsize = -1; /* Size of geo dim */
    1241             : 
    1242             :     char            utlbuf[256];/* Utility buffer */
    1243             : 
    1244             : 
    1245             :     /* Check Swath ID */
    1246           0 :     status = SWchkswid(swathID, "SWidxmapinfo",
    1247             :            &fid, &sdInterfaceID, &swVgrpID);
    1248             : 
    1249           0 :     if (status == 0)
    1250             :     {
    1251             :   /* Find Index Mapping Vdata with Swath Attributes Vgroup */
    1252           0 :   snprintf(utlbuf, sizeof(utlbuf), "%s%s%s%s", "INDXMAP:", geodim, "/", datadim);
    1253           0 :   vgid = SWXSwath[swathID % idOffset].VIDTable[2];
    1254           0 :   vdataID = EHgetid(fid, vgid, utlbuf, 1, "r");
    1255             : 
    1256             :   /* If found then get geodim size & read l_index mapping values */
    1257           0 :   if (vdataID != -1)
    1258             :   {
    1259           0 :       gsize = SWdiminfo(swathID, geodim);
    1260             : 
    1261           0 :       VSsetfields(vdataID, "Index");
    1262           0 :       VSread(vdataID, (uint8 *) l_index, 1, FULL_INTERLACE);
    1263           0 :       VSdetach(vdataID);
    1264             :   }
    1265             :   else
    1266             :   {
    1267             :       /*status = -1;*/
    1268           0 :       HEpush(DFE_GENAPP, "SWidxmapinfo", __FILE__, __LINE__);
    1269           0 :       HEreport("Index Mapping \"%s\" not found.\n", utlbuf);
    1270             :   }
    1271             :     }
    1272           0 :     return (gsize);
    1273             : }
    1274             : 
    1275             : 
    1276             : 
    1277             : 
    1278             : /*----------------------------------------------------------------------------|
    1279             : |  BEGIN_PROLOG                                                               |
    1280             : |                                                                             |
    1281             : |  FUNCTION: SWcompinfo                                                       |
    1282             : |                                                                             |
    1283             : |  DESCRIPTION:                                                               |
    1284             : |                                                                             |
    1285             : |                                                                             |
    1286             : |  Return Value    Type     Units     Description                             |
    1287             : |  ============   ======  =========   =====================================   |
    1288             : |  status         intn                                                        |
    1289             : |                                                                             |
    1290             : |  INPUTS:                                                                    |
    1291             : |  swathID        int32                                                       |
    1292             : |  compcode       int32                                                       |
    1293             : |  compparm       intn                                                        |
    1294             : |                                                                             |
    1295             : |                                                                             |
    1296             : |  OUTPUTS:                                                                   |
    1297             : |             None                                                            |
    1298             : |                                                                             |
    1299             : |  NOTES:                                                                     |
    1300             : |                                                                             |
    1301             : |                                                                             |
    1302             : |   Date     Programmer   Description                                         |
    1303             : |  ======   ============  =================================================   |
    1304             : |  Oct 96   Joel Gales    Original Programmer                                 |
    1305             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
    1306             : |                                                                             |
    1307             : |  END_PROLOG                                                                 |
    1308             : -----------------------------------------------------------------------------*/
    1309             : intn
    1310           0 : SWcompinfo(int32 swathID, const char *fieldname, int32 * compcode, intn compparm[])
    1311             : {
    1312             :     intn            i;    /* Loop Index */
    1313             :     intn            status; /* routine return status variable */
    1314           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
    1315             : 
    1316             :     int32           fid;  /* HDF-EOS file ID */
    1317             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1318             :     int32           swVgrpID; /* Swath root Vgroup ID */
    1319           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    1320             : 
    1321             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1322             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1323             :     char            swathname[80];  /* Swath Name */
    1324             :     char           *utlstr;     /* Utility string */
    1325             : 
    1326           0 :     const char           *HDFcomp[5] = {"HDFE_COMP_NONE", "HDFE_COMP_RLE",
    1327             :   "HDFE_COMP_NBIT", "HDFE_COMP_SKPHUFF",
    1328             :     "HDFE_COMP_DEFLATE"}; /* Compression Codes */
    1329             : 
    1330             :     /* Allocate space for utility string */
    1331             :     /* --------------------------------- */
    1332           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1333           0 :     if(utlstr == NULL)
    1334             :     { 
    1335           0 :   HEpush(DFE_NOSPACE,"SWcompinfo", __FILE__, __LINE__);
    1336           0 :   return(-1);
    1337             :     }
    1338             : 
    1339             :     /* Check Swath ID */
    1340           0 :     status = SWchkswid(swathID, "SWcompinfo",
    1341             :            &fid, &sdInterfaceID, &swVgrpID);
    1342             : 
    1343           0 :     if (status == 0)
    1344             :     {
    1345             :   /* Get swath name */
    1346           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    1347             : 
    1348             :   /* Get pointers to "DataField" section within SM */
    1349           0 :   metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    1350             :                "DataField", metaptrs);
    1351           0 :   if(metabuf == NULL)
    1352             :   {
    1353           0 :       free(utlstr);
    1354           0 :       return(-1);
    1355             :   }
    1356             :   /* Search for field */
    1357           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"\n");
    1358           0 :   metaptrs[0] = strstr(metaptrs[0], utlstr);
    1359             : 
    1360             :   /* If not found then search in "GeoField" section */
    1361           0 :   if (metaptrs[0] > metaptrs[1] || metaptrs[0] == NULL)
    1362             :   {
    1363           0 :       free(metabuf);
    1364             : 
    1365             :       /* Get pointers to "GeoField" section within SM */
    1366           0 :       metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    1367             :              "GeoField", metaptrs);
    1368           0 :       if(metabuf == NULL)
    1369             :       {
    1370           0 :     free(utlstr);
    1371           0 :     return(-1);
    1372             :       }
    1373             :       /* Search for field */
    1374           0 :       snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"\n");
    1375           0 :       metaptrs[0] = strstr(metaptrs[0], utlstr);
    1376             :   }
    1377             : 
    1378             : 
    1379             :   /* If field found and user wants compression code ... */
    1380           0 :   if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    1381             :   {
    1382           0 :       if (compcode != NULL)
    1383             :       {
    1384             :     /* Set endptr at end of field's definition entry */
    1385           0 :     metaptrs[1] = strstr(metaptrs[0], "\t\t\tEND_OBJECT");
    1386             : 
    1387             :     /* Get compression type */
    1388           0 :     statmeta = EHgetmetavalue(metaptrs, "CompressionType", utlstr);
    1389             : 
    1390             :     /*
    1391             :      * Default is no compression if "CompressionType" string not
    1392             :      * in metadata
    1393             :      */
    1394           0 :     *compcode = HDFE_COMP_NONE;
    1395             : 
    1396             :     /* If compression code is found ... */
    1397           0 :     if (statmeta == 0)
    1398             :     {
    1399             :         /* Loop through compression types until match */
    1400           0 :         for (i = 0; i < 5; i++)
    1401             :         {
    1402           0 :       if (strcmp(utlstr, HDFcomp[i]) == 0)
    1403             :       {
    1404           0 :           *compcode = i;
    1405           0 :           break;
    1406             :       }
    1407             :         }
    1408             :     }
    1409             :       }
    1410             : 
    1411             :       /* If user wants compression parameters ... */
    1412           0 :       if (compparm != NULL && compcode != NULL)
    1413             :       {
    1414             :     /* Initialize to zero */
    1415           0 :     for (i = 0; i < 4; i++)
    1416             :     {
    1417           0 :         compparm[i] = 0;
    1418             :     }
    1419             : 
    1420             :     /*
    1421             :      * Get compression parameters if NBIT or DEFLATE compression
    1422             :      */
    1423           0 :     if (*compcode == HDFE_COMP_NBIT)
    1424             :     {
    1425             :         statmeta =
    1426           0 :       EHgetmetavalue(metaptrs, "CompressionParams", utlstr);
    1427           0 :         if (statmeta == 0)
    1428             :         {
    1429           0 :       sscanf(utlstr, "(%d,%d,%d,%d)",
    1430             :              &compparm[0], &compparm[1],
    1431             :              &compparm[2], &compparm[3]);
    1432             :         }
    1433             :         else
    1434             :         {
    1435           0 :       status = -1;
    1436           0 :       HEpush(DFE_GENAPP, "SWcompinfo", __FILE__, __LINE__);
    1437           0 :       HEreport(
    1438             :          "\"CompressionParams\" string not found in metadata.\n");
    1439             :         }
    1440             :     }
    1441           0 :     else if (*compcode == HDFE_COMP_DEFLATE)
    1442             :     {
    1443             :         statmeta =
    1444           0 :       EHgetmetavalue(metaptrs, "DeflateLevel", utlstr);
    1445           0 :         if (statmeta == 0)
    1446             :         {
    1447           0 :       sscanf(utlstr, "%d", &compparm[0]);
    1448             :         }
    1449             :         else
    1450             :         {
    1451           0 :       status = -1;
    1452           0 :       HEpush(DFE_GENAPP, "SWcompinfo", __FILE__, __LINE__);
    1453           0 :       HEreport(
    1454             :       "\"DeflateLevel\" string not found in metadata.\n");
    1455             :         }
    1456             :     }
    1457             :       }
    1458             :   }
    1459             :   else
    1460             :   {
    1461           0 :       HEpush(DFE_GENAPP, "SWcompinfo", __FILE__, __LINE__);
    1462           0 :       HEreport("Fieldname \"%s\" not found.\n", fieldname);
    1463             :   }
    1464             : 
    1465           0 :   free(metabuf);
    1466             :     }
    1467           0 :     free(utlstr);
    1468             :     
    1469           0 :     return (status);
    1470             : }
    1471             : 
    1472             : 
    1473             : 
    1474             : /*----------------------------------------------------------------------------|
    1475             : |  BEGIN_PROLOG                                                               |
    1476             : |                                                                             |
    1477             : |  FUNCTION: SWfinfo                                                          |
    1478             : |                                                                             |
    1479             : |  DESCRIPTION: Returns field info                                            |
    1480             : |                                                                             |
    1481             : |                                                                             |
    1482             : |  Return Value    Type     Units     Description                             |
    1483             : |  ============   ======  =========   =====================================   |
    1484             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1485             : |                                                                             |
    1486             : |  INPUTS:                                                                    |
    1487             : |  swathID        int32               swath structure id                      |
    1488             : |  fieldtype      const char          fieldtype (geo or data)                 |
    1489             : |  fieldname      const char          name of field                           |
    1490             : |                                                                             |
    1491             : |                                                                             |
    1492             : |  OUTPUTS:                                                                   |
    1493             : |  rank           int32               rank of field (# of dims)               |
    1494             : |  dims           int32               field dimensions                        |
    1495             : |  numbertype     int32               field number type                       |
    1496             : |  dimlist        char                field dimension list                    |
    1497             : |                                                                             |
    1498             : |  NOTES:                                                                     |
    1499             : |                                                                             |
    1500             : |                                                                             |
    1501             : |   Date     Programmer   Description                                         |
    1502             : |  ======   ============  =================================================   |
    1503             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1504             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    1505             : |  Jan 97   Joel Gales    Check for metadata error status from EHgetmetavalue |
    1506             : |                                                                             |
    1507             : |  END_PROLOG                                                                 |
    1508             : -----------------------------------------------------------------------------*/
    1509             : static int32
    1510           0 : SWfinfo(int32 swathID, const char *fieldtype, const char *fieldname,
    1511             :         int32 *rank, int32 dims[], int32 *numbertype, char *dimlist)
    1512             : 
    1513             : {
    1514             :     intn            i;    /* Loop index */
    1515             :     intn            j;    /* Loop index */
    1516             :     intn            status; /* routine return status variable */
    1517           0 :     intn            statmeta = 0; /* EHgetmetavalue return status */
    1518             : 
    1519             :     int32           fid;  /* HDF-EOS file ID */
    1520             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1521           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    1522             :     int32           fsize;  /* field size in bytes */
    1523           0 :     int32           ndims = 0;  /* Number of dimensions */
    1524             :     int32           slen[8];  /* Length of each entry in parsed string */
    1525             :     int32           dum;  /* Dummy variable */
    1526             :     int32           vdataID;  /* 1d field vdata ID */
    1527             : 
    1528             :     uint8          *buf;  /* One-Dim field buffer */
    1529             : 
    1530             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    1531             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    1532             :     char            swathname[80];  /* Swath Name */
    1533             :     char           *utlstr; /* Utility string */
    1534             :     char           *ptr[8]; /* String pointers for parsed string */
    1535             :     char            dimstr[64]; /* Individual dimension entry string */
    1536             : 
    1537             : 
    1538             :     /* Allocate space for utility string */
    1539             :     /* --------------------------------- */
    1540           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    1541           0 :     if(utlstr == NULL)
    1542             :     { 
    1543           0 :   HEpush(DFE_NOSPACE,"SWfinfo", __FILE__, __LINE__);
    1544           0 :   return(-1);
    1545             :     }
    1546             : 
    1547             :     /* Initialize rank and numbertype to -1 (error) */
    1548             :     /* -------------------------------------------- */
    1549           0 :     *rank = -1;
    1550           0 :     *numbertype = -1;
    1551             : 
    1552             :     /* Get HDF-EOS file ID and SDS interface ID */
    1553           0 :     status = SWchkswid(swathID, "SWfinfo", &fid, &sdInterfaceID, &dum);
    1554             : 
    1555             :     /* Get swath name */
    1556           0 :     Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    1557             : 
    1558             :     /* Get pointers to appropriate "Field" section within SM */
    1559           0 :     if (strcmp(fieldtype, "Geolocation Fields") == 0)
    1560             :     {
    1561           0 :   metabuf = EHmetagroup(sdInterfaceID, swathname, "s",
    1562             :                "GeoField", metaptrs);
    1563             :   
    1564           0 :   if(metabuf == NULL)
    1565             :   {
    1566           0 :       free(utlstr);
    1567           0 :       return(-1);
    1568             :   }
    1569             :     }
    1570             :     else
    1571             :     {
    1572           0 :   metabuf = EHmetagroup(sdInterfaceID, swathname, "s",
    1573             :                "DataField", metaptrs);
    1574           0 :   if(metabuf == NULL)
    1575             :   {
    1576           0 :       free(utlstr);
    1577           0 :       return(-1);
    1578             :   }
    1579             :     }
    1580             : 
    1581             : 
    1582             :     /* Search for field */
    1583           0 :     snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"\n");
    1584           0 :     metaptrs[0] = strstr(metaptrs[0], utlstr);
    1585             : 
    1586             :     /* If field found ... */
    1587           0 :     if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    1588             :     {
    1589             :   /* Get DataType string */
    1590           0 :   statmeta = EHgetmetavalue(metaptrs, "DataType", utlstr);
    1591             : 
    1592             :   /* Convert to numbertype code */
    1593           0 :   if (statmeta == 0)
    1594           0 :       *numbertype = EHnumstr(utlstr);
    1595             :   else
    1596             :   {
    1597           0 :       status = -1;
    1598           0 :       HEpush(DFE_GENAPP, "SWfinfo", __FILE__, __LINE__);
    1599           0 :       HEreport("\"DataType\" string not found in metadata.\n");
    1600             :   }
    1601             : 
    1602             : 
    1603             :   /*
    1604             :    * Get DimList string and trim off leading and trailing parens "()"
    1605             :    */
    1606           0 :   statmeta = EHgetmetavalue(metaptrs, "DimList", utlstr);
    1607             : 
    1608           0 :   if (statmeta == 0)
    1609             :   {
    1610           0 :       memmove(utlstr, utlstr + 1, strlen(utlstr) - 2);
    1611           0 :       utlstr[strlen(utlstr) - 2] = 0;
    1612             : 
    1613             :       /* Parse trimmed DimList string and get rank */
    1614           0 :       ndims = EHparsestr(utlstr, ',', ptr, slen);
    1615           0 :       *rank = ndims;
    1616             :   }
    1617             :   else
    1618             :   {
    1619           0 :       status = -1;
    1620           0 :       HEpush(DFE_GENAPP, "SWfinfo", __FILE__, __LINE__);
    1621           0 :       HEreport("\"DimList\" string not found in metadata.\n");
    1622             :   }
    1623             : 
    1624             :   /* If dimension list is desired by user then initialize length to 0 */
    1625           0 :   if (dimlist != NULL)
    1626             :   {
    1627           0 :       dimlist[0] = 0;
    1628             :   }
    1629             : 
    1630             :   /*
    1631             :    * Copy each entry in DimList and remove leading and trailing quotes,
    1632             :    * Get dimension sizes and concatenate dimension names to dimension
    1633             :    * list
    1634             :    */
    1635           0 :   for (i = 0; i < ndims; i++)
    1636             :   {
    1637           0 :       memcpy(dimstr, ptr[i] + 1, slen[i] - 2);
    1638           0 :       dimstr[slen[i] - 2] = 0;
    1639           0 :       dims[i] = SWdiminfo(swathID, dimstr);
    1640           0 :       if (dimlist != NULL)
    1641             :       {
    1642           0 :     if (i > 0)
    1643             :     {
    1644           0 :         strcat(dimlist, ",");
    1645             :     }
    1646           0 :     strcat(dimlist, dimstr);
    1647             :       }
    1648             : 
    1649             :   }
    1650             : 
    1651             : 
    1652             :   /* Appendable Field Section */
    1653             :   /* ------------------------ */
    1654           0 :   if (dims[0] == 0)
    1655             :   {
    1656             :       /* One-Dimensional Field */
    1657           0 :       if (*rank == 1)
    1658             :       {
    1659             :     /* Get vdata ID */
    1660           0 :     status = SW1dfldsrch(fid, swathID, fieldname, "r",
    1661             :              &dum, &vdataID, &dum);
    1662             : 
    1663             :     /* Get actual size of field */
    1664           0 :     dims[0] = VSelts(vdataID);
    1665             : 
    1666             :     /*
    1667             :      * If size=1 then check where actual record of
    1668             :      * "initialization" record
    1669             :      */
    1670           0 :     if (dims[0] == 1)
    1671             :     {
    1672             :         /* Get record size and read 1st record */
    1673           0 :         fsize = VSsizeof(vdataID, (char *)fieldname);
    1674           0 :         buf = (uint8 *) calloc(fsize, 1);
    1675           0 :         if(buf == NULL)
    1676             :         { 
    1677           0 :       HEpush(DFE_NOSPACE,"SWfinfo", __FILE__, __LINE__);
    1678           0 :       free(utlstr);
    1679           0 :       return(-1);
    1680             :         }
    1681           0 :         VSsetfields(vdataID, fieldname);
    1682           0 :         VSseek(vdataID, 0);
    1683           0 :         VSread(vdataID, (uint8 *) buf, 1, FULL_INTERLACE);
    1684             : 
    1685             :         /* Sum up "bytes" in record */
    1686           0 :         for (i = 0, j = 0; i < fsize; i++)
    1687             :         {
    1688           0 :       j += buf[i];
    1689             :         }
    1690             : 
    1691             :         /*
    1692             :          * If filled with 255 then "initialization" record,
    1693             :          * actual number of records = 0
    1694             :          */
    1695           0 :         if (j == 255 * fsize)
    1696             :         {
    1697           0 :       dims[0] = 0;
    1698             :         }
    1699             : 
    1700           0 :         free(buf);
    1701             :     }
    1702             :     /* Detach from 1d field */
    1703           0 :     VSdetach(vdataID);
    1704             :       }
    1705             :       else
    1706             :       {
    1707             :     /* Get actual size of Multi-Dimensional Field */
    1708           0 :     status = SWSDfldsrch(swathID, sdInterfaceID, fieldname,
    1709             :              &dum, &dum, &dum, &dum, dims,
    1710             :              &dum);
    1711             :       }
    1712             :   }
    1713             :     }
    1714           0 :     free(metabuf);
    1715             : 
    1716           0 :     if (*rank == -1)
    1717             :     {
    1718           0 :   status = -1;
    1719             :     }
    1720           0 :     free(utlstr);
    1721             :      
    1722           0 :     return (status);
    1723             : }
    1724             : 
    1725             : 
    1726             : 
    1727             : 
    1728             : 
    1729             : /*----------------------------------------------------------------------------|
    1730             : |  BEGIN_PROLOG                                                               |
    1731             : |                                                                             |
    1732             : |  FUNCTION: SWfieldinfo                                                      |
    1733             : |                                                                             |
    1734             : |  DESCRIPTION: Wrapper around SWfinfo                                        |
    1735             : |                                                                             |
    1736             : |                                                                             |
    1737             : |  Return Value    Type     Units     Description                             |
    1738             : |  ============   ======  =========   =====================================   |
    1739             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1740             : |                                                                             |
    1741             : |  INPUTS:                                                                    |
    1742             : |  swathID        int32               swath structure id                      |
    1743             : |  fieldname      const char          name of field                           |
    1744             : |                                                                             |
    1745             : |                                                                             |
    1746             : |  OUTPUTS:                                                                   |
    1747             : |  rank           int32               rank of field (# of dims)               |
    1748             : |  dims           int32               field dimensions                        |
    1749             : |  numbertype     int32               field number type                       |
    1750             : |  dimlist        char                field dimension list                    |
    1751             : |                                                                             |
    1752             : |  NOTES:                                                                     |
    1753             : |                                                                             |
    1754             : |                                                                             |
    1755             : |   Date     Programmer   Description                                         |
    1756             : |  ======   ============  =================================================   |
    1757             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1758             : |                                                                             |
    1759             : |  END_PROLOG                                                                 |
    1760             : -----------------------------------------------------------------------------*/
    1761             : intn
    1762           0 : SWfieldinfo(int32 swathID, const char *fieldname, int32 * rank, int32 dims[],
    1763             :       int32 * numbertype, char *dimlist)
    1764             : 
    1765             : {
    1766             :     intn            status; /* routine return status variable */
    1767             : 
    1768             :     int32           fid;  /* HDF-EOS file ID */
    1769             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1770             :     int32           swVgrpID; /* Swath root Vgroup ID */
    1771             : 
    1772             : 
    1773             :     /* Check for valid swath id */
    1774           0 :     status = SWchkswid(swathID, "SWfieldinfo", &fid,
    1775             :            &sdInterfaceID, &swVgrpID);
    1776           0 :     if (status == 0)
    1777             :     {
    1778             :   /* Check for field within Geolocatation Fields */
    1779           0 :   status = SWfinfo(swathID, "Geolocation Fields", fieldname,
    1780             :        rank, dims, numbertype, dimlist);
    1781             : 
    1782             :   /* If not there then check within Data Fields */
    1783           0 :   if (status == -1)
    1784             :   {
    1785           0 :       status = SWfinfo(swathID, "Data Fields", fieldname,
    1786             :            rank, dims, numbertype, dimlist);
    1787             :   }
    1788             : 
    1789             :   /* If not there either then can't be found */
    1790           0 :   if (status == -1)
    1791             :   {
    1792           0 :       HEpush(DFE_GENAPP, "SWfieldinfo", __FILE__, __LINE__);
    1793           0 :       HEreport("Fieldname \"%s\" not found.\n", fieldname);
    1794             :   }
    1795             :     }
    1796           0 :     return (status);
    1797             : }
    1798             : 
    1799             : 
    1800             : 
    1801             : 
    1802             : 
    1803             : 
    1804             : /*----------------------------------------------------------------------------|
    1805             : |  BEGIN_PROLOG                                                               |
    1806             : |                                                                             |
    1807             : |  FUNCTION: SWdefdimmap                                                      |
    1808             : |                                                                             |
    1809             : |  DESCRIPTION: Defines mapping between geolocation and data dimensions       |
    1810             : |                                                                             |
    1811             : |                                                                             |
    1812             : |  Return Value    Type     Units     Description                             |
    1813             : |  ============   ======  =========   =====================================   |
    1814             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1815             : |                                                                             |
    1816             : |  INPUTS:                                                                    |
    1817             : |  swathID        int32               swath structure ID                      |
    1818             : |  geodim         char                Geolocation dimension                   |
    1819             : |  datadim        char                Data dimension                          |
    1820             : |  offset         int32               Mapping offset                          |
    1821             : |  increment      int32               Mapping increment                       |
    1822             : |                                                                             |
    1823             : |  OUTPUTS:                                                                   |
    1824             : |             None                                                            |
    1825             : |                                                                             |
    1826             : |  NOTES:                                                                     |
    1827             : |                                                                             |
    1828             : |                                                                             |
    1829             : |   Date     Programmer   Description                                         |
    1830             : |  ======   ============  =================================================   |
    1831             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1832             : |                                                                             |
    1833             : |  END_PROLOG                                                                 |
    1834             : -----------------------------------------------------------------------------*/
    1835             : intn
    1836           0 : SWdefdimmap(int32 swathID, const char *geodim, const char *datadim, int32 offset,
    1837             :       int32 increment)
    1838             : 
    1839             : {
    1840             :     intn            status; /* routine return status variable */
    1841             : 
    1842             :     int32           fid;  /* HDF-EOS file ID */
    1843             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1844             :     int32           size; /* Size of geo dim */
    1845           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    1846             :     int32           dum;  /* Dummy variable */
    1847             :     int32           metadata[2];/* Offset & Increment (passed to metadata) */
    1848             : 
    1849             :     char            mapname[80];/* Mapping name (geodim/datadim) */
    1850             :     char            swathname[80];  /* Swath name */
    1851             : 
    1852             :     /* Check Swath ID */
    1853           0 :     status = SWchkswid(swathID, "SWdefdimmap", &fid, &sdInterfaceID, &dum);
    1854             : 
    1855           0 :     if (status == 0)
    1856             :     {
    1857             : 
    1858             :   /* Search Dimension Vdata for dimension entries */
    1859             :   /* -------------------------------------------- */
    1860           0 :   size = SWdiminfo(swathID, geodim);
    1861           0 :   if (size == -1)
    1862             :   {
    1863           0 :       status = -1;
    1864           0 :       HEpush(DFE_GENAPP, "SWdefdimmap", __FILE__, __LINE__);
    1865           0 :       HEreport("Geolocation dimension name: \"%s\" not found.\n",
    1866             :          geodim);
    1867             :   }
    1868             :   /* Data Dimension Search */
    1869             :   /* --------------------- */
    1870           0 :   if (status == 0)
    1871             :   {
    1872           0 :       size = SWdiminfo(swathID, datadim);
    1873           0 :       if (size == -1)
    1874             :       {
    1875           0 :     status = -1;
    1876           0 :     HEpush(DFE_GENAPP, "SWdefdimmap", __FILE__, __LINE__);
    1877           0 :     HEreport("Data dimension name: \"%s\" not found.\n",
    1878             :        datadim);
    1879             :       }
    1880             :   }
    1881             : 
    1882             :   /* Write Dimension Map to Structural MetaData */
    1883             :   /* ------------------------------------------ */
    1884           0 :   if (status == 0)
    1885             :   {
    1886           0 :       snprintf(mapname, sizeof(mapname), "%s%s%s", geodim, "/", datadim);
    1887           0 :       metadata[0] = offset;
    1888           0 :       metadata[1] = increment;
    1889             : 
    1890           0 :       Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    1891           0 :       status = EHinsertmeta(sdInterfaceID, swathname, "s", 1L,
    1892             :           mapname, metadata);
    1893             : 
    1894             :   }
    1895             :     }
    1896           0 :     return (status);
    1897             : }
    1898             : 
    1899             : 
    1900             : 
    1901             : /*----------------------------------------------------------------------------|
    1902             : |  BEGIN_PROLOG                                                               |
    1903             : |                                                                             |
    1904             : |  FUNCTION: SWdefidxmap                                                      |
    1905             : |                                                                             |
    1906             : |  DESCRIPTION: Defines l_indexed (non-linear) mapping between geolocation      |
    1907             : |               and data dimensions                                           |
    1908             : |                                                                             |
    1909             : |                                                                             |
    1910             : |  Return Value    Type     Units     Description                             |
    1911             : |  ============   ======  =========   =====================================   |
    1912             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1913             : |                                                                             |
    1914             : |  INPUTS:                                                                    |
    1915             : |  swathID        int32               swath structure ID                      |
    1916             : |  geodim         char                Geolocation dimension                   |
    1917             : |  datadim        char                Data dimension                          |
    1918             : |  l_index          int32               Index mapping array                     |
    1919             : |                                                                             |
    1920             : |  OUTPUTS:                                                                   |
    1921             : |             None                                                            |
    1922             : |                                                                             |
    1923             : |  NOTES:                                                                     |
    1924             : |                                                                             |
    1925             : |                                                                             |
    1926             : |   Date     Programmer   Description                                         |
    1927             : |  ======   ============  =================================================   |
    1928             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1929             : |                                                                             |
    1930             : |  END_PROLOG                                                                 |
    1931             : -----------------------------------------------------------------------------*/
    1932             : intn
    1933           0 : SWdefidxmap(int32 swathID, const char *geodim, const char *datadim, int32 l_index[])
    1934             : 
    1935             : {
    1936             :     intn            status; /* routine return status variable */
    1937             : 
    1938             :     int32           fid;  /* HDF-EOS file ID */
    1939             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    1940             :     int32           attrVgrpID; /* Swath attribute ID */
    1941             :     int32           vdataID;  /* Mapping Index Vdata ID */
    1942             :     int32           gsize;  /* Size of geo dim */
    1943             :     int32           dsize;  /* Size of data dim */
    1944           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    1945             :     int32           dum;  /* Dummy variable */
    1946             : 
    1947             :     uint8          *buf;  /* Vdata field buffer */
    1948             : 
    1949             :     char            mapname[80];/* Mapping name (geodim/datadim) */
    1950             :     char            swathname[80];  /* Swath name */
    1951             :     char            utlbuf[256];/* Utility buffer */
    1952             : 
    1953             : 
    1954             :     /* Check Swath ID */
    1955           0 :     status = SWchkswid(swathID, "SWdefidxmap", &fid, &sdInterfaceID, &dum);
    1956           0 :     if (status == 0)
    1957             :     {
    1958             :   /* Search Dimension Vdata for dimension entries */
    1959             :   /* -------------------------------------------- */
    1960             : 
    1961             :   /* Geo Dimension Search */
    1962             :   /* -------------------- */
    1963             :        
    1964           0 :   gsize = SWdiminfo(swathID, geodim);
    1965             : 
    1966           0 :   if (gsize == -1)
    1967             :   {
    1968           0 :       status = -1;
    1969           0 :       HEpush(DFE_GENAPP, "SWdefidxmap", __FILE__, __LINE__);
    1970           0 :       HEreport("Geolocation dimension name: \"%s\" not found.\n",
    1971             :          geodim);
    1972             :   }
    1973             :   /* Data Dimension Search */
    1974             :   /* --------------------- */
    1975           0 :   if (status == 0)
    1976             :   {
    1977           0 :       dsize = SWdiminfo(swathID, datadim);
    1978           0 :       if (dsize == -1)
    1979             :       {
    1980           0 :     status = -1;
    1981           0 :     HEpush(DFE_GENAPP, "SWdefidxmap", __FILE__, __LINE__);
    1982           0 :     HEreport("Data dimension name: \"%s\" not found.\n",
    1983             :        datadim);
    1984             :       }
    1985             :   }
    1986             :   /* Define Index Vdata and Store Index Array */
    1987             :   /* ---------------------------------------- */
    1988           0 :   if (status == 0)
    1989             :   {
    1990             :       /* Get attribute Vgroup ID and allocate data buffer */
    1991             :       /* ------------------------------------------------ */
    1992           0 :       attrVgrpID = SWXSwath[swathID % idOffset].VIDTable[2];
    1993           0 :       buf = (uint8 *) calloc(4 * gsize, 1);
    1994           0 :       if(buf == NULL)
    1995             :       { 
    1996           0 :     HEpush(DFE_NOSPACE,"SWdefidxmap", __FILE__, __LINE__);
    1997           0 :     return(-1);
    1998             :       }
    1999             : 
    2000             :       /* Name: "INDXMAP:" + geodim + "/" + datadim */
    2001           0 :       snprintf(utlbuf, sizeof(utlbuf), "%s%s%s%s", "INDXMAP:", geodim, "/", datadim);
    2002             : 
    2003           0 :       vdataID = VSattach(fid, -1, "w");
    2004           0 :       VSsetname(vdataID, utlbuf);
    2005             : 
    2006             :       /* Attribute Class */
    2007           0 :       VSsetclass(vdataID, "Attr0.0");
    2008             : 
    2009             :       /* Fieldname is "Index" */
    2010           0 :       VSfdefine(vdataID, "Index", DFNT_INT32, gsize);
    2011           0 :       VSsetfields(vdataID, "Index");
    2012           0 :       memcpy(buf, l_index, 4 * gsize);
    2013             : 
    2014             :       /* Write to vdata and free data buffer */
    2015           0 :       VSwrite(vdataID, buf, 1, FULL_INTERLACE);
    2016           0 :       free(buf);
    2017             : 
    2018             :       /* Insert in Attribute Vgroup and detach Vdata */
    2019           0 :       Vinsert(attrVgrpID, vdataID);
    2020           0 :       VSdetach(vdataID);
    2021             : 
    2022             : 
    2023             :       /* Write to Structural Metadata */
    2024           0 :       snprintf(mapname, sizeof(mapname), "%s%s%s", geodim, "/", datadim);
    2025           0 :       Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    2026           0 :       status = EHinsertmeta(sdInterfaceID, swathname, "s", 2L,
    2027             :           mapname, &dum);
    2028             : 
    2029             :   }
    2030             :     }
    2031           0 :     return (status);
    2032             : 
    2033             : }
    2034             : 
    2035             : 
    2036             : /*----------------------------------------------------------------------------|
    2037             : |  BEGIN_PROLOG                                                               |
    2038             : |                                                                             |
    2039             : |  FUNCTION: SWdefcomp                                                        |
    2040             : |                                                                             |
    2041             : |  DESCRIPTION: Defines compression type and parameters                       |
    2042             : |                                                                             |
    2043             : |                                                                             |
    2044             : |  Return Value    Type     Units     Description                             |
    2045             : |  ============   ======  =========   =====================================   |
    2046             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2047             : |                                                                             |
    2048             : |  INPUTS:                                                                    |
    2049             : |  swathID        int32               swath structure ID                      |
    2050             : |  compcode       int32               compression code                        |
    2051             : |  compparm       intn                compression parameters                  |
    2052             : |                                                                             |
    2053             : |  OUTPUTS:                                                                   |
    2054             : |             None                                                            |
    2055             : |                                                                             |
    2056             : |  NOTES:                                                                     |
    2057             : |                                                                             |
    2058             : |                                                                             |
    2059             : |   Date     Programmer   Description                                         |
    2060             : |  ======   ============  =================================================   |
    2061             : |  Sep 96   Joel Gales    Original Programmer                                 |
    2062             : |                                                                             |
    2063             : |  END_PROLOG                                                                 |
    2064             : -----------------------------------------------------------------------------*/
    2065             : intn
    2066           0 : SWdefcomp(int32 swathID, int32 compcode, intn compparm[])
    2067             : {
    2068           0 :     intn            status = 0; /* routine return status variable */
    2069             : 
    2070             :     int32           fid;  /* HDF-EOS file id */
    2071             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2072             :     int32           swVgrpID; /* Swath root Vgroup ID */
    2073           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    2074             :     int32           sID;  /* swathID - offset */
    2075             : 
    2076             : 
    2077             :     /* Check for valid swath id */
    2078           0 :     status = SWchkswid(swathID, "SWdefcomp", &fid, &sdInterfaceID, &swVgrpID);
    2079             : 
    2080           0 :     if (status == 0)
    2081             :     {
    2082           0 :   sID = swathID % idOffset;
    2083             : 
    2084             :   /* Set compression code in compression external array */
    2085           0 :   SWXSwath[sID].compcode = compcode;
    2086             : 
    2087           0 :   switch (compcode)
    2088             :   {
    2089             :       /* Set NBIT compression parameters in compression external array */
    2090           0 :   case HDFE_COMP_NBIT:
    2091             : 
    2092           0 :       SWXSwath[sID].compparm[0] = compparm[0];
    2093           0 :       SWXSwath[sID].compparm[1] = compparm[1];
    2094           0 :       SWXSwath[sID].compparm[2] = compparm[2];
    2095           0 :       SWXSwath[sID].compparm[3] = compparm[3];
    2096             : 
    2097           0 :       break;
    2098             : 
    2099             :       /* Set GZIP compression parameter in compression external array */
    2100           0 :   case HDFE_COMP_DEFLATE:
    2101             : 
    2102           0 :       SWXSwath[sID].compparm[0] = compparm[0];
    2103             : 
    2104           0 :       break;
    2105             : 
    2106             :   }
    2107           0 :     }
    2108             : 
    2109           0 :     return (status);
    2110             : }
    2111             : 
    2112             : /*----------------------------------------------------------------------------|
    2113             : |  BEGIN_PROLOG                                                               |
    2114             : |                                                                             |
    2115             : |  FUNCTION: SWdefinefield                                                    |
    2116             : |                                                                             |
    2117             : |  DESCRIPTION: Defines geolocation or data field within swath structure      |
    2118             : |                                                                             |
    2119             : |                                                                             |
    2120             : |  Return Value    Type     Units     Description                             |
    2121             : |  ============   ======  =========   =====================================   |
    2122             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2123             : |                                                                             |
    2124             : |  INPUTS:                                                                    |
    2125             : |  swathID        int32               swath structure ID                      |
    2126             : |  fieldtype      char                geo/data fieldtype                      |
    2127             : |  fieldname      char                fieldname                               |
    2128             : |  dimlist        char                Dimension list (comma-separated list)   |
    2129             : |  numbertype     int32               field type                              |
    2130             : |  merge          int32               merge code                              |
    2131             : |                                                                             |
    2132             : |                                                                             |
    2133             : |  OUTPUTS:                                                                   |
    2134             : |             None                                                            |
    2135             : |                                                                             |
    2136             : |  NOTES:                                                                     |
    2137             : |                                                                             |
    2138             : |                                                                             |
    2139             : |   Date     Programmer   Description                                         |
    2140             : |  ======   ============  =================================================   |
    2141             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2142             : |  Aug 96   Joel Gales    Check name for length                               |
    2143             : |  Sep 96   Joel Gales    Make string array "dimbuf" dynamic                  |
    2144             : |  Oct 96   Joel Gales    Make sure total length of "merged" Vdata < 64       |
    2145             : |  Jun 03   Abe Taaheri   Supplied cast comp_coder_t in call to SDsetcompress |
    2146             : |                                                                             |
    2147             : |  END_PROLOG                                                                 |
    2148             : -----------------------------------------------------------------------------*/
    2149             : static intn
    2150           0 : SWdefinefield(int32 swathID, const char *fieldtype, const char *fieldname, const char *dimlist,
    2151             :         int32 numbertype, int32 merge)
    2152             : 
    2153             : {
    2154             :     intn            i;    /* Loop index */
    2155             :     intn            status; /* routine return status variable */
    2156             :     intn            found;  /* utility found flag */
    2157           0 :     intn            foundNT = 0;/* found number type flag */
    2158           0 :     intn            foundAllDim = 1;  /* found all dimensions flag */
    2159           0 :     intn            first = 1;  /* first entry flag */
    2160             :     intn            fac;  /* Geo (-1), Data (+1) field factor */
    2161           0 :     int32           cnt = 0;
    2162             : 
    2163             :     int32           fid;  /* HDF-EOS file ID */
    2164           0 :     int32           vdataID = 0;  /* Vdata ID */
    2165             :     int32           vgid; /* Geo/Data field Vgroup ID */
    2166             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2167             :     int32           sdid; /* SDS object ID */
    2168             :     int32           dimid;  /* SDS dimension ID */
    2169             :     int32           recSize;  /* Vdata record size */
    2170             :     int32           swVgrpID; /* Swath root Vgroup ID */
    2171             :     int32           dims[8];  /* Dimension size array */
    2172             :     int32           dimsize;  /* Dimension size */
    2173           0 :     int32           rank = 0; /* Field rank */
    2174             :     int32           slen[32]; /* String length array */
    2175           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    2176             :     int32           compcode; /* Compression code */
    2177             :     int32           sID;  /* SwathID - offset */
    2178             : 
    2179             :     uint8          *oneDbuf;  /* Vdata record buffer */
    2180             :     char           *dimbuf; /* Dimension buffer */
    2181             :     char           *comma;  /* Pointer to comma */
    2182             :     char           *dimcheck; /* Dimension check buffer */
    2183             :     char            utlbuf[512];/* Utility buffer */
    2184             :     char            utlbuf2[256]; /* Utility buffer 2 */
    2185             :     char           *ptr[32];  /* String pointer array */
    2186             :     char            swathname[80];  /* Swath name */
    2187             :     char            errbuf1[128]; /* Error message buffer 1 */
    2188             :     char            errbuf2[128]; /* Error message buffer 2 */
    2189             :     char            compparmbuf[128]; /* Compression parameter string buffer */
    2190             : 
    2191           0 :     const char           *HDFcomp[5] = {"HDFE_COMP_NONE", "HDFE_COMP_RLE",
    2192             :   "HDFE_COMP_NBIT", "HDFE_COMP_SKPHUFF",
    2193             :     "HDFE_COMP_DEFLATE"};
    2194             :     /* Compression code names */
    2195             : 
    2196           0 :     uint16          good_number[10] = {3, 4, 5, 6, 20, 21, 22, 23, 24, 25};
    2197             :     /* Valid number types */
    2198             :     comp_info       c_info; /* Compression parameter structure */
    2199             : 
    2200             : 
    2201             : 
    2202             :     /* Setup error message strings */
    2203             :     /* --------------------------- */
    2204           0 :     strcpy(errbuf1, "SWXSDname array too small.\nPlease increase ");
    2205           0 :     strcat(errbuf1, "size of HDFE_NAMBUFSIZE in \"HdfEosDef.h\".\n");
    2206           0 :     strcpy(errbuf2, "SWXSDdims array too small.\nPlease increase ");
    2207           0 :     strcat(errbuf2, "size of HDFE_DIMBUFSIZE in \"HdfEosDef.h\".\n");
    2208             : 
    2209             : 
    2210             : 
    2211             :     /*
    2212             :      * Check for proper swath ID and return HDF-EOS file ID, SDinterface ID,
    2213             :      * and swath root Vgroup ID
    2214             :      */
    2215           0 :     status = SWchkswid(swathID, "SWdefinefield",
    2216             :            &fid, &sdInterfaceID, &swVgrpID);
    2217             : 
    2218             : 
    2219           0 :     if (status == 0)
    2220             :     {
    2221             :   /* Remove offset from swath ID & get swathname */
    2222           0 :   sID = swathID % idOffset;
    2223           0 :   Vgetname(swVgrpID, swathname);
    2224             : 
    2225             :   /* Allocate space for dimbuf, copy dimlist into it, & append comma */
    2226           0 :   dimbuf = (char *) calloc(strlen(dimlist) + 64, 1);
    2227           0 :   if(dimbuf == NULL)
    2228             :   { 
    2229           0 :       HEpush(DFE_NOSPACE,"SWdefinefield", __FILE__, __LINE__);
    2230           0 :       return(-1);
    2231             :   }
    2232           0 :   strcpy(dimbuf, dimlist);
    2233           0 :   strcat(dimbuf, ",");
    2234             : 
    2235             :   /* Find comma */
    2236           0 :   comma = strchr(dimbuf, ',');
    2237             : 
    2238             : 
    2239             :   /*
    2240             :    * Loop through entries in dimension list to make sure they are
    2241             :    * defined in swath
    2242             :    */
    2243           0 :   while (comma != NULL)
    2244             :   {
    2245             :       /* Copy dimension list entry to dimcheck */
    2246           0 :       dimcheck = (char *) calloc(comma - dimbuf + 1, 1);
    2247           0 :       if(dimcheck == NULL)
    2248             :       { 
    2249           0 :     HEpush(DFE_NOSPACE,"SWdefinefield", __FILE__, __LINE__);
    2250           0 :     free(dimbuf);
    2251           0 :     return(-1);
    2252             :       }
    2253           0 :       memcpy(dimcheck, dimbuf, comma - dimbuf);
    2254             : 
    2255             :       /* Get dimension size */
    2256           0 :       dimsize = SWdiminfo(swathID, dimcheck);
    2257             : 
    2258             :       /* if != -1 then sent found flag, store size and increment rank */
    2259           0 :       if (dimsize != -1)
    2260             :       {
    2261           0 :     dims[rank] = dimsize;
    2262           0 :     rank++;
    2263             :       }
    2264             :       else
    2265             :       {
    2266             :     /*
    2267             :      * If dimension list entry not found - set error return
    2268             :      * status, append name to utility buffer for error report
    2269             :      */
    2270           0 :     status = -1;
    2271           0 :     foundAllDim = 0;
    2272           0 :     if (first == 1)
    2273             :     {
    2274           0 :         strcpy(utlbuf, dimcheck);
    2275             :     }
    2276             :     else
    2277             :     {
    2278           0 :         strcat(utlbuf, ",");
    2279           0 :         strcat(utlbuf, dimcheck);
    2280             :     }
    2281           0 :     first = 0;
    2282             :       }
    2283             : 
    2284             :       /*
    2285             :        * Go to next dimension entry, find next comma, & free up
    2286             :        * dimcheck buffer
    2287             :        */
    2288           0 :             *comma = '\0';  /* zero out first comma  */
    2289           0 :             comma++;
    2290           0 :             comma = strchr(comma, ',');
    2291           0 :             if (comma != NULL)
    2292             :             {
    2293           0 :                for (i=0; i<(intn)strlen(dimcheck) + 1; i++)
    2294             :                {
    2295           0 :                   dimbuf++;
    2296           0 :                   cnt++;
    2297             :                }
    2298             :             }
    2299           0 :       free(dimcheck);
    2300             :   }
    2301           0 :         for(i=0; i<cnt; i++)
    2302           0 :            dimbuf--;
    2303             : 
    2304           0 :   free(dimbuf);
    2305             : 
    2306             : 
    2307             :   /* Check that UNLIMITED dimension is first dimension if present */
    2308             :   /* ------------------------------------------------------------ */
    2309           0 :   if (status == 0)
    2310             :   {
    2311           0 :       for (i = 0; i < rank; i++)
    2312             :       {
    2313           0 :     if (dims[i] == 0 && i != 0)
    2314             :     {
    2315           0 :         status = -1;
    2316           0 :         HEpush(DFE_GENAPP, "SWdefinefield", __FILE__, __LINE__);
    2317           0 :         HEreport("UNLIMITED dimension must be first dimension.\n");
    2318             :     }
    2319             :       }
    2320             :   }
    2321             : 
    2322             :   /* Check fieldname length */
    2323             :   /* ---------------------- */
    2324           0 :   if (status == 0)
    2325             :   {
    2326             : /* ((intn) strlen(fieldname) > MAX_NC_NAME - 7)
    2327             : ** this was changed because HDF4.1r3 made a change in the
    2328             : ** hlimits.h file.  We have notified NCSA and asked to have 
    2329             : ** it made the same as in previous versions of HDF
    2330             : ** see ncr 26314.  DaW  Apr 2000
    2331             : */
    2332             : 
    2333           0 :       if (((intn) strlen(fieldname) > VSNAMELENMAX && rank == 1) ||
    2334           0 :     ((intn) strlen(fieldname) > (256 - 7) && rank > 1))
    2335             :       {
    2336           0 :     status = -1;
    2337           0 :     HEpush(DFE_GENAPP, "SWdefinefield", __FILE__, __LINE__);
    2338           0 :     HEreport("Fieldname \"%s\" too long.\n", fieldname);
    2339             :       }
    2340             :   }
    2341             : 
    2342             :   /* Check for valid numbertype */
    2343             :   /* -------------------------- */
    2344           0 :   if (status == 0)
    2345             :   {
    2346           0 :       for (i = 0; i < 10; i++)
    2347             :       {
    2348           0 :     if (numbertype == good_number[i])
    2349             :     {
    2350           0 :         foundNT = 1;
    2351             :     }
    2352             :       }
    2353             : 
    2354           0 :       if (foundNT == 0)
    2355             :       {
    2356           0 :     HEpush(DFE_BADNUMTYPE, "SWdefinefield", __FILE__, __LINE__);
    2357           0 :     HEreport("Invalid number type: %d (%s).\n",
    2358             :        numbertype, fieldname);
    2359           0 :     status = -1;
    2360             :       }
    2361             :   }
    2362             : 
    2363             : 
    2364             :   /* Define Field */
    2365             :   /* ------------ */
    2366           0 :   if (status == 0)
    2367             :   {
    2368             :       /* Set factor & get Field Vgroup id */
    2369             :       /* -------------------------------- */
    2370           0 :       if (strcmp(fieldtype, "Geolocation Fields") == 0)
    2371             :       {
    2372           0 :     fac = -1;
    2373           0 :     vgid = SWXSwath[sID].VIDTable[0];
    2374             :       }
    2375             :       else
    2376             :       {
    2377           0 :     fac = +1;
    2378           0 :     vgid = SWXSwath[sID].VIDTable[1];
    2379             :       }
    2380             :       /*
    2381             :        * Note: "fac" is used to distinguish geo fields from data fields
    2382             :        * so that they are not merged together
    2383             :        */
    2384             : 
    2385             : 
    2386             :       /* One D Fields */
    2387             :       /* ------------ */
    2388           0 :       if (rank == 1)
    2389             :       {
    2390             :     /* No Compression for 1D (Vdata) fields */
    2391           0 :     compcode = HDFE_COMP_NONE;
    2392             : 
    2393             : 
    2394             :     /* If field non-appendable and merge set to AUTOMERGE ... */
    2395           0 :     if (dims[0] != 0 && merge == HDFE_AUTOMERGE)
    2396             :     {
    2397           0 :         i = 0;
    2398           0 :         found = 0;
    2399             : 
    2400             :         /* Loop through previous entries in 1d combination array */
    2401           0 :         while (SWX1dcomb[3 * i] != 0)
    2402             :         {
    2403             :       /* Get name of previous 1d combined field */
    2404           0 :       vdataID = SWX1dcomb[3 * i + 2];
    2405           0 :       VSgetname(vdataID, utlbuf);
    2406             : 
    2407             :       /*
    2408             :        * If dimension, field type (geo/data), and swath
    2409             :        * structure if current entry match a previous entry
    2410             :        * and combined name is less than max allowed then
    2411             :        * set "found" flag and exit loop
    2412             :        */
    2413           0 :       if (SWX1dcomb[3 * i] == fac * dims[0] &&
    2414           0 :           SWX1dcomb[3 * i + 1] == swVgrpID &&
    2415           0 :           (intn) strlen(utlbuf) +
    2416           0 :           (intn) strlen(fieldname) + 1 <=
    2417             :           VSNAMELENMAX)
    2418             :       {
    2419           0 :           found = 1;
    2420           0 :           break;
    2421             :       }
    2422             :       /* Increment loop index */
    2423           0 :       i++;
    2424             :         }
    2425             : 
    2426             : 
    2427           0 :         if (found == 0)
    2428             :         {
    2429             :       /*
    2430             :        * If no matching entry found then start new Vdata
    2431             :        * and store dimension size, swath root Vgroup ID,
    2432             :        * field Vdata and fieldname in external array
    2433             :        * "SWX1dcomb"
    2434             :        */
    2435           0 :       vdataID = VSattach(fid, -1, "w");
    2436           0 :       SWX1dcomb[3 * i] = fac * dims[0];
    2437           0 :       SWX1dcomb[3 * i + 1] = swVgrpID;
    2438           0 :       SWX1dcomb[3 * i + 2] = vdataID;
    2439           0 :       VSsetname(vdataID, fieldname);
    2440             :         }
    2441             :         else
    2442             :         {
    2443             :       /*
    2444             :        * If match then concatenate current fieldname to
    2445             :        * previous matching fieldnames.
    2446             :        */
    2447           0 :       strcat(utlbuf, ",");
    2448           0 :       strcat(utlbuf, fieldname);
    2449           0 :       VSsetname(vdataID, utlbuf);
    2450             :         }
    2451             : 
    2452             :         /* Define field as field within Vdata */
    2453           0 :         VSfdefine(vdataID, fieldname, numbertype, 1);
    2454           0 :         Vinsert(vgid, vdataID);
    2455             : 
    2456             :     }
    2457             :     else
    2458             :     {
    2459             :         /* 1d No Merge Section */
    2460             : 
    2461             :         /* Get new vdata ID and establish field within Vdata */
    2462           0 :         vdataID = VSattach(fid, -1, "w");
    2463           0 :         VSsetname(vdataID, fieldname);
    2464           0 :         VSfdefine(vdataID, fieldname, numbertype, 1);
    2465           0 :         VSsetfields(vdataID, fieldname);
    2466             : 
    2467           0 :         recSize = VSsizeof(vdataID, (char*) fieldname);
    2468           0 :         if (dims[0] == 0)
    2469             :         {
    2470             :       /*
    2471             :        * If appendable field then write single record
    2472             :        * filled with 255
    2473             :        */
    2474           0 :       oneDbuf = (uint8 *) calloc(recSize, 1);
    2475           0 :       if(oneDbuf == NULL)
    2476             :       { 
    2477           0 :           HEpush(DFE_NOSPACE,"SWdefinefield", __FILE__, __LINE__);
    2478           0 :           return(-1);
    2479             :       }
    2480           0 :       for (i = 0; i < recSize; i++)
    2481           0 :           oneDbuf[i] = 255;
    2482           0 :       VSwrite(vdataID, oneDbuf, 1, FULL_INTERLACE);
    2483             :         }
    2484             :         else
    2485             :         {
    2486             :       /*
    2487             :        * If non-appendable then write entire field with
    2488             :        * blank records
    2489             :        */
    2490           0 :       oneDbuf = (uint8 *) calloc(recSize, dims[0]);
    2491           0 :       if(oneDbuf == NULL)
    2492             :       { 
    2493           0 :           HEpush(DFE_NOSPACE,"SWdefinefield", __FILE__, __LINE__);
    2494           0 :           return(-1);
    2495             :       }
    2496           0 :       VSwrite(vdataID, oneDbuf, dims[0], FULL_INTERLACE);
    2497             :         }
    2498           0 :         free(oneDbuf);
    2499             : 
    2500             :         /* Insert Vdata into field Vgroup & detach */
    2501           0 :         Vinsert(vgid, vdataID);
    2502           0 :         VSdetach(vdataID);
    2503             : 
    2504             :     }   /* End No Merge Section */
    2505             : 
    2506             :       }     /* End 1d field Section */
    2507             :       else
    2508             :       {
    2509             :     /* SDS Interface (Multi-dim fields) */
    2510             :     /* -------------------------------- */
    2511             : 
    2512             :     /* Get current compression code */
    2513           0 :     compcode = SWXSwath[sID].compcode;
    2514             : 
    2515             :     /*
    2516             :      * If rank is less than or equal to 3 (and greater than 1)
    2517             :      * and AUTOMERGE is set and the first dimension is not
    2518             :      * appendable and the compression code is set to none then
    2519             :      * ...
    2520             :      */
    2521           0 :     if (rank <= 3 && merge == HDFE_AUTOMERGE && dims[0] != 0
    2522           0 :         && compcode == HDFE_COMP_NONE)
    2523             :     {
    2524             :         /* Find first empty slot in external combination array */
    2525             :         /* --------------------------------------------------- */
    2526           0 :         i = 0;
    2527           0 :         while (SWXSDcomb[5 * i] != 0)
    2528             :         {
    2529           0 :       i++;
    2530             :         }
    2531             : 
    2532             :         /*
    2533             :          * Store dimensions (with geo/data factor), swath root
    2534             :          * Vgroup ID, and number type in external combination
    2535             :          * array "SWXSDcomb"
    2536             :          */
    2537             : 
    2538           0 :         if (rank == 2)
    2539             :         {
    2540             :       /* If 2-dim field then set lowest dimension to +/- 1 */
    2541           0 :       SWXSDcomb[5 * i] = fac;
    2542           0 :       SWXSDcomb[5 * i + 1] = fac * dims[0];
    2543           0 :       SWXSDcomb[5 * i + 2] = fac * dims[1];
    2544             :         }
    2545             :         else
    2546             :         {
    2547           0 :       SWXSDcomb[5 * i] = fac * dims[0];
    2548           0 :       SWXSDcomb[5 * i + 1] = fac * dims[1];
    2549           0 :       SWXSDcomb[5 * i + 2] = fac * dims[2];
    2550             :         }
    2551             : 
    2552           0 :         SWXSDcomb[5 * i + 3] = swVgrpID;
    2553           0 :         SWXSDcomb[5 * i + 4] = numbertype;
    2554             : 
    2555             : 
    2556             :         /* Concatenate fieldname with combined name string */
    2557             :         /* ----------------------------------------------- */
    2558           0 :         if ((intn) strlen(SWXSDname) +
    2559           0 :       (intn) strlen(fieldname) + 2 < HDFE_NAMBUFSIZE)
    2560             :         {
    2561           0 :       strcat(SWXSDname, fieldname);
    2562           0 :       strcat(SWXSDname, ",");
    2563             :         }
    2564             :         else
    2565             :         {
    2566             :       /* SWXSDname array too small! */
    2567             :       /* -------------------------- */
    2568           0 :       HEpush(DFE_GENAPP, "SWdefinefield",
    2569             :              __FILE__, __LINE__);
    2570           0 :       HEreport(errbuf1);
    2571           0 :       status = -1;
    2572           0 :       return (status);
    2573             :         }
    2574             : 
    2575             : 
    2576             : 
    2577             :         /*
    2578             :          * If 2-dim field then set lowest dimension (in 3-dim
    2579             :          * array) to "ONE"
    2580             :          */
    2581           0 :         if (rank == 2)
    2582             :         {
    2583           0 :       if ((intn) strlen(SWXSDdims) + 5 < HDFE_DIMBUFSIZE)
    2584             :       {
    2585           0 :           strcat(SWXSDdims, "ONE,");
    2586             :       }
    2587             :       else
    2588             :       {
    2589             :           /* SWXSDdims array too small! */
    2590             :           /* -------------------------- */
    2591           0 :           HEpush(DFE_GENAPP, "SWdefinefield",
    2592             :            __FILE__, __LINE__);
    2593           0 :           HEreport(errbuf2);
    2594           0 :           status = -1;
    2595           0 :           return (status);
    2596             :       }
    2597             : 
    2598             :         }
    2599             : 
    2600             :         /*
    2601             :          * Concatenate field dimlist to merged dimlist and
    2602             :          * separate fields with semi-colon.
    2603             :          */
    2604           0 :         if ((intn) strlen(SWXSDdims) +
    2605           0 :       (intn) strlen(dimlist) + 2 < HDFE_DIMBUFSIZE)
    2606             :         {
    2607           0 :       strcat(SWXSDdims, dimlist);
    2608           0 :       strcat(SWXSDdims, ";");
    2609             :         }
    2610             :         else
    2611             :         {
    2612             :       /* SWXSDdims array too small! */
    2613             :       /* -------------------------- */
    2614           0 :       HEpush(DFE_GENAPP, "SWdefinefield",
    2615             :              __FILE__, __LINE__);
    2616           0 :       HEreport(errbuf2);
    2617           0 :       status = -1;
    2618           0 :       return (status);
    2619             :         }
    2620             : 
    2621             :     }   /* End Multi-Dim Merge Section */
    2622             :     else
    2623             :     {
    2624             :         /* Multi-Dim No Merge Section */
    2625             :         /* ========================== */
    2626             : 
    2627             :         /* Create SDS dataset */
    2628             :         /* ------------------ */
    2629           0 :         sdid = SDcreate(sdInterfaceID, fieldname,
    2630             :             numbertype, rank, dims);
    2631             : 
    2632             : 
    2633             :         /* Store Dimension Names in SDS */
    2634             :         /* ---------------------------- */
    2635           0 :         rank = EHparsestr(dimlist, ',', ptr, slen);
    2636           0 :         for (i = 0; i < rank; i++)
    2637             :         {
    2638             :       /* Dimension name = Swathname:Dimname */
    2639           0 :       memcpy(utlbuf, ptr[i], slen[i]);
    2640           0 :       utlbuf[slen[i]] = 0;
    2641           0 :       strcat(utlbuf, ":");
    2642           0 :       strcat(utlbuf, swathname);
    2643             : 
    2644           0 :       dimid = SDgetdimid(sdid, i);
    2645           0 :       SDsetdimname(dimid, utlbuf);
    2646             :         }
    2647             : 
    2648             : 
    2649             :         /* Setup compression parameters */
    2650           0 :         if (compcode == HDFE_COMP_NBIT)
    2651             :         {
    2652           0 :       c_info.nbit.nt = numbertype;
    2653           0 :       c_info.nbit.sign_ext = SWXSwath[sID].compparm[0];
    2654           0 :       c_info.nbit.fill_one = SWXSwath[sID].compparm[1];
    2655           0 :       c_info.nbit.start_bit = SWXSwath[sID].compparm[2];
    2656           0 :       c_info.nbit.bit_len = SWXSwath[sID].compparm[3];
    2657             :         }
    2658           0 :         else if (compcode == HDFE_COMP_SKPHUFF)
    2659             :         {
    2660           0 :       c_info.skphuff.skp_size = (intn) DFKNTsize(numbertype);
    2661             :         }
    2662           0 :         else if (compcode == HDFE_COMP_DEFLATE)
    2663             :         {
    2664           0 :       c_info.deflate.level = SWXSwath[sID].compparm[0];
    2665             :         }
    2666             : 
    2667             :         /* If field is compressed then call SDsetcompress */
    2668             :         /* ---------------------------------------------- */
    2669           0 :         if (compcode != HDFE_COMP_NONE)
    2670             :         {
    2671           0 :                         /* status = */ SDsetcompress(sdid, (comp_coder_t) compcode, &c_info);
    2672             :         }
    2673             : 
    2674             : 
    2675             :         /* Attach to Vgroup */
    2676             :         /* ---------------- */
    2677           0 :         Vaddtagref(vgid, DFTAG_NDG, SDidtoref(sdid));
    2678             : 
    2679             : 
    2680             :         /* Store SDS dataset IDs */
    2681             :         /* --------------------- */
    2682           0 :         if (SWXSwath[sID].nSDS > 0)
    2683             :         {
    2684           0 :       SWXSwath[sID].sdsID = (int32 *)
    2685           0 :           realloc((void *) SWXSwath[sID].sdsID,
    2686           0 :             (SWXSwath[sID].nSDS + 1) * 4);
    2687           0 :       if(SWXSwath[sID].sdsID == NULL)
    2688             :       { 
    2689           0 :           HEpush(DFE_NOSPACE,"SWdefinefield", __FILE__, __LINE__);
    2690           0 :           return(-1);
    2691             :       }
    2692             : 
    2693             :         }
    2694             :         else
    2695             :         {
    2696           0 :       SWXSwath[sID].sdsID = (int32 *) calloc(1, 4);
    2697           0 :       if(SWXSwath[sID].sdsID == NULL)
    2698             :       { 
    2699           0 :           HEpush(DFE_NOSPACE,"SWdefinefield", __FILE__, __LINE__);
    2700           0 :           return(-1);
    2701             :       }
    2702             :         }
    2703           0 :         SWXSwath[sID].sdsID[SWXSwath[sID].nSDS] = sdid;
    2704           0 :         SWXSwath[sID].nSDS++;
    2705             : 
    2706             :     }   /* End Multi-Dim No Merge Section */
    2707             : 
    2708             :       }     /* End Multi-Dim Section */
    2709             : 
    2710             : 
    2711             : 
    2712             :       /* Setup metadata string */
    2713             :       /* --------------------- */
    2714           0 :       snprintf(utlbuf, sizeof(utlbuf), "%s%s%s", fieldname, ":", dimlist);
    2715             : 
    2716             : 
    2717             :       /* Setup compression metadata */
    2718             :       /* -------------------------- */
    2719           0 :       if (compcode != HDFE_COMP_NONE)
    2720             :       {
    2721           0 :     snprintf(utlbuf2, sizeof(utlbuf2),
    2722             :       "%s%s",
    2723             :       ":\n\t\t\t\tCompressionType=", HDFcomp[compcode]);
    2724             : 
    2725           0 :     switch (compcode)
    2726             :     {
    2727           0 :     case HDFE_COMP_NBIT:
    2728             : 
    2729           0 :         snprintf(compparmbuf, sizeof(compparmbuf),
    2730             :           "%s%d,%d,%d,%d%s",
    2731             :           "\n\t\t\t\tCompressionParams=(",
    2732             :           SWXSwath[sID].compparm[0],
    2733             :           SWXSwath[sID].compparm[1],
    2734             :           SWXSwath[sID].compparm[2],
    2735             :           SWXSwath[sID].compparm[3], ")");
    2736           0 :         strcat(utlbuf2, compparmbuf);
    2737           0 :         break;
    2738             : 
    2739             : 
    2740           0 :     case HDFE_COMP_DEFLATE:
    2741             : 
    2742           0 :         snprintf(compparmbuf, sizeof(compparmbuf),
    2743             :           "%s%d",
    2744             :           "\n\t\t\t\tDeflateLevel=",
    2745             :           SWXSwath[sID].compparm[0]);
    2746           0 :         strcat(utlbuf2, compparmbuf);
    2747           0 :         break;
    2748             :     }
    2749             : 
    2750             :     /* Concatenate compression parameters with compression code */
    2751           0 :     strcat(utlbuf, utlbuf2);
    2752             :       }
    2753             : 
    2754             : 
    2755             :       /* Insert field metadata within File Structural Metadata */
    2756             :       /* ----------------------------------------------------- */
    2757           0 :       if (strcmp(fieldtype, "Geolocation Fields") == 0)
    2758             :       {
    2759           0 :     status = EHinsertmeta(sdInterfaceID, swathname, "s", 3L,
    2760             :               utlbuf, &numbertype);
    2761             :       }
    2762             :       else
    2763             :       {
    2764           0 :     status = EHinsertmeta(sdInterfaceID, swathname, "s", 4L,
    2765             :               utlbuf, &numbertype);
    2766             :       }
    2767             : 
    2768             :   }
    2769             :     }
    2770             : 
    2771             :     /* If all dimensions not found then report error */
    2772             :     /* --------------------------------------------- */
    2773           0 :     if (foundAllDim == 0)
    2774             :     {
    2775           0 :   HEpush(DFE_GENAPP, "SWdefinefield", __FILE__, __LINE__);
    2776           0 :   HEreport("Dimension(s): \"%s\" not found (%s).\n",
    2777             :      utlbuf, fieldname);
    2778           0 :   status = -1;
    2779             :     }
    2780             : 
    2781           0 :     return (status);
    2782             : }
    2783             : 
    2784             : 
    2785             : 
    2786             : 
    2787             : /*----------------------------------------------------------------------------|
    2788             : |  BEGIN_PROLOG                                                               |
    2789             : |                                                                             |
    2790             : |  FUNCTION: SWdefgeofield                                                    |
    2791             : |                                                                             |
    2792             : |  DESCRIPTION: Defines geolocation field within swath structure (wrapper)    |
    2793             : |                                                                             |
    2794             : |                                                                             |
    2795             : |  Return Value    Type     Units     Description                             |
    2796             : |  ============   ======  =========   =====================================   |
    2797             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2798             : |                                                                             |
    2799             : |  INPUTS:                                                                    |
    2800             : |  swathID        int32               swath structure ID                      |
    2801             : |  fieldname      char                fieldname                               |
    2802             : |  dimlist        char                Dimension list (comma-separated list)   |
    2803             : |  numbertype     int32               field type                              |
    2804             : |  merge          int32               merge code                              |
    2805             : |                                                                             |
    2806             : |  OUTPUTS:                                                                   |
    2807             : |             None                                                            |
    2808             : |                                                                             |
    2809             : |  NOTES:                                                                     |
    2810             : |                                                                             |
    2811             : |                                                                             |
    2812             : |   Date     Programmer   Description                                         |
    2813             : |  ======   ============  =================================================   |
    2814             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2815             : |                                                                             |
    2816             : |  END_PROLOG                                                                 |
    2817             : -----------------------------------------------------------------------------*/
    2818             : intn
    2819           0 : SWdefgeofield(int32 swathID, const char *fieldname, const char *dimlist,
    2820             :         int32 numbertype, int32 merge)
    2821             : {
    2822             :     intn            status; /* routine return status variable */
    2823             : 
    2824             :     /* Call SWdefinefield routine */
    2825             :     /* -------------------------- */
    2826           0 :     status = SWdefinefield(swathID, "Geolocation Fields", fieldname, dimlist,
    2827             :          numbertype, merge);
    2828             : 
    2829           0 :     return (status);
    2830             : }
    2831             : 
    2832             : 
    2833             : 
    2834             : 
    2835             : /*----------------------------------------------------------------------------|
    2836             : |  BEGIN_PROLOG                                                               |
    2837             : |                                                                             |
    2838             : |  FUNCTION: SWdefdatafield                                                   |
    2839             : |                                                                             |
    2840             : |  DESCRIPTION: Defines data field within swath structure (wrapper)           |
    2841             : |                                                                             |
    2842             : |                                                                             |
    2843             : |  Return Value    Type     Units     Description                             |
    2844             : |  ============   ======  =========   =====================================   |
    2845             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2846             : |                                                                             |
    2847             : |  INPUTS:                                                                    |
    2848             : |  swathID        int32               swath structure ID                      |
    2849             : |  fieldname      char                fieldname                               |
    2850             : |  dimlist        char                Dimension list (comma-separated list)   |
    2851             : |  numbertype     int32               field type                              |
    2852             : |  merge          int32               merge code                              |
    2853             : |                                                                             |
    2854             : |  OUTPUTS:                                                                   |
    2855             : |             None                                                            |
    2856             : |                                                                             |
    2857             : |  NOTES:                                                                     |
    2858             : |                                                                             |
    2859             : |                                                                             |
    2860             : |   Date     Programmer   Description                                         |
    2861             : |  ======   ============  =================================================   |
    2862             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2863             : |                                                                             |
    2864             : |  END_PROLOG                                                                 |
    2865             : -----------------------------------------------------------------------------*/
    2866             : intn
    2867           0 : SWdefdatafield(int32 swathID, const char *fieldname, const char *dimlist,
    2868             :          int32 numbertype, int32 merge)
    2869             : {
    2870             :     intn            status; /* routine return status variable */
    2871             : 
    2872             :     /* Call SWdefinefield routine */
    2873             :     /* -------------------------- */
    2874           0 :     status = SWdefinefield(swathID, "Data Fields", fieldname, dimlist,
    2875             :          numbertype, merge);
    2876             : 
    2877           0 :     return (status);
    2878             : }
    2879             : 
    2880             : 
    2881             : 
    2882             : 
    2883             : 
    2884             : /*----------------------------------------------------------------------------|
    2885             : |  BEGIN_PROLOG                                                               |
    2886             : |                                                                             |
    2887             : |  FUNCTION: SWwritegeometa                                                   |
    2888             : |                                                                             |
    2889             : |  DESCRIPTION: Defines structural metadata for pre-existing geolocation      |
    2890             : |               field within swath structure                                  |
    2891             : |                                                                             |
    2892             : |                                                                             |
    2893             : |  Return Value    Type     Units     Description                             |
    2894             : |  ============   ======  =========   =====================================   |
    2895             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2896             : |                                                                             |
    2897             : |  INPUTS:                                                                    |
    2898             : |  swathID        int32               swath structure ID                      |
    2899             : |  fieldname      char                fieldname                               |
    2900             : |  dimlist        char                Dimension list (comma-separated list)   |
    2901             : |  numbertype     int32               field type                              |
    2902             : |                                                                             |
    2903             : |                                                                             |
    2904             : |  OUTPUTS:                                                                   |
    2905             : |             None                                                            |
    2906             : |                                                                             |
    2907             : |  NOTES:                                                                     |
    2908             : |                                                                             |
    2909             : |                                                                             |
    2910             : |   Date     Programmer   Description                                         |
    2911             : |  ======   ============  =================================================   |
    2912             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2913             : |                                                                             |
    2914             : |  END_PROLOG                                                                 |
    2915             : -----------------------------------------------------------------------------*/
    2916             : intn
    2917           0 : SWwritegeometa(int32 swathID, const char *fieldname, const char *dimlist,
    2918             :          int32 numbertype)
    2919             : {
    2920           0 :     intn            status = 0; /* routine return status variable */
    2921             : 
    2922             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2923             :     int32           dum;  /* dummy variable */
    2924           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    2925             : 
    2926             :     char            utlbuf[256];/* Utility buffer */
    2927             :     char            swathname[80];  /* Swath name */
    2928             : 
    2929           0 :     status = SWchkswid(swathID, "SWwritegeometa", &dum, &sdInterfaceID,
    2930             :            &dum);
    2931             : 
    2932           0 :     if (status == 0)
    2933             :     {
    2934             :   /* Setup and write field metadata */
    2935             :   /* ------------------------------ */
    2936           0 :   snprintf(utlbuf, sizeof(utlbuf), "%s%s%s", fieldname, ":", dimlist);
    2937             : 
    2938           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    2939           0 :   status = EHinsertmeta(sdInterfaceID, swathname, "s", 3L,
    2940             :             utlbuf, &numbertype);
    2941             :     }
    2942             : 
    2943           0 :     return (status);
    2944             : }
    2945             : 
    2946             : 
    2947             : 
    2948             : 
    2949             : /*----------------------------------------------------------------------------|
    2950             : |  BEGIN_PROLOG                                                               |
    2951             : |                                                                             |
    2952             : |  FUNCTION: SWwritedatameta                                                  |
    2953             : |                                                                             |
    2954             : |  DESCRIPTION: Defines structural metadata for pre-existing data             |
    2955             : |               field within swath structure                                  |
    2956             : |                                                                             |
    2957             : |                                                                             |
    2958             : |  Return Value    Type     Units     Description                             |
    2959             : |  ============   ======  =========   =====================================   |
    2960             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2961             : |                                                                             |
    2962             : |  INPUTS:                                                                    |
    2963             : |  swathID        int32               swath structure ID                      |
    2964             : |  fieldname      char                fieldname                               |
    2965             : |  dimlist        char                Dimension list (comma-separated list)   |
    2966             : |  numbertype     int32               field type                              |
    2967             : |                                                                             |
    2968             : |                                                                             |
    2969             : |  OUTPUTS:                                                                   |
    2970             : |             None                                                            |
    2971             : |                                                                             |
    2972             : |  NOTES:                                                                     |
    2973             : |                                                                             |
    2974             : |                                                                             |
    2975             : |   Date     Programmer   Description                                         |
    2976             : |  ======   ============  =================================================   |
    2977             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2978             : |                                                                             |
    2979             : |  END_PROLOG                                                                 |
    2980             : -----------------------------------------------------------------------------*/
    2981             : intn
    2982           0 : SWwritedatameta(int32 swathID, const char *fieldname, const char *dimlist,
    2983             :     int32 numbertype)
    2984             : {
    2985           0 :     intn            status = 0; /* routine return status variable */
    2986             : 
    2987             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2988             :     int32           dum;  /* dummy variable */
    2989           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    2990             : 
    2991             :     char            utlbuf[256];/* Utility buffer */
    2992             :     char            swathname[80];  /* Swath name */
    2993             : 
    2994           0 :     status = SWchkswid(swathID, "SWwritedatameta", &dum, &sdInterfaceID,
    2995             :            &dum);
    2996             : 
    2997           0 :     if (status == 0)
    2998             :     {
    2999             :   /* Setup and write field metadata */
    3000             :   /* ------------------------------ */
    3001           0 :   snprintf(utlbuf, sizeof(utlbuf), "%s%s%s", fieldname, ":", dimlist);
    3002             : 
    3003           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    3004           0 :   status = EHinsertmeta(sdInterfaceID, swathname, "s", 4L,
    3005             :             utlbuf, &numbertype);
    3006             :     }
    3007           0 :     return (status);
    3008             : }
    3009             : 
    3010             : 
    3011             : 
    3012             : /*----------------------------------------------------------------------------|
    3013             : |  BEGIN_PROLOG                                                               |
    3014             : |                                                                             |
    3015             : |  FUNCTION: SWwrrdattr                                                       |
    3016             : |                                                                             |
    3017             : |  DESCRIPTION:                                                               |
    3018             : |                                                                             |
    3019             : |                                                                             |
    3020             : |  Return Value    Type     Units     Description                             |
    3021             : |  ============   ======  =========   =====================================   |
    3022             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3023             : |                                                                             |
    3024             : |  INPUTS:                                                                    |
    3025             : |  swathID        int32               swath structure ID                      |
    3026             : |  attrname       char                attribute name                          |
    3027             : |  numbertype     int32               attribute HDF numbertype                |
    3028             : |  count          int32               Number of attribute elements            |
    3029             : |  wrcode         char                Read/Write Code "w/r"                   |
    3030             : |  datbuf         void                I/O buffer                              |
    3031             : |                                                                             |
    3032             : |  OUTPUTS:                                                                   |
    3033             : |  datbuf                                                                     |
    3034             : |                                                                             |
    3035             : |  NOTES:                                                                     |
    3036             : |                                                                             |
    3037             : |                                                                             |
    3038             : |   Date     Programmer   Description                                         |
    3039             : |  ======   ============  =================================================   |
    3040             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3041             : |  Oct 96   Joel Gales    Get Attribute Vgroup ID from external array         |
    3042             : |                                                                             |
    3043             : |  END_PROLOG                                                                 |
    3044             : -----------------------------------------------------------------------------*/
    3045             : static intn
    3046           0 : SWwrrdattr(int32 swathID, const char *attrname, int32 numbertype, int32 count,
    3047             :      const char *wrcode, VOIDP datbuf)
    3048             : 
    3049             : {
    3050             :     intn            status; /* routine return status variable */
    3051             : 
    3052             :     int32           fid;  /* HDF-EOS file ID */
    3053             :     int32           attrVgrpID; /* Swath attribute ID */
    3054             :     int32           dum;  /* dummy variable */
    3055           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    3056             : 
    3057             :     /* Check Swath id */
    3058           0 :     status = SWchkswid(swathID, "SWwrrdattr", &fid, &dum, &dum);
    3059             : 
    3060           0 :     if (status == 0)
    3061             :     {
    3062             :   /* Get attribute Vgroup ID and call EHattr to perform I/O */
    3063             :   /* ------------------------------------------------------ */
    3064           0 :   attrVgrpID = SWXSwath[swathID % idOffset].VIDTable[2];
    3065           0 :   status = EHattr(fid, attrVgrpID, attrname, numbertype, count,
    3066             :       wrcode, datbuf);
    3067             :     }
    3068           0 :     return (status);
    3069             : }
    3070             : 
    3071             : 
    3072             : 
    3073             : /*----------------------------------------------------------------------------|
    3074             : |  BEGIN_PROLOG                                                               |
    3075             : |                                                                             |
    3076             : |  FUNCTION: SWwriteattr                                                      |
    3077             : |                                                                             |
    3078             : |  DESCRIPTION: Writes/updates attribute in a swath.                          |
    3079             : |                                                                             |
    3080             : |                                                                             |
    3081             : |  Return Value    Type     Units     Description                             |
    3082             : |  ============   ======  =========   =====================================   |
    3083             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3084             : |                                                                             |
    3085             : |  INPUTS:                                                                    |
    3086             : |  swathID        int32               swath structure ID                      |
    3087             : |  attrname       char                attribute name                          |
    3088             : |  numbertype     int32               attribute HDF numbertype                |
    3089             : |  count          int32               Number of attribute elements            |
    3090             : |  datbuf         void                I/O buffer                              |
    3091             : |                                                                             |
    3092             : |  OUTPUTS:                                                                   |
    3093             : |             None                                                            |
    3094             : |                                                                             |
    3095             : |  NOTES:                                                                     |
    3096             : |                                                                             |
    3097             : |                                                                             |
    3098             : |   Date     Programmer   Description                                         |
    3099             : |  ======   ============  =================================================   |
    3100             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3101             : |                                                                             |
    3102             : |  END_PROLOG                                                                 |
    3103             : -----------------------------------------------------------------------------*/
    3104             : intn
    3105           0 : SWwriteattr(int32 swathID, const char *attrname, int32 numbertype, int32 count,
    3106             :       VOIDP datbuf)
    3107             : {
    3108           0 :     intn            status = 0; /* routine return status variable */
    3109             : 
    3110             :     /* Call SWwrrdattr routine to write attribute */
    3111             :     /* ------------------------------------------ */
    3112           0 :     status = SWwrrdattr(swathID, attrname, numbertype, count, "w", datbuf);
    3113             : 
    3114           0 :     return (status);
    3115             : }
    3116             : 
    3117             : 
    3118             : 
    3119             : /*----------------------------------------------------------------------------|
    3120             : |  BEGIN_PROLOG                                                               |
    3121             : |                                                                             |
    3122             : |  FUNCTION: SWreadattr                                                       |
    3123             : |                                                                             |
    3124             : |  DESCRIPTION: Reads attribute from a swath.                                 |
    3125             : |                                                                             |
    3126             : |                                                                             |
    3127             : |  Return Value    Type     Units     Description                             |
    3128             : |  ============   ======  =========   =====================================   |
    3129             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3130             : |                                                                             |
    3131             : |  INPUTS:                                                                    |
    3132             : |  swathID        int32               swath structure ID                      |
    3133             : |  attrname       char                attribute name                          |
    3134             : |                                                                             |
    3135             : |  OUTPUTS:                                                                   |
    3136             : |  datbuf         void                I/O buffer                              |
    3137             : |                                                                             |
    3138             : |  NOTES:                                                                     |
    3139             : |                                                                             |
    3140             : |                                                                             |
    3141             : |   Date     Programmer   Description                                         |
    3142             : |  ======   ============  =================================================   |
    3143             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3144             : |                                                                             |
    3145             : |  END_PROLOG                                                                 |
    3146             : -----------------------------------------------------------------------------*/
    3147             : intn
    3148           0 : SWreadattr(int32 swathID, const char *attrname, VOIDP datbuf)
    3149             : {
    3150           0 :     intn            status = 0; /* routine return status variable */
    3151           0 :     int32           dum = 0;  /* dummy variable */
    3152             : 
    3153             :     /* Call SWwrrdattr routine to read attribute */
    3154             :     /* ----------------------------------------- */
    3155           0 :     status = SWwrrdattr(swathID, attrname, dum, dum, "r", datbuf);
    3156             : 
    3157           0 :     return (status);
    3158             : }
    3159             : 
    3160             : 
    3161             : 
    3162             : 
    3163             : 
    3164             : /*----------------------------------------------------------------------------|
    3165             : |  BEGIN_PROLOG                                                               |
    3166             : |                                                                             |
    3167             : |  FUNCTION: SWattrinfo                                                       |
    3168             : |                                                                             |
    3169             : |  DESCRIPTION:                                                               |
    3170             : |                                                                             |
    3171             : |                                                                             |
    3172             : |  Return Value    Type     Units     Description                             |
    3173             : |  ============   ======  =========   =====================================   |
    3174             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    3175             : |                                                                             |
    3176             : |  INPUTS:                                                                    |
    3177             : |  swathID        int32               swath structure ID                      |
    3178             : |  attrname       char                attribute name                          |
    3179             : |                                                                             |
    3180             : |  OUTPUTS:                                                                   |
    3181             : |  numbertype     int32               attribute HDF numbertype                |
    3182             : |  count          int32               Number of attribute elements            |
    3183             : |                                                                             |
    3184             : |                                                                             |
    3185             : |  OUTPUTS:                                                                   |
    3186             : |             None                                                            |
    3187             : |                                                                             |
    3188             : |  NOTES:                                                                     |
    3189             : |                                                                             |
    3190             : |                                                                             |
    3191             : |   Date     Programmer   Description                                         |
    3192             : |  ======   ============  =================================================   |
    3193             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3194             : |  Oct 96   Joel Gales    Get Attribute Vgroup ID from external array         |
    3195             : |                                                                             |
    3196             : |  END_PROLOG                                                                 |
    3197             : -----------------------------------------------------------------------------*/
    3198             : intn
    3199           0 : SWattrinfo(int32 swathID, const char *attrname, int32 * numbertype, int32 * count)
    3200             : {
    3201           0 :     intn            status = 0; /* routine return status variable */
    3202             : 
    3203             :     int32           fid;  /* HDF-EOS file ID */
    3204             :     int32           attrVgrpID; /* Swath attribute ID */
    3205             :     int32           dum;  /* dummy variable */
    3206           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    3207             : 
    3208             :     /* Check for valid swath ID */
    3209             :     /* ------------------------ */
    3210           0 :     status = SWchkswid(swathID, "SWattrinfo", &fid, &dum, &dum);
    3211             : 
    3212           0 :     if (status == 0)
    3213             :     {
    3214             :   /* Get attribute Vgroup ID and call EHattrinfo */
    3215             :   /* ------------------------------------------- */
    3216           0 :   attrVgrpID = SWXSwath[swathID % idOffset].VIDTable[2];
    3217             : 
    3218           0 :   status = EHattrinfo(fid, attrVgrpID, attrname, numbertype,
    3219             :           count);
    3220             :     }
    3221           0 :     return (status);
    3222             : }
    3223             : 
    3224             : 
    3225             : 
    3226             : 
    3227             : 
    3228             : 
    3229             : /*----------------------------------------------------------------------------|
    3230             : |  BEGIN_PROLOG                                                               |
    3231             : |                                                                             |
    3232             : |  FUNCTION: SWinqattrs                                                       |
    3233             : |                                                                             |
    3234             : |  DESCRIPTION:                                                               |
    3235             : |                                                                             |
    3236             : |                                                                             |
    3237             : |  Return Value    Type     Units     Description                             |
    3238             : |  ============   ======  =========   =====================================   |
    3239             : |  nattr          int32               Number of attributes in swath struct    |
    3240             : |                                                                             |
    3241             : |  INPUTS:                                                                    |
    3242             : |  swath ID       int32               swath structure ID                      |
    3243             : |                                                                             |
    3244             : |  OUTPUTS:                                                                   |
    3245             : |  attrnames      char                Attribute names in swath struct         |
    3246             : |                                     (Comma-separated list)                  |
    3247             : |  strbufsize     int32               Attributes name list string length      |
    3248             : |                                                                             |
    3249             : |  OUTPUTS:                                                                   |
    3250             : |             None                                                            |
    3251             : |                                                                             |
    3252             : |  NOTES:                                                                     |
    3253             : |                                                                             |
    3254             : |                                                                             |
    3255             : |   Date     Programmer   Description                                         |
    3256             : |  ======   ============  =================================================   |
    3257             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3258             : |  Oct 96   Joel Gales    Initialize nattr                                    |
    3259             : |  Oct 96   Joel Gales    Get Attribute Vgroup ID from external array         |
    3260             : |                                                                             |
    3261             : |  END_PROLOG                                                                 |
    3262             : -----------------------------------------------------------------------------*/
    3263             : int32
    3264           0 : SWinqattrs(int32 swathID, char *attrnames, int32 * strbufsize)
    3265             : {
    3266             :     intn            status; /* routine return status variable */
    3267             : 
    3268             :     int32           fid;  /* HDF-EOS file ID */
    3269             :     int32           attrVgrpID; /* Swath attribute ID */
    3270             :     int32           dum;  /* dummy variable */
    3271           0 :     int32           nattr = 0;  /* Number of attributes */
    3272           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    3273             : 
    3274             :     /* Check Swath id */
    3275           0 :     status = SWchkswid(swathID, "SWinqattrs", &fid, &dum, &dum);
    3276             : 
    3277           0 :     if (status == 0)
    3278             :     {
    3279             :   /* Get attribute Vgroup ID and call EHattrcat */
    3280             :   /* ------------------------------------------ */
    3281           0 :   attrVgrpID = SWXSwath[swathID % idOffset].VIDTable[2];
    3282             : 
    3283           0 :   nattr = EHattrcat(fid, attrVgrpID, attrnames, strbufsize);
    3284             :     }
    3285             : 
    3286           0 :     return (nattr);
    3287             : }
    3288             : 
    3289             : #define REMQUOTE(x) do { \
    3290             :     char* l_x = x; \
    3291             :     const size_t l_x_len = strlen(l_x); \
    3292             :     if (l_x_len >= 2 && l_x[0] == '"' && l_x[l_x_len - 1] == '"') {\
    3293             :         memmove(l_x, l_x + 1, l_x_len - 2); \
    3294             :         l_x[l_x_len - 2] = 0; \
    3295             :     } \
    3296             :   } while(0)
    3297             : 
    3298             : 
    3299             : /*----------------------------------------------------------------------------|
    3300             : |  BEGIN_PROLOG                                                               |
    3301             : |                                                                             |
    3302             : |  FUNCTION: SWinqdims                                                        |
    3303             : |                                                                             |
    3304             : |  DESCRIPTION: Returns dimension names and values defined in swath structure |
    3305             : |                                                                             |
    3306             : |                                                                             |
    3307             : |  Return Value    Type     Units     Description                             |
    3308             : |  ============   ======  =========   =====================================   |
    3309             : |  nDim           int32               Number of defined dimensions            |
    3310             : |                                                                             |
    3311             : |  INPUTS:                                                                    |
    3312             : |  swathID        int32               swath structure ID                      |
    3313             : |                                                                             |
    3314             : |  OUTPUTS:                                                                   |
    3315             : |  dimnames       char                Dimension names (comma-separated)       |
    3316             : |  dims           int32               Dimension values                        |
    3317             : |                                                                             |
    3318             : |  NOTES:                                                                     |
    3319             : |                                                                             |
    3320             : |                                                                             |
    3321             : |   Date     Programmer   Description                                         |
    3322             : |  ======   ============  =================================================   |
    3323             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3324             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    3325             : |  Feb 97   Joel Gales    Set nDim to -1 if status = -1                       |
    3326             : |                                                                             |
    3327             : |  END_PROLOG                                                                 |
    3328             : -----------------------------------------------------------------------------*/
    3329             : int32
    3330           0 : SWinqdims(int32 swathID, char *dimnames, int32 dims[])
    3331             : 
    3332             : {
    3333             :     intn            status; /* routine return status variable */
    3334             : 
    3335             :     int32           fid;  /* HDF-EOS file ID */
    3336             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    3337             :     int32           swVgrpID; /* Swath root Vgroup ID */
    3338             :     int32           size; /* Dimension size */
    3339           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    3340           0 :     int32           nDim = 0; /* Number of dimensions */
    3341             : 
    3342             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    3343             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    3344             :     char            swathname[80];  /* Swath Name */
    3345             :     char           *utlstr;     /* Utility string */
    3346             : 
    3347             : 
    3348             :     /* Allocate space for utility string */
    3349             :     /* --------------------------------- */
    3350           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    3351           0 :     if(utlstr == NULL)
    3352             :     { 
    3353           0 :   HEpush(DFE_NOSPACE,"SWinqdims", __FILE__, __LINE__);
    3354           0 :   return(-1);
    3355             :     }
    3356             : 
    3357             :     /* Check for valid swath id */
    3358           0 :     status = SWchkswid(swathID, "SWinqdims", &fid, &sdInterfaceID, &swVgrpID);
    3359             : 
    3360           0 :     if (status == 0)
    3361             :     {
    3362             :   /* If dimension names or sizes are desired ... */
    3363             :   /* ------------------------------------------- */
    3364           0 :   if (dimnames != NULL || dims != NULL)
    3365             :   {
    3366             :       /* Get swath name */
    3367           0 :       Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    3368             : 
    3369             :       /* Get pointers to "Dimension" section within SM */
    3370           0 :       metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    3371             :              "Dimension", metaptrs);
    3372           0 :       if(metabuf == NULL)
    3373             :       {
    3374           0 :     free(utlstr);
    3375           0 :     return(-1);
    3376             :       }
    3377             :       /* If dimension names are desired then "clear" name buffer */
    3378           0 :       if (dimnames != NULL)
    3379             :       {
    3380           0 :     dimnames[0] = 0;
    3381             :       }
    3382             : 
    3383             : 
    3384             :       /* Begin loop through dimension entries in metadata */
    3385             :       /* ------------------------------------------------ */
    3386             :       while (1)
    3387             :       {
    3388             :     /* Search for OBJECT string */
    3389           0 :     metaptrs[0] = strstr(metaptrs[0], "\t\tOBJECT=");
    3390             : 
    3391             :     /* If found within "Dimension" metadata section ... */
    3392           0 :     if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    3393             :     {
    3394             :         /* Get Dimension Name (if desired) */
    3395           0 :         if (dimnames != NULL)
    3396             :         {
    3397             :       /* Check 1st for old meta data then new */
    3398             :       /* ------------------------------------ */
    3399           0 :       EHgetmetavalue(metaptrs, "OBJECT", utlstr);
    3400             : 
    3401             :       /*
    3402             :        * If OBJECT value begins with double quote then old
    3403             :        * metadata, dimension name is OBJECT value.
    3404             :        * Otherwise search for "DimensionName" string
    3405             :        */
    3406           0 :       if (utlstr[0] != '"')
    3407             :       {
    3408           0 :           metaptrs[0] =
    3409           0 :         strstr(metaptrs[0], "\t\t\t\tDimensionName=");
    3410           0 :           EHgetmetavalue(metaptrs, "DimensionName", utlstr);
    3411             :       }
    3412             : 
    3413             :       /* Strip off double quotes */
    3414             :       /* ----------------------- */
    3415           0 :       REMQUOTE(utlstr);
    3416             : 
    3417             :       /* If not first name then add comma delimiter */
    3418           0 :           if (nDim > 0)
    3419             :       {
    3420           0 :           strcat(dimnames, ",");
    3421             :       }
    3422             :       /* Add dimension name to dimension list */
    3423           0 :       strcat(dimnames, utlstr);
    3424             :         }
    3425             : 
    3426             :         /* Get Dimension Size (if desired) */
    3427           0 :         if (dims != NULL)
    3428             :         {
    3429           0 :       EHgetmetavalue(metaptrs, "Size", utlstr);
    3430           0 :       size = atoi(utlstr);
    3431           0 :       dims[nDim] = size;
    3432             :         }
    3433             :         /* Increment number of dimensions */
    3434           0 :         nDim++;
    3435             :     }
    3436             :     else
    3437             :         /* No more dimensions found */
    3438             :     {
    3439             :         break;
    3440             :     }
    3441             :       }
    3442           0 :       free(metabuf);
    3443             :   }
    3444             :     }
    3445             : 
    3446             : 
    3447             :     /* Set nDim to -1 if error status exists */
    3448             :     /* ------------------------------------- */
    3449           0 :     if (status == -1)
    3450             :     {
    3451           0 :   nDim = -1;
    3452             :     }
    3453           0 :     free(utlstr);
    3454             : 
    3455           0 :     return (nDim);
    3456             : }
    3457             : 
    3458             : 
    3459             : 
    3460             : 
    3461             : 
    3462             : /*----------------------------------------------------------------------------|
    3463             : |  BEGIN_PROLOG                                                               |
    3464             : |                                                                             |
    3465             : |  FUNCTION: SWinqmaps                                                        |
    3466             : |                                                                             |
    3467             : |  DESCRIPTION: Returns dimension mappings and offsets and increments         |
    3468             : |                                                                             |
    3469             : |                                                                             |
    3470             : |  Return Value    Type     Units     Description                             |
    3471             : |  ============   ======  =========   =====================================   |
    3472             : |  nMap           int32               Number of dimension mappings            |
    3473             : |                                                                             |
    3474             : |  INPUTS:                                                                    |
    3475             : |  swathID        int32               swath structure ID                      |
    3476             : |                                                                             |
    3477             : |  OUTPUTS:                                                                   |
    3478             : |  dimmaps        char                dimension mappings (comma-separated)    |
    3479             : |  offset         int32               array of offsets                        |
    3480             : |  increment      int32               array of increments                     |
    3481             : |                                                                             |
    3482             : |  NOTES:                                                                     |
    3483             : |                                                                             |
    3484             : |                                                                             |
    3485             : |   Date     Programmer   Description                                         |
    3486             : |  ======   ============  =================================================   |
    3487             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3488             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    3489             : |  Feb 97   Joel Gales    Set nMap to -1 if status = -1                       |
    3490             : |                                                                             |
    3491             : |  END_PROLOG                                                                 |
    3492             : -----------------------------------------------------------------------------*/
    3493             : int32
    3494           0 : SWinqmaps(int32 swathID, char *dimmaps, int32 offset[], int32 increment[])
    3495             : 
    3496             : {
    3497             :     intn            status; /* routine return status variable */
    3498             : 
    3499             :     int32           fid;  /* HDF-EOS file ID */
    3500             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    3501             :     int32           swVgrpID; /* Swath root Vgroup ID */
    3502             :     int32           off;  /* Mapping Offset */
    3503             :     int32           incr; /* Mapping Increment */
    3504           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    3505           0 :     int32           nMap = 0; /* Number of mappings */
    3506             : 
    3507             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    3508             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    3509             :     char            swathname[80];  /* Swath Name */
    3510             :     char           *utlstr;     /* Utility string */
    3511             : 
    3512             : 
    3513             :     /* Allocate space for utility string */
    3514             :     /* --------------------------------- */
    3515           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    3516           0 :     if(utlstr == NULL)
    3517             :     { 
    3518           0 :   HEpush(DFE_NOSPACE,"SWinqmaps", __FILE__, __LINE__);
    3519           0 :   return(-1);
    3520             :     }
    3521             : 
    3522             :     /* Check for valid swath id */
    3523           0 :     status = SWchkswid(swathID, "SWinqmaps", &fid, &sdInterfaceID, &swVgrpID);
    3524           0 :     if (status == 0)
    3525             :     {
    3526             :   /* If mapping names or offsets or increments desired ... */
    3527             :   /* ----------------------------------------------------- */
    3528           0 :   if (dimmaps != NULL || offset != NULL || increment != NULL)
    3529             :   {
    3530             : 
    3531             :       /* Get swath name */
    3532           0 :       Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    3533             : 
    3534             :       /* Get pointers to "DimensionMap" section within SM */
    3535           0 :       metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    3536             :              "DimensionMap", metaptrs);
    3537           0 :       if(metabuf == NULL)
    3538             :       {
    3539           0 :     free(utlstr);
    3540           0 :     return(-1);
    3541             :       }
    3542             :       /* If mapping names are desired then "clear" name buffer */
    3543           0 :       if (dimmaps != NULL)
    3544             :       {
    3545           0 :     dimmaps[0] = 0;
    3546             :       }
    3547             : 
    3548             :       /* Begin loop through mapping entries in metadata */
    3549             :       /* ---------------------------------------------- */
    3550             :       while (1)
    3551             :       {
    3552             :     /* Search for OBJECT string */
    3553           0 :     metaptrs[0] = strstr(metaptrs[0], "\t\tOBJECT=");
    3554             : 
    3555             :     /* If found within "DimensionMap" metadata section ... */
    3556           0 :     if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    3557             :     {
    3558             :         /* Get Geo & Data Dimensions (if desired) */
    3559           0 :         if (dimmaps != NULL)
    3560             :         {
    3561             :       /* Get Geo Dim, remove quotes, add "/" */
    3562           0 :       EHgetmetavalue(metaptrs, "GeoDimension", utlstr);
    3563           0 :       REMQUOTE(utlstr);
    3564           0 :       strcat(utlstr, "/");
    3565             : 
    3566             :       /* If not first map then add comma delimiter. */
    3567           0 :       if (nMap > 0)
    3568             :       {
    3569           0 :           strcat(dimmaps, ",");
    3570             :       }
    3571             : 
    3572             :       /* Add to map list */
    3573           0 :       strcat(dimmaps, utlstr);
    3574             : 
    3575             :       /* Get Data Dim, remove quotes */
    3576           0 :       EHgetmetavalue(metaptrs, "DataDimension", utlstr);
    3577           0 :       REMQUOTE(utlstr);
    3578             : 
    3579             :       /* Add to map list */
    3580           0 :           strcat(dimmaps, utlstr);
    3581             :         }
    3582             : 
    3583             :         /* Get Offset (if desired) */
    3584           0 :         if (offset != NULL)
    3585             :         {
    3586           0 :       EHgetmetavalue(metaptrs, "Offset", utlstr);
    3587           0 :       off = atoi(utlstr);
    3588           0 :       offset[nMap] = off;
    3589             :         }
    3590             : 
    3591             :         /* Get Increment (if desired) */
    3592           0 :         if (increment != NULL)
    3593             :         {
    3594           0 :       EHgetmetavalue(metaptrs, "Increment", utlstr);
    3595           0 :       incr = atoi(utlstr);
    3596           0 :       increment[nMap] = incr;
    3597             :         }
    3598             : 
    3599             :         /* Increment number of maps */
    3600           0 :         nMap++;
    3601             :     }
    3602             :     else
    3603             :         /* No more mappings found */
    3604             :     {
    3605             :         break;
    3606             :     }
    3607             :       }
    3608           0 :       free(metabuf);
    3609             :   }
    3610             :     }
    3611             : 
    3612             : 
    3613             :     /* Set nMap to -1 if error status exists */
    3614             :     /* ------------------------------------- */
    3615           0 :     if (status == -1)
    3616             :     {
    3617           0 :   nMap = -1;
    3618             :     }
    3619           0 :     free(utlstr);
    3620             : 
    3621           0 :     return (nMap);
    3622             : }
    3623             : 
    3624             : 
    3625             : 
    3626             : 
    3627             : 
    3628             : /*----------------------------------------------------------------------------|
    3629             : |  BEGIN_PROLOG                                                               |
    3630             : |                                                                             |
    3631             : |  FUNCTION: SWinqidxmaps                                                     |
    3632             : |                                                                             |
    3633             : |  DESCRIPTION: Returns l_indexed mappings and l_index sizes                      |
    3634             : |                                                                             |
    3635             : |                                                                             |
    3636             : |  Return Value    Type     Units     Description                             |
    3637             : |  ============   ======  =========   =====================================   |
    3638             : |  nMap           int32               Number of l_indexed dimension mappings    |
    3639             : |                                                                             |
    3640             : |  INPUTS:                                                                    |
    3641             : |  swathID        int32               swath structure ID                      |
    3642             : |                                                                             |
    3643             : |  OUTPUTS:                                                                   |
    3644             : |  idxmaps        char                l_indexed dimension mappings              |
    3645             : |                                     (comma-separated)                       |
    3646             : |  idxsizes       int32               Number of elements in each mapping      |
    3647             : |                                                                             |
    3648             : |                                                                             |
    3649             : |  NOTES:                                                                     |
    3650             : |                                                                             |
    3651             : |                                                                             |
    3652             : |   Date     Programmer   Description                                         |
    3653             : |  ======   ============  =================================================   |
    3654             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3655             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    3656             : |  Feb 97   Joel Gales    Set nMap to -1 if status = -1                       |
    3657             : |                                                                             |
    3658             : |  END_PROLOG                                                                 |
    3659             : -----------------------------------------------------------------------------*/
    3660             : int32
    3661           0 : SWinqidxmaps(int32 swathID, char *idxmaps, int32 idxsizes[])
    3662             : 
    3663             : {
    3664             :     intn            status; /* routine return status variable */
    3665             : 
    3666             :     int32           fid;  /* HDF-EOS file ID */
    3667             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    3668             :     int32           swVgrpID; /* Swath root Vgroup ID */
    3669           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    3670           0 :     int32           nMap = 0; /* Number of mappings */
    3671             : 
    3672             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    3673             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    3674             :     char            swathname[80];  /* Swath Name */
    3675             :     char           *utlstr;     /* Utility string */
    3676             :     char           *slash;  /* Pointer to slash */
    3677             : 
    3678             : 
    3679             :     /* Allocate space for utility string */
    3680             :     /* --------------------------------- */
    3681           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    3682           0 :     if(utlstr == NULL)
    3683             :     { 
    3684           0 :   HEpush(DFE_NOSPACE,"SWinqidxmaps", __FILE__, __LINE__);
    3685           0 :   return(-1);
    3686             :     }
    3687             :     /* Check for valid swath id */
    3688           0 :     status = SWchkswid(swathID, "SWinqidxmaps", &fid,
    3689             :            &sdInterfaceID, &swVgrpID);
    3690             : 
    3691           0 :     if (status == 0)
    3692             :     {
    3693             :   /* If mapping names or l_index sizes desired ... */
    3694             :   /* ------------------------------------------- */
    3695           0 :   if (idxmaps != NULL || idxsizes != NULL)
    3696             :   {
    3697             :       /* Get swath name */
    3698           0 :       Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    3699             : 
    3700             :       /* Get pointers to "IndexDimensionMap" section within SM */
    3701           0 :       metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    3702             :              "IndexDimensionMap", metaptrs);
    3703           0 :       if(metabuf == NULL)
    3704             :       {
    3705           0 :     free(utlstr);
    3706           0 :     return(-1);
    3707             :       }
    3708             :       /* If mapping names are desired then "clear" name buffer */
    3709           0 :       if (idxmaps != NULL)
    3710             :       {
    3711           0 :     idxmaps[0] = 0;
    3712             :       }
    3713             : 
    3714             :       /* Begin loop through mapping entries in metadata */
    3715             :       /* ---------------------------------------------- */
    3716             :       while (1)
    3717             :       {
    3718             :     /* Search for OBJECT string */
    3719           0 :     metaptrs[0] = strstr(metaptrs[0], "\t\tOBJECT=");
    3720             : 
    3721             :     /* If found within "IndexDimensionMap" metadata section ... */
    3722           0 :     if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    3723             :     {
    3724             :         /* Get Geo & Data Dimensions and # of indices */
    3725           0 :         if (idxmaps != NULL)
    3726             :         {
    3727             :       /* Get Geo Dim, remove quotes, add "/" */
    3728           0 :       EHgetmetavalue(metaptrs, "GeoDimension", utlstr);
    3729           0 :       REMQUOTE(utlstr);
    3730           0 :       strcat(utlstr, "/");
    3731             : 
    3732             :       /* If not first map then add comma delimiter. */
    3733           0 :       if (nMap > 0)
    3734             :       {
    3735           0 :           strcat(idxmaps, ",");
    3736             :       }
    3737             : 
    3738             :       /* Add to map list */
    3739           0 :       strcat(idxmaps, utlstr);
    3740             : 
    3741             : 
    3742             :       /* Get Index size (if desired) */
    3743           0 :       if (idxsizes != NULL)
    3744             :       {
    3745             :           /* Parse off geo dimension and find its size */
    3746           0 :           slash = strchr(utlstr, '/');
    3747           0 :           *slash = 0;
    3748           0 :           idxsizes[nMap] = SWdiminfo(swathID, utlstr);
    3749             :       }
    3750             : 
    3751             : 
    3752             :       /* Get Data Dim, remove quotes */
    3753           0 :       EHgetmetavalue(metaptrs, "DataDimension", utlstr);
    3754           0 :       REMQUOTE(utlstr);
    3755             : 
    3756             :       /* Add to map list */
    3757           0 :           strcat(idxmaps, utlstr);
    3758             :         }
    3759             : 
    3760             :         /* Increment number of maps */
    3761           0 :         nMap++;
    3762             :     }
    3763             :     else
    3764             :         /* No more mappings found */
    3765             :     {
    3766             :         break;
    3767             :     }
    3768             :       }
    3769           0 :       free(metabuf);
    3770             :   }
    3771             :     }
    3772             : 
    3773             : 
    3774             :     /* Set nMap to -1 if error status exists */
    3775             :     /* ------------------------------------- */
    3776           0 :     if (status == -1)
    3777             :     {
    3778           0 :   nMap = -1;
    3779             :     }
    3780           0 :     free(utlstr);
    3781             : 
    3782           0 :     return (nMap);
    3783             : }
    3784             : 
    3785             : 
    3786             : 
    3787             : 
    3788             : /*----------------------------------------------------------------------------|
    3789             : |  BEGIN_PROLOG                                                               |
    3790             : |                                                                             |
    3791             : |  FUNCTION: SWinqfields                                                      |
    3792             : |                                                                             |
    3793             : |  DESCRIPTION: Returns fieldnames, ranks and numbertypes defined in swath.   |
    3794             : |                                                                             |
    3795             : |                                                                             |
    3796             : |  Return Value    Type     Units     Description                             |
    3797             : |  ============   ======  =========   =====================================   |
    3798             : |  nFld           int32               Number of (geo/data) fields in swath    |
    3799             : |                                                                             |
    3800             : |  INPUTS:                                                                    |
    3801             : |  swathID        int32               swath structure ID                      |
    3802             : |  fieldtype      char                field type (geo or data)                |
    3803             : |                                                                             |
    3804             : |                                                                             |
    3805             : |  OUTPUTS:                                                                   |
    3806             : |  fieldlist      char                Field names (comma-separated)           |
    3807             : |  rank           int32               Array of ranks                          |
    3808             : |  numbertype     int32               Array of HDF number types               |
    3809             : |                                                                             |
    3810             : |  NOTES:                                                                     |
    3811             : |                                                                             |
    3812             : |                                                                             |
    3813             : |   Date     Programmer   Description                                         |
    3814             : |  ======   ============  =================================================   |
    3815             : |  Jun 96   Joel Gales    Original Programmer                                 |
    3816             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    3817             : |  Feb 97   Joel Gales    Set nFld to -1 if status = -1                       |
    3818             : |                                                                             |
    3819             : |  END_PROLOG                                                                 |
    3820             : -----------------------------------------------------------------------------*/
    3821             : static int32
    3822           0 : SWinqfields(int32 swathID, const char *fieldtype, char *fieldlist, int32 rank[],
    3823             :       int32 numbertype[])
    3824             : 
    3825             : {
    3826             :     intn            status; /* routine return status variable */
    3827             : 
    3828             :     int32           fid;  /* HDF-EOS file ID */
    3829             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    3830             :     int32           swVgrpID; /* Swath root Vgroup ID */
    3831           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    3832           0 :     int32           nFld = 0; /* Number of mappings */
    3833             :     int32           slen[8];  /* String length array */
    3834             : 
    3835             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    3836             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    3837             :     char            swathname[80];  /* Swath Name */
    3838             :     char           *utlstr; /* Utility string */
    3839             :     char           *utlstr2;  /* Utility string 2 */
    3840             :     char           *ptr[8]; /* String pointer array */
    3841             : 
    3842             : 
    3843             :     /* Allocate space for utility string */
    3844             :     /* --------------------------------- */
    3845           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    3846           0 :     if(utlstr == NULL)
    3847             :     { 
    3848           0 :   HEpush(DFE_NOSPACE,"SWinqfields", __FILE__, __LINE__);
    3849           0 :   return(-1);
    3850             :     }
    3851             : 
    3852           0 :     utlstr2 = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    3853           0 :     if(utlstr2 == NULL)
    3854             :     { 
    3855           0 :   HEpush(DFE_NOSPACE,"SWinqfields", __FILE__, __LINE__);
    3856           0 :   free(utlstr);
    3857           0 :   return(-1);
    3858             :     }
    3859             : 
    3860             :     /* Check for valid swath id */
    3861           0 :     status = SWchkswid(swathID, "SWinqfields",
    3862             :            &fid, &sdInterfaceID, &swVgrpID);
    3863             : 
    3864           0 :     if (status == 0)
    3865             :     {
    3866             :   /* If field names, ranks,  or number types desired ... */
    3867             :   /* --------------------------------------------------- */
    3868           0 :   if (fieldlist != NULL || rank != NULL || numbertype != NULL)
    3869             :   {
    3870             :       /* Get swath name */
    3871           0 :       Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    3872             : 
    3873             :       /* Get pointers to "GeoField" or "DataField" section within SM */
    3874           0 :       if (strcmp(fieldtype, "Geolocation Fields") == 0)
    3875             :       {
    3876           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    3877             :                  "GeoField", metaptrs);
    3878           0 :     if(metabuf == NULL)
    3879             :     {
    3880           0 :         free(utlstr);
    3881           0 :         free(utlstr2);
    3882           0 :         return(-1);
    3883             :     }
    3884           0 :     strcpy(utlstr2, "GeoFieldName");
    3885             :       }
    3886             :       else
    3887             :       {
    3888           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    3889             :                  "DataField", metaptrs);
    3890           0 :     if(metabuf == NULL)
    3891             :     {
    3892           0 :         free(utlstr);
    3893           0 :         free(utlstr2);
    3894           0 :         return(-1);
    3895             :     }
    3896           0 :     strcpy(utlstr2, "DataFieldName");
    3897             :       }
    3898             : 
    3899             : 
    3900             :       /* If field names are desired then "clear" name buffer */
    3901           0 :       if (fieldlist != NULL)
    3902             :       {
    3903           0 :     fieldlist[0] = 0;
    3904             :       }
    3905             : 
    3906             : 
    3907             :       /* Begin loop through mapping entries in metadata */
    3908             :       /* ---------------------------------------------- */
    3909             :       while (1)
    3910             :       {
    3911             :     /* Search for OBJECT string */
    3912           0 :     metaptrs[0] = strstr(metaptrs[0], "\t\tOBJECT=");
    3913             : 
    3914             :     /* If found within "Geo" or "Data" Field metadata section .. */
    3915           0 :     if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    3916             :     {
    3917             :         /* Get Fieldnames (if desired) */
    3918           0 :         if (fieldlist != NULL)
    3919             :         {
    3920             :       /* Check 1st for old meta data then new */
    3921             :       /* ------------------------------------ */
    3922           0 :       EHgetmetavalue(metaptrs, "OBJECT", utlstr);
    3923             : 
    3924             :       /*
    3925             :        * If OBJECT value begins with double quote then old
    3926             :        * metadata, field name is OBJECT value. Otherwise
    3927             :        * search for "GeoFieldName" or "DataFieldName"
    3928             :        * string
    3929             :        */
    3930             : 
    3931           0 :       if (utlstr[0] != '"')
    3932             :       {
    3933           0 :           strcpy(utlstr, "\t\t\t\t");
    3934           0 :           strcat(utlstr, utlstr2);
    3935           0 :           strcat(utlstr, "=");
    3936           0 :           metaptrs[0] = strstr(metaptrs[0], utlstr);
    3937           0 :           EHgetmetavalue(metaptrs, utlstr2, utlstr);
    3938             :       }
    3939             : 
    3940             :       /* Strip off double quotes */
    3941             :       /* ----------------------- */
    3942           0 :       REMQUOTE(utlstr);
    3943             : 
    3944             : 
    3945             :       /* Add to fieldlist */
    3946             :       /* ---------------- */
    3947           0 :           if (nFld > 0)
    3948             :       {
    3949           0 :           strcat(fieldlist, ",");
    3950             :       }
    3951           0 :       strcat(fieldlist, utlstr);
    3952             : 
    3953             :         }
    3954             :         /* Get Numbertype */
    3955           0 :         if (numbertype != NULL)
    3956             :         {
    3957           0 :       EHgetmetavalue(metaptrs, "DataType", utlstr);
    3958           0 :       numbertype[nFld] = EHnumstr(utlstr);
    3959             :         }
    3960             :         /*
    3961             :          * Get Rank (if desired) by counting # of dimensions in
    3962             :          * "DimList" string
    3963             :          */
    3964           0 :         if (rank != NULL)
    3965             :         {
    3966           0 :       EHgetmetavalue(metaptrs, "DimList", utlstr);
    3967           0 :       rank[nFld] = EHparsestr(utlstr, ',', ptr, slen);
    3968             :         }
    3969             :         /* Increment number of fields */
    3970           0 :         nFld++;
    3971             :     }
    3972             :     else
    3973             :         /* No more fields found */
    3974             :     {
    3975             :         break;
    3976             :     }
    3977             :       }
    3978           0 :       free(metabuf);
    3979             :   }
    3980             :     }
    3981             : 
    3982             :     /* Set nFld to -1 if error status exists */
    3983             :     /* ------------------------------------- */
    3984           0 :     if (status == -1)
    3985             :     {
    3986           0 :   nFld = -1;
    3987             :     }
    3988             : 
    3989           0 :     free(utlstr);
    3990           0 :     free(utlstr2);
    3991             : 
    3992           0 :     return (nFld);
    3993             : }
    3994             : 
    3995             : 
    3996             : 
    3997             : 
    3998             : /*----------------------------------------------------------------------------|
    3999             : |  BEGIN_PROLOG                                                               |
    4000             : |                                                                             |
    4001             : |  FUNCTION: SWinqgeofields                                                   |
    4002             : |                                                                             |
    4003             : |  DESCRIPTION: Inquires about geo fields in swath                            |
    4004             : |                                                                             |
    4005             : |                                                                             |
    4006             : |  Return Value    Type     Units     Description                             |
    4007             : |  ============   ======  =========   =====================================   |
    4008             : |  nflds          int32               Number of geo fields in swath           |
    4009             : |                                                                             |
    4010             : |  INPUTS:                                                                    |
    4011             : |  swathID        int32               swath structure ID                      |
    4012             : |                                                                             |
    4013             : |  OUTPUTS:                                                                   |
    4014             : |  fieldlist      char                Field names (comma-separated)           |
    4015             : |  rank           int32               Array of ranks                          |
    4016             : |  numbertype     int32               Array of HDF number types               |
    4017             : |                                                                             |
    4018             : |  NOTES:                                                                     |
    4019             : |                                                                             |
    4020             : |                                                                             |
    4021             : |   Date     Programmer   Description                                         |
    4022             : |  ======   ============  =================================================   |
    4023             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4024             : |                                                                             |
    4025             : |  END_PROLOG                                                                 |
    4026             : -----------------------------------------------------------------------------*/
    4027             : int32
    4028           0 : SWinqgeofields(int32 swathID, char *fieldlist, int32 rank[],
    4029             :          int32 numbertype[])
    4030             : {
    4031             : 
    4032             :     int32           nflds;  /* Number of Geolocation fields */
    4033             : 
    4034             :     /* Call "SWinqfields" routine */
    4035             :     /* -------------------------- */
    4036           0 :     nflds = SWinqfields(swathID, "Geolocation Fields", fieldlist, rank,
    4037             :       numbertype);
    4038             : 
    4039           0 :     return (nflds);
    4040             : 
    4041             : }
    4042             : 
    4043             : 
    4044             : 
    4045             : 
    4046             : /*----------------------------------------------------------------------------|
    4047             : |  BEGIN_PROLOG                                                               |
    4048             : |                                                                             |
    4049             : |  FUNCTION: SWinqdatafields                                                  |
    4050             : |                                                                             |
    4051             : |  DESCRIPTION: Inquires about data fields in swath                           |
    4052             : |                                                                             |
    4053             : |                                                                             |
    4054             : |  Return Value    Type     Units     Description                             |
    4055             : |  ============   ======  =========   =====================================   |
    4056             : |  nflds          int32               Number of data fields in swath          |
    4057             : |                                                                             |
    4058             : |  INPUTS:                                                                    |
    4059             : |  swathID        int32               swath structure ID                      |
    4060             : |                                                                             |
    4061             : |  OUTPUTS:                                                                   |
    4062             : |  fieldlist      char                Field names (comma-separated)           |
    4063             : |  rank           int32               Array of ranks                          |
    4064             : |  numbertype     int32               Array of HDF number types               |
    4065             : |                                                                             |
    4066             : |  NOTES:                                                                     |
    4067             : |                                                                             |
    4068             : |                                                                             |
    4069             : |   Date     Programmer   Description                                         |
    4070             : |  ======   ============  =================================================   |
    4071             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4072             : |                                                                             |
    4073             : |  END_PROLOG                                                                 |
    4074             : -----------------------------------------------------------------------------*/
    4075             : int32
    4076           0 : SWinqdatafields(int32 swathID, char *fieldlist, int32 rank[],
    4077             :     int32 numbertype[])
    4078             : {
    4079             : 
    4080             :     int32           nflds;  /* Number of Data fields */
    4081             : 
    4082             :     /* Call "SWinqfields" routine */
    4083             :     /* -------------------------- */
    4084           0 :     nflds = SWinqfields(swathID, "Data Fields", fieldlist, rank,
    4085             :       numbertype);
    4086             : 
    4087           0 :     return (nflds);
    4088             : 
    4089             : }
    4090             : 
    4091             : 
    4092             : 
    4093             : 
    4094             : /*----------------------------------------------------------------------------|
    4095             : |  BEGIN_PROLOG                                                               |
    4096             : |                                                                             |
    4097             : |  FUNCTION: SWnentries                                                       |
    4098             : |                                                                             |
    4099             : |  DESCRIPTION: Returns number of entries and string buffer size              |
    4100             : |                                                                             |
    4101             : |                                                                             |
    4102             : |  Return Value    Type     Units     Description                             |
    4103             : |  ============   ======  =========   =====================================   |
    4104             : |  nEntries       int32               Number of entries                       |
    4105             : |                                                                             |
    4106             : |  INPUTS:                                                                    |
    4107             : |  swathID        int32               swath structure ID                      |
    4108             : |  entrycode      int32               Entry code                              |
    4109             : |                               HDFE_NENTDIM  (0)                       |
    4110             : |                               HDFE_NENTMAP  (1)                       |
    4111             : |                               HDFE_NENTIMAP (2)                       |
    4112             : |                               HDFE_NENTGFLD (3)                       |
    4113             : |                               HDFE_NENTDFLD (4)                       |
    4114             : |                                                                             |
    4115             : |                                                                             |
    4116             : |  OUTPUTS:                                                                   |
    4117             : |  strbufsize     int32               Length of comma-separated list          |
    4118             : |                                     (Does not include null-terminator       |
    4119             : |                                                                             |
    4120             : |  NOTES:                                                                     |
    4121             : |                                                                             |
    4122             : |                                                                             |
    4123             : |   Date     Programmer   Description                                         |
    4124             : |  ======   ============  =================================================   |
    4125             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4126             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    4127             : |  Feb 97   Joel Gales    Set nEntries to -1 if status = -1                   |
    4128             : |                                                                             |
    4129             : |  END_PROLOG                                                                 |
    4130             : -----------------------------------------------------------------------------*/
    4131             : int32
    4132           0 : SWnentries(int32 swathID, int32 entrycode, int32 * strbufsize)
    4133             : 
    4134             : {
    4135             :     intn            status;     /* routine return status variable */
    4136             :     intn            i;        /* Loop index */
    4137             : 
    4138             :     int32           fid;      /* HDF-EOS file ID */
    4139             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    4140             :     int32           swVgrpID;     /* Swath root Vgroup ID */
    4141           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    4142           0 :     int32           nEntries = 0;   /* Number of entries */
    4143             :     int32           metaflag;     /* Old (0), New (1) metadata flag) */
    4144           0 :     int32           nVal = 0;     /* Number of strings to search for */
    4145             : 
    4146           0 :     char           *metabuf = NULL; /* Pointer to structural metadata (SM) */
    4147             :     char           *metaptrs[2];    /* Pointers to begin and end of SM section */
    4148             :     char            swathname[80];  /* Swath Name */
    4149             :     char           *utlstr;     /* Utility string */
    4150             :     char            valName[2][32]; /* Strings to search for */
    4151             : 
    4152             :     /* Allocate space for utility string */
    4153             :     /* --------------------------------- */
    4154           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    4155           0 :     if(utlstr == NULL)
    4156             :     { 
    4157           0 :   HEpush(DFE_NOSPACE,"SWnemtries", __FILE__, __LINE__);
    4158           0 :   return(-1);
    4159             :     }
    4160             :     /* Check for valid swath id */
    4161             :     /* ------------------------ */
    4162           0 :     status = SWchkswid(swathID, "SWnentries", &fid, &sdInterfaceID, &swVgrpID);
    4163             : 
    4164           0 :     if (status == 0)
    4165             :     {
    4166             :   /* Get swath name */
    4167           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
    4168             : 
    4169             :   /* Zero out string buffer size */
    4170           0 :   *strbufsize = 0;
    4171             : 
    4172             : 
    4173             :   /*
    4174             :    * Get pointer to relevant section within SM and Get names of
    4175             :    * metadata strings to inquire about
    4176             :    */
    4177           0 :   switch (entrycode)
    4178             :   {
    4179           0 :   case HDFE_NENTDIM:
    4180             :       /* Dimensions */
    4181             :       {
    4182           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    4183             :                  "Dimension", metaptrs);
    4184           0 :     if(metabuf == NULL)
    4185             :     {
    4186           0 :         free(utlstr);
    4187           0 :         return(-1);
    4188             :     }
    4189           0 :     nVal = 1;
    4190           0 :     strcpy(&valName[0][0], "DimensionName");
    4191             :       }
    4192           0 :       break;
    4193             : 
    4194           0 :   case HDFE_NENTMAP:
    4195             :       /* Dimension Maps */
    4196             :       {
    4197           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    4198             :                  "DimensionMap", metaptrs);
    4199           0 :     if(metabuf == NULL)
    4200             :     {
    4201           0 :         free(utlstr);
    4202           0 :         return(-1);
    4203             :     }
    4204           0 :     nVal = 2;
    4205           0 :     strcpy(&valName[0][0], "GeoDimension");
    4206           0 :     strcpy(&valName[1][0], "DataDimension");
    4207             :       }
    4208           0 :       break;
    4209             : 
    4210           0 :   case HDFE_NENTIMAP:
    4211             :       /* Indexed Dimension Maps */
    4212             :       {
    4213           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    4214             :                "IndexDimensionMap", metaptrs);
    4215           0 :     if(metabuf == NULL)
    4216             :     {
    4217           0 :         free(utlstr);
    4218           0 :         return(-1);
    4219             :     }
    4220           0 :     nVal = 2;
    4221           0 :     strcpy(&valName[0][0], "GeoDimension");
    4222           0 :     strcpy(&valName[1][0], "DataDimension");
    4223             :       }
    4224           0 :       break;
    4225             : 
    4226           0 :   case HDFE_NENTGFLD:
    4227             :       /* Geolocation Fields */
    4228             :       {
    4229           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    4230             :                  "GeoField", metaptrs);
    4231           0 :     if(metabuf == NULL)
    4232             :     {
    4233           0 :         free(utlstr);
    4234           0 :         return(-1);
    4235             :     }
    4236           0 :     nVal = 1;
    4237           0 :     strcpy(&valName[0][0], "GeoFieldName");
    4238             :       }
    4239           0 :       break;
    4240             : 
    4241           0 :   case HDFE_NENTDFLD:
    4242             :       /* Data Fields */
    4243             :       {
    4244           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    4245             :                  "DataField", metaptrs);
    4246           0 :     if(metabuf == NULL)
    4247             :     {
    4248           0 :         free(utlstr);
    4249           0 :         return(-1);
    4250             :     }
    4251           0 :     nVal = 1;
    4252           0 :     strcpy(&valName[0][0], "DataFieldName");
    4253             :       }
    4254           0 :       break;
    4255             :   }
    4256             : 
    4257             : 
    4258             :   /*
    4259             :    * Check for presence of 'GROUP="' string If found then old metadata,
    4260             :    * search on OBJECT string
    4261             :    */
    4262           0 :         if (metabuf)
    4263             :         {
    4264           0 :             metaflag = (strstr(metabuf, "GROUP=\"") == NULL) ? 1 : 0;
    4265           0 :             if (metaflag == 0)
    4266             :             {
    4267           0 :                 nVal = 1;
    4268           0 :                 strcpy(&valName[0][0], "\t\tOBJECT");
    4269             :             }
    4270             : 
    4271             : 
    4272             :             /* Begin loop through entries in metadata */
    4273             :             /* -------------------------------------- */
    4274             :             while (1)
    4275             :             {
    4276             :                 /* Search for first string */
    4277           0 :                 strcpy(utlstr, &valName[0][0]);
    4278           0 :                 strcat(utlstr, "=");
    4279           0 :                 metaptrs[0] = strstr(metaptrs[0], utlstr);
    4280             : 
    4281             :                 /* If found within relevant metadata section ... */
    4282           0 :                 if (metaptrs[0] < metaptrs[1] && metaptrs[0] != NULL)
    4283             :                 {
    4284           0 :                     for (i = 0; i < nVal; i++)
    4285             :                     {
    4286             :                         /*
    4287             :                          * Get all string values Don't count quotes
    4288             :                          */
    4289           0 :                         EHgetmetavalue(metaptrs, &valName[i][0], utlstr);
    4290           0 :                         *strbufsize += (int32)strlen(utlstr) - 2;
    4291             :                     }
    4292             :                     /* Increment number of entries */
    4293           0 :                     nEntries++;
    4294             : 
    4295             :                     /* Go to end of OBJECT */
    4296           0 :                     metaptrs[0] = strstr(metaptrs[0], "END_OBJECT");
    4297             :                 }
    4298             :                 else
    4299             :                     /* No more entries found */
    4300             :                 {
    4301             :                     break;
    4302             :                 }
    4303             :             }
    4304           0 :             free(metabuf);
    4305             :         }
    4306             : 
    4307             : 
    4308             :   /* Count comma separators & slashes (if mappings) */
    4309             :   /* ---------------------------------------------- */
    4310           0 :   if (nEntries > 0)
    4311             :   {
    4312           0 :       *strbufsize += nEntries - 1;
    4313           0 :       *strbufsize += (nVal - 1) * nEntries;
    4314             :   }
    4315             :     }
    4316             : 
    4317             : 
    4318             :     /* Set nEntries to -1 if error status exists */
    4319             :     /* ----------------------------------------- */
    4320           0 :     if (status == -1)
    4321           0 :   nEntries = -1;
    4322             : 
    4323           0 :     free(utlstr);
    4324             : 
    4325           0 :     return (nEntries);
    4326             : }
    4327             : 
    4328             : 
    4329             : 
    4330             : 
    4331             : 
    4332             : /*----------------------------------------------------------------------------|
    4333             : |  BEGIN_PROLOG                                                               |
    4334             : |                                                                             |
    4335             : |  FUNCTION: SWinqswath                                                       |
    4336             : |                                                                             |
    4337             : |  DESCRIPTION: Returns number and names of swath structures in file          |
    4338             : |                                                                             |
    4339             : |                                                                             |
    4340             : |  Return Value    Type     Units     Description                             |
    4341             : |  ============   ======  =========   =====================================   |
    4342             : |  nSwath         int32               Number of swath structures in file      |
    4343             : |                                                                             |
    4344             : |  INPUTS:                                                                    |
    4345             : |  filename       char                HDF-EOS filename                        |
    4346             : |                                                                             |
    4347             : |  OUTPUTS:                                                                   |
    4348             : |  swathlist      char                List of swath names (comma-separated)   |
    4349             : |  strbufsize     int32               Length of swathlist                     |
    4350             : |                                                                             |
    4351             : |  NOTES:                                                                     |
    4352             : |                                                                             |
    4353             : |                                                                             |
    4354             : |   Date     Programmer   Description                                         |
    4355             : |  ======   ============  =================================================   |
    4356             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4357             : |                                                                             |
    4358             : |  END_PROLOG                                                                 |
    4359             : -----------------------------------------------------------------------------*/
    4360             : int32
    4361           4 : SWinqswath(const char *filename, char *swathlist, int32 * strbufsize)
    4362             : {
    4363             :     int32           nSwath; /* Number of swath structures in file */
    4364             : 
    4365             :     /* Call "EHinquire" routine */
    4366             :     /* ------------------------ */
    4367           4 :     nSwath = EHinquire(filename, "SWATH", swathlist, strbufsize);
    4368             : 
    4369           4 :     return (nSwath);
    4370             : }
    4371             : 
    4372             : 
    4373             : 
    4374             : /*----------------------------------------------------------------------------|
    4375             : |  BEGIN_PROLOG                                                               |
    4376             : |                                                                             |
    4377             : |  FUNCTION: SW1dfldsrch                                                      |
    4378             : |                                                                             |
    4379             : |  DESCRIPTION: Retrieves information about a 1D field                        |
    4380             : |                                                                             |
    4381             : |                                                                             |
    4382             : |  Return Value    Type     Units     Description                             |
    4383             : |  ============   ======  =========   =====================================   |
    4384             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    4385             : |                                                                             |
    4386             : |  INPUTS:                                                                    |
    4387             : |  fid            int32               HDF-EOS file ID                         |
    4388             : |  swathID        int32               swath structure ID                      |
    4389             : |  fieldname      const char          field name                              |
    4390             : |  access         const char          Access code (w/r)                       |
    4391             : |                                                                             |
    4392             : |                                                                             |
    4393             : |  OUTPUTS:                                                                   |
    4394             : |  vgidout        int32               Field (geo/data) vgroup ID              |
    4395             : |  vdataIDout     int32               Field Vdata ID                          |
    4396             : |  fldtype        int32               Field type                              |
    4397             : |                                                                             |
    4398             : |  NOTES:                                                                     |
    4399             : |                                                                             |
    4400             : |                                                                             |
    4401             : |   Date     Programmer   Description                                         |
    4402             : |  ======   ============  =================================================   |
    4403             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4404             : |                                                                             |
    4405             : |  END_PROLOG                                                                 |
    4406             : -----------------------------------------------------------------------------*/
    4407             : static intn
    4408           0 : SW1dfldsrch(int32 fid, int32 swathID, const char *fieldname, const char *i_access,
    4409             :       int32 * vgidout, int32 * vdataIDout, int32 * fldtype)
    4410             : 
    4411             : {
    4412           0 :     intn            status = 0; /* routine return status variable */
    4413             : 
    4414             :     int32           sID;  /* SwathID - offset */
    4415             :     int32           vgid; /* Swath Geo or Data Vgroup ID */
    4416             :     int32           vdataID;  /* 1d field vdata */
    4417           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    4418             : 
    4419             : 
    4420             :     /* Compute "reduced" swath ID */
    4421             :     /* -------------------------- */
    4422           0 :     sID = swathID % idOffset;
    4423             : 
    4424             : 
    4425             :     /* Get Geolocation Vgroup id and 1D field name Vdata id */
    4426             :     /* ---------------------------------------------------- */
    4427           0 :     vgid = SWXSwath[sID].VIDTable[0];
    4428           0 :     vdataID = EHgetid(fid, vgid, fieldname, 1, i_access);
    4429           0 :     *fldtype = 0;
    4430             : 
    4431             : 
    4432             :     /*
    4433             :      * If name not found in Geolocation Vgroup then detach Geolocation Vgroup
    4434             :      * and search in Data Vgroup
    4435             :      */
    4436           0 :     if (vdataID == -1)
    4437             :     {
    4438           0 :   vgid = SWXSwath[sID].VIDTable[1];;
    4439           0 :   vdataID = EHgetid(fid, vgid, fieldname, 1, i_access);
    4440           0 :   *fldtype = 1;
    4441             : 
    4442             :   /* If field also not found in Data Vgroup then set error status */
    4443             :   /* ------------------------------------------------------------ */
    4444           0 :   if (vdataID == -1)
    4445             :   {
    4446           0 :       status = -1;
    4447           0 :       vgid = -1;
    4448           0 :       vdataID = -1;
    4449             :   }
    4450             :     }
    4451           0 :     *vgidout = vgid;
    4452           0 :     *vdataIDout = vdataID;
    4453             : 
    4454           0 :     return (status);
    4455             : }
    4456             : 
    4457             : 
    4458             : 
    4459             : 
    4460             : 
    4461             : /*----------------------------------------------------------------------------|
    4462             : |  BEGIN_PROLOG                                                               |
    4463             : |                                                                             |
    4464             : |  FUNCTION: SWSDfldsrch                                                      |
    4465             : |                                                                             |
    4466             : |  DESCRIPTION: Retrieves information SDS field                               |
    4467             : |                                                                             |
    4468             : |                                                                             |
    4469             : |  Return Value    Type     Units     Description                             |
    4470             : |  ============   ======  =========   =====================================   |
    4471             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    4472             : |                                                                             |
    4473             : |  INPUTS:                                                                    |
    4474             : |  swathID        int32               swath structure ID                      |
    4475             : |  sdInterfaceID  int32               SD interface ID                         |
    4476             : |  fieldname      const char          field name                              |
    4477             : |                                                                             |
    4478             : |                                                                             |
    4479             : |  OUTPUTS:                                                                   |
    4480             : |  sdid           int32               SD element ID                           |
    4481             : |  rankSDS        int32               Rank of SDS                             |
    4482             : |  rankFld        int32               True rank of field (merging)            |
    4483             : |  offset         int32               Offset of field within merged field     |
    4484             : |  dims           int32               Dimensions of field                     |
    4485             : |  solo           int32               Solo field flag                         |
    4486             : |                                                                             |
    4487             : |  NOTES:                                                                     |
    4488             : |                                                                             |
    4489             : |                                                                             |
    4490             : |   Date     Programmer   Description                                         |
    4491             : |  ======   ============  =================================================   |
    4492             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4493             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    4494             : |                                                                             |
    4495             : |  END_PROLOG                                                                 |
    4496             : -----------------------------------------------------------------------------*/
    4497             : static intn
    4498           0 : SWSDfldsrch(int32 swathID, int32 sdInterfaceID, const char *fieldname,
    4499             :             int32 * sdid, int32 * rankSDS, int32 * rankFld, int32 * offset,
    4500             :             int32 dims[], int32 * solo)
    4501             : {
    4502             :     intn            i;    /* Loop index */
    4503           0 :     intn            status = -1;/* routine return status variable */
    4504             : 
    4505             :     int32           sID;  /* SwathID - offset */
    4506           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    4507             :     int32           dum;  /* Dummy variable */
    4508             :     int32           dums[128];  /* Dummy array */
    4509             :     int32           attrIndex;  /* Attribute l_index */
    4510             : 
    4511             :     char            name[2048]; /* Merged-Field Names */
    4512             :     char            swathname[80];  /* Swath Name */
    4513             :     char           *utlstr; /* Utility string */
    4514             :     char           *metabuf;  /* Pointer to structural metadata (SM) */
    4515             :     char           *metaptrs[2];/* Pointers to begin and end of SM section */
    4516             :     char           *oldmetaptr; /* Pointer within SM section */
    4517             : 
    4518             : 
    4519             :     /* Allocate space for utility string */
    4520             :     /* --------------------------------- */
    4521           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
    4522           0 :     if(utlstr == NULL)
    4523             :     { 
    4524           0 :   HEpush(DFE_NOSPACE,"SWSDfldsrch", __FILE__, __LINE__);
    4525           0 :   return(-1);
    4526             :     }
    4527             :     /* Set solo flag to 0 (no) */
    4528             :     /* ----------------------- */
    4529           0 :     *solo = 0;
    4530             : 
    4531             : 
    4532             :     /* Compute "reduced" swath ID */
    4533             :     /* -------------------------- */
    4534           0 :     sID = swathID % idOffset;
    4535             : 
    4536             : 
    4537             :     /* Loop through all SDSs in swath */
    4538             :     /* ------------------------------ */
    4539           0 :     for (i = 0; i < SWXSwath[sID].nSDS; i++)
    4540             :     {
    4541             :   /* If active SDS ... */
    4542             :   /* ----------------- */
    4543           0 :   if (SWXSwath[sID].sdsID[i] != 0)
    4544             :   {
    4545             :       /* Get SDS ID, name, rankSDS, and dimensions */
    4546             :       /* ----------------------------------------- */
    4547           0 :       *sdid = SWXSwath[sID].sdsID[i];
    4548           0 :       SDgetinfo(*sdid, name, rankSDS, dims, &dum, &dum);
    4549           0 :       *rankFld = *rankSDS;
    4550             : 
    4551             :       /* If merged field ... */
    4552             :       /* ------------------- */
    4553           0 :       if (strstr(name, "MRGFLD_") == &name[0])
    4554             :       {
    4555             :     /* Get swath name */
    4556             :     /* -------------- */
    4557           0 :     Vgetname(SWXSwath[sID].IDTable, swathname);
    4558             : 
    4559             : 
    4560             :     /* Get pointers to "MergedFields" section within SM */
    4561             :     /* ------------------------------------------------ */
    4562           0 :     metabuf = (char *) EHmetagroup(sdInterfaceID, swathname, "s",
    4563             :                  "MergedFields", metaptrs);
    4564           0 :     if(metabuf == NULL)
    4565             :     {
    4566           0 :         free(utlstr);
    4567           0 :         return(-1);
    4568             :     }
    4569             : 
    4570             :     /* Store metaptr in order to recover */
    4571             :     /* --------------------------------- */
    4572           0 :     oldmetaptr = metaptrs[0];
    4573             : 
    4574             : 
    4575             :     /* Search for Merged field name */
    4576             :     /* ---------------------------- */
    4577           0 :     snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%.480s%s", "MergedFieldName=\"",
    4578             :       name, "\"\n");
    4579           0 :     metaptrs[0] = strstr(metaptrs[0], utlstr);
    4580             : 
    4581             : 
    4582             :     /* If not found check for old metadata */
    4583             :     /* ----------------------------------- */
    4584           0 :     if (metaptrs[0] == NULL)
    4585             :     {
    4586           0 :         snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%.480s%s", "OBJECT=\"", name, "\"\n");
    4587           0 :         metaptrs[0] = strstr(oldmetaptr, utlstr);
    4588             :     }
    4589             : 
    4590             : 
    4591             :     /* Get field list and strip off leading and trailing quotes */
    4592           0 :     EHgetmetavalue(metaptrs, "FieldList", name);  /* not return status --xhua */
    4593           0 :     memmove(name, name + 1, strlen(name) - 2);
    4594           0 :     name[strlen(name) - 2] = 0;
    4595             : 
    4596             :     /* Search for desired field within merged field list */
    4597           0 :     snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s%s", "\"", fieldname, "\"");
    4598           0 :     dum = EHstrwithin(utlstr, name, ',');
    4599             : 
    4600           0 :     free(metabuf);
    4601             :       }
    4602             :       else
    4603             :       {
    4604             :     /* If solo (unmerged) check if SDS name matches fieldname */
    4605             :     /* ------------------------------------------------------ */
    4606           0 :     dum = EHstrwithin(fieldname, name, ',');
    4607           0 :     if (dum != -1)
    4608             :     {
    4609           0 :         *solo = 1;
    4610           0 :         *offset = 0;
    4611             :     }
    4612             :       }
    4613             : 
    4614             : 
    4615             :       /* If field found ... */
    4616             :       /* ------------------ */
    4617           0 :       if (dum != -1)
    4618             :       {
    4619           0 :     status = 0;
    4620             : 
    4621             :     /* If merged field ... */
    4622             :     /* ------------------- */
    4623           0 :     if (*solo == 0)
    4624             :     {
    4625             :         /* Get "Field Offsets" SDS attribute l_index */
    4626             :         /* --------------------------------------- */
    4627           0 :         attrIndex = SDfindattr(*sdid, "Field Offsets");
    4628             : 
    4629             :         /*
    4630             :          * If attribute exists then get offset of desired field
    4631             :          * within merged field
    4632             :          */
    4633           0 :         if (attrIndex != -1)
    4634             :         {
    4635           0 :       SDreadattr(*sdid, attrIndex, (VOIDP) dums);
    4636           0 :       *offset = dums[dum];
    4637             :         }
    4638             : 
    4639             : 
    4640             :         /* Get "Field Dims" SDS attribute l_index */
    4641             :         /* ------------------------------------ */
    4642           0 :         attrIndex = SDfindattr(*sdid, "Field Dims");
    4643             : 
    4644             :         /*
    4645             :          * If attribute exists then get 0th dimension of desired
    4646             :          * field within merged field
    4647             :          */
    4648           0 :         if (attrIndex != -1)
    4649             :         {
    4650           0 :       SDreadattr(*sdid, attrIndex, (VOIDP) dums);
    4651           0 :       dims[0] = dums[dum];
    4652             : 
    4653             :       /* If this dimension = 1 then field is really 2 dim */
    4654             :       /* ------------------------------------------------ */
    4655           0 :       if (dums[dum] == 1)
    4656             :       {
    4657           0 :           *rankFld = 2;
    4658             :       }
    4659             :         }
    4660             :     }
    4661             : 
    4662             : 
    4663             :     /* Break out of SDS loop */
    4664             :     /* --------------------- */
    4665           0 :     break;
    4666             :       }     /* End of found field section */
    4667             :   }
    4668             :   else
    4669             :   {
    4670             :       /* First non-active SDS signifies no more, break out of SDS loop */
    4671             :       /* ------------------------------------------------------------- */
    4672           0 :       break;
    4673             :   }
    4674             :     }
    4675             : 
    4676           0 :     free(utlstr);
    4677             : 
    4678           0 :     return (status);
    4679             : }
    4680             : 
    4681             : 
    4682             : 
    4683             : 
    4684             : 
    4685             : /*----------------------------------------------------------------------------|
    4686             : |  BEGIN_PROLOG                                                               |
    4687             : |                                                                             |
    4688             : |  FUNCTION: SWwrrdfield                                                      |
    4689             : |                                                                             |
    4690             : |  DESCRIPTION: Writes/Reads fields                                           |
    4691             : |                                                                             |
    4692             : |                                                                             |
    4693             : |  Return Value    Type     Units     Description                             |
    4694             : |  ============   ======  =========   =====================================   |
    4695             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    4696             : |                                                                             |
    4697             : |  INPUTS:                                                                    |
    4698             : |  swathID        int32               swath structure ID                      |
    4699             : |  fieldname      const char          fieldname                               |
    4700             : |  code           const char          Write/Read code (w/r)                   |
    4701             : |  start          int32               start array                             |
    4702             : |  stride         int32               stride array                            |
    4703             : |  edge           int32               edge array                              |
    4704             : |  datbuf         void                data buffer for read                    |
    4705             : |                                                                             |
    4706             : |                                                                             |
    4707             : |  OUTPUTS:                                                                   |
    4708             : |  datbuf         void                data buffer for write                   |
    4709             : |                                                                             |
    4710             : |  NOTES:                                                                     |
    4711             : |                                                                             |
    4712             : |                                                                             |
    4713             : |   Date     Programmer   Description                                         |
    4714             : |  ======   ============  =================================================   |
    4715             : |  Jun 96   Joel Gales    Original Programmer                                 |
    4716             : |  Feb 97   Joel Gales    Stride = 1 HDF compression workaround               |
    4717             : |                                                                             |
    4718             : |  END_PROLOG                                                                 |
    4719             : -----------------------------------------------------------------------------*/
    4720             : static intn
    4721           0 : SWwrrdfield(int32 swathID, const char *fieldname, const char *code,
    4722             :       int32 start[], int32 stride[], int32 edge[], VOIDP datbuf)
    4723             : 
    4724             : {
    4725             :     intn            i;    /* Loop index */
    4726           0 :     intn            status = 0; /* routine return status variable */
    4727             : 
    4728             :     int32           fid;  /* HDF-EOS file ID */
    4729             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    4730             :     int32           vgid; /* Swath Geo or Data Vgroup ID */
    4731             :     int32           sdid; /* SDS ID */
    4732             :     int32           dum;  /* Dummy variable */
    4733             :     int32           rankSDS;  /* Rank of SDS */
    4734             :     int32           rankFld;  /* Rank of field */
    4735             : 
    4736             :     int32           vdataID;  /* 1d field vdata */
    4737             :     int32           recsize;  /* Vdata record size */
    4738             :     int32           fldsize;  /* Field size */
    4739             :     int32           nrec; /* Number of records in Vdata */
    4740             : 
    4741             :     int32           offset[8];  /* I/O offset (start) */
    4742             :     int32           incr[8];  /* I/O increment (stride) */
    4743             :     int32           count[8]; /* I/O count (edge) */
    4744             :     int32           dims[8];  /* Field/SDS dimensions */
    4745             :     int32           mrgOffset;  /* Merged field offset */
    4746             :     int32           nflds;  /* Number of fields in Vdata */
    4747             :     int32           strideOne;  /* Strides = 1 flag */
    4748             : 
    4749             :     uint8          *buf;  /* I/O (transfer) buffer */
    4750             :     uint8          *fillbuf;  /* Fill value buffer */
    4751             : 
    4752             :     char            attrName[80]; /* Name of fill value attribute */
    4753             :     char           *ptr[64];  /* String pointer array */
    4754             :     char            fieldlist[256]; /* Vdata field list */
    4755             : 
    4756             : 
    4757             :     /* Check for valid swath ID */
    4758             :     /* ------------------------ */
    4759           0 :     status = SWchkswid(swathID, "SWwrrdfield", &fid, &sdInterfaceID, &dum);
    4760             : 
    4761             : 
    4762           0 :     if (status == 0)
    4763             :     {
    4764             : 
    4765             :   /* Check whether fieldname is in SDS (multi-dim field) */
    4766             :   /* --------------------------------------------------- */
    4767           0 :   status = SWSDfldsrch(swathID, sdInterfaceID, fieldname, &sdid,
    4768             :            &rankSDS, &rankFld, &mrgOffset, dims, &dum);
    4769             : 
    4770             :   /* Multi-Dimensional Field Section */
    4771             :   /* ------------------------------- */
    4772           0 :   if (status != -1)
    4773             :   {
    4774             :       /* Set I/O offset Section */
    4775             :       /* ---------------------- */
    4776             : 
    4777             :       /*
    4778             :        * If start == NULL (default) set I/O offset of 0th field to
    4779             :        * offset within merged field (if any) and the rest to 0
    4780             :        */
    4781           0 :       if (start == NULL)
    4782             :       {
    4783           0 :     for (i = 0; i < rankSDS; i++)
    4784             :     {
    4785           0 :         offset[i] = 0;
    4786             :     }
    4787           0 :     offset[0] = mrgOffset;
    4788             :       }
    4789             :       else
    4790             :       {
    4791             :     /*
    4792             :      * ... otherwise set I/O offset to user values, adjusting the
    4793             :      * 0th field with the merged field offset (if any)
    4794             :      */
    4795           0 :     if (rankFld == rankSDS)
    4796             :     {
    4797           0 :         for (i = 0; i < rankSDS; i++)
    4798             :         {
    4799           0 :       offset[i] = start[i];
    4800             :         }
    4801           0 :         offset[0] += mrgOffset;
    4802             :     }
    4803             :     else
    4804             :     {
    4805             :         /*
    4806             :          * If field really 2-dim merged in 3-dim field then set
    4807             :          * 0th field offset to merge offset and then next two to
    4808             :          * the user values
    4809             :          */
    4810           0 :         for (i = 0; i < rankFld; i++)
    4811             :         {
    4812           0 :       offset[i + 1] = start[i];
    4813             :         }
    4814           0 :         offset[0] = mrgOffset;
    4815             :     }
    4816             :       }
    4817             : 
    4818             : 
    4819             : 
    4820             :       /* Set I/O stride Section */
    4821             :       /* ---------------------- */
    4822             : 
    4823             :       /*
    4824             :        * If stride == NULL (default) set I/O stride to 1
    4825             :        */
    4826           0 :       if (stride == NULL)
    4827             :       {
    4828           0 :     for (i = 0; i < rankSDS; i++)
    4829             :     {
    4830           0 :         incr[i] = 1;
    4831             :     }
    4832             :       }
    4833             :       else
    4834             :       {
    4835             :     /*
    4836             :      * ... otherwise set I/O stride to user values
    4837             :      */
    4838           0 :     if (rankFld == rankSDS)
    4839             :     {
    4840           0 :         for (i = 0; i < rankSDS; i++)
    4841             :         {
    4842           0 :       incr[i] = stride[i];
    4843             :         }
    4844             :     }
    4845             :     else
    4846             :     {
    4847             :         /*
    4848             :          * If field really 2-dim merged in 3-dim field then set
    4849             :          * 0th field stride to 1 and then next two to the user
    4850             :          * values.
    4851             :          */
    4852           0 :         for (i = 0; i < rankFld; i++)
    4853             :         {
    4854           0 :       incr[i + 1] = stride[i];
    4855             :         }
    4856           0 :         incr[0] = 1;
    4857             :     }
    4858             :       }
    4859             : 
    4860             : 
    4861             : 
    4862             :       /* Set I/O count Section */
    4863             :       /* --------------------- */
    4864             : 
    4865             :       /*
    4866             :        * If edge == NULL (default) set I/O count to number of remaining
    4867             :        * entries (dims - start) / increment.  Note that 0th field
    4868             :        * offset corrected for merged field offset (if any).
    4869             :        */
    4870           0 :       if (edge == NULL)
    4871             :       {
    4872           0 :     for (i = 1; i < rankSDS; i++)
    4873             :     {
    4874           0 :         count[i] = (dims[i] - offset[i]) / incr[i];
    4875             :     }
    4876           0 :     count[0] = (dims[0] - (offset[0] - mrgOffset)) / incr[0];
    4877             :       }
    4878             :       else
    4879             :       {
    4880             :     /*
    4881             :      * ... otherwise set I/O count to user values
    4882             :      */
    4883           0 :     if (rankFld == rankSDS)
    4884             :     {
    4885           0 :         for (i = 0; i < rankSDS; i++)
    4886             :         {
    4887           0 :       count[i] = edge[i];
    4888             :         }
    4889             :     }
    4890             :     else
    4891             :     {
    4892             :         /*
    4893             :          * If field really 2-dim merged in 3-dim field then set
    4894             :          * 0th field count to 1 and then next two to the user
    4895             :          * values.
    4896             :          */
    4897           0 :         for (i = 0; i < rankFld; i++)
    4898             :         {
    4899           0 :       count[i + 1] = edge[i];
    4900             :         }
    4901           0 :         count[0] = 1;
    4902             :     }
    4903             :       }
    4904             : 
    4905             :       /* Perform I/O with relevant HDF I/O routine */
    4906             :       /* ----------------------------------------- */
    4907           0 :       if (strcmp(code, "w") == 0)
    4908             :       {
    4909             :     /* Set strideOne to true (1) */
    4910             :     /* ------------------------- */
    4911           0 :     strideOne = 1;
    4912             : 
    4913             : 
    4914             :     /* If incr[i] != 1 set strideOne to false (0) */
    4915             :     /* ------------------------------------------ */
    4916           0 :     for (i = 0; i < rankSDS; i++)
    4917             :     {
    4918           0 :         if (incr[i] != 1)
    4919             :         {
    4920           0 :       strideOne = 0;
    4921           0 :       break;
    4922             :         }
    4923             :     }
    4924             : 
    4925             : 
    4926             :     /*
    4927             :      * If strideOne is true use NULL parameter for stride. This
    4928             :      * is a work-around to HDF compression problem
    4929             :      */
    4930           0 :     if (strideOne == 1)
    4931             :     {
    4932           0 :         status = SDwritedata(sdid, offset, NULL, count,
    4933             :            (VOIDP) datbuf);
    4934             :     }
    4935             :     else
    4936             :     {
    4937           0 :         status = SDwritedata(sdid, offset, incr, count,
    4938             :            (VOIDP) datbuf);
    4939             :     }
    4940             :       }
    4941             :       else
    4942             :       {
    4943           0 :     status = SDreaddata(sdid, offset, incr, count,
    4944             :             (VOIDP) datbuf);
    4945             :       }
    4946             :   }     /* End of Multi-Dimensional Field Section */
    4947             :   else
    4948             :   {
    4949             : 
    4950             :       /* One-Dimensional Field Section */
    4951             :       /* ----------------------------- */
    4952             : 
    4953             :       /* Check fieldname within 1d field Vgroups */
    4954             :       /* --------------------------------------- */
    4955           0 :       status = SW1dfldsrch(fid, swathID, fieldname, code,
    4956             :          &vgid, &vdataID, &dum);
    4957             : 
    4958           0 :       if (status != -1)
    4959             :       {
    4960             : 
    4961             :     /* Get number of records */
    4962             :     /* --------------------- */
    4963           0 :     nrec = VSelts(vdataID);
    4964             : 
    4965             : 
    4966             :     /* Set offset, increment, & count */
    4967             :     /* ------------------------------ */
    4968           0 :     offset[0] = (start == NULL) ? 0 : start[0];
    4969           0 :     incr[0] = (stride == NULL) ? 1 : stride[0];
    4970           0 :     count[0] = (edge == NULL)
    4971           0 :         ? (nrec - offset[0]) / incr[0]
    4972           0 :         : edge[0];
    4973             : 
    4974             : 
    4975             : 
    4976             :     /* Write Section */
    4977             :     /* ------------- */
    4978           0 :     if (strcmp(code, "w") == 0)
    4979             :     {
    4980             :         /* Get size of field and setup fill buffer */
    4981             :         /* --------------------------------------- */
    4982           0 :         fldsize = VSsizeof(vdataID, (char *)fieldname);
    4983           0 :         fillbuf = (uint8 *) calloc(fldsize, 1);
    4984           0 :         if(fillbuf == NULL)
    4985             :         { 
    4986           0 :       HEpush(DFE_NOSPACE,"SWwrrdfield", __FILE__, __LINE__);
    4987           0 :       return(-1);
    4988             :         }
    4989             : 
    4990             :         /* Get size of record in Vdata and setup I/O buffer */
    4991             :         /* ------------------------------------------------ */
    4992           0 :         VSQueryvsize(vdataID, &recsize);
    4993           0 :         buf = (uint8 *) calloc(recsize, count[0] * incr[0]);
    4994           0 :         if(buf == NULL)
    4995             :         { 
    4996           0 :       HEpush(DFE_NOSPACE,"SWwrrdfield", __FILE__, __LINE__);
    4997           0 :       return(-1);
    4998             :         }
    4999             : 
    5000             : 
    5001             :         /* Get names and number of fields in each record  */
    5002             :         /* ---------------------------------------------- */
    5003           0 :         VSgetfields(vdataID, fieldlist);
    5004           0 :         dum = EHstrwithin(fieldname, fieldlist, ',');
    5005           0 :         nflds = EHparsestr(fieldlist, ',', ptr, NULL);
    5006             : 
    5007             : 
    5008             :         /* Get Merged Field Offset (if any) */
    5009             :         /* -------------------------------- */
    5010           0 :         if (nflds > 1)
    5011             :         {
    5012           0 :       if (dum > 0)
    5013             :       {
    5014           0 :           *(ptr[dum] - 1) = 0;
    5015           0 :           mrgOffset = VSsizeof(vdataID, fieldlist);
    5016           0 :           *(ptr[dum] - 1) = ',';
    5017             :       }
    5018             :       else
    5019             :       {
    5020           0 :           mrgOffset = 0;
    5021             :       }
    5022             : 
    5023             :       /* Read records to recover previously written data */
    5024           0 :       /* status = */ VSsetfields(vdataID, fieldlist);
    5025           0 :       /* status = */ VSseek(vdataID, offset[0]);
    5026           0 :       nrec = VSread(vdataID, buf, count[0] * incr[0],
    5027             :               FULL_INTERLACE);
    5028             :         }
    5029             :         else
    5030             :         {
    5031           0 :       mrgOffset = 0;
    5032             :         }
    5033             : 
    5034             : 
    5035             : 
    5036             :         /* Fill buffer with "Fill" value (if any) */
    5037             :         /* -------------------------------------- */
    5038           0 :                     snprintf( attrName, sizeof(attrName), "_FV_%s", fieldname);
    5039             : 
    5040           0 :         status = SWreadattr(swathID, attrName, (char *) fillbuf);
    5041           0 :         if (status == 0)
    5042             :         {
    5043           0 :       for (i = 0; i < count[0] * incr[0]; i++)
    5044             :       {
    5045           0 :           memcpy(buf + i * recsize + mrgOffset,
    5046             :            fillbuf, fldsize);
    5047             :       }
    5048             :         }
    5049             : 
    5050             : 
    5051             :         /* Write new data into buffer */
    5052             :         /* -------------------------- */
    5053           0 :         if (incr[0] == 1 && nflds == 1)
    5054             :         {
    5055           0 :       memcpy(buf, datbuf, count[0] * recsize);
    5056             :         }
    5057             :         else
    5058             :         {
    5059           0 :       for (i = 0; i < count[0]; i++)
    5060             :       {
    5061           0 :           memcpy(buf + i * recsize * incr[0] + mrgOffset,
    5062           0 :            (uint8 *) datbuf + i * fldsize, fldsize);
    5063             :       }
    5064             :         }
    5065             : 
    5066             : 
    5067             :         /* If append read last record */
    5068             :         /* -------------------------- */
    5069           0 :         if (offset[0] == nrec)
    5070             :         {
    5071             :       /* abe added "status =" to next line 8/8/97 */
    5072           0 :       status = VSseek(vdataID, offset[0] - 1);
    5073           0 :       VSread(vdataID, fillbuf, 1, FULL_INTERLACE);
    5074             :         }
    5075             :         else
    5076             :         {
    5077           0 :       status = VSseek(vdataID, offset[0]);
    5078             :         }
    5079             : 
    5080             : 
    5081             :         /* Write data into Vdata */
    5082             :         /* --------------------- */
    5083           0 :         nrec = VSwrite(vdataID, buf, count[0] * incr[0],
    5084             :            FULL_INTERLACE);
    5085             : 
    5086           0 :         free(fillbuf);
    5087           0 :                     if (status > 0)
    5088           0 :                        status = 0;
    5089             : 
    5090             :     }   /* End Write Section */
    5091             :     else
    5092             :     {
    5093             :         /* Read Section */
    5094             :         /* ------------ */
    5095           0 :         status = VSsetfields(vdataID, fieldname);
    5096           0 :         fldsize = VSsizeof(vdataID, (char *)fieldname);
    5097           0 :         buf = (uint8 *) calloc(fldsize, count[0] * incr[0]);
    5098           0 :         if(buf == NULL)
    5099             :         { 
    5100           0 :       HEpush(DFE_NOSPACE,"SWwrrdfield", __FILE__, __LINE__);
    5101           0 :       return(-1);
    5102             :         }
    5103             : 
    5104           0 :         (void) VSseek(vdataID, offset[0]);
    5105           0 :         (void) VSread(vdataID, buf, count[0] * incr[0],
    5106             :          FULL_INTERLACE);
    5107             : 
    5108             : 
    5109             :         /* Copy from input buffer to returned data buffer */
    5110             :         /* ---------------------------------------------- */
    5111           0 :         if (incr[0] == 1)
    5112             :         {
    5113           0 :       memcpy(datbuf, buf, count[0] * fldsize);
    5114             :         }
    5115             :         else
    5116             :         {
    5117           0 :       for (i = 0; i < count[0]; i++)
    5118             :       {
    5119           0 :           memcpy((uint8 *) datbuf + i * fldsize,
    5120           0 :            buf + i * fldsize * incr[0], fldsize);
    5121             :       }
    5122             :         }
    5123             : 
    5124             :     }   /* End Read Section */
    5125             : 
    5126           0 :     free(buf);
    5127           0 :     VSdetach(vdataID);
    5128             :       }
    5129             :       else
    5130             :       {
    5131           0 :     HEpush(DFE_GENAPP, "SWwrrdfield", __FILE__, __LINE__);
    5132           0 :     HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
    5133             :       }
    5134             :   }     /* End One-D Field Section */
    5135             : 
    5136             :     }
    5137           0 :     return (status);
    5138             : }
    5139             : 
    5140             : 
    5141             : 
    5142             : /*----------------------------------------------------------------------------|
    5143             : |  BEGIN_PROLOG                                                               |
    5144             : |                                                                             |
    5145             : |  FUNCTION: SWwritefield                                                     |
    5146             : |                                                                             |
    5147             : |  DESCRIPTION: Writes data to field                                          |
    5148             : |                                                                             |
    5149             : |                                                                             |
    5150             : |  Return Value    Type     Units     Description                             |
    5151             : |  ============   ======  =========   =====================================   |
    5152             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    5153             : |                                                                             |
    5154             : |  INPUTS:                                                                    |
    5155             : |  swathID        int32               swath structure ID                      |
    5156             : |  fieldname      char                fieldname                               |
    5157             : |  start          int32               start array                             |
    5158             : |  stride         int32               stride array                            |
    5159             : |  edge           int32               edge array                              |
    5160             : |                                                                             |
    5161             : |                                                                             |
    5162             : |  OUTPUTS:                                                                   |
    5163             : |  data           void                data buffer for write                   |
    5164             : |                                                                             |
    5165             : |  NOTES:                                                                     |
    5166             : |                                                                             |
    5167             : |                                                                             |
    5168             : |   Date     Programmer   Description                                         |
    5169             : |  ======   ============  =================================================   |
    5170             : |  Jun 96   Joel Gales    Original Programmer                                 |
    5171             : |                                                                             |
    5172             : |  END_PROLOG                                                                 |
    5173             : -----------------------------------------------------------------------------*/
    5174             : intn
    5175           0 : SWwritefield(int32 swathID, const char *fieldname,
    5176             :        int32 start[], int32 stride[], int32 edge[], VOIDP data)
    5177             : 
    5178             : {
    5179           0 :     intn            status = 0; /* routine return status variable */
    5180             : 
    5181           0 :     status = SWwrrdfield(swathID, fieldname, "w", start, stride, edge,
    5182             :        data);
    5183           0 :     return (status);
    5184             : }
    5185             : 
    5186             : 
    5187             : 
    5188             : 
    5189             : 
    5190             : 
    5191             : /*----------------------------------------------------------------------------|
    5192             : |  BEGIN_PROLOG                                                               |
    5193             : |                                                                             |
    5194             : |  FUNCTION: SWreadfield                                                      |
    5195             : |                                                                             |
    5196             : |  DESCRIPTION: Reads data from field                                         |
    5197             : |                                                                             |
    5198             : |  Return Value    Type     Units     Description                             |
    5199             : |  ============   ======  =========   =====================================   |
    5200             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    5201             : |                                                                             |
    5202             : |  INPUTS:                                                                    |
    5203             : |  swathID        int32               swath structure ID                      |
    5204             : |  fieldname      const char          fieldname                               |
    5205             : |  start          int32               start array                             |
    5206             : |  stride         int32               stride array                            |
    5207             : |  edge           int32               edge array                              |
    5208             : |  buffer         void                data buffer for read                    |
    5209             : |                                                                             |
    5210             : |                                                                             |
    5211             : |  OUTPUTS:                                                                   |
    5212             : |     None                                                                    |
    5213             : |                                                                             |
    5214             : |  NOTES:                                                                     |
    5215             : |                                                                             |
    5216             : |                                                                             |
    5217             : |   Date     Programmer   Description                                         |
    5218             : |  ======   ============  =================================================   |
    5219             : |  Jun 96   Joel Gales    Original Programmer                                 |
    5220             : |                                                                             |
    5221             : |  END_PROLOG                                                                 |
    5222             : -----------------------------------------------------------------------------*/
    5223             : intn
    5224           0 : SWreadfield(int32 swathID, const char *fieldname,
    5225             :       int32 start[], int32 stride[], int32 edge[], VOIDP buffer)
    5226             : 
    5227             : {
    5228           0 :     intn            status = 0; /* routine return status variable */
    5229             : 
    5230           0 :     status = SWwrrdfield(swathID, fieldname, "r", start, stride, edge,
    5231             :        buffer);
    5232           0 :     return (status);
    5233             : }
    5234             : 
    5235             : 
    5236             : 
    5237             : 
    5238             : /*----------------------------------------------------------------------------|
    5239             : |  BEGIN_PROLOG                                                               |
    5240             : |                                                                             |
    5241             : |  FUNCTION: SWdefboxregion                                                   |
    5242             : |                                                                             |
    5243             : |  DESCRIPTION: Finds swath cross tracks within area of interest and returns  |
    5244             : |               region ID                                                     |
    5245             : |                                                                             |
    5246             : |                                                                             |
    5247             : |  Return Value    Type     Units     Description                             |
    5248             : |  ============   ======  =========   =====================================   |
    5249             : |  regionID       int32               Region ID                               |
    5250             : |                                                                             |
    5251             : |  INPUTS:                                                                    |
    5252             : |  swathID        int32               Swath structure ID                      |
    5253             : |  cornerlon      float64  dec deg    Longitude of opposite corners of box    |
    5254             : |  cornerlat      float64  dec deg    Latitude of opposite corners of box     |
    5255             : |  mode           int32               Search mode                             |
    5256             : |                                     HDFE_MIDPOINT - Use midpoint of Xtrack  |
    5257             : |                                     HDFE_ENDPOINT - Use endpoints of Xtrack |
    5258             : |                                     HDFE_ANYPOINT - Use all points of Xtrack|
    5259             : |                                                                             |
    5260             : |  OUTPUTS:                                                                   |
    5261             : |             None                                                            |
    5262             : |                                                                             |
    5263             : |  NOTES:                                                                     |
    5264             : |                                                                             |
    5265             : |                                                                             |
    5266             : |   Date     Programmer   Description                                         |
    5267             : |  ======   ============  =================================================   |
    5268             : |  Jun 96   Joel Gales    Original Programmer                                 |
    5269             : |  Oct 96   Joel Gales    Add ability to handle regions crossing date line    |
    5270             : |  Dec 96   Joel Gales    Add multiple vertical subsetting capability         |
    5271             : |  Jul 98   Abe Taaheri   Fixed core dump in SWregioninfo associated with     |
    5272             : |                         SWXRegion[k]->nRegions exceeding MAXNREGIONS in     |
    5273             : |                         this function                                       |
    5274             : |  Aug 99   Abe Taaheri   Fixed the code so that all cross tracks or all      |
    5275             : |                         points on the along track that fall inside the box  |
    5276             : |                         are identified. At the same time added code to      |
    5277             : |                         function "updatescene" to reject cases where there  |
    5278             : |                         is single cross track in the box (for LANDSAT)      |
    5279             : |  Jun 03   Abe Taaheri   Added a few lines to report error and return -1 if  |
    5280             : |                         regionID exceeded NSWATHREGN                        |
    5281             : |  Mar 04   Abe Taaheri   Added recognition for GeodeticLatitude              |
    5282             : |                                                                             |
    5283             : |  END_PROLOG                                                                 |
    5284             : -----------------------------------------------------------------------------*/
    5285             : int32
    5286           0 : SWdefboxregion(int32 swathID, float64 cornerlon[], float64 cornerlat[],
    5287             :          int32 mode)
    5288             : {
    5289             :     intn            i;    /* Loop index */
    5290           0 :     intn            j = 0;    /* Loop index */
    5291             :     intn            k;    /* Loop index */
    5292             :     
    5293             :     intn            status; /* routine return status variable */
    5294             :     intn            statLon;  /* Status from SWfieldinfo for longitude */
    5295             :     intn            statLat;  /* Status from SWfieldinfo for latitude */
    5296           0 :     intn            statCoLat = -1; /* Status from SWfieldinfo for
    5297             :            * Colatitude */
    5298           0 :     intn            statGeodeticLat = -1; /* Status from SWfieldinfo for
    5299             :            * GeodeticLatitude */
    5300             : 
    5301           0 :     uint8           found = 0;  /* Found flag */
    5302             :     uint8          *flag; /* Pointer to track flag array */
    5303           0 :     intn           validReg = -1; /* -1 is invalid validReg */ 
    5304             :     
    5305             :     int32           fid;  /* HDF-EOS file ID */
    5306             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    5307             :     int32           swVgrpID; /* Swath Vgroup ID */
    5308             :     int32           rank; /* Rank of geolocation fields */
    5309             :     int32           nt;   /* Number type of geolocation fields */
    5310             :     int32           dims[8];  /* Dimensions of geolocation fields */
    5311             :     int32           nElem;  /* Number of elements to read */
    5312             :     int32           bndflag;  /* +/-180 longitude boundary flag */
    5313             :     int32           lonTest;  /* Longitude test flag */
    5314             :     int32           latTest;  /* Latitude test flag */
    5315             :     int32           start[2]; /* Start array (read) */
    5316           0 :     int32           stride[2] = {1, 1}; /* Stride array (read) */
    5317             :     int32           edge[2];  /* Edge array (read) */
    5318           0 :     int32           regionID = -1;  /* Region ID (return) */
    5319             :     int32           anyStart[2];/* ANYPOINT start array (read) */
    5320             :     int32           anyEdge[2]; /* ANYPOINT edge array (read) */
    5321             : 
    5322             :     float32         temp32; /* Temporary float32 variable */
    5323             : 
    5324             :     float64         lonTestVal; /* Longitude test value */
    5325             :     float64         latTestVal; /* Latitude test value */
    5326             :     float64         temp64; /* Temporary float64 variable */
    5327             : 
    5328             :     char           *lonArr; /* Longitude data array */
    5329             :     char           *latArr; /* Latitude data array */
    5330             :     char            dimlist[256]; /* Dimension list (geolocation
    5331             :            * fields) */
    5332             :     char            latName[17];/* Latitude field name */
    5333             :     
    5334             : 
    5335             :     /* Check for valid swath ID */
    5336             :     /* ------------------------ */
    5337           0 :     status = SWchkswid(swathID, "SWdefboxregion", &fid, &sdInterfaceID,
    5338             :            &swVgrpID);
    5339             : 
    5340             : 
    5341             :     /* Inclusion mode must be between 0 and 2 */
    5342             :     /* -------------------------------------- */
    5343           0 :     if (mode < 0 || mode > 2)
    5344             :     {
    5345           0 :   status = -1;
    5346           0 :   HEpush(DFE_GENAPP, "SWdefboxregion", __FILE__, __LINE__);
    5347           0 :   HEreport("Improper Inclusion Mode: %d.\n", mode);
    5348             :     }
    5349             : 
    5350             : 
    5351           0 :     if (status == 0)
    5352             :     {
    5353             :   /* Get "Longitude" field info */
    5354             :   /* -------------------------- */
    5355           0 :   statLon = SWfieldinfo(swathID, "Longitude", &rank, dims, &nt, dimlist);
    5356           0 :   if (statLon != 0)
    5357             :   {
    5358           0 :       status = -1;
    5359           0 :       HEpush(DFE_GENAPP, "SWdefboxregion", __FILE__, __LINE__);
    5360           0 :       HEreport("\"Longitude\" field not found.\n");
    5361             :   }
    5362             : 
    5363             :   /* Get "Latitude" field info */
    5364             :   /* -------------------------- */
    5365           0 :   statLat = SWfieldinfo(swathID, "Latitude", &rank, dims, &nt, dimlist);
    5366           0 :   if (statLat != 0)
    5367             :   {
    5368             :       /* If not found check for "Colatitude" field info */
    5369             :       /* ---------------------------------------------- */
    5370           0 :       statCoLat = SWfieldinfo(swathID, "Colatitude", &rank, dims, &nt,
    5371             :             dimlist);
    5372           0 :       if (statCoLat != 0)
    5373             :       {
    5374             :         /* Check again for Geodeticlatitude */            
    5375           0 :         statGeodeticLat = SWfieldinfo(swathID, 
    5376             :               "GeodeticLatitude", &rank, 
    5377             :               dims, &nt, dimlist);
    5378           0 :         if (statGeodeticLat != 0)
    5379             :     {
    5380             :       /* Neither "Latitude" nor "Colatitude" nor
    5381             :          "GeodeticLatitude" field found */
    5382             :       /* ----------------------------------------------- */
    5383           0 :       status = -1;
    5384           0 :       HEpush(DFE_GENAPP, "SWdefboxregion", __FILE__, __LINE__);
    5385           0 :       HEreport(
    5386             :          "Neither \"Latitude\" nor \"Colatitude\" nor \"GeodeticLatitude\" fields found.\n");
    5387             :     }
    5388             :         else
    5389             :     {
    5390             :       /* Latitude field is "GeodeticLatitude" */
    5391             :       /* ------------------------------ */
    5392           0 :       strcpy(latName, "GeodeticLatitude");
    5393             :     }
    5394             :       }
    5395             :       else
    5396             :       {
    5397             :     /* Latitude field is "Colatitude" */
    5398             :     /* ------------------------------ */
    5399           0 :     strcpy(latName, "Colatitude");
    5400             :       }
    5401             :   }
    5402             :   else
    5403             :   {
    5404             :       /* Latitude field is "Latitude" */
    5405             :       /* ---------------------------- */
    5406           0 :       strcpy(latName, "Latitude");
    5407             :   }
    5408             : 
    5409             : 
    5410           0 :   if (status == 0)
    5411             :   {
    5412             :       /* Search along entire "Track" dimension from beginning to end */
    5413             :       /* ----------------------------------------------------------- */
    5414           0 :       start[0] = 0;
    5415           0 :       edge[0] = dims[0];
    5416             : 
    5417             : 
    5418             :       /* If 1D geolocation fields then set mode to MIDPOINT */
    5419             :       /* -------------------------------------------------- */
    5420           0 :       if (rank == 1)
    5421             :       {
    5422           0 :     mode = HDFE_MIDPOINT;
    5423             :       }
    5424             : 
    5425             : 
    5426           0 :       switch (mode)
    5427             :       {
    5428             :     /* If MIDPOINT search single point in middle of "CrossTrack" */
    5429             :     /* --------------------------------------------------------- */
    5430           0 :       case HDFE_MIDPOINT:
    5431             : 
    5432           0 :     start[1] = dims[1] / 2;
    5433           0 :     edge[1] = 1;
    5434             : 
    5435           0 :     break;
    5436             : 
    5437             :     /* If ENDPOINT search 2 points at either end of "CrossTrack" */
    5438             :     /* --------------------------------------------------------- */
    5439           0 :       case HDFE_ENDPOINT:
    5440             : 
    5441           0 :     start[1] = 0;
    5442           0 :     stride[1] = dims[1] - 1;
    5443           0 :     edge[1] = 2;
    5444             : 
    5445           0 :     break;
    5446             : 
    5447             :     /* If ANYPOINT do initial MIDPOINT search */
    5448             :     /* -------------------------------------- */
    5449           0 :       case HDFE_ANYPOINT:
    5450             : 
    5451           0 :     start[1] = dims[1] / 2;
    5452           0 :     edge[1] = 1;
    5453             : 
    5454           0 :     break;
    5455             :       }
    5456             : 
    5457             : 
    5458             :       /* Compute number of elements */
    5459             :       /* -------------------------- */
    5460           0 :       nElem = edge[0] * edge[1];
    5461             : 
    5462             : 
    5463             :       /* Allocate space for longitude and latitude (float64) */
    5464             :       /* --------------------------------------------------- */
    5465           0 :       lonArr = (char *) calloc(nElem, sizeof(float64));
    5466           0 :       if(lonArr == NULL)
    5467             :       { 
    5468           0 :     HEpush(DFE_NOSPACE,"SWdefboxregion", __FILE__, __LINE__);
    5469           0 :     return(-1);
    5470             :       }
    5471             : 
    5472           0 :       latArr = (char *) calloc(nElem, sizeof(float64));
    5473           0 :       if(latArr == NULL)
    5474             :       { 
    5475           0 :     HEpush(DFE_NOSPACE,"SWdefboxregion", __FILE__, __LINE__);
    5476           0 :     free(lonArr);
    5477           0 :     return(-1);
    5478             :       }
    5479             : 
    5480             : 
    5481             :       /* Allocate space for flag array (uint8) */
    5482             :       /* ------------------------------------- */
    5483           0 :       flag = (uint8 *) calloc(edge[0] + 1, 1);
    5484           0 :       if(flag == NULL)
    5485             :       { 
    5486           0 :     HEpush(DFE_NOSPACE,"SWdefboxregion", __FILE__, __LINE__);
    5487           0 :     free(lonArr);
    5488           0 :     free(latArr);
    5489           0 :     return(-1);
    5490             :       }
    5491             : 
    5492             : 
    5493             :       /* Read Longitude and Latitude fields */
    5494             :       /* ---------------------------------- */
    5495           0 :       status = SWreadfield(swathID, "Longitude",
    5496             :          start, stride, edge, lonArr);
    5497           0 :       status = SWreadfield(swathID, latName,
    5498             :          start, stride, edge, latArr);
    5499             : 
    5500             : 
    5501             : 
    5502             :       /*
    5503             :        * If geolocation fields are FLOAT32 then cast each entry as
    5504             :        * FLOAT64
    5505             :        */
    5506           0 :       if (nt == DFNT_FLOAT32)
    5507             :       {
    5508           0 :     for (i = nElem - 1; i >= 0; i--)
    5509             :     {
    5510           0 :         memcpy(&temp32, lonArr + 4 * i, 4);
    5511           0 :         temp64 = (float64) temp32;
    5512           0 :         memcpy(lonArr + 8 * i, &temp64, 8);
    5513             : 
    5514           0 :         memcpy(&temp32, latArr + 4 * i, 4);
    5515           0 :         temp64 = (float64) temp32;
    5516           0 :         memcpy(latArr + 8 * i, &temp64, 8);
    5517             :     }
    5518             :       }   
    5519             : 
    5520             : 
    5521             :       /* Set boundary flag */
    5522             :       /* ----------------- */
    5523             : 
    5524             :       /*
    5525             :        * This variable is set to 1 if the region of interest crosses
    5526             :        * the +/- 180 longitude boundary
    5527             :        */
    5528           0 :       bndflag = (cornerlon[0] < cornerlon[1]) ? 0 : 1;
    5529             : 
    5530             : 
    5531             : 
    5532             :       /* Main Search Loop */
    5533             :       /* ---------------- */
    5534             : 
    5535             :       /* For each track ... */
    5536             :       /* ------------------ */
    5537             : 
    5538           0 :       for (i = 0; i < edge[0]; i++)
    5539             :       {   
    5540             :     /* For each value from Cross Track ... */
    5541             :     /* ----------------------------------- */
    5542           0 :     for (j = 0; j < edge[1]; j++)
    5543             :     {
    5544             :         /* Read in single lon & lat values from data buffers */
    5545             :         /* ------------------------------------------------- */
    5546           0 :         memcpy(&lonTestVal, &lonArr[8 * (i * edge[1] + j)], 8);
    5547           0 :         memcpy(&latTestVal, &latArr[8 * (i * edge[1] + j)], 8);
    5548             : 
    5549             : 
    5550             :         /* If longitude value > 180 convert to -180 to 180 range */
    5551             :         /* ----------------------------------------------------- */
    5552           0 :         if (lonTestVal > 180)
    5553             :         {
    5554           0 :       lonTestVal = lonTestVal - 360;
    5555             :         }
    5556             : 
    5557             :         /* If Colatitude value convert to latitude value */
    5558             :         /* --------------------------------------------- */
    5559           0 :         if (statCoLat == 0)
    5560             :         {
    5561           0 :       latTestVal = 90 - latTestVal;
    5562             :         }
    5563             : 
    5564             : 
    5565             :         /* Test if lat value is within range */
    5566             :         /* --------------------------------- */
    5567           0 :         latTest = (latTestVal >= cornerlat[0] &&
    5568           0 :              latTestVal <= cornerlat[1]);
    5569             : 
    5570             : 
    5571           0 :         if (bndflag == 1)
    5572             :         {
    5573             :       /*
    5574             :        * If boundary flag set test whether longitude value
    5575             :        * is outside region and then flip
    5576             :        */
    5577           0 :       lonTest = (lonTestVal >= cornerlon[1] &&
    5578           0 :            lonTestVal <= cornerlon[0]);
    5579           0 :       lonTest = 1 - lonTest;
    5580             :         }
    5581             :         else
    5582             :         {
    5583           0 :       lonTest = (lonTestVal >= cornerlon[0] &&
    5584           0 :            lonTestVal <= cornerlon[1]);
    5585             :         }
    5586             : 
    5587             : 
    5588             :         /*
    5589             :          * If both longitude and latitude are within region set
    5590             :          * flag on for this track
    5591             :          */
    5592           0 :         if (lonTest + latTest == 2)
    5593             :         {
    5594           0 :       flag[i] = 1;
    5595           0 :       found = 1;
    5596           0 :       break;
    5597             :         }
    5598             :     }
    5599             :       }
    5600             : 
    5601             : 
    5602             : 
    5603             :       /* ANYPOINT search */
    5604             :       /* --------------- */
    5605           0 :       if (mode == HDFE_ANYPOINT && rank > 1)
    5606             :       {
    5607           0 :     free(lonArr);
    5608           0 :     free(latArr);
    5609             : 
    5610             :     /* Allocate space for an entire single cross track */
    5611             :     /* ----------------------------------------------- */
    5612           0 :     lonArr = (char *) calloc(dims[1], sizeof(float64));
    5613           0 :     if(lonArr == NULL)
    5614             :     { 
    5615           0 :         HEpush(DFE_NOSPACE,"SWdefboxregion", __FILE__, __LINE__);
    5616           0 :         return(-1);
    5617             :     }
    5618             : 
    5619           0 :     latArr = (char *) calloc(dims[1], sizeof(float64));
    5620           0 :     if(latArr == NULL)
    5621             :     { 
    5622           0 :         HEpush(DFE_NOSPACE,"SWdefboxregion", __FILE__, __LINE__);
    5623           0 :         free(lonArr);
    5624           0 :         return(-1);
    5625             :     }
    5626             : 
    5627             : 
    5628             :     /* Setup start and edge */
    5629             :     /* -------------------- */
    5630           0 :     anyStart[1] = 0;
    5631           0 :     anyEdge[0] = 1;
    5632           0 :     anyEdge[1] = dims[1];
    5633             :   
    5634             :                
    5635             :     /* For each track starting from 0 */
    5636             :     /* ------------------------------ */
    5637           0 :     for (i = 0; i < edge[0]; i++)    
    5638             :     {
    5639             :                
    5640             :         /* If cross track not in region (with MIDPOINT search ... */
    5641             :         /* ------------------------------------------------------ */
    5642           0 :         if (flag[i] == 0)
    5643             :         {
    5644             :       /* Setup track start */
    5645             :       /* ----------------- */
    5646           0 :       anyStart[0] = i;
    5647             : 
    5648             : 
    5649             :       /* Read in lon and lat values for cross track */
    5650             :       /* ------------------------------------------ */
    5651           0 :       status = SWreadfield(swathID, "Longitude",
    5652             :              anyStart, NULL, anyEdge, lonArr);
    5653           0 :       status = SWreadfield(swathID, latName,
    5654             :              anyStart, NULL, anyEdge, latArr);
    5655             : 
    5656             : 
    5657             : 
    5658             :       /*
    5659             :        * If geolocation fields are FLOAT32 then cast each
    5660             :        * entry as FLOAT64
    5661             :        */
    5662           0 :       if (nt == DFNT_FLOAT32)
    5663             :       {
    5664           0 :           for (j = dims[1] - 1; j >= 0; j--)
    5665             :           {
    5666           0 :         memcpy(&temp32, lonArr + 4 * j, 4);
    5667           0 :         temp64 = (float64) temp32;
    5668           0 :         memcpy(lonArr + 8 * j, &temp64, 8);
    5669             : 
    5670           0 :         memcpy(&temp32, latArr + 4 * j, 4);
    5671           0 :         temp64 = (float64) temp32;
    5672           0 :         memcpy(latArr + 8 * j, &temp64, 8);
    5673             :           }
    5674             :       }
    5675             : 
    5676             : 
    5677             :       /* For each value from Cross Track ... */
    5678             :       /* ----------------------------------- */
    5679           0 :       for (j = 0; j < dims[1]; j++)
    5680             :       {
    5681             :           /* Read in single lon & lat values from buffers */
    5682             :           /* -------------------------------------------- */
    5683           0 :           memcpy(&lonTestVal, &lonArr[8 * j], 8);
    5684           0 :           memcpy(&latTestVal, &latArr[8 * j], 8);
    5685             : 
    5686             : 
    5687             :           /* If lon value > 180 convert to -180 - 180 range */
    5688             :           /* ---------------------------------------------- */
    5689           0 :           if (lonTestVal > 180)
    5690             :           {
    5691           0 :         lonTestVal = lonTestVal - 360;
    5692             :           }
    5693             : 
    5694             :           /* If Colatitude value convert to latitude value */
    5695             :           /* --------------------------------------------- */
    5696           0 :           if (statCoLat == 0)
    5697             :           {
    5698           0 :         latTestVal = 90 - latTestVal;
    5699             :           }
    5700             : 
    5701             : 
    5702             :           /* Test if lat value is within range */
    5703             :           /* --------------------------------- */
    5704           0 :           latTest = (latTestVal >= cornerlat[0] &&
    5705           0 :                latTestVal <= cornerlat[1]);
    5706             : 
    5707             : 
    5708           0 :           if (bndflag == 1)
    5709             :           {
    5710             :         /*
    5711             :          * If boundary flag set test whether
    5712             :          * longitude value is outside region and then
    5713             :          * flip
    5714             :          */
    5715           0 :         lonTest = (lonTestVal >= cornerlon[1] &&
    5716           0 :              lonTestVal <= cornerlon[0]);
    5717           0 :         lonTest = 1 - lonTest;
    5718             :           }
    5719             :           else
    5720             :           {
    5721           0 :         lonTest = (lonTestVal >= cornerlon[0] &&
    5722           0 :              lonTestVal <= cornerlon[1]);
    5723             :           }
    5724             : 
    5725             : 
    5726             :           /*
    5727             :            * If both longitude and latitude are within
    5728             :            * region set flag on for this track
    5729             :            */
    5730           0 :           if (lonTest + latTest == 2)
    5731             :           {
    5732           0 :         flag[i] = 1;
    5733           0 :         found = 1;
    5734           0 :         break;
    5735             :           }
    5736             :       }
    5737             :         }
    5738             :     }
    5739             :             }
    5740             : 
    5741             :       /* If within region setup Region Structure */
    5742             :       /* --------------------------------------- */
    5743           0 :       if (found == 1)
    5744             :       {
    5745             :     /* For all entries in SWXRegion array ... */
    5746             :     /* -------------------------------------- */
    5747           0 :     for (k = 0; k < NSWATHREGN; k++)
    5748             :     {
    5749             :         /* If empty region ... */
    5750             :         /* ------------------- */
    5751           0 :         if (SWXRegion[k] == 0)
    5752             :         {
    5753             :       /* Allocate space for region entry */
    5754             :       /* ------------------------------- */
    5755           0 :       SWXRegion[k] = (struct swathRegion *)
    5756           0 :           calloc(1, sizeof(struct swathRegion));
    5757           0 :       if(SWXRegion[k] == NULL)
    5758             :       { 
    5759           0 :           HEpush(DFE_NOSPACE,"SWdefboxregion", __FILE__, __LINE__);
    5760           0 :           return(-1);
    5761             :       }
    5762             : 
    5763             :       /* Store file and swath ID */
    5764             :       /* ----------------------- */
    5765           0 :       SWXRegion[k]->fid = fid;
    5766           0 :       SWXRegion[k]->swathID = swathID;
    5767             : 
    5768             : 
    5769             :       /* Set Start & Stop Vertical arrays to -1 */
    5770             :       /* -------------------------------------- */
    5771           0 :       for (j = 0; j < 8; j++)
    5772             :       {
    5773           0 :           SWXRegion[k]->StartVertical[j] = -1;
    5774           0 :           SWXRegion[k]->StopVertical[j] = -1;
    5775           0 :           SWXRegion[k]->StartScan[j] = -1;
    5776           0 :           SWXRegion[k]->StopScan[j] = -1;
    5777             :       }
    5778             : 
    5779             : 
    5780             :       /* Set region ID */
    5781             :       /* ------------- */
    5782           0 :       regionID = k;
    5783           0 :       break;
    5784             :         }
    5785             :     }
    5786           0 :     if (k >= NSWATHREGN)
    5787             :       {
    5788           0 :         HEpush(DFE_GENAPP, "SWdefboxregion", __FILE__, __LINE__);
    5789           0 :         HEreport(
    5790             :            "regionID exceeded NSWATHREGN.\n");
    5791           0 :                     return (-1);
    5792             :       }
    5793             : 
    5794             :     /* Find start and stop of regions */
    5795             :     /* ------------------------------ */
    5796             : 
    5797             :     /* Subtract previous flag value from current one */
    5798             :     /* --------------------------------------------- */
    5799             : 
    5800             :     /*
    5801             :      * Transition points will have flag value (+1) start or
    5802             :      * (255 = (uint8) -1) stop of region
    5803             :      */
    5804           0 :     for (i = edge[0]; i > 0; i--)
    5805             :     {
    5806           0 :         flag[i] -= flag[i - 1];
    5807             :     }
    5808             : 
    5809             : 
    5810           0 :     for (i = 0; i <= edge[0]; i++)
    5811             :     {
    5812             :         /* Start of region */
    5813             :         /* --------------- */
    5814           0 :         if (flag[i] == 1)
    5815             :         {
    5816             :       /* Increment (multiple) region counter */
    5817             :       /* ----------------------------------- */
    5818           0 :       j = ++SWXRegion[k]->nRegions;
    5819             :       
    5820             :       /* if SWXRegion[k]->nRegions greater than MAXNREGIONS */
    5821             :       /* free allocated memory and return FAIL */
    5822             :       
    5823           0 :       if ((SWXRegion[k]->nRegions) > MAXNREGIONS)
    5824             :       {
    5825           0 :           HEpush(DFE_GENAPP, "SWdefboxregion", __FILE__, __LINE__);
    5826           0 :           HEreport("SWXRegion[%d]->nRegions exceeds MAXNREGIONS= %d.\n", k, MAXNREGIONS);
    5827           0 :           free(lonArr);
    5828           0 :           free(latArr);
    5829           0 :           free(flag);
    5830           0 :           return(-1);
    5831             :       }
    5832             :       
    5833           0 :       SWXRegion[k]->StartRegion[j - 1] = i;
    5834             :         }
    5835             :         
    5836             :         /* End of region */
    5837             :         /* ------------- */
    5838           0 :         if (flag[i] == 255)
    5839             :         {
    5840           0 :       SWXRegion[k]->StopRegion[j - 1] = i - 1;
    5841           0 :       validReg = 0;
    5842             :         }
    5843             :     }
    5844             :       }
    5845           0 :       free(lonArr);
    5846           0 :       free(latArr);
    5847           0 :       free(flag);
    5848             :   }
    5849             :     }
    5850           0 :     if(validReg==0)
    5851             :     {
    5852           0 :   return (regionID);
    5853             :     }
    5854             :     else
    5855             :     {
    5856           0 :   return (-1);
    5857             :     }
    5858             :     
    5859             : }
    5860             : 
    5861             : 
    5862             : 
    5863             : 
    5864             : /*----------------------------------------------------------------------------|
    5865             : |  BEGIN_PROLOG                                                               |
    5866             : |                                                                             |
    5867             : |  FUNCTION: SWregionl_index                                                    |
    5868             : |                                                                             |
    5869             : |  DESCRIPTION: Finds swath cross tracks within area of interest and returns  |
    5870             : |               region l_index and region ID                                    |
    5871             : |                                                                             |
    5872             : |                                                                             |
    5873             : |  Return Value    Type     Units     Description                             |
    5874             : |  ============   ======  =========   =====================================   |
    5875             : |  regionID       int32               Region ID                               |
    5876             : |                                                                             |
    5877             : |  INPUTS:                                                                    |
    5878             : |  swathID        int32               Swath structure ID                      |
    5879             : |  cornerlon      float64  dec deg    Longitude of opposite corners of box    |
    5880             : |  cornerlat      float64  dec deg    Latitude of opposite corners of box     |
    5881             : |  mode           int32               Search mode                             |
    5882             : |                                     HDFE_MIDPOINT - Use midpoint of Xtrack  |
    5883             : |                                     HDFE_ENDPOINT - Use endpoints of Xtrack |
    5884             : |                                     HDFE_ANYPOINT - Use all points of Xtrack|
    5885             : |                                                                             |
    5886             : |  OUTPUTS:                                                                   |
    5887             : |  geodim   char          geolocation track dimension             |
    5888             : |  idxrange   int32         indices of region for along track dim.  |
    5889             : |                                                                             |
    5890             : |  NOTES:                                                                     |
    5891             : |                                                                             |
    5892             : |                                                                             |
    5893             : |   Date     Programmer   Description                                         |
    5894             : |  ======   ============  =================================================   |
    5895             : |  Jun 96   Joel Gales    Original Programmer                                 |
    5896             : |  Oct 96   Joel Gales    Add ability to handle regions crossing date line    |
    5897             : |  Dec 96   Joel Gales    Add multiple vertical subsetting capability         |
    5898             : |  Nov 97   Daw           Add multiple vertical subsetting capability         |
    5899             : |  END_PROLOG                                                                 |
    5900             : -----------------------------------------------------------------------------*/
    5901             : int32
    5902           0 : SWregionindex(int32 swathID, float64 cornerlon[], float64 cornerlat[],
    5903             :          int32 mode, char *geodim, int32 idxrange[])
    5904             : {
    5905             :     intn            i;    /* Loop index */
    5906             :     intn            j;    /* Loop index */
    5907             :     intn            k;    /* Loop index */
    5908             : 
    5909           0 :     intn            l=0;  /* Loop index */
    5910           0 :     intn            tmpVal = 0;     /* temp value for start region Delyth Jones*/
    5911             :   /*intn            j1;  */     /* Loop index */
    5912             :     intn            status; /* routine return status variable */
    5913             :     intn      mapstatus;  /* status for type of mapping */
    5914             :     intn            statLon;  /* Status from SWfieldinfo for longitude */
    5915             :     intn            statLat;  /* Status from SWfieldinfo for latitude */
    5916           0 :     intn            statCoLat = -1; /* Status from SWfieldinfo for
    5917             :            * Colatitude */
    5918           0 :     intn            statGeodeticLat = -1; /* Status from SWfieldinfo for
    5919             :            * GeodeticLatitude */
    5920             : 
    5921           0 :     uint8           found = 0;  /* Found flag */
    5922             :     uint8          *flag; /* Pointer to track flag array */
    5923           0 :     intn           validReg = -1; /* -1 is invalid validReg */ 
    5924             :     
    5925             :     int32           fid;  /* HDF-EOS file ID */
    5926             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    5927             :     int32           swVgrpID; /* Swath Vgroup ID */
    5928             :     int32           rank; /* Rank of geolocation fields */
    5929             :     int32           nt;   /* Number type of geolocation fields */
    5930             :     int32           dims[8];  /* Dimensions of geolocation fields */
    5931             :     int32           nElem;  /* Number of elements to read */
    5932             :     int32           bndflag;  /* +/-180 longitude boundary flag */
    5933             :     int32           lonTest;  /* Longitude test flag */
    5934             :     int32           latTest;  /* Latitude test flag */
    5935             :     int32           start[2]; /* Start array (read) */
    5936           0 :     int32           stride[2] = {1, 1}; /* Stride array (read) */
    5937             :     int32           edge[2];  /* Edge array (read) */
    5938           0 :     int32           regionID = -1;  /* Region ID (return) */
    5939             :     int32           anyStart[2];/* ANYPOINT start array (read) */
    5940             :     int32           anyEdge[2]; /* ANYPOINT edge array (read) */
    5941             : 
    5942             :     float32         temp32; /* Temporary float32 variable */
    5943             : 
    5944             :     float64         lonTestVal; /* Longitude test value */
    5945             :     float64         latTestVal; /* Latitude test value */
    5946             :     float64         temp64; /* Temporary float64 variable */
    5947             : 
    5948             :     char           *lonArr; /* Longitude data array */
    5949             :     char           *latArr; /* Latitude data array */
    5950             :     char            dimlist[256]; /* Dimension list (geolocation
    5951             :            * fields) */
    5952             :     char            latName[17];/* Latitude field name */
    5953             : 
    5954             : 
    5955             :     /* Check for valid swath ID */
    5956             :     /* ------------------------ */
    5957           0 :     status = SWchkswid(swathID, "SWregionl_index", &fid, &sdInterfaceID,
    5958             :            &swVgrpID);
    5959             : 
    5960             : 
    5961             :     /* Inclusion mode must be between 0 and 2 */
    5962             :     /* -------------------------------------- */
    5963           0 :     if (mode < 0 || mode > 2)
    5964             :     {
    5965           0 :   status = -1;
    5966           0 :   HEpush(DFE_GENAPP, "SWregionl_index", __FILE__, __LINE__);
    5967           0 :   HEreport("Improper Inclusion Mode: %d.\n", mode);
    5968             :     }
    5969             : 
    5970             : 
    5971           0 :     if (status == 0)
    5972             :     {
    5973             :   /* Get "Longitude" field info */
    5974             :   /* -------------------------- */
    5975           0 :   statLon = SWfieldinfo(swathID, "Longitude", &rank, dims, &nt, dimlist);
    5976           0 :   if (statLon != 0)
    5977             :   {
    5978           0 :       status = -1;
    5979           0 :       HEpush(DFE_GENAPP, "SWregionl_index", __FILE__, __LINE__);
    5980           0 :       HEreport("\"Longitude\" field not found.\n");
    5981             :   }
    5982             : 
    5983             :   /* Get "Latitude" field info */
    5984             :   /* -------------------------- */
    5985           0 :   statLat = SWfieldinfo(swathID, "Latitude", &rank, dims, &nt, dimlist);
    5986           0 :   if (statLat != 0)
    5987             :   {
    5988             :       /* If not found check for "Colatitude" field info */
    5989             :       /* ---------------------------------------------- */
    5990           0 :       statCoLat = SWfieldinfo(swathID, "Colatitude", &rank, dims, &nt,
    5991             :             dimlist);
    5992           0 :       if (statCoLat != 0)
    5993             :       {
    5994             :         /* Check again for Geodeticlatitude */            
    5995           0 :         statGeodeticLat = SWfieldinfo(swathID, 
    5996             :               "GeodeticLatitude", &rank, 
    5997             :               dims, &nt, dimlist);
    5998           0 :         if (statGeodeticLat != 0)
    5999             :           {
    6000             :       /* Neither "Latitude" nor "Colatitude" field found */
    6001             :       /* ----------------------------------------------- */
    6002           0 :       status = -1;
    6003           0 :       HEpush(DFE_GENAPP, "SWregionl_index", __FILE__, __LINE__);
    6004           0 :       HEreport(
    6005             :          "Neither \"Latitude\" nor \"Colatitude\" fields found.\n");
    6006             :     }
    6007             :         else
    6008             :     {
    6009             :          /* Latitude field is "Colatitude" */
    6010             :          /* ------------------------------ */
    6011           0 :          strcpy(latName, "GeodeticLatitude");
    6012             :     }
    6013             :       }
    6014             :       else
    6015             :       {
    6016             :     /* Latitude field is "Colatitude" */
    6017             :     /* ------------------------------ */
    6018           0 :     strcpy(latName, "Colatitude");
    6019             :       }
    6020             :   }
    6021             :   else
    6022             :   {
    6023             :       /* Latitude field is "Latitude" */
    6024             :       /* ---------------------------- */
    6025           0 :       strcpy(latName, "Latitude");
    6026             :   }
    6027             : 
    6028             :         /* This line modifies the dimlist variable so only the along-track */
    6029             :         /* dimension remains.                                              */
    6030             :         /* --------------------------------------------------------------- */
    6031           0 :         (void) strtok(dimlist,",");
    6032           0 :         mapstatus = SWgeomapinfo(swathID,dimlist);
    6033           0 :         (void) strcpy(geodim,dimlist);
    6034             : 
    6035           0 :   if (status == 0)
    6036             :   {
    6037             :       /* Search along entire "Track" dimension from beginning to end */
    6038             :       /* ----------------------------------------------------------- */
    6039           0 :       start[0] = 0;
    6040           0 :       edge[0] = dims[0];
    6041             : 
    6042             : 
    6043             :       /* If 1D geolocation fields then set mode to MIDPOINT */
    6044             :       /* -------------------------------------------------- */
    6045           0 :       if (rank == 1)
    6046             :       {
    6047           0 :     mode = HDFE_MIDPOINT;
    6048             :       }
    6049             : 
    6050             : 
    6051           0 :       switch (mode)
    6052             :       {
    6053             :     /* If MIDPOINT search single point in middle of "CrossTrack" */
    6054             :     /* --------------------------------------------------------- */
    6055           0 :       case HDFE_MIDPOINT:
    6056             : 
    6057           0 :     start[1] = dims[1] / 2;
    6058           0 :     edge[1] = 1;
    6059             : 
    6060           0 :     break;
    6061             : 
    6062             :     /* If ENDPOINT search 2 points at either end of "CrossTrack" */
    6063             :     /* --------------------------------------------------------- */
    6064           0 :       case HDFE_ENDPOINT:
    6065             : 
    6066           0 :     start[1] = 0;
    6067           0 :     stride[1] = dims[1] - 1;
    6068           0 :     edge[1] = 2;
    6069             : 
    6070           0 :     break;
    6071             : 
    6072             :     /* If ANYPOINT do initial MIDPOINT search */
    6073             :     /* -------------------------------------- */
    6074           0 :       case HDFE_ANYPOINT:
    6075             : 
    6076           0 :     start[1] = dims[1] / 2;
    6077           0 :     edge[1] = 1;
    6078             : 
    6079           0 :     break;
    6080             :       }
    6081             : 
    6082             : 
    6083             :       /* Compute number of elements */
    6084             :       /* -------------------------- */
    6085           0 :       nElem = edge[0] * edge[1];
    6086             : 
    6087             : 
    6088             :       /* Allocate space for longitude and latitude (float64) */
    6089             :       /* --------------------------------------------------- */
    6090           0 :       lonArr = (char *) calloc(nElem, sizeof(float64));
    6091           0 :       if(lonArr == NULL)
    6092             :       { 
    6093           0 :     HEpush(DFE_NOSPACE,"SWregionl_index", __FILE__, __LINE__);
    6094           0 :     return(-1);
    6095             :       }
    6096             :       
    6097           0 :       latArr = (char *) calloc(nElem, sizeof(float64));
    6098           0 :       if(latArr == NULL)
    6099             :       { 
    6100           0 :     HEpush(DFE_NOSPACE,"SWregionl_index", __FILE__, __LINE__);
    6101           0 :     free(lonArr);
    6102           0 :     return(-1);
    6103             :       }
    6104             : 
    6105             : 
    6106             :       /* Allocate space for flag array (uint8) */
    6107             :       /* ------------------------------------- */
    6108           0 :       flag = (uint8 *) calloc(edge[0] + 1, 1);
    6109           0 :       if(flag == NULL)
    6110             :       { 
    6111           0 :     HEpush(DFE_NOSPACE,"SWregionl_index", __FILE__, __LINE__);
    6112           0 :     free(lonArr);
    6113           0 :     free(latArr);
    6114           0 :     return(-1);
    6115             :       }
    6116             : 
    6117             : 
    6118             :       /* Read Longitude and Latitude fields */
    6119             :       /* ---------------------------------- */
    6120           0 :       status = SWreadfield(swathID, "Longitude",
    6121             :          start, stride, edge, lonArr);
    6122           0 :       status = SWreadfield(swathID, latName,
    6123             :          start, stride, edge, latArr);
    6124             : 
    6125             : 
    6126             : 
    6127             :       /*
    6128             :        * If geolocation fields are FLOAT32 then cast each entry as
    6129             :        * FLOAT64
    6130             :        */
    6131           0 :       if (nt == DFNT_FLOAT32)
    6132             :       {
    6133           0 :     for (i = nElem - 1; i >= 0; i--)
    6134             :     {
    6135           0 :         memcpy(&temp32, lonArr + 4 * i, 4);
    6136           0 :         temp64 = (float64) temp32;
    6137           0 :         memcpy(lonArr + 8 * i, &temp64, 8);
    6138             : 
    6139           0 :         memcpy(&temp32, latArr + 4 * i, 4);
    6140           0 :         temp64 = (float64) temp32;
    6141           0 :         memcpy(latArr + 8 * i, &temp64, 8);
    6142             :     }
    6143             :       }
    6144             : 
    6145             : 
    6146             :       /* Set boundary flag */
    6147             :       /* ----------------- */
    6148             : 
    6149             :       /*
    6150             :        * This variable is set to 1 if the region of interest crosses
    6151             :        * the +/- 180 longitude boundary
    6152             :        */
    6153           0 :       bndflag = (cornerlon[0] < cornerlon[1]) ? 0 : 1;
    6154             : 
    6155             : 
    6156             : 
    6157             :       /* Main Search Loop */
    6158             :       /* ---------------- */
    6159             : 
    6160             :       /* For each track ... */
    6161             :       /* ------------------ */
    6162           0 :       for (i = 0; i < edge[0]; i++)
    6163             :       {
    6164             :     /* For each value from Cross Track ... */
    6165             :     /* ----------------------------------- */
    6166           0 :     for (j = 0; j < edge[1]; j++)
    6167             :     {
    6168             :         /* Read in single lon & lat values from data buffers */
    6169             :         /* ------------------------------------------------- */
    6170           0 :         memcpy(&lonTestVal, &lonArr[8 * (i * edge[1] + j)], 8);
    6171           0 :         memcpy(&latTestVal, &latArr[8 * (i * edge[1] + j)], 8);
    6172             : 
    6173             : 
    6174             :         /* If longitude value > 180 convert to -180 to 180 range */
    6175             :         /* ----------------------------------------------------- */
    6176           0 :         if (lonTestVal > 180)
    6177             :         {
    6178           0 :       lonTestVal = lonTestVal - 360;
    6179             :         }
    6180             : 
    6181             :         /* If Colatitude value convert to latitude value */
    6182             :         /* --------------------------------------------- */
    6183           0 :         if (statCoLat == 0)
    6184             :         {
    6185           0 :       latTestVal = 90 - latTestVal;
    6186             :         }
    6187             : 
    6188             : 
    6189             :         /* Test if lat value is within range */
    6190             :         /* --------------------------------- */
    6191           0 :         latTest = (latTestVal >= cornerlat[0] &&
    6192           0 :              latTestVal <= cornerlat[1]);
    6193             : 
    6194             : 
    6195           0 :         if (bndflag == 1)
    6196             :         {
    6197             :       /*
    6198             :        * If boundary flag set test whether longitude value
    6199             :        * is outside region and then flip
    6200             :        */
    6201           0 :       lonTest = (lonTestVal >= cornerlon[1] &&
    6202           0 :            lonTestVal <= cornerlon[0]);
    6203           0 :       lonTest = 1 - lonTest;
    6204             :         }
    6205             :         else
    6206             :         {
    6207           0 :       lonTest = (lonTestVal >= cornerlon[0] &&
    6208           0 :            lonTestVal <= cornerlon[1]);
    6209             :         }
    6210             : 
    6211             : 
    6212             :         /*
    6213             :          * If both longitude and latitude are within region set
    6214             :          * flag on for this track
    6215             :          */
    6216           0 :         if (lonTest + latTest == 2)
    6217             :         {
    6218           0 :       flag[i] = 1;
    6219           0 :       found = 1;
    6220           0 :       break;
    6221             :         }
    6222             :     }
    6223             :       }
    6224             : 
    6225             : 
    6226             : 
    6227             :       /* ANYPOINT search */
    6228             :       /* --------------- */
    6229           0 :       if (mode == HDFE_ANYPOINT && rank > 1)
    6230             :       {
    6231           0 :     free(lonArr);
    6232           0 :     free(latArr);
    6233             : 
    6234             :     /* Allocate space for an entire single cross track */
    6235             :     /* ----------------------------------------------- */
    6236           0 :     lonArr = (char *) calloc(dims[1], sizeof(float64));
    6237           0 :     if(lonArr == NULL)
    6238             :     { 
    6239           0 :         HEpush(DFE_NOSPACE,"SWregionl_index", __FILE__, __LINE__);
    6240           0 :         return(-1);
    6241             :     }
    6242           0 :     latArr = (char *) calloc(dims[1], sizeof(float64));
    6243           0 :     if(latArr == NULL)
    6244             :     { 
    6245           0 :         HEpush(DFE_NOSPACE,"SWregionl_index", __FILE__, __LINE__);
    6246           0 :         free(lonArr);
    6247           0 :         return(-1);
    6248             :     }
    6249             : 
    6250             :     /* Setup start and edge */
    6251             :     /* -------------------- */
    6252           0 :     anyStart[1] = 0;
    6253           0 :     anyEdge[0] = 1;
    6254           0 :     anyEdge[1] = dims[1];
    6255             : 
    6256             : 
    6257             :     /* For each track ... */
    6258             :     /* ------------------ */
    6259           0 :     for (i = 0; i < edge[0]; i++)
    6260             :     {
    6261             : 
    6262             :         /* If cross track not in region (with MIDPOINT search ... */
    6263             :         /* ------------------------------------------------------ */
    6264           0 :         if (flag[i] == 0)
    6265             :         {
    6266             :       /* Setup track start */
    6267             :       /* ----------------- */
    6268           0 :       anyStart[0] = i;
    6269             : 
    6270             : 
    6271             :       /* Read in lon and lat values for cross track */
    6272             :       /* ------------------------------------------ */
    6273           0 :       status = SWreadfield(swathID, "Longitude",
    6274             :              anyStart, NULL, anyEdge, lonArr);
    6275           0 :       status = SWreadfield(swathID, latName,
    6276             :              anyStart, NULL, anyEdge, latArr);
    6277             : 
    6278             : 
    6279             : 
    6280             :       /*
    6281             :        * If geolocation fields are FLOAT32 then cast each
    6282             :        * entry as FLOAT64
    6283             :        */
    6284           0 :       if (nt == DFNT_FLOAT32)
    6285             :       {
    6286           0 :           for (j = dims[1] - 1; j >= 0; j--)
    6287             :           {
    6288           0 :         memcpy(&temp32, lonArr + 4 * j, 4);
    6289           0 :         temp64 = (float64) temp32;
    6290           0 :         memcpy(lonArr + 8 * j, &temp64, 8);
    6291             : 
    6292           0 :         memcpy(&temp32, latArr + 4 * j, 4);
    6293           0 :         temp64 = (float64) temp32;
    6294           0 :         memcpy(latArr + 8 * j, &temp64, 8);
    6295             :           }
    6296             :       }
    6297             : 
    6298             : 
    6299             :       /* For each value from Cross Track ... */
    6300             :       /* ----------------------------------- */
    6301           0 :       for (j = 0; j < dims[1]; j++)
    6302             :       {
    6303             :           /* Read in single lon & lat values from buffers */
    6304             :           /* -------------------------------------------- */
    6305           0 :           memcpy(&lonTestVal, &lonArr[8 * j], 8);
    6306           0 :           memcpy(&latTestVal, &latArr[8 * j], 8);
    6307             : 
    6308             : 
    6309             :           /* If lon value > 180 convert to -180 - 180 range */
    6310             :           /* ---------------------------------------------- */
    6311           0 :           if (lonTestVal > 180)
    6312             :           {
    6313           0 :         lonTestVal = lonTestVal - 360;
    6314             :           }
    6315             : 
    6316             :           /* If Colatitude value convert to latitude value */
    6317             :           /* --------------------------------------------- */
    6318           0 :           if (statCoLat == 0)
    6319             :           {
    6320           0 :         latTestVal = 90 - latTestVal;
    6321             :           }
    6322             : 
    6323             : 
    6324             :           /* Test if lat value is within range */
    6325             :           /* --------------------------------- */
    6326           0 :           latTest = (latTestVal >= cornerlat[0] &&
    6327           0 :                latTestVal <= cornerlat[1]);
    6328             : 
    6329             : 
    6330           0 :           if (bndflag == 1)
    6331             :           {
    6332             :         /*
    6333             :          * If boundary flag set test whether
    6334             :          * longitude value is outside region and then
    6335             :          * flip
    6336             :          */
    6337           0 :         lonTest = (lonTestVal >= cornerlon[1] &&
    6338           0 :              lonTestVal <= cornerlon[0]);
    6339           0 :         lonTest = 1 - lonTest;
    6340             :           }
    6341             :           else
    6342             :           {
    6343           0 :         lonTest = (lonTestVal >= cornerlon[0] &&
    6344           0 :              lonTestVal <= cornerlon[1]);
    6345             :           }
    6346             : 
    6347             : 
    6348             :           /*
    6349             :            * If both longitude and latitude are within
    6350             :            * region set flag on for this track
    6351             :            */
    6352           0 :           if (lonTest + latTest == 2)
    6353             :           {
    6354           0 :         flag[i] = 1;
    6355           0 :         found = 1;
    6356           0 :         break;
    6357             :           }
    6358             :       }
    6359             :         }
    6360             :     }
    6361             :       }
    6362             :       /*
    6363             :       for (j1 = 0; j1 < edge[0]; j1++)
    6364             :         {
    6365             :     idxrange[j1] = (int32) flag[j1];
    6366             :         }
    6367             :       */
    6368             :       /* If within region setup Region Structure */
    6369             :       /* --------------------------------------- */
    6370           0 :       if (found == 1)
    6371             :       {
    6372             :     /* For all entries in SWXRegion array ... */
    6373             :     /* -------------------------------------- */
    6374           0 :     for (k = 0; k < NSWATHREGN; k++)
    6375             :     {
    6376             :         /* If empty region ... */
    6377             :         /* ------------------- */
    6378           0 :         if (SWXRegion[k] == 0)
    6379             :         {
    6380             :       /* Allocate space for region entry */
    6381             :       /* ------------------------------- */
    6382           0 :       SWXRegion[k] = (struct swathRegion *)
    6383           0 :           calloc(1, sizeof(struct swathRegion));
    6384           0 :       if(SWXRegion[k] == NULL)
    6385             :       { 
    6386           0 :           HEpush(DFE_NOSPACE,"SWregionl_index", __FILE__, __LINE__);
    6387           0 :           return(-1);
    6388             :       }
    6389             : 
    6390             :       /* Store file and swath ID */
    6391             :       /* ----------------------- */
    6392           0 :       SWXRegion[k]->fid = fid;
    6393           0 :       SWXRegion[k]->swathID = swathID;
    6394             : 
    6395             : 
    6396             :       /* Set Start & Stop Vertical arrays to -1 */
    6397             :       /* -------------------------------------- */
    6398           0 :       for (j = 0; j < 8; j++)
    6399             :       {
    6400           0 :           SWXRegion[k]->StartVertical[j] = -1;
    6401           0 :           SWXRegion[k]->StopVertical[j] = -1;
    6402           0 :           SWXRegion[k]->StartScan[j] = -1;
    6403           0 :           SWXRegion[k]->StopScan[j] = -1;
    6404             :       }
    6405             : 
    6406             : 
    6407             :       /* Set region ID */
    6408             :       /* ------------- */
    6409           0 :       regionID = k;
    6410           0 :       break;
    6411             :         }
    6412             :     }
    6413           0 :     if (k >= NSWATHREGN)
    6414             :       {
    6415           0 :         HEpush(DFE_GENAPP, "SWregionl_index", __FILE__, __LINE__);
    6416           0 :         HEreport(
    6417             :            "regionID exceeded NSWATHREGN.\n");
    6418           0 :                     return (-1);
    6419             :       }
    6420             : 
    6421             :     /* Find start and stop of regions */
    6422             :     /* ------------------------------ */
    6423             : 
    6424             :     /* Subtract previous flag value from current one */
    6425             :     /* --------------------------------------------- */
    6426             : 
    6427             :     /*
    6428             :      * Transition points will have flag value (+1) start or
    6429             :      * (255 = (uint8) -1) stop of region
    6430             :      */
    6431           0 :     for (i = edge[0]; i > 0; i--)
    6432             :     {
    6433           0 :         flag[i] -= flag[i - 1];
    6434             :     }
    6435             : 
    6436             : 
    6437           0 :     for (i = 0; i <= edge[0]; i++)
    6438             :     {
    6439             :         /* Start of region */
    6440             :         /* --------------- */
    6441           0 :         if (flag[i] == 1)
    6442             :         {
    6443             :       /* Delyth Jones Moved the increment of the region down
    6444             :          to next if statement j = ++SWXRegion[k]->nRegions; */
    6445             : 
    6446             :       /* using temp value, if not equal to stop region
    6447             :          invalid region otherwise ok Delyth Jones */
    6448           0 :       tmpVal = i+1;
    6449             :         }
    6450             : 
    6451             :         /* End of region */
    6452             :         /* ------------- */
    6453           0 :         if (flag[i] == 255)
    6454             :         {
    6455           0 :       if( tmpVal!=i )
    6456             :       {
    6457             :           /* Increment (multiple) region counter */
    6458             :           /* ----------------------------------- */
    6459           0 :           j = ++SWXRegion[k]->nRegions;
    6460             :           
    6461           0 :                             if (mapstatus == 2)
    6462             :                             {
    6463           0 :                                l = i;
    6464           0 :                                if ((tmpVal-1) % 2 == 1)
    6465             :                                {
    6466           0 :                                   tmpVal = tmpVal + 1;
    6467             :                                }
    6468             : 
    6469           0 :                                if ((l-1) % 2 == 0)
    6470             :                                {
    6471           0 :                                   l = l - 1;
    6472             :                                }
    6473             :                             }
    6474           0 :           SWXRegion[k]->StartRegion[j - 1] = tmpVal-1;
    6475           0 :                             idxrange[0] = tmpVal - 1;
    6476           0 :           SWXRegion[k]->StopRegion[j - 1] = l - 1;
    6477           0 :                             idxrange[1] = l - 1;
    6478           0 :           validReg = 0;
    6479             :       }
    6480             :         }
    6481             :         
    6482             :     }
    6483             : 
    6484             :       }
    6485           0 :       free(lonArr);
    6486           0 :       free(latArr);
    6487           0 :       free(flag);
    6488             :   }
    6489             :     }
    6490           0 :     if(validReg==0)
    6491             :     {
    6492           0 :   return (regionID);
    6493             :     }
    6494             :     else
    6495             :     {
    6496           0 :   return (-1);
    6497             :     }
    6498             :     
    6499             : }
    6500             : 
    6501             : 
    6502             : 
    6503             : /*----------------------------------------------------------------------------|
    6504             : |  BEGIN_PROLOG                                                               |
    6505             : |                                                                             |
    6506             : |  FUNCTION: SWdeftimeperiod                                                  |
    6507             : |                                                                             |
    6508             : |  DESCRIPTION: Finds swath cross tracks observed during time period and      |
    6509             : |               returns  period ID                                            |
    6510             : |                                                                             |
    6511             : |               region ID                                                     |
    6512             : |  DESCRIPTION:                                                               |
    6513             : |                                                                             |
    6514             : |                                                                             |
    6515             : |  Return Value    Type     Units     Description                             |
    6516             : |  ============   ======  =========   =====================================   |
    6517             : |  periodID       int32               (Period ID) or (-1) if failed           |
    6518             : |                                                                             |
    6519             : |  INPUTS:                                                                    |
    6520             : |  swathID        int32               Swath structure ID                      |
    6521             : |  starttime      float64 TAI sec     Start of time period                    |
    6522             : |  stoptime       float64 TAI sec     Stop of time period                     |
    6523             : |  mode           int32               Search mode                             |
    6524             : |                                     HDFE_MIDPOINT - Use midpoint of Xtrack  |
    6525             : |                                     HDFE_ENDPOINT - Use endpoints of Xtrack |
    6526             : |                                                                             |
    6527             : |  OUTPUTS:                                                                   |
    6528             : |             None                                                            |
    6529             : |                                                                             |
    6530             : |  NOTES:                                                                     |
    6531             : |                                                                             |
    6532             : |                                                                             |
    6533             : |   Date     Programmer   Description                                         |
    6534             : |  ======   ============  =================================================   |
    6535             : |  Jun 96   Joel Gales    Original Programmer                                 |
    6536             : |                                                                             |
    6537             : |  END_PROLOG                                                                 |
    6538             : -----------------------------------------------------------------------------*/
    6539             : int32
    6540           0 : SWdeftimeperiod(int32 swathID, float64 starttime, float64 stoptime,
    6541             :     int32 mode)
    6542             : {
    6543             : 
    6544             :     intn            i;        /* Loop index */
    6545             :     intn            j;        /* Loop index */
    6546           0 :     intn            k = 0;        /* Loop index */
    6547             :     intn            status;     /* routine return status variable */
    6548             :     intn            statTime;     /* Status from SWfieldinfo for time */
    6549             : 
    6550           0 :     uint8           found = 0;      /* Found flag */
    6551             : 
    6552             :     int32           fid;      /* HDF-EOS file ID */
    6553             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    6554             :     int32           swVgrpID;     /* Swath Vgroup ID */
    6555             :     int32           rank;     /* Rank of geolocation fields */
    6556             :     int32           nt;       /* Number type of geolocation fields */
    6557             :     int32           dims[8];      /* Dimensions of geolocation fields */
    6558             :     int32           start[2];     /* Start array (read) */
    6559           0 :     int32           stride[2] = {1, 1}; /* Stride array (read) */
    6560             :     int32           edge[2];      /* Edge array (read) */
    6561           0 :     int32           periodID = -1;  /* Period ID (return) */
    6562             :     int32           dum;      /* Dummy (loop) variable */
    6563             : 
    6564             :     float64         time64Test;     /* Time test value */
    6565           0 :     float64        *time64 = NULL;  /* Time data array */
    6566             : 
    6567             :     char            dimlist[256];   /* Dimension list (geolocation fields) */
    6568             : 
    6569             :     /* Check for valid swath ID */
    6570             :     /* ------------------------ */
    6571           0 :     status = SWchkswid(swathID, "SWdeftimeperiod", &fid, &sdInterfaceID,
    6572             :            &swVgrpID);
    6573             : 
    6574           0 :     if (status == 0)
    6575             :     {
    6576             :   /* Get "Time" field info */
    6577             :   /* --------------------- */
    6578           0 :   statTime = SWfieldinfo(swathID, "Time", &rank, dims, &nt, dimlist);
    6579           0 :   if (statTime != 0)
    6580             :   {
    6581           0 :       status = -1;
    6582           0 :       HEpush(DFE_GENAPP, "SWdeftimeperiod", __FILE__, __LINE__);
    6583           0 :       HEreport("\"Time\" field not found.\n");
    6584             :   }
    6585             : 
    6586           0 :   if (status == 0)
    6587             :   {
    6588             :       /* Search along entire "Track" dimension from beginning to end */
    6589             :       /* ----------------------------------------------------------- */
    6590           0 :       start[0] = 0;
    6591           0 :       edge[0] = dims[0];
    6592             : 
    6593             : 
    6594             :       /* If 1D geolocation fields then set mode to MIDPOINT */
    6595             :       /* -------------------------------------------------- */
    6596           0 :       if (rank == 1)
    6597             :       {
    6598           0 :     mode = HDFE_MIDPOINT;
    6599             :       }
    6600             : 
    6601             : 
    6602           0 :       switch (mode)
    6603             :       {
    6604             : 
    6605             :     /* If MIDPOINT search single point in middle of "CrossTrack" */
    6606             :     /* --------------------------------------------------------- */
    6607           0 :       case HDFE_MIDPOINT:
    6608             : 
    6609           0 :     start[1] = dims[1] / 2;
    6610           0 :     edge[1] = 1;
    6611             : 
    6612             : 
    6613             :     /* Allocate space for time data */
    6614             :     /* ---------------------------- */
    6615           0 :     time64 = (float64 *) calloc(edge[0], 8);
    6616           0 :     if(time64 == NULL)
    6617             :     { 
    6618           0 :         HEpush(DFE_NOSPACE,"SWdeftimeperiod", __FILE__, __LINE__);
    6619           0 :         return(-1);
    6620             :     }
    6621             : 
    6622             : 
    6623             :     /* Read "Time" field */
    6624             :     /* ----------------- */
    6625           0 :     status = SWreadfield(swathID, "Time",
    6626             :              start, NULL, edge, time64);
    6627           0 :     break;
    6628             : 
    6629             : 
    6630             :     /* If ENDPOINT search 2 points at either end of "CrossTrack" */
    6631             :     /* --------------------------------------------------------- */
    6632           0 :       case HDFE_ENDPOINT:
    6633           0 :     start[1] = 0;
    6634           0 :     stride[1] = dims[1] - 1;
    6635           0 :     edge[1] = 2;
    6636             : 
    6637             : 
    6638             :     /* Allocate space for time data */
    6639             :     /* ---------------------------- */
    6640           0 :     time64 = (float64 *) calloc(edge[0] * 2, 8);
    6641           0 :     if(time64 == NULL)
    6642             :     { 
    6643           0 :         HEpush(DFE_NOSPACE,"SWdeftimeperiod", __FILE__, __LINE__);
    6644           0 :         return(-1);
    6645             :     }
    6646             : 
    6647             :     /* Read "Time" field */
    6648             :     /* ----------------- */
    6649           0 :     status = SWreadfield(swathID, "Time",
    6650             :              start, stride, edge, time64);
    6651           0 :     break;
    6652             : 
    6653             :       }
    6654             : 
    6655           0 :             if (time64)
    6656             :             {
    6657             :                 /* For each track (from top) ... */
    6658             :                 /* ----------------------------- */
    6659           0 :                 for (i = 0; i < edge[0]; i++)
    6660             :                 {
    6661             :                     /* For each value from Cross Track ... */
    6662             :                     /* ----------------------------------- */
    6663           0 :                     for (j = 0; j < edge[1]; j++)
    6664             :                     {
    6665             : 
    6666             :                         /* Get time test value */
    6667             :                         /* ------------------- */
    6668           0 :                         time64Test = time64[i * edge[1] + j];
    6669             : 
    6670             : 
    6671             :                         /* If within time period ... */
    6672             :                         /* ------------------------- */
    6673           0 :                         if (time64Test >= starttime &&
    6674             :                             time64Test <= stoptime)
    6675             :                         {
    6676             :                             /* Set found flag */
    6677             :                             /* -------------- */
    6678           0 :                             found = 1;
    6679             : 
    6680             : 
    6681             :                             /* For all entries in SWXRegion array ... */
    6682             :                             /* -------------------------------------- */
    6683           0 :                             for (k = 0; k < NSWATHREGN; k++)
    6684             :                             {
    6685             :                                 /* If empty region ... */
    6686             :                                 /* ------------------- */
    6687           0 :                                 if (SWXRegion[k] == 0)
    6688             :                                 {
    6689             :                                     /* Allocate space for region entry */
    6690             :                                     /* ------------------------------- */
    6691           0 :                                     SWXRegion[k] = (struct swathRegion *)
    6692           0 :                                         calloc(1, sizeof(struct swathRegion));
    6693           0 :                                     if(SWXRegion[k] == NULL)
    6694             :                                     { 
    6695           0 :                                         HEpush(DFE_NOSPACE,"SWdeftimeperiod", __FILE__, __LINE__);
    6696           0 :                                         return(-1);
    6697             :                                     }
    6698             : 
    6699             :                                     /* Store file and swath ID */
    6700             :                                     /* ----------------------- */
    6701           0 :                                     SWXRegion[k]->fid = fid;
    6702           0 :                                     SWXRegion[k]->swathID = swathID;
    6703             : 
    6704             : 
    6705             :                                     /* Set number of isolated regions to 1 */
    6706             :                                     /* ----------------------------------- */
    6707           0 :                                     SWXRegion[k]->nRegions = 1;
    6708             : 
    6709             : 
    6710             :                                     /* Set start of region to first track found */
    6711             :                                     /* ---------------------------------------- */
    6712           0 :                                     SWXRegion[k]->StartRegion[0] = i;
    6713             : 
    6714             : 
    6715             :                                     /* Set Start & Stop Vertical arrays to -1 */
    6716             :                                     /* -------------------------------------- */
    6717           0 :                                     for (dum = 0; dum < 8; dum++)
    6718             :                                     {
    6719           0 :                                         SWXRegion[k]->StartVertical[dum] = -1;
    6720           0 :                                         SWXRegion[k]->StopVertical[dum] = -1;
    6721           0 :                                         SWXRegion[k]->StartScan[dum] = -1;
    6722           0 :                                         SWXRegion[k]->StopScan[dum] = -1;
    6723             :                                     }
    6724             : 
    6725             : 
    6726             :                                     /* Set period ID */
    6727             :                                     /* ------------- */
    6728           0 :                                     periodID = k;
    6729             : 
    6730           0 :                                     break;  /* Break from "k" loop */
    6731             :                                 }
    6732             :                             }
    6733             :                         }
    6734           0 :                         if (found == 1)
    6735             :                         {
    6736           0 :                             break;  /* Break from "j" loop */
    6737             :                         }
    6738             :                     }
    6739           0 :                     if (found == 1)
    6740             :                     {
    6741           0 :                         break;  /* Break from "i" loop */
    6742             :                     }
    6743             :                 }
    6744             : 
    6745             : 
    6746             : 
    6747             :                 /* Clear found flag */
    6748             :                 /* ---------------- */
    6749           0 :                 found = 0;
    6750             : 
    6751             : 
    6752             :                 /* For each track (from bottom) ... */
    6753             :                 /* -------------------------------- */
    6754           0 :                 for (i = edge[0] - 1; i >= 0; i--)
    6755             :                 {
    6756             :                     /* For each value from Cross Track ... */
    6757             :                     /* ----------------------------------- */
    6758           0 :                     for (j = 0; j < edge[1]; j++)
    6759             :                     {
    6760             : 
    6761             :                         /* Get time test value */
    6762             :                         /* ------------------- */
    6763           0 :                         time64Test = time64[i * edge[1] + j];
    6764             : 
    6765             : 
    6766             :                         /* If within time period ... */
    6767             :                         /* ------------------------- */
    6768           0 :                         if (time64Test >= starttime &&
    6769             :                             time64Test <= stoptime)
    6770             :                         {
    6771             :                             /* Set found flag */
    6772             :                             /* -------------- */
    6773           0 :                             found = 1;
    6774             : 
    6775             :                             /* Set start of region to first track found */
    6776             :                             /* ---------------------------------------- */
    6777           0 :                             SWXRegion[k]->StopRegion[0] = i;
    6778             : 
    6779           0 :                             break;  /* Break from "j" loop */
    6780             :                         }
    6781             :                     }
    6782           0 :                     if (found == 1)
    6783             :                     {
    6784           0 :                         break;  /* Break from "i" loop */
    6785             :                     }
    6786             :                 }
    6787             : 
    6788           0 :                 free(time64);
    6789             :             }
    6790             :   }
    6791             :     }
    6792             : 
    6793           0 :     return (periodID);
    6794             : }
    6795             : 
    6796             : /*----------------------------------------------------------------------------|
    6797             : |  BEGIN_PROLOG                                                               |
    6798             : |                                                                             |
    6799             : |  FUNCTION: SWextractregion                                                  |
    6800             : |                                                                             |
    6801             : |  DESCRIPTION: Retrieves data from specified region.                         |
    6802             : |                                                                             |
    6803             : |                                                                             |
    6804             : |  Return Value    Type     Units     Description                             |
    6805             : |  ============   ======  =========   =====================================   |
    6806             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    6807             : |                                                                             |
    6808             : |  INPUTS:                                                                    |
    6809             : |  swathID        int32               Swath structure ID                      |
    6810             : |  regionID       int32               Region ID                               |
    6811             : |  fieldname      char                Fieldname                               |
    6812             : |  externalflag   int32               External geolocation fields flag        |
    6813             : |                                     HDFE_INTERNAL (0)                       |
    6814             : |                                     HDFE_EXTERNAL (1)                       |
    6815             : |                                                                             |
    6816             : |  OUTPUTS:                                                                   |
    6817             : |  buffer         void                Data buffer containing subsetted region |
    6818             : |                                                                             |
    6819             : |  NOTES:                                                                     |
    6820             : |                                                                             |
    6821             : |                                                                             |
    6822             : |   Date     Programmer   Description                                         |
    6823             : |  ======   ============  =================================================   |
    6824             : |  Jun 96   Joel Gales    Original Programmer                                 |
    6825             : |  Aug 96   Joel Gales    Add vertical subsetting                             |
    6826             : |  Oct 96   Joel Gales    Mapping offset value not read from SWmapinfo        |
    6827             : |  Dec 96   Joel Gales    Vert Subset overwriting data buffer                 |
    6828             : |  Dec 96   Joel Gales    Add multiple vertical subsetting capability         |
    6829             : |  Mar 97   Joel Gales    Add support for l_index mapping                       |
    6830             : |  Jul 99   DaW     Add support for floating scene subsetting         |
    6831             : |  Feb 03   Terry Haran/                                                      |
    6832             : |           Abe Taaheri   Forced map offset to 0 so that data is extracted    |
    6833             : |                         without offset consideration. This will preserve    |
    6834             : |                         original mapping between geofields and the data     |
    6835             : |                         field.                                              |
    6836             : |                                                                             |
    6837             : |  END_PROLOG                                                                 |
    6838             : -----------------------------------------------------------------------------*/
    6839             : intn
    6840           0 : SWextractregion(int32 swathID, int32 regionID, const char *fieldname,
    6841             :     int32 externalflag, VOIDP buffer)
    6842             : 
    6843             : {
    6844             :     intn            i;    /* Loop index */
    6845             :     intn            j;    /* Loop index */
    6846             :     intn            k;    /* Loop index */
    6847             :     intn            l;    /* Loop index */
    6848             :     intn            status; /* routine return status variable */
    6849           0 :     intn            long_status = 3;  /* routine return status variable    */
    6850             :                                         /* for longitude                     */
    6851           0 :     intn      land_status = 3;  /* Used for L7 float scene sub.      */
    6852           0 :     intn            statMap = -1; /* Status from SWmapinfo  */
    6853             : 
    6854           0 :     uint8           found = 0;    /* Found flag */
    6855           0 :     uint8           vfound = 0;   /* Found flag for vertical subsetting*/
    6856             :                                         /*  --- xhua                         */
    6857           0 :     uint8     scene_cnt = 0;  /* Used for L7 float scene sub.      */
    6858           0 :     uint8           detect_cnt = 0;     /* Used to convert scan to scanline  */
    6859             :                                         /*  L7 float scene sub.              */
    6860             : 
    6861             :     int32           fid;  /* HDF-EOS file ID */
    6862             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    6863             :     int32           swVgrpID; /* Swath Vgroup ID */
    6864             : 
    6865           0 :     int32     numtype = 0; /* Used for L7 float scene sub. */
    6866           0 :     int32     count = 0;   /* Used for L7 float scene sub. */
    6867           0 :     int32           l_index = 0;  /* Geo Dim Index */
    6868             :     int32           nDim; /* Number of dimensions */
    6869             :     int32           slen[64]; /* String length array */
    6870             :     int32           dum;  /* Dummy variable */
    6871           0 :     int32           offset = 0; /* Mapping offset */
    6872           0 :     int32           incr = 0; /* Mapping increment */
    6873             :     int32           nXtrk;  /* Number of cross tracks */
    6874           0 :     int32           scan_shift = 0; /* Used to take out partial scans */
    6875             :     int32           dumdims[8]; /* Dimensions from SWfieldinfo */
    6876             :     int32           start[8]; /* Start array for data read */
    6877             :     int32           edge[8];  /* Edge array for data read */
    6878             :     int32           dims[8];  /* Dimensions */
    6879           0 :     int32           rank = 0; /* Field rank */
    6880           0 :     int32           rk = 0; /* Field rank */
    6881           0 :     int32           ntype = 0;  /* Field number type */
    6882           0 :     int32           bufOffset = 0;  /* Output buffer offset */
    6883             :     int32           size; /* Size of data buffer */
    6884           0 :     int32           idxMapElem = -1;  /* Number of l_index map elements  */
    6885           0 :     int32          *idxmap = NULL;  /* Pointer to l_index mapping array */
    6886             : 
    6887           0 :     int32 startscanline = 0;
    6888           0 :     int32 stopscanline = 0;
    6889           0 :     char  *dfieldlist = (char *)NULL;
    6890           0 :     int32 strbufsize = 0;
    6891             :     int32 dfrank[8];
    6892             :     int32 numtype2[8];
    6893           0 :     uint16  *buffer2 = (uint16 *)NULL;
    6894           0 :     uint16  *tbuffer = (uint16 *)NULL;
    6895             :     int32 dims2[8];
    6896           0 :     int32 nt = 0;
    6897           0 :     int32 startscandim = -1;
    6898           0 :     int32 stopscandim = -1;
    6899           0 :     int32 rank2 = 0;
    6900             : 
    6901             :     char            dimlist[256]; /* Dimension list */
    6902             :     char            geodim[256];/* Geolocation field dimension list */
    6903             :     char            tgeodim[256];/* Time field dimension list */
    6904             :     char            dgeodim[256];/* Data field dimension list for subsetting */
    6905             :     char            utlbuf[256];/* Utility buffer */
    6906             :     char           *ptr[64];  /* String pointer array */
    6907             : 
    6908             : 
    6909             : 
    6910             :     /* Check for valid swath ID */
    6911             :     /* ------------------------ */
    6912           0 :     status = SWchkswid(swathID, "SWextractregion", &fid, &sdInterfaceID,
    6913             :            &swVgrpID);
    6914             : 
    6915             : 
    6916             :     /* Check for valid region ID */
    6917             :     /* ------------------------- */
    6918           0 :     if (status == 0)
    6919             :     {
    6920           0 :   if (regionID < 0 || regionID >= NSWATHREGN)
    6921             :   {
    6922           0 :       status = -1;
    6923           0 :       HEpush(DFE_RANGE, "SWextractregion", __FILE__, __LINE__);
    6924           0 :       HEreport("Invalid Region id: %d.\n", regionID);
    6925             :   }
    6926             :     }
    6927             : 
    6928             : 
    6929             : 
    6930             :     /* Check for active region ID */
    6931             :     /* -------------------------- */
    6932           0 :     if (status == 0)
    6933             :     {
    6934           0 :   if (SWXRegion[regionID] == 0)
    6935             :   {
    6936           0 :       status = -1;
    6937           0 :       HEpush(DFE_GENAPP, "SWextractregion", __FILE__, __LINE__);
    6938           0 :       HEreport("Inactive Region ID: %d.\n", regionID);
    6939             :   }
    6940             :     }
    6941             : 
    6942             : 
    6943             :    /* This code checks for the attribute detector_count */
    6944             :    /* which is found in Landsat 7 files.  It is used    */
    6945             :    /* for some of the loops.                            */
    6946             :    /* ================================================= */
    6947           0 :    if (status == 0 && SWXRegion[regionID]->scanflag == 1)
    6948             :    {
    6949           0 :       land_status = SWattrinfo(swathID, "detector_count", &numtype, &count);
    6950           0 :       if (land_status == 0)
    6951           0 :          land_status = SWreadattr(swathID, "detector_count", &detect_cnt);
    6952             :    }
    6953             : 
    6954             :     /* Check that geo file and data file are same for INTERNAL subsetting */
    6955             :     /* ------------------------------------------------------------------ */
    6956           0 :     if (status == 0)
    6957             :     {
    6958           0 :   if (SWXRegion[regionID]->fid != fid && externalflag != HDFE_EXTERNAL)
    6959             :   {
    6960           0 :       status = -1;
    6961           0 :       HEpush(DFE_GENAPP, "SWextractregion", __FILE__, __LINE__);
    6962           0 :       HEreport("Region is not defined for this file.\n");
    6963             :   }
    6964             :     }
    6965             : 
    6966             : 
    6967             : 
    6968             :     /* Check that geo swath and data swath are same for INTERNAL subsetting */
    6969             :     /* -------------------------------------------------------------------- */
    6970           0 :     if (status == 0)
    6971             :     {
    6972           0 :   if (SWXRegion[regionID]->swathID != swathID &&
    6973             :       externalflag != HDFE_EXTERNAL)
    6974             :   {
    6975           0 :       status = -1;
    6976           0 :       HEpush(DFE_GENAPP, "SWextractregion", __FILE__, __LINE__);
    6977           0 :       HEreport("Region is not defined for this Swath.\n");
    6978             :   }
    6979             :     }
    6980             : 
    6981             : 
    6982             : 
    6983             :     /* Check for valid fieldname */
    6984             :     /* ------------------------- */
    6985           0 :     if (status == 0)
    6986             :     {
    6987             : 
    6988             :   /* Get data field info */
    6989             :   /* ------------------- */
    6990           0 :   status = SWfieldinfo(swathID, fieldname, &rank,
    6991             :            dims, &ntype, dimlist);
    6992             : 
    6993           0 :   if (status != 0)
    6994             :   {
    6995           0 :       status = -1;
    6996           0 :       HEpush(DFE_GENAPP, "SWextractregion", __FILE__, __LINE__);
    6997           0 :       HEreport("Field \"%s\" Not Found.\n", fieldname);
    6998             :   }
    6999             :     }
    7000             : 
    7001             : 
    7002             :     /* No problems so proceed ... */
    7003             :     /* -------------------------- */
    7004           0 :     if (status == 0)
    7005             :     {
    7006             : 
    7007             : 
    7008             :   /* Initialize start and edge for all dimensions */
    7009             :   /* -------------------------------------------- */
    7010           0 :   for (j = 0; j < rank; j++)
    7011             :   {
    7012           0 :       start[j] = 0;
    7013           0 :       edge[j] = dims[j];
    7014             :   }
    7015             : 
    7016             : 
    7017             :   /* Vertical Subset */
    7018             :   /* --------------- */
    7019           0 :   for (j = 0; j < 8; j++)
    7020             :   {
    7021             :       /* If active vertical subset ... */
    7022             :       /* ----------------------------- */
    7023           0 :       if (SWXRegion[regionID]->StartVertical[j] != -1)
    7024             :       {
    7025             : 
    7026             :     /* Find vertical dimension within dimlist */
    7027             :     /* -------------------------------------- */
    7028           0 :     dum = EHstrwithin(SWXRegion[regionID]->DimNamePtr[j],
    7029             :           dimlist, ',');
    7030             : 
    7031             :     /* If dimension found ... */
    7032             :     /* ---------------------- */
    7033           0 :     if (dum != -1)
    7034             :     {
    7035             :         /* Compute start and edge for vertical dimension */
    7036             :         /* --------------------------------------------- */
    7037           0 :                     vfound = 1;                   /* xhua */
    7038           0 :         start[dum] = SWXRegion[regionID]->StartVertical[j];
    7039           0 :         edge[dum] = SWXRegion[regionID]->StopVertical[j] -
    7040           0 :       SWXRegion[regionID]->StartVertical[j] + 1;
    7041             :     }
    7042             :     else
    7043             :     {
    7044             :         /* Vertical dimension not found */
    7045             :         /* ---------------------------- */
    7046           0 :         status = -1;
    7047           0 :         HEpush(DFE_GENAPP, "SWextractregion", __FILE__, __LINE__);
    7048           0 :         HEreport("Vertical Dimension Not Found: \"%s\".\n",
    7049           0 :            SWXRegion[regionID]->DimNamePtr);
    7050             :     }
    7051             :       }
    7052             :   } /* End of Vertical Subset loop  */
    7053             : 
    7054             : 
    7055             : 
    7056             :   /* No problems so proceed ... */
    7057             :   /* -------------------------- */
    7058           0 :   if (status == 0)
    7059             :   {
    7060             :       /* If non-vertical subset regions defined ... */
    7061             :       /* ------------------------------------------ */
    7062           0 :       if (SWXRegion[regionID]->nRegions > 0)    
    7063             :       {
    7064             : 
    7065             :     /* Get geolocation dimension name */
    7066             :     /* ------------------------------ */
    7067           0 :     status = SWfieldinfo(SWXRegion[regionID]->swathID,
    7068             :              "Longitude", &dum,
    7069             :              dumdims, &dum, geodim);
    7070           0 :                 long_status = status;
    7071             : 
    7072             :                 /* If Time field being used, check for dimensions */
    7073             :                 /* ---------------------------------------------- */
    7074           0 :                 if (timeflag == 1)
    7075             :                 {
    7076             :                    /* code change to fix time subset bug for Landsat7 */
    7077             : 
    7078           0 :                    status = SWfieldinfo(SWXRegion[regionID]->swathID,
    7079             :                                         "Time", &dum,
    7080             :                                         dumdims, &dum, tgeodim);
    7081             :                    
    7082           0 :                    if (strcmp(geodim, tgeodim) != 0)
    7083             :                    {
    7084           0 :                       strcpy(geodim, tgeodim);
    7085             :                    }
    7086             :                 }
    7087           0 :                 timeflag = 0;
    7088             : 
    7089             :                 /* If defscanregion being used, get dimensions    */
    7090             :                 /* of field being used                            */
    7091             :                 /* ---------------------------------------------- */
    7092           0 :                 if (SWXRegion[regionID]->scanflag == 1)
    7093             :                 {
    7094           0 :                    (void) SWnentries(SWXRegion[regionID]->swathID,4,&strbufsize);
    7095           0 :                    dfieldlist = (char *)calloc(strbufsize + 1, sizeof(char));
    7096           0 :                    (void) SWinqdatafields(SWXRegion[regionID]->swathID,dfieldlist,dfrank,numtype2);
    7097           0 :                    status = SWfieldinfo(SWXRegion[regionID]->swathID,dfieldlist,&dum,dumdims,&dum,dgeodim);
    7098             : 
    7099             :                    /* The dimensions have to be switched, because */
    7100             :                    /* the mappings force a geodim and datadim     */
    7101             :                    /* so to find the mapping, the dimensions must */
    7102             :                    /* be switched, but the subsetting will still  */
    7103             :                    /* be based on the correct dimensions          */
    7104             :                    /* ------------------------------------------- */
    7105           0 :                    if (strcmp(dgeodim,dimlist) != 0 || long_status == -1)
    7106             :                    {
    7107           0 :                       strcpy(geodim,dimlist);
    7108           0 :                       strcpy(dimlist,dgeodim);
    7109             :                    }
    7110             :                 }
    7111             : 
    7112             : 
    7113             :     /* Get "Track" (first) Dimension from geo dimlist */
    7114             :     /* ---------------------------------------------- */
    7115           0 :     nDim = EHparsestr(geodim, ',', ptr, slen);
    7116           0 :     geodim[slen[0]] = 0;
    7117             : 
    7118             : 
    7119             :     /* Parse Data Field Dimlist & find mapping */
    7120             :     /* --------------------------------------- */
    7121           0 :     nDim = EHparsestr(dimlist, ',', ptr, slen);
    7122             : 
    7123             : 
    7124             :     /* Loop through all dimensions and search for mapping */
    7125             :     /* -------------------------------------------------- */
    7126           0 :     for (i = 0; i < nDim; i++)
    7127             :     {
    7128           0 :         memcpy(utlbuf, ptr[i], slen[i]);
    7129           0 :         utlbuf[slen[i]] = 0;
    7130           0 :         statMap = SWmapinfo(swathID, geodim, utlbuf,
    7131             :           &offset, &incr);
    7132             : 
    7133             : 
    7134             :                     /*
    7135             :                      *  Force offset to 0.
    7136             :                      *  We're not changing the mapping, so we want
    7137             :                      *  the original offset to apply to the subsetted data.
    7138             :                      *  Otherwise, bad things happen, such as subsetting
    7139             :                      *  past the end of the original data, and being unable
    7140             :                      *  to read the first <offset> elements of the
    7141             :                      *  original data.
    7142             :                      *  The offset is only important for aligning the
    7143             :                      *  data with interpolated (incr > 0) or decimated
    7144             :                      *  (incr < 0) geolocation information for the data.
    7145             :                      */
    7146             : 
    7147           0 :                     offset = 0;
    7148             : 
    7149             : 
    7150             :         /* Mapping found */
    7151             :         /* ------------- */
    7152           0 :         if (statMap == 0)
    7153             :         {
    7154           0 :       found = 1;
    7155           0 :       l_index = i;
    7156           0 :       break;
    7157             :         }
    7158             :     }
    7159             : 
    7160             : 
    7161             :     /* If mapping not found check for geodim within dimlist */
    7162             :     /* ---------------------------------------------------- */
    7163           0 :     if (found == 0)
    7164             :     {
    7165           0 :         l_index = EHstrwithin(geodim, dimlist, ',');
    7166             : 
    7167             :         /* Geo dimension found within subset field dimlist */
    7168             :         /* ----------------------------------------------- */
    7169           0 :         if (l_index != -1)
    7170             :         {
    7171           0 :       found = 1;
    7172           0 :       offset = 0;
    7173           0 :       incr = 1;
    7174             :         }
    7175             :     }
    7176             : 
    7177             : 
    7178             : 
    7179             :     /* If mapping not found check for l_indexed mapping */
    7180             :     /* ---------------------------------------------- */
    7181           0 :     if (found == 0)
    7182             :     {
    7183             :         /* Get size of geo dim & allocate space of l_index mapping */
    7184             :         /* ----------------------------------------------------- */
    7185           0 :         dum = SWdiminfo(swathID, geodim);
    7186             : 
    7187             :                     /* For Landsat files, the l_index mapping has two values   */
    7188             :                     /* for each point, a left and right point.  So for a 37  */
    7189             :                     /* scene band file there are 2x2 points for each scene   */
    7190             :                     /* meaning, 2x2x37 = 148 values.  The above function     */
    7191             :                     /* only returns the number of values in the track        */
    7192             :                     /* dimension.                                            */
    7193             :                     /* ----------------------------------------------------- */
    7194           0 :                     if(land_status == 0)
    7195           0 :                        if(strcmp(fieldname, "Latitude") == 0 || 
    7196           0 :                           strcmp(fieldname, "Longitude") == 0)
    7197             :                        {
    7198           0 :                           dum = dum * 2;
    7199             :                        }
    7200           0 :         idxmap = (int32 *) calloc(dum, sizeof(int32));
    7201           0 :         if(idxmap == NULL)
    7202             :         { 
    7203           0 :       HEpush(DFE_NOSPACE,"SWextractregion", __FILE__, __LINE__);
    7204           0 :       return(-1);
    7205             :         }
    7206             : 
    7207             :         /* Loop through all dimensions and search for mapping */
    7208             :         /* -------------------------------------------------- */
    7209           0 :         for (i = 0; i < nDim; i++)
    7210             :         {
    7211           0 :       memcpy(utlbuf, ptr[i], slen[i]);
    7212           0 :       utlbuf[slen[i]] = 0;
    7213             : 
    7214             :       idxMapElem =
    7215           0 :           SWidxmapinfo(swathID, geodim, utlbuf, idxmap);
    7216             : 
    7217             : 
    7218             :       /* Mapping found */
    7219             :       /* ------------- */
    7220           0 :       if (idxMapElem != -1)
    7221             :       {
    7222           0 :           found = 1;
    7223           0 :           l_index = i;
    7224           0 :           break;
    7225             :       }
    7226             :         }
    7227             :     }
    7228             : 
    7229             : 
    7230             :     /* If regular mapping found ... */
    7231             :     /* ---------------------------- */
    7232           0 :     if (found == 1 && idxMapElem == -1)
    7233             :     {
    7234           0 :         for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
    7235             :         {
    7236           0 :       if (k > 0)
    7237             :       {
    7238             :           /* Compute size in bytes of previous region */
    7239             :           /* ---------------------------------------- */
    7240           0 :           size = edge[0];
    7241           0 :           for (j = 1; j < rank; j++)
    7242             :           {
    7243           0 :         size *= edge[j];
    7244             :           }
    7245           0 :           size *= DFKNTsize(ntype);
    7246             : 
    7247             : 
    7248             :           /* Compute output buffer offset */
    7249             :           /* ---------------------------- */
    7250           0 :           bufOffset += size;
    7251             :       }
    7252             :       else
    7253             :       {
    7254             :           /* Initialize output buffer offset */
    7255             :           /* ------------------------------- */
    7256           0 :           bufOffset = 0;
    7257             :       }
    7258             : 
    7259             : 
    7260             :       /* Compute number of cross tracks in region */
    7261             :       /* ---------------------------------------- */
    7262           0 :       nXtrk = SWXRegion[regionID]->StopRegion[k] -
    7263           0 :           SWXRegion[regionID]->StartRegion[k] + 1;
    7264             : 
    7265             : 
    7266             :       /* Positive increment (geodim <= datadim) */
    7267             :       /* -------------------------------------- */
    7268           0 :       if (incr > 0)
    7269             :       {
    7270           0 :                            if (SWXRegion[regionID]->scanflag == 1)
    7271             :                            {
    7272           0 :                               start[l_index] = SWXRegion[regionID]->StartRegion[k]/incr;
    7273           0 :                               if(SWXRegion[regionID]->band8flag == 2 || 
    7274           0 :                                  SWXRegion[regionID]->band8flag == 3)
    7275             :                               {
    7276           0 :                                  start[l_index] = (SWXRegion[regionID]->StartRegion[k]+detect_cnt)/incr;
    7277           0 :                                  status = SWfieldinfo(SWXRegion[regionID]->swathID,"scan_no",&rank,dims2,&nt,dimlist);
    7278           0 :                                  buffer2 = (uint16 *)calloc(dims2[0], sizeof(uint16));
    7279           0 :                                  status = SWreadfield(SWXRegion[regionID]->swathID,"scan_no",NULL,NULL,NULL,buffer2);
    7280           0 :                                  if(incr == 1)
    7281           0 :                                     start[l_index] = start[l_index] - (buffer2[0] * detect_cnt);
    7282             :                                  else
    7283           0 :                                     start[l_index] = start[l_index] - buffer2[0];
    7284           0 :                                  free(buffer2);
    7285             :                               }
    7286           0 :                               scan_shift = nXtrk % incr;
    7287           0 :                               if(scan_shift != 0)
    7288           0 :                                  nXtrk = nXtrk - scan_shift;
    7289           0 :             edge[l_index] = nXtrk / incr;
    7290           0 :                               if (nXtrk % incr != 0)
    7291           0 :                                  edge[l_index]++;
    7292           0 :                               if(long_status == -1 || incr == 1)
    7293             :                               {
    7294           0 :                                  if( detect_cnt == 0 )
    7295           0 :                                      return -1;
    7296           0 :                                  scan_shift = nXtrk % detect_cnt;
    7297           0 :                                  if(scan_shift != 0)
    7298           0 :                                     edge[l_index] = nXtrk - scan_shift;
    7299             :                               }
    7300             : 
    7301             :                            }
    7302             :                            else
    7303             :                            {
    7304           0 :             start[l_index] = SWXRegion[regionID]->StartRegion[k] * incr + offset;
    7305           0 :             edge[l_index] = nXtrk * incr - offset;
    7306             :                            }
    7307             :       }
    7308             :       else
    7309             :       {
    7310             :           /* Negative increment (geodim > datadim) */
    7311             :           /* ------------------------------------- */
    7312           0 :           start[l_index] = SWXRegion[regionID]->StartRegion[k]
    7313           0 :         / (-incr) + offset;
    7314           0 :           edge[l_index] = nXtrk / (-incr);
    7315             : 
    7316             :           /*
    7317             :            * If Xtrk not exactly divisible by incr, round
    7318             :            * edge to next highest integer
    7319             :            */
    7320             : 
    7321           0 :           if (nXtrk % (-incr) != 0)
    7322             :           {
    7323           0 :         edge[l_index]++;
    7324             :           }
    7325             :       }
    7326             : 
    7327             : 
    7328             :       /* Read Data into output buffer */
    7329             :       /* ---------------------------- */
    7330           0 :       status = SWreadfield(swathID, fieldname,
    7331             :                start, NULL, edge,
    7332             :                (uint8 *) buffer + bufOffset);
    7333             :         }
    7334             :     }
    7335           0 :     else if (found == 1 && idxMapElem != -1)
    7336             :     {
    7337             :         /* Indexed Mapping */
    7338             :         /* --------------- */
    7339           0 :         for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
    7340             :         {
    7341           0 :       if (k > 0)
    7342             :       {
    7343             :           /* Compute size in bytes of previous region */
    7344             :           /* ---------------------------------------- */
    7345           0 :           size = edge[0];
    7346           0 :           for (j = 1; j < rank; j++)
    7347             :           {
    7348           0 :         size *= edge[j];
    7349             :           }
    7350           0 :           size *= DFKNTsize(ntype);
    7351             : 
    7352             : 
    7353             :           /* Compute output buffer offset */
    7354             :           /* ---------------------------- */
    7355           0 :           bufOffset += size;
    7356             :       }
    7357             :       else
    7358             :       {
    7359             :           /* Initialize output buffer offset */
    7360             :           /* ------------------------------- */
    7361           0 :           bufOffset = 0;
    7362             :       }
    7363             : 
    7364             : 
    7365             :       /* Compute start & edge from l_index mappings */
    7366             :       /* ---------------------------------------- */
    7367           0 :                         if (SWXRegion[regionID]->scanflag == 1 &&
    7368           0 :                             (strcmp(fieldname, "Latitude") == 0 ||
    7369           0 :                              strcmp(fieldname, "Longitude") == 0))
    7370             :                         {
    7371           0 :                            if (land_status == 0)
    7372           0 :                               status = SWreadattr(swathID, "scene_count", &scene_cnt);
    7373           0 :                            startscanline = SWXRegion[regionID]->StartRegion[k];
    7374           0 :                            stopscanline = SWXRegion[regionID]->StopRegion[k];
    7375           0 :                            if(SWXRegion[regionID]->band8flag == 2 || SWXRegion[regionID]->band8flag == 3)
    7376             :                            {
    7377           0 :                                status = SWfieldinfo(swathID,"scan_no",&rk,dims2,&nt,dimlist);
    7378           0 :                                tbuffer = (uint16 *)calloc(dims2[0], sizeof(uint16));
    7379           0 :                                status =SWreadfield(swathID,"scan_no",NULL,NULL,NULL,tbuffer);
    7380           0 :                                startscanline = startscanline - ((tbuffer[0] * detect_cnt) - detect_cnt);
    7381           0 :                                stopscanline = stopscanline - ((tbuffer[0] * detect_cnt) - 1);
    7382             :                            }
    7383           0 :                            if(SWXRegion[regionID]->band8flag == 2 ||
    7384           0 :                               SWXRegion[regionID]->band8flag == 3)
    7385             :                            {
    7386           0 :                               if(startscandim == -1)
    7387           0 :                                  if(startscanline < idxmap[0])
    7388             :                                  {
    7389           0 :                                     startscandim = 0;
    7390           0 :                                     start[l_index] = 0;
    7391           0 :                                     if(stopscanline > idxmap[scene_cnt * 2 - 1])
    7392             :                                     {
    7393           0 :                                        stopscandim = scene_cnt*2 - startscandim;
    7394           0 :                                        edge[l_index] = scene_cnt*2 - startscandim;
    7395             :                                     }
    7396             :                                  }
    7397             :                            }
    7398           0 :                            j = 0;
    7399           0 :                            for (l = 0; l < scene_cnt; l++)
    7400             :                            {
    7401           0 :                               if(idxmap[j] <= startscanline && idxmap[j+1] >= startscanline)
    7402           0 :                                  if(startscandim == -1)
    7403             :                                  {
    7404           0 :                                     start[l_index] = j;
    7405           0 :                                     startscandim = j;
    7406             :                                  }
    7407           0 :                               if(idxmap[j] <= stopscanline && idxmap[j+1] >= stopscanline)
    7408           0 :                                  if(startscandim != -1)
    7409             :                                  {
    7410           0 :                                     edge[l_index] = j - start[l_index] + 2;
    7411           0 :                                     stopscandim = j - start[l_index] + 1;
    7412             :                                  }
    7413           0 :                               j = j + 2;
    7414             :                            }
    7415           0 :                            if(SWXRegion[regionID]->band8flag == 1 ||
    7416           0 :                               SWXRegion[regionID]->band8flag == 2)
    7417             :                            {
    7418           0 :                               if(startscandim == -1)
    7419           0 :                                  if(startscanline < idxmap[0])
    7420             :                                  {
    7421           0 :                                     startscandim = 0;
    7422           0 :                                     start[l_index] = 0;
    7423             :                                  }
    7424           0 :                               if(stopscandim == -1)
    7425           0 :                                  if(stopscanline > idxmap[scene_cnt * 2 - 1])
    7426             :                                  {
    7427           0 :                                     stopscandim = scene_cnt*2 - start[l_index];
    7428           0 :                                     edge[l_index] = scene_cnt*2 - start[l_index];
    7429             :                                  }
    7430             :                            }
    7431           0 :                            if(SWXRegion[regionID]->band8flag == 2)
    7432             :                            {
    7433           0 :                               if(startscandim == -1)
    7434           0 :                                  if(startscanline > idxmap[j - 1])
    7435             :                                  {
    7436           0 :                                     status = SWfieldinfo(SWXRegion[regionID]->swathID,"scan_no",&rank2,dims2,&nt,dimlist);
    7437           0 :                                     buffer2 = (uint16 *)calloc(dims2[0], sizeof(uint16));
    7438           0 :                                     status = SWreadfield(SWXRegion[regionID]->swathID,"scan_no",NULL,NULL,NULL,buffer2);
    7439           0 :                                     startscanline = startscanline - (buffer2[0] * detect_cnt);
    7440           0 :                                     stopscanline = stopscanline - (buffer2[0] * detect_cnt);
    7441           0 :                                     free(buffer2);
    7442           0 :                                     j = 0;
    7443           0 :                                     for (l = 0; l < scene_cnt; l++)
    7444             :                                     {
    7445           0 :                                        if(idxmap[j] <= startscanline && idxmap[j+1] >= startscanline)
    7446             :                                        {
    7447           0 :                                           start[l_index] = j;
    7448             :                                        }
    7449           0 :                                        if(idxmap[j] <= stopscanline && idxmap[j+1] >= stopscanline)
    7450           0 :                                           edge[l_index] = j - start[l_index] + 2;
    7451           0 :                                        j = j + 2;
    7452           0 :                                        if(idxmap[j] == 0  || idxmap[j+1] == 0)
    7453           0 :                                           l = scene_cnt;
    7454             :                                     }
    7455             :  
    7456             :                                  }
    7457             :                            }
    7458             : 
    7459             :                         }
    7460           0 :                         else if(SWXRegion[regionID]->scanflag == 1 &&
    7461           0 :                                 (strcmp(fieldname, "scene_center_latitude") == 0 ||
    7462           0 :                                  strcmp(fieldname, "scene_center_longitude") == 0))
    7463             :                         {
    7464           0 :                            if (land_status == 0)
    7465           0 :                               status = SWreadattr(swathID, "scene_count", &scene_cnt);
    7466           0 :                            startscanline = SWXRegion[regionID]->StartRegion[k];
    7467           0 :                            stopscanline = SWXRegion[regionID]->StopRegion[k];
    7468           0 :                            if(startscanline < idxmap[0])
    7469             :                            {
    7470           0 :                               startscandim = 0;
    7471           0 :                               start[l_index] = 0;
    7472             :                            }
    7473           0 :                            for (l = 0; l < scene_cnt-1; l++)
    7474             :                            {
    7475           0 :                               if(idxmap[l] <= startscanline && idxmap[l+1] >= startscanline)
    7476           0 :                                  if(startscandim == -1)
    7477             :                                  {
    7478           0 :                                     start[l_index] = l;
    7479           0 :                                     startscandim = l;
    7480             :                                  }
    7481           0 :                               if(idxmap[l] <= stopscanline && idxmap[l+1] >= stopscanline)
    7482           0 :                                  if(stopscandim == -1)
    7483             :                                  {
    7484           0 :                                     edge[l_index] = l - start[l_index] + 2;
    7485           0 :                                     stopscandim = l + 1;
    7486             :                                  }
    7487             :                             }
    7488           0 :                             if(stopscandim == -1)
    7489             :                             {
    7490           0 :                                if(stopscanline > idxmap[scene_cnt - 1])
    7491             :                                {
    7492           0 :                                   edge[l_index] = scene_cnt - start[l_index];
    7493           0 :                                   stopscandim = scene_cnt - 1;
    7494             :                                }
    7495             :                             }
    7496             : 
    7497           0 :                             if(SWXRegion[regionID]->band8flag == 1)
    7498             :                             {
    7499           0 :                                if(stopscandim == -1)
    7500           0 :                                   if(stopscanline > idxmap[scene_cnt - 1])
    7501             :                                   {
    7502           0 :                                      edge[l_index] = scene_cnt - start[l_index];
    7503           0 :                                      stopscandim = scene_cnt -1;
    7504             :                                   }
    7505             :                             }
    7506           0 :                             if(SWXRegion[regionID]->band8flag == 2 ||
    7507           0 :                                SWXRegion[regionID]->band8flag == 3)
    7508             :                             {
    7509           0 :                                if(startscandim == -1)
    7510             :                                {
    7511           0 :                                   if(startscanline < idxmap[0])
    7512             :                                   {
    7513           0 :                                      startscandim = 0;
    7514           0 :                                      start[l_index] = 0;
    7515           0 :                                      edge[l_index] = stopscandim - startscandim + 1;
    7516             :                                   }
    7517             :                                }
    7518           0 :                                if(startscandim == -1)
    7519             :                                {
    7520           0 :                                   startscanline = SWXRegion[regionID]->StartScan[k] * detect_cnt - detect_cnt;
    7521           0 :                                   stopscanline = SWXRegion[regionID]->StopScan[k] * detect_cnt - 1;
    7522           0 :                                   for (l = 0; l < scene_cnt-1; l++)
    7523             :                                   {
    7524           0 :                                      if(idxmap[l] <= startscanline && idxmap[l+1] >= startscanline)
    7525           0 :                                         start[l_index] = l;
    7526           0 :                                      if(idxmap[l] <= stopscanline && idxmap[l+1] >= stopscanline)
    7527           0 :                                         edge[l_index] = l - start[l_index] + 1;
    7528             :                                   }
    7529             :                                }
    7530             :                            }
    7531             :                         }
    7532             :                         else
    7533             :                         {
    7534           0 :                            if (SWXRegion[regionID]->scanflag == 1 && 
    7535           0 :                                strcmp(fieldname,dfieldlist) == 0)
    7536             :                            {
    7537           0 :                               start[l_index] = SWXRegion[regionID]->StartRegion[k];
    7538           0 :                               edge[l_index] = SWXRegion[regionID]->StopRegion[k] - 
    7539           0 :                                              SWXRegion[regionID]->StartRegion[k] + 1;
    7540           0 :                               if(SWXRegion[regionID]->band8flag == 2 ||
    7541           0 :          SWXRegion[regionID]->band8flag == 3 )
    7542             :                               {
    7543           0 :                                  status = SWfieldinfo(SWXRegion[regionID]->swathID,"scan_no",&rank,dims2,&nt,dimlist);
    7544           0 :                                  buffer2 = (uint16 *)calloc(dims2[0], sizeof(uint16));
    7545           0 :                                  status = SWreadfield(SWXRegion[regionID]->swathID,"scan_no",NULL,NULL,NULL,buffer2);
    7546           0 :                                  start[l_index] = start[l_index] - (buffer2[0] * detect_cnt - detect_cnt);
    7547           0 :                                  free(buffer2);
    7548             :                               }
    7549             :                            }
    7550             :                            else
    7551             :                            {
    7552           0 :             start[l_index] = idxmap[SWXRegion[regionID]->StartRegion[k]];
    7553             : 
    7554           0 :             edge[l_index] = idxmap[SWXRegion[regionID]->StopRegion[k]] -
    7555           0 :                        idxmap[SWXRegion[regionID]->StartRegion[k]] + 1;
    7556             :                            }
    7557             :                         }
    7558             :       /* Read Data into output buffer */
    7559             :       /* ---------------------------- */
    7560           0 :       status = SWreadfield(swathID, fieldname,
    7561             :                start, NULL, edge,
    7562             :                buffer);
    7563           0 :                         if (SWXRegion[regionID]->scanflag == 1)
    7564             :                         {
    7565             :                            
    7566           0 :                            if (strcmp(fieldname,"Longitude") == 0)
    7567             :                            {
    7568           0 :                               status = SWscan2longlat(swathID, fieldname, buffer, start, 
    7569             :                                               edge, idxmap, startscanline, stopscanline);
    7570             :                            }
    7571           0 :                            if (strcmp(fieldname,"Latitude") == 0)
    7572             :                            {
    7573           0 :                               status = SWscan2longlat(swathID, fieldname, buffer, start, 
    7574             :                                               edge, idxmap, startscanline, stopscanline);
    7575             :                            }
    7576             :                         }
    7577             :         }
    7578             :     }
    7579           0 :     else if(vfound == 1)                          /* Vertical subsetting */
    7580             :                 {                                             /* found previously,   */
    7581           0 :                    status = SWreadfield(swathID, fieldname,   /* perform the vertical*/
    7582             :                                         start, NULL, edge,    /* subsetting.         */
    7583             :                                         (uint8 *) buffer);    /* -- xhua             */
    7584             :                 }
    7585             :                 else
    7586             :     {
    7587             :         /* Mapping not found */
    7588             :         /* ----------------- */
    7589           0 :         status = -1; 
    7590           0 :         HEpush(DFE_GENAPP, "SWextractregion", __FILE__, __LINE__);
    7591           0 :         HEreport("Mapping Not Defined for \"%s\" Dimension.\n",
    7592             :            geodim);
    7593             :     }                                           
    7594             :       }
    7595             :       else
    7596             :       {
    7597             :     /* Read Data (Vert SS only) */
    7598             :     /* ------------------------ */
    7599           0 :     status = SWreadfield(swathID, fieldname,
    7600             :              start, NULL, edge,
    7601             :              (uint8 *) buffer);
    7602             :       }
    7603             :   }
    7604             :     }
    7605             : 
    7606             :     /* Free l_index mappings if applicable */
    7607             :     /* --------------------------------- */
    7608           0 :     if (idxmap != NULL)
    7609             :     {
    7610           0 :   free(idxmap);
    7611             :     }
    7612           0 :     if(dfieldlist != NULL)
    7613           0 :        free(dfieldlist);
    7614             : 
    7615           0 :     return (status);
    7616             : }
    7617             : 
    7618             : 
    7619             : /*----------------------------------------------------------------------------|
    7620             : |  BEGIN_PROLOG                                                               |
    7621             : |                                                                             |
    7622             : |  FUNCTION: SWscan2longlat                                                   |
    7623             : |                                                                             |
    7624             : |  DESCRIPTION:  Convert scanline to Long/Lat for floating scene subsetting.  |
    7625             : |                This will calculate/interpolate the long/lat for a given     |
    7626             : |                scanline.                                                    |
    7627             : |                                                                             |
    7628             : |                                                                             |
    7629             : |  Return Value    Type     Units     Description                             |
    7630             : |  ============   ======  =========   =====================================   |
    7631             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    7632             : |                                                                             |
    7633             : |  INPUTS:                                                                    |
    7634             : |  swathID        int32               Swath structure ID                      |
    7635             : |  fieldname      char                Fieldname                               |
    7636             : |  buffer   void          Values to update                        |
    7637             : |  start    int32                                                 |
    7638             : |  edge     int32                   |
    7639             : |  idxmap   int32 *       Buffer of l_index mapping values          |
    7640             : |  startscanline  int32         Start of scan region          |
    7641             : |  stopscanline   int32         Stop of scan region         |
    7642             : |                                                                             |
    7643             : |  OUTPUTS:                                                                   |
    7644             : |                                                                             |
    7645             : |  NOTES:                                                                     |
    7646             : |                                                                             |
    7647             : |                                                                             |
    7648             : |   Date     Programmer   Description                                         |
    7649             : |  ======   ============  =================================================   |
    7650             : |  Jul 99   DaW           Original Programmer                                 |
    7651             : |                                                                             |
    7652             : |  END_PROLOG                                                                 |
    7653             : -----------------------------------------------------------------------------*/
    7654             : static intn
    7655           0 : SWscan2longlat(int32 swathID, const char *fieldname, VOIDP buffer, int32 start[], 
    7656             : int32 edge[], int32 *idxmap, int32 startscanline, int32 stopscanline)
    7657             : {
    7658             : 
    7659             :    enum corner {UL, UR, LL, LR};
    7660           0 :    enum corner pos = UL;
    7661           0 :    enum corner pos2 = UL;
    7662             : 
    7663           0 :    uint8  scene_cnt = 0;    /* Used to convert scan to scanline  */
    7664             :                                         /*  L7 float scene sub.              */
    7665             :    float32  *buffer2;
    7666             :    float32  *bufferc;
    7667           0 :    float32  deg2rad = (float32)(M_PI/180.00);
    7668             : 
    7669           0 :    float32  p1_long = 0.0;  /* point 1, longitude */
    7670           0 :    float32  p2_long = 0.0;  /* point 2, longitude */
    7671           0 :    float32  pi_long = 0.0;  /* interpolated point, longitude */
    7672           0 :    int32  scanline_p1 = 0;
    7673             : 
    7674           0 :    float32  p1_lat = 0.0; /* point 1, latitude */
    7675           0 :    float32  p2_lat = 0.0; /* point 2, latitude */
    7676           0 :    float32  pi_lat = 0.0; /* interpolated point, latitude */
    7677           0 :    int32  scanline_p2 = 0;
    7678             : 
    7679             : 
    7680           0 :    float32  x_p1 = 0.0;   /* Cartesian coordinates */
    7681           0 :    float32  y_p1 = 0.0;   /* point 1               */
    7682           0 :    float32  z_p1 = 0.0;
    7683             : 
    7684           0 :    float32  x_p2 = 0.0;   /* Cartesian coordinates */
    7685           0 :    float32  y_p2 = 0.0;   /* point 2     */
    7686           0 :    float32  z_p2 = 0.0;
    7687             : 
    7688           0 :    float32  x_pi = 0.0;   /* Cartesian coordinates */
    7689           0 :    float32  y_pi = 0.0;   /* interpolated point    */
    7690           0 :    float32  z_pi = 0.0;
    7691           0 :    int32  scanline_pi = 0;
    7692             : 
    7693           0 :    intn   status = -1;
    7694             : 
    7695           0 :    int    i = 0;
    7696           0 :    int    p1_long_l90_flag = 0;
    7697           0 :    int    p1_long_g90_flag = 0;
    7698           0 :    int    p2_long_l90_flag = 0;
    7699           0 :    int    p2_long_g90_flag = 0;
    7700           0 :    int    fieldflag = 0;
    7701             : 
    7702           0 :    int  numofval = 0;
    7703             : 
    7704             : 
    7705             : 
    7706           0 :    numofval = edge[0] * 2;
    7707             : 
    7708             : 
    7709           0 :    buffer2 = (float32 *)calloc(numofval, sizeof(float32));
    7710           0 :    bufferc = (float32 *)calloc(numofval, sizeof(float32));
    7711           0 :    memmove(bufferc, buffer, numofval*sizeof(float32));
    7712             : 
    7713           0 :    (void) SWreadattr(swathID, "scene_count", &scene_cnt);
    7714             : 
    7715           0 :    if (strcmp(fieldname, "Longitude") == 0)
    7716             :    {
    7717           0 :       fieldflag = 1;
    7718           0 :       status = SWreadfield(swathID, "Latitude", start, NULL, edge, buffer2);
    7719             :    }
    7720           0 :    else if (strcmp(fieldname, "Latitude") == 0)
    7721             :    {
    7722           0 :       fieldflag = 2;
    7723           0 :       status = SWreadfield(swathID, "Longitude", start, NULL, edge, buffer2);
    7724             :    }
    7725             : 
    7726           0 :    for(i=0; i<4; i++)
    7727             :    {
    7728           0 :       switch(pos)
    7729             :       {
    7730           0 :          case UL:
    7731           0 :             if (fieldflag == 1)
    7732             :             {
    7733           0 :                p1_long = bufferc[0];
    7734           0 :                p2_long = bufferc[2];
    7735           0 :                p1_lat = buffer2[0];
    7736           0 :                p2_lat = buffer2[2];
    7737             :             }
    7738           0 :             if (fieldflag == 2)
    7739             :             {
    7740           0 :                p1_long = buffer2[0];
    7741           0 :                p2_long = buffer2[2];
    7742           0 :                p1_lat = bufferc[0];
    7743           0 :                p2_lat = bufferc[2];
    7744             :             }
    7745           0 :             scanline_p1 = idxmap[start[0]];
    7746           0 :             scanline_p2 = idxmap[start[0]+1];
    7747           0 :             scanline_pi = startscanline;
    7748           0 :             pos = UR;
    7749           0 :             break;
    7750           0 :          case UR:
    7751           0 :             if (fieldflag == 1)
    7752             :             {
    7753           0 :                p1_long = bufferc[1];
    7754           0 :                p2_long = bufferc[3];
    7755           0 :                p1_lat = buffer2[1];
    7756           0 :                p2_lat = buffer2[3];
    7757             :             }
    7758           0 :             if (fieldflag == 2)
    7759             :             {
    7760           0 :                p1_long = buffer2[1];
    7761           0 :                p2_long = buffer2[3];
    7762           0 :                p1_lat = bufferc[1];
    7763           0 :                p2_lat = bufferc[3];
    7764             :             }
    7765           0 :             scanline_p1 = idxmap[start[0]];
    7766           0 :             scanline_p2 = idxmap[start[0]+1];
    7767           0 :             scanline_pi = startscanline;
    7768           0 :             pos = LL;
    7769           0 :             break;
    7770           0 :          case LL:
    7771           0 :             if (fieldflag == 1)
    7772             :             {
    7773           0 :                p1_long = bufferc[numofval-4];
    7774           0 :                p2_long = bufferc[numofval-2];
    7775           0 :                p1_lat = buffer2[numofval-4];
    7776           0 :                p2_lat = buffer2[numofval-2];
    7777             :             }
    7778           0 :             if (fieldflag == 2)
    7779             :             {
    7780           0 :                p1_long = buffer2[numofval-4];
    7781           0 :                p2_long = buffer2[numofval-2];
    7782           0 :                p1_lat = bufferc[numofval-4];
    7783           0 :                p2_lat = bufferc[numofval-2];
    7784             :             }
    7785           0 :             scanline_p1 = idxmap[start[0] + edge[0] - 2];
    7786           0 :             scanline_p2 = idxmap[start[0] + edge[0] - 1];
    7787           0 :             scanline_pi = stopscanline;
    7788           0 :             pos = LR;
    7789           0 :             break;
    7790           0 :          case LR:
    7791           0 :             if (fieldflag == 1)
    7792             :             {
    7793           0 :                p1_long = bufferc[numofval-3];
    7794           0 :                p2_long = bufferc[numofval-1];
    7795           0 :                p1_lat = buffer2[numofval-3];
    7796           0 :                p2_lat = buffer2[numofval-1];
    7797             :             }
    7798           0 :             if (fieldflag == 2)
    7799             :             {
    7800           0 :                p1_long = buffer2[numofval-3];
    7801           0 :                p2_long = buffer2[numofval-1];
    7802           0 :                p1_lat = bufferc[numofval-3];
    7803           0 :                p2_lat = bufferc[numofval-1];
    7804             :             }
    7805           0 :             scanline_p1 = idxmap[start[0] + edge[0] - 2];
    7806           0 :             scanline_p2 = idxmap[start[0] + edge[0] - 1];
    7807           0 :             scanline_pi = stopscanline;
    7808           0 :             break;
    7809             :       }
    7810             : 
    7811             : 
    7812             : 
    7813           0 :    if (p1_long <= -90.0)
    7814             :    {
    7815           0 :       if (p2_long >= 90.0)
    7816             :       {
    7817           0 :          p1_long = p1_long + 180.0f;
    7818           0 :          p2_long = p2_long - 180.0f;
    7819           0 :          p1_long_l90_flag = 2;
    7820             :       }
    7821             :       else
    7822             :       {
    7823           0 :          p1_long = p1_long + 180.0f;
    7824           0 :          p1_long_l90_flag = 1;
    7825             :       }
    7826             :    }
    7827           0 :    if (p1_long >= 90.0 && p1_long_l90_flag != 2)
    7828             :    {
    7829           0 :       if(p2_long <= -90.0)
    7830             :       {
    7831           0 :          p1_long = p1_long - 180.0f;
    7832           0 :          p2_long = p2_long + 180.0f;
    7833           0 :          p1_long_g90_flag = 2;
    7834             :       }
    7835             :       else
    7836             :       {
    7837           0 :          p1_long = p1_long - 90.0f;
    7838           0 :          p1_long_g90_flag = 1;
    7839             :       }
    7840             :    }
    7841           0 :    if (p2_long <= -90.0)
    7842             :    {
    7843           0 :       if (p1_long < 0.0)
    7844             :       {
    7845           0 :          p2_long = p2_long + 90.0f;
    7846           0 :          p1_long = p1_long + 90.0f;
    7847           0 :          p2_long_l90_flag = 2;
    7848             :       }
    7849             :       else
    7850             :       {
    7851           0 :          p2_long = p2_long + 180.0f;
    7852           0 :          p2_long_l90_flag = 1;
    7853             :       }
    7854             :    }
    7855           0 :    if (p2_long >= 90.0 && p1_long_l90_flag != 2)
    7856             :    {
    7857           0 :       p2_long = p2_long - 90.0f;
    7858           0 :       p2_long_g90_flag = 1;
    7859             :    }
    7860             : 
    7861             : 
    7862           0 :    x_p1 = (float)(RADOE * cos((p1_long*deg2rad)) * sin((p1_lat*deg2rad)));
    7863           0 :    y_p1 = (float)(RADOE * sin((p1_long*deg2rad)) * sin((p1_lat*deg2rad)));
    7864           0 :    z_p1 = (float)(RADOE * cos((p1_lat*deg2rad)));
    7865             : 
    7866             :    
    7867           0 :    x_p2 = (float)(RADOE * cos((p2_long*deg2rad)) * sin((p2_lat*deg2rad)));
    7868           0 :    y_p2 = (float)(RADOE * sin((p2_long*deg2rad)) * sin((p2_lat*deg2rad)));
    7869           0 :    z_p2 = (float)(RADOE * cos((p2_lat*deg2rad)));
    7870             : 
    7871           0 :    x_pi = x_p1 + (x_p2 - x_p1)*(scanline_pi-scanline_p1)/(scanline_p2-scanline_p1);
    7872           0 :    y_pi = y_p1 + (y_p2 - y_p1)*(scanline_pi-scanline_p1)/(scanline_p2-scanline_p1);
    7873           0 :    z_pi = z_p1 + (z_p2 - z_p1)*(scanline_pi-scanline_p1)/(scanline_p2-scanline_p1); 
    7874             : 
    7875           0 :    if (fieldflag == 1)
    7876             :    {
    7877           0 :       pi_long = (float)(atan(y_pi/x_pi)*180.0/M_PI);
    7878           0 :       if (p1_long_l90_flag == 1 || p2_long_l90_flag == 1)
    7879             :       {
    7880           0 :          pi_long = pi_long - 180.0f;
    7881           0 :          p1_long_l90_flag = 0;
    7882           0 :    p2_long_l90_flag = 0;
    7883             :       }
    7884           0 :       if (p1_long_g90_flag == 1 || p2_long_g90_flag == 1)
    7885             :       {
    7886           0 :          pi_long = pi_long + 90.0f;
    7887           0 :          p1_long_g90_flag = 0;
    7888           0 :          p2_long_g90_flag = 0;
    7889             :       }
    7890           0 :       if (p1_long_l90_flag == 2)
    7891             :       {
    7892           0 :          if (pi_long > 0.0)
    7893           0 :             pi_long = pi_long - 180.0f;
    7894           0 :          else if (pi_long < 0.0)
    7895           0 :             pi_long = pi_long + 180.0f;
    7896           0 :          p1_long_l90_flag = 0;
    7897             :       }
    7898           0 :       if (p1_long_g90_flag == 2)
    7899             :       {
    7900           0 :          if (pi_long > 0.0)
    7901           0 :             pi_long = pi_long - 180.0f;
    7902           0 :          else if (pi_long < 0.0)
    7903           0 :             pi_long = pi_long + 180.0f;
    7904           0 :          p1_long_g90_flag = 0;
    7905             :       }
    7906           0 :       if (p2_long_l90_flag == 2)
    7907             :       {
    7908           0 :          pi_long = pi_long - 90.0f;
    7909           0 :          p2_long_l90_flag = 0;
    7910             :       }
    7911             : 
    7912             : 
    7913             : 
    7914           0 :       switch(pos2)
    7915             :       {
    7916           0 :       case UL:
    7917           0 :          bufferc[0] = pi_long;
    7918           0 :          pos2 = UR;
    7919           0 :          break;
    7920           0 :       case UR:
    7921           0 :          bufferc[1] = pi_long;
    7922           0 :          pos2 = LL;
    7923           0 :          break;
    7924           0 :       case LL:
    7925           0 :          if(stopscanline > idxmap[scene_cnt*2 - 1])
    7926           0 :             break;
    7927           0 :          bufferc[numofval-2] = pi_long;
    7928           0 :          pos2 = LR;
    7929           0 :          break;
    7930           0 :       case LR:
    7931           0 :          if(stopscanline > idxmap[scene_cnt*2 - 1])
    7932           0 :             break;
    7933           0 :          bufferc[numofval-1] = pi_long;
    7934           0 :          break;
    7935             :       }
    7936             : 
    7937           0 :     }
    7938           0 :     if (fieldflag == 2)
    7939             :     {
    7940           0 :       pi_lat = (float)(atan((sqrt(x_pi*x_pi + y_pi*y_pi)/z_pi))*180.0/M_PI);
    7941           0 :       switch(pos2)
    7942             :       {
    7943           0 :       case UL:
    7944           0 :          bufferc[0] = pi_lat;
    7945           0 :          pos2 = UR;
    7946           0 :          break;
    7947           0 :       case UR:
    7948           0 :          bufferc[1] = pi_lat;
    7949           0 :          pos2 = LL;
    7950           0 :          break;
    7951           0 :       case LL:
    7952           0 :          if(stopscanline > idxmap[scene_cnt*2 - 1])
    7953           0 :             break;
    7954           0 :          bufferc[numofval-2] = pi_lat;
    7955           0 :          pos2 = LR;
    7956           0 :          break;
    7957           0 :       case LR:
    7958           0 :          if(stopscanline > idxmap[scene_cnt*2 - 1])
    7959           0 :             break;
    7960           0 :          bufferc[numofval-1] = pi_lat;
    7961           0 :          break;
    7962             :       }
    7963           0 :    }
    7964             :    }
    7965           0 :    memmove(buffer, bufferc, numofval*sizeof(float32));
    7966           0 :    free(buffer2);
    7967           0 :    free(bufferc);
    7968           0 :    return(status);
    7969             : }
    7970             : 
    7971             : 
    7972             : /*----------------------------------------------------------------------------|
    7973             : |  BEGIN_PROLOG                                                               |
    7974             : |                                                                             |
    7975             : |  FUNCTION: SWextractperiod                                                  |
    7976             : |                                                                             |
    7977             : |  DESCRIPTION: Retrieves data from specified period.                         |
    7978             : |                                                                             |
    7979             : |                                                                             |
    7980             : |  Return Value    Type     Units     Description                             |
    7981             : |  ============   ======  =========   =====================================   |
    7982             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    7983             : |                                                                             |
    7984             : |  INPUTS:                                                                    |
    7985             : |  swathID        int32               Swath structure ID                      |
    7986             : |  periodID       int32               Period ID                               |
    7987             : |  fieldname      char                Fieldname                               |
    7988             : |  externalflag   int32               External geolocation fields flag        |
    7989             : |                                     HDFE_INTERNAL (0)                       |
    7990             : |                                     HDFE_EXTERNAL (1)                       |
    7991             : |                                                                             |
    7992             : |  OUTPUTS:                                                                   |
    7993             : |  buffer         void                Data buffer containing subsetted region |
    7994             : |                                                                             |
    7995             : |  NOTES:                                                                     |
    7996             : |                                                                             |
    7997             : |                                                                             |
    7998             : |   Date     Programmer   Description                                         |
    7999             : |  ======   ============  =================================================   |
    8000             : |  Jun 96   Joel Gales    Original Programmer                                 |
    8001             : |  Jun 03   Abe Taaheri   added clearing timeflag if SWextractregion fails    |
    8002             : |                                                                             |
    8003             : |  END_PROLOG                                                                 |
    8004             : -----------------------------------------------------------------------------*/
    8005             : intn
    8006           0 : SWextractperiod(int32 swathID, int32 periodID, const char *fieldname,
    8007             :     int32 externalflag, VOIDP buffer)
    8008             : 
    8009             : {
    8010             :     intn            status; /* routine return status variable */
    8011             : 
    8012           0 :     timeflag = 1;
    8013             : 
    8014             :     /* Call SWextractregion routine */
    8015             :     /* ---------------------------- */
    8016           0 :     status = SWextractregion(swathID, periodID, fieldname, externalflag,
    8017             :            (char *) buffer);
    8018           0 :     if (status != 0) timeflag = 0; /*clear timeflag if SWextractregion failed*/
    8019           0 :     return (status);
    8020             : }
    8021             : 
    8022             : 
    8023             : 
    8024             : 
    8025             : 
    8026             : 
    8027             : 
    8028             : /*----------------------------------------------------------------------------|
    8029             : |  BEGIN_PROLOG                                                               |
    8030             : |                                                                             |
    8031             : |  FUNCTION: SWdupregion                                                      |
    8032             : |                                                                             |
    8033             : |  DESCRIPTION: Duplicates a region                                           |
    8034             : |                                                                             |
    8035             : |                                                                             |
    8036             : |  Return Value    Type     Units     Description                             |
    8037             : |  ============   ======  =========   =====================================   |
    8038             : |  newregionID    int32               New region ID                           |
    8039             : |                                                                             |
    8040             : |  INPUTS:                                                                    |
    8041             : |  oldregionID    int32               Old region ID                           |
    8042             : |                                                                             |
    8043             : |  OUTPUTS:                                                                   |
    8044             : |             None                                                            |
    8045             : |                                                                             |
    8046             : |  NOTES:                                                                     |
    8047             : |                                                                             |
    8048             : |                                                                             |
    8049             : |   Date     Programmer   Description                                         |
    8050             : |  ======   ============  =================================================   |
    8051             : |  Jan 97   Joel Gales    Original Programmer                                 |
    8052             : |                                                                             |
    8053             : |  END_PROLOG                                                                 |
    8054             : -----------------------------------------------------------------------------*/
    8055             : int32
    8056           0 : SWdupregion(int32 oldregionID)
    8057             : {
    8058             :     intn            i;    /* Loop index */
    8059             : 
    8060           0 :     int32           newregionID = -1; /* New region ID */
    8061             : 
    8062             : 
    8063             :     /* Find first empty (inactive) region */
    8064             :     /* ---------------------------------- */
    8065           0 :     for (i = 0; i < NSWATHREGN; i++)
    8066             :     {
    8067           0 :   if (SWXRegion[i] == 0)
    8068             :   {
    8069             :       /* Allocate space for new swath region entry */
    8070             :       /* ----------------------------------------- */
    8071           0 :       SWXRegion[i] = (struct swathRegion *)
    8072           0 :     calloc(1, sizeof(struct swathRegion));
    8073           0 :       if(SWXRegion[i] == NULL)
    8074             :       { 
    8075           0 :     HEpush(DFE_NOSPACE,"SWdupregion", __FILE__, __LINE__);
    8076           0 :     return(-1);
    8077             :       }
    8078             : 
    8079             :       /* Copy old region structure data to new region */
    8080             :       /* -------------------------------------------- */
    8081           0 :       *SWXRegion[i] = *SWXRegion[oldregionID];
    8082             : 
    8083             : 
    8084             :       /* Define new region ID */
    8085             :       /* -------------------- */
    8086           0 :       newregionID = i;
    8087             : 
    8088           0 :       break;
    8089             :   }
    8090             :     }
    8091             : 
    8092           0 :     return (newregionID);
    8093             : }
    8094             : 
    8095             : 
    8096             : /*----------------------------------------------------------------------------|
    8097             : |  BEGIN_PROLOG                                                               |
    8098             : |                                                                             |
    8099             : |  FUNCTION: SWregioninfo                                                     |
    8100             : |                                                                             |
    8101             : |  DESCRIPTION: Returns size of region in bytes                               |
    8102             : |                                                                             |
    8103             : |                                                                             |
    8104             : |  Return Value    Type     Units     Description                             |
    8105             : |  ============   ======  =========   =====================================   |
    8106             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    8107             : |                                                                             |
    8108             : |  INPUTS:                                                                    |
    8109             : |  swathID        int32               Swath structure ID                      |
    8110             : |  regionID       int32               Region ID                               |
    8111             : |  fieldname      char                Fieldname                               |
    8112             : |                                                                             |
    8113             : |                                                                             |
    8114             : |  OUTPUTS:                                                                   |
    8115             : |  ntype          int32               field number type                       |
    8116             : |  rank           int32               field rank                              |
    8117             : |  dims           int32               dimensions of field region              |
    8118             : |  size           int32               size in bytes of field region           |
    8119             : |                                                                             |
    8120             : |  NOTES:                                                                     |
    8121             : |                                                                             |
    8122             : |                                                                             |
    8123             : |   Date     Programmer   Description                                         |
    8124             : |  ======   ============  =================================================   |
    8125             : |  Jun 96   Joel Gales    Original Programmer                                 |
    8126             : |  Aug 96   Joel Gales    Add vertical subsetting                             |
    8127             : |  Dec 96   Joel Gales    Add multiple vertical subsetting capability         |
    8128             : |  Mar 97   Joel Gales    Add support for l_index mapping                       |
    8129             : |  Jul 99   DaW           Add support for floating scene subsetting           |
    8130             : |                                                                             |
    8131             : |  END_PROLOG                                                                 |
    8132             : -----------------------------------------------------------------------------*/
    8133             : intn
    8134           0 : SWregioninfo(int32 swathID, int32 regionID, const char *fieldname,
    8135             :        int32 * ntype, int32 * rank, int32 dims[], int32 * size)
    8136             : 
    8137             : {
    8138             :     intn            i;    /* Loop index */
    8139             :     intn            j;    /* Loop index */
    8140             :     intn            k;    /* Loop index */
    8141           0 :     intn            l = 0;    /* Loop index */
    8142             :     intn            status; /* routine return status variable */
    8143           0 :     intn            long_status = 3;  /* routine return status variable for longitude */
    8144           0 :     intn            land_status = 3;    /* Used for L7 float scene sub.      */
    8145           0 :     intn            statMap = -1;   /* Status from SWmapinfo  */
    8146             :     
    8147           0 :     uint8           found = 0;  /* Found flag */
    8148           0 :     uint8           detect_cnt = 0; /* Used for L7 float scene sub.      */
    8149             : 
    8150           0 :     int32           numtype = 0; /* Used for L7 float scene sub. */
    8151           0 :     int32           count = 0;   /* Used for L7 float scene sub. */
    8152             : 
    8153             : 
    8154             :     int32           fid;  /* HDF-EOS file ID */
    8155             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    8156             :     int32           swVgrpID; /* Swath Vgroup ID */
    8157             : 
    8158           0 :     int32           l_index = 0;  /* Geo Dim Index */
    8159             :     int32           nDim; /* Number of dimensions */
    8160             :     int32           slen[64]; /* String length array */
    8161             :     int32           dum;  /* Dummy variable */
    8162           0 :     int32           incr = 0; /* Mapping increment */
    8163           0 :     int32           nXtrk = 0;  /* Number of cross tracks */
    8164           0 :     int32     scan_shift = 0; /* Used to take out partial scans */
    8165           0 :     int32     startscandim = -1;    /* Used for floating scene region size */
    8166           0 :     int32     stopscandim = -1;    /* Used for floating scene region size */
    8167             :     int32           dumdims[8]; /* Dimensions from SWfieldinfo */
    8168           0 :     int32           idxMapElem = -1;  /* Number of l_index map elements  */
    8169           0 :     int32          *idxmap = NULL;  /* Pointer to l_index mapping array */
    8170           0 :     int32     datafld = 0;
    8171             : 
    8172           0 :    uint8  scene_cnt = 0;    /* Number of scenes in swath */
    8173           0 :    int32  startscanline = 0;
    8174           0 :    int32  stopscanline = 0;
    8175           0 :    char   *dfieldlist = (char *)NULL;
    8176           0 :    int32  strbufsize = 0;
    8177             :    int32  dfrank[8];
    8178             :    int32  numtype2[8];
    8179           0 :    int32  rank2 = 0;
    8180           0 :    int32  rk = 0;
    8181             :    int32  dims2[8];
    8182           0 :    int32  nt = 0;
    8183           0 :    uint16 *buffer2 = (uint16 *)NULL;
    8184           0 :    uint16 *tbuffer = (uint16 *)NULL;
    8185             : 
    8186             :     char            dimlist[256]; /* Dimension list */
    8187             :     char            geodim[256];/* Geolocation field dimension list */
    8188             :     char            tgeodim[256];/* Time Geolocation field dimension list */
    8189             :     char            dgeodim[256];/* Data Subsetting field dimension list */
    8190             :     char            utlbuf[256];/* Utility buffer */
    8191             :     char           *ptr[64];  /* String pointer array */
    8192             :     static const char errMesg[] = "Vertical Dimension Not Found: \"%s\".\n";
    8193             : 
    8194             : 
    8195             : 
    8196             :     /* Set region size to -1 */
    8197             :     /* --------------------- */
    8198           0 :     *size = -1;
    8199             : 
    8200             : 
    8201             :     /* Check for valid swath ID */
    8202             :     /* ------------------------ */
    8203           0 :     status = SWchkswid(swathID, "SWregioninfo", &fid, &sdInterfaceID,
    8204             :            &swVgrpID);
    8205             : 
    8206             : 
    8207             :     /* Check for valid region ID */
    8208             :     /* ------------------------- */
    8209           0 :     if (status == 0)
    8210             :     {
    8211           0 :   if (regionID < 0 || regionID >= NSWATHREGN)
    8212             :   {
    8213           0 :       status = -1;
    8214           0 :       HEpush(DFE_RANGE, "SWregioninfo", __FILE__, __LINE__);
    8215           0 :       HEreport("Invalid Region id: %d.\n", regionID);
    8216             :   }
    8217             :     }
    8218             : 
    8219             : 
    8220             : 
    8221             :     /* Check for active region ID */
    8222             :     /* -------------------------- */
    8223           0 :     if (status == 0)
    8224             :     {
    8225           0 :   if (SWXRegion[regionID] == 0)
    8226             :   {
    8227           0 :       status = -1;
    8228           0 :       HEpush(DFE_GENAPP, "SWregioninfo", __FILE__, __LINE__);
    8229           0 :       HEreport("Inactive Region ID: %d.\n", regionID);
    8230             :   }
    8231             :     }
    8232             : 
    8233             :    /* This code checks for the attribute detector_count */
    8234             :    /* which is found in Landsat 7 files.  It is used    */
    8235             :    /* for some of the loops.                            */
    8236             :    /* ================================================= */
    8237           0 :    if (status == 0 && SWXRegion[regionID]->scanflag == 1)
    8238             :    {
    8239           0 :       land_status = SWattrinfo(swathID, "detector_count", &numtype, &count);
    8240           0 :       if (land_status == 0)
    8241             :       {
    8242           0 :          land_status = SWreadattr(swathID, "detector_count", &detect_cnt);
    8243           0 :          land_status = SWreadattr(swathID, "scene_count", &scene_cnt);
    8244             : 
    8245             :       }
    8246             :    }
    8247             : 
    8248             : 
    8249             : 
    8250             : 
    8251             :     /* Check for valid fieldname */
    8252             :     /* ------------------------- */
    8253           0 :     if (status == 0)
    8254             :     {
    8255             :   /* Get data field info */
    8256             :   /* ------------------- */
    8257           0 :   status = SWfieldinfo(swathID, fieldname, rank,
    8258             :            dims, ntype, dimlist);
    8259             : 
    8260           0 :   if (status != 0)
    8261             :   {
    8262           0 :       status = -1;
    8263           0 :       HEpush(DFE_GENAPP, "SWregioninfo", __FILE__, __LINE__);
    8264           0 :       HEreport("Field \"%s\" Not Found.\n", fieldname);
    8265             :   }
    8266             :     }
    8267             : 
    8268             : 
    8269             : 
    8270             :     /* No problems so proceed ... */
    8271             :     /* -------------------------- */
    8272           0 :     if (status == 0)
    8273             :     {
    8274             :   /* If non-vertical subset regions defined ... */
    8275             :   /* ------------------------------------------ */
    8276           0 :   if (SWXRegion[regionID]->nRegions > 0 || SWXRegion[regionID]->scanflag == 1)
    8277             :   {
    8278             : 
    8279             :       /* Get geolocation dimension name */
    8280             :       /* ------------------------------ */
    8281           0 :       status = SWfieldinfo(SWXRegion[regionID]->swathID,
    8282             :          "Longitude", &dum,
    8283             :          dumdims, &dum, geodim);
    8284           0 :             long_status = status;
    8285             : 
    8286             :             /* If Time field being used, check for dimensions */
    8287             :             /* ---------------------------------------------- */
    8288           0 :             if (timeflag == 1)
    8289             :             {
    8290             :                /* code change to fix time subset bug for Landsat7 */
    8291             : 
    8292           0 :                status = SWfieldinfo(SWXRegion[regionID]->swathID,
    8293             :                                     "Time", &dum,
    8294             :                                     dumdims, &dum, tgeodim);
    8295             :                
    8296           0 :                if (strcmp(geodim, tgeodim) != 0)
    8297             :                {
    8298           0 :                   strcpy(geodim, tgeodim);
    8299             :                }
    8300           0 :             timeflag = 0;
    8301             :             }
    8302             : 
    8303             :             /* If defscanregion being used, get dimensions    */
    8304             :             /* of field being used                            */
    8305             :             /* ---------------------------------------------- */
    8306           0 :             if (SWXRegion[regionID]->scanflag == 1)
    8307             :             {
    8308           0 :                (void) SWnentries(SWXRegion[regionID]->swathID,4,&strbufsize);
    8309           0 :                dfieldlist = (char *)calloc(strbufsize + 1, sizeof(char));
    8310           0 :                (void) SWinqdatafields(SWXRegion[regionID]->swathID,dfieldlist,dfrank,numtype2);
    8311           0 :                status = SWfieldinfo(SWXRegion[regionID]->swathID,dfieldlist,&dum,dumdims,&dum,dgeodim);
    8312             : 
    8313             :                   /* The dimensions have to be switched, because */
    8314             :                   /* the mappings force a geodim and datadim     */
    8315             :                   /* so to find the mapping, the dimensions must */
    8316             :                   /* be switched, but the subsetting will still  */
    8317             :                   /* be based on the correct dimensions          */
    8318             :                   /* "long_status == -1" added for CAL file which   */
    8319             :                   /* doesn't have a Traditional geolocation field   */
    8320             :                   /* ---------------------------------------------- */
    8321           0 :                   if (strcmp(dgeodim,dimlist) != 0 || long_status == -1)
    8322             :                   {
    8323           0 :                       strcpy(geodim,dimlist);
    8324           0 :                       strcpy(dimlist,dgeodim);
    8325             :                   }
    8326             :             }
    8327             : 
    8328             : 
    8329             :       /* Get "Track" (first) Dimension from geo dimlist */
    8330             :       /* ---------------------------------------------- */
    8331           0 :       nDim = EHparsestr(geodim, ',', ptr, slen);
    8332           0 :       geodim[slen[0]] = 0;
    8333             : 
    8334             : 
    8335             :       /* Parse Data Field Dimlist & find mapping */
    8336             :       /* --------------------------------------- */
    8337           0 :       nDim = EHparsestr(dimlist, ',', ptr, slen);
    8338             : 
    8339             : 
    8340             :       /* Loop through all dimensions and search for mapping */
    8341             :       /* -------------------------------------------------- */
    8342           0 :       for (i = 0; i < nDim; i++)
    8343             :       {
    8344           0 :     memcpy(utlbuf, ptr[i], slen[i]);
    8345           0 :     utlbuf[slen[i]] = 0;
    8346           0 :     statMap = SWmapinfo(swathID, geodim, utlbuf,
    8347             :             &dum, &incr);
    8348             : 
    8349             :     /* Mapping found */
    8350             :     /* ------------- */
    8351           0 :     if (statMap == 0)
    8352             :     {
    8353           0 :         found = 1;
    8354           0 :         l_index = i;
    8355           0 :         break;
    8356             :     }
    8357             :       }
    8358             : 
    8359             : 
    8360             :       /* If mapping not found check for geodim within dimlist */
    8361             :       /* ---------------------------------------------------- */
    8362           0 :       if (found == 0)
    8363             :       {
    8364           0 :     l_index = EHstrwithin(geodim, dimlist, ',');
    8365             : 
    8366             :     /* Geo dimension found within subset field dimlist */
    8367             :     /* ----------------------------------------------- */
    8368           0 :     if (l_index != -1)
    8369             :     {
    8370           0 :         found = 1;
    8371           0 :         incr = 1;
    8372             :     }
    8373             :       }
    8374             : 
    8375             : 
    8376             : 
    8377             :       /* If mapping not found check for l_indexed mapping */
    8378             :       /* ---------------------------------------------- */
    8379           0 :       if (found == 0)
    8380             :       {
    8381             :     /* Get size of geo dim & allocate space of l_index mapping */
    8382             :     /* ----------------------------------------------------- */
    8383           0 :     dum = SWdiminfo(swathID, geodim);
    8384           0 :     idxmap = (int32 *) calloc(dum, sizeof(int32));
    8385           0 :     if(idxmap == NULL)
    8386             :     { 
    8387           0 :         HEpush(DFE_NOSPACE,"SWregioninfo", __FILE__, __LINE__);
    8388           0 :         return(-1);
    8389             :     }
    8390             : 
    8391             :     /* Loop through all dimensions and search for mapping */
    8392             :     /* -------------------------------------------------- */
    8393           0 :     for (i = 0; i < nDim; i++)
    8394             :     {
    8395           0 :         memcpy(utlbuf, ptr[i], slen[i]);
    8396           0 :         utlbuf[slen[i]] = 0;
    8397             : 
    8398           0 :         idxMapElem = SWidxmapinfo(swathID, geodim, utlbuf, idxmap);
    8399             : 
    8400             : 
    8401             :         /* Mapping found */
    8402             :         /* ------------- */
    8403           0 :         if (idxMapElem != -1)
    8404             :         {
    8405           0 :       found = 1;
    8406           0 :       l_index = i;
    8407           0 :       break;
    8408             :         }
    8409             :     }
    8410             :       }
    8411             : 
    8412             : 
    8413             :       /* Regular Mapping Found */
    8414             :       /* --------------------- */
    8415           0 :       if (found == 1 && idxMapElem == -1)
    8416             :       {
    8417           0 :     dims[l_index] = 0;
    8418             : 
    8419             :     /* Loop through all regions */
    8420             :     /* ------------------------ */
    8421           0 :     for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
    8422             :     {
    8423             :         /* Get number of cross tracks in particular region */
    8424             :         /* ----------------------------------------------- */
    8425           0 :         nXtrk = SWXRegion[regionID]->StopRegion[k] -
    8426           0 :       SWXRegion[regionID]->StartRegion[k] + 1;
    8427             : 
    8428             : 
    8429             :         /* If increment is positive (geodim <= datadim) ... */
    8430             :         /* ------------------------------------------------ */
    8431           0 :         if (incr > 0)
    8432             :         {
    8433           0 :                         if (SWXRegion[regionID]->scanflag == 1)
    8434             :                         {
    8435           0 :                             scan_shift = nXtrk % incr;
    8436           0 :                             if(scan_shift != 0)
    8437           0 :                                nXtrk = nXtrk - scan_shift;
    8438           0 :                             dims[l_index] += nXtrk/incr;
    8439           0 :                             if(long_status == -1 || incr == 1)
    8440             :                             {
    8441           0 :                                if( detect_cnt == 0 )
    8442           0 :                                    return -1;
    8443           0 :                                scan_shift = nXtrk % detect_cnt;
    8444           0 :                                if(scan_shift != 0)
    8445           0 :                                   dims[l_index] = nXtrk - scan_shift;
    8446             :                             }
    8447             :                         }
    8448             :       else
    8449             :                         {
    8450           0 :          dims[l_index] += nXtrk * incr;
    8451             :                         }
    8452             :         }
    8453             :         else
    8454             :         {
    8455             :       /* Negative increment (geodim > datadim) */
    8456             :       /* ------------------------------------- */
    8457           0 :       dims[l_index] += nXtrk / (-incr);
    8458             : 
    8459             :       /*
    8460             :        * If Xtrk not exactly divisible by incr, round dims
    8461             :        * to next highest integer
    8462             :        */
    8463           0 :       if (nXtrk % (-incr) != 0)
    8464             :       {
    8465           0 :           dims[l_index]++;
    8466             :       }
    8467             :         }
    8468             :     }
    8469             :       }
    8470           0 :       else if (found == 1 && idxMapElem != -1)
    8471             :       {
    8472             : 
    8473             :     /* Indexed Mapping */
    8474             :     /* --------------- */
    8475             : 
    8476           0 :     dims[l_index] = 0;
    8477             : 
    8478             :     /* Loop through all regions */
    8479             :     /* ------------------------ */
    8480           0 :     for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
    8481             :     {
    8482           0 :                    j = 0;
    8483           0 :                    if(SWXRegion[regionID]->scanflag == 1)
    8484             :                    {
    8485           0 :                       startscanline = SWXRegion[regionID]->StartRegion[k];
    8486           0 :                       stopscanline = SWXRegion[regionID]->StopRegion[k];
    8487           0 :                       if (strcmp(fieldname,dfieldlist) == 0)
    8488             :                       {
    8489           0 :                          dims[l_index] = stopscanline - startscanline + 1;
    8490           0 :                          datafld = 1;
    8491             :                       }
    8492           0 :                       if (strcmp(fieldname, "Latitude") == 0 ||
    8493           0 :                           strcmp(fieldname, "Longitude") == 0)
    8494             :                       {
    8495           0 :                          if(SWXRegion[regionID]->band8flag == 2 || SWXRegion[regionID]->band8flag == 3)
    8496             :                          {
    8497           0 :                             status = SWfieldinfo(swathID,"scan_no",&rk,dims2,&nt,dimlist);
    8498           0 :                             tbuffer = (uint16 *)calloc(dims2[0], sizeof(uint16));
    8499           0 :                             status =SWreadfield(swathID,"scan_no",NULL,NULL,NULL,tbuffer);
    8500           0 :                             startscanline = startscanline - ((tbuffer[0] * detect_cnt) - detect_cnt);
    8501           0 :                             stopscanline = stopscanline - ((tbuffer[0] * detect_cnt) - 1);
    8502             :                          }
    8503           0 :                          if(SWXRegion[regionID]->band8flag == 2 ||
    8504           0 :                             SWXRegion[regionID]->band8flag == 3)
    8505             :                          {
    8506           0 :                             if(startscandim == -1)
    8507           0 :                                if(startscanline < idxmap[0])
    8508             :                                {
    8509           0 :                                   startscandim = 0;
    8510           0 :                                   dims[l_index] = 0;
    8511           0 :                                   if(stopscanline > idxmap[scene_cnt *2 - 1])
    8512             :                                   {
    8513           0 :                                      stopscandim = scene_cnt*2 - startscandim;
    8514           0 :                                      dims[l_index] = scene_cnt*2 - startscandim;
    8515             :                                   }
    8516             :                                }
    8517             :                          }
    8518           0 :                          for (l = 0; l < scene_cnt; l++)
    8519             :                          {
    8520           0 :                             if(idxmap[j] <= startscanline && idxmap[j+1] >= startscanline)
    8521           0 :                                if(startscandim == -1)
    8522             :                                {
    8523           0 :                                   dims[l_index] = j;
    8524           0 :                                   startscandim = j;
    8525             :                                }
    8526           0 :                             if(idxmap[j] <= stopscanline && idxmap[j+1] >= stopscanline)
    8527           0 :                                if(startscandim != -1)
    8528             :                                {
    8529           0 :                                   dims[l_index] = j - startscandim + 2;
    8530           0 :                                   stopscandim = j + 1;
    8531             :                                }
    8532           0 :                             j = j + 2;
    8533           0 :                             if(idxmap[j] == 0  || idxmap[j+1] == 0)
    8534           0 :                                l = scene_cnt;
    8535             :                          }
    8536           0 :                          if(SWXRegion[regionID]->band8flag == 1 ||
    8537           0 :                             SWXRegion[regionID]->band8flag == 2)
    8538             :                          {
    8539           0 :                             if(stopscandim == -1)
    8540           0 :                                if(stopscanline > idxmap[scene_cnt * 2 - 1])
    8541             :                                {
    8542           0 :                                   stopscandim = scene_cnt*2 - dims[l_index];
    8543           0 :                                   dims[l_index] = scene_cnt*2 - dims[l_index];
    8544             :                                }
    8545             :                          }
    8546           0 :                          if(SWXRegion[regionID]->band8flag == 3)
    8547             :                          {
    8548           0 :                             if(startscandim == -1)
    8549           0 :                                if(startscanline < idxmap[0])
    8550             :                                {
    8551           0 :                                   startscandim = 0;
    8552           0 :                                   if(stopscandim != -1)
    8553           0 :                                      dims[l_index] = stopscandim - startscandim + 1;
    8554             :                                }
    8555             :                          }
    8556           0 :                          if(SWXRegion[regionID]->band8flag == 2)
    8557             :                          {
    8558           0 :                             if(startscandim == -1)
    8559           0 :                                if(startscanline > idxmap[j - 1])
    8560             :                                {
    8561           0 :                                   status = SWfieldinfo(SWXRegion[regionID]->swathID,"scan_no",&rank2,dims2,&nt,dimlist);
    8562           0 :                                   buffer2 = (uint16 *)calloc(dims2[0], sizeof(uint16));
    8563           0 :                                   status = SWreadfield(SWXRegion[regionID]->swathID,"scan_no",NULL,NULL,NULL,buffer2);
    8564           0 :                                   startscanline = startscanline - (buffer2[0] * detect_cnt);
    8565           0 :                                   stopscanline = stopscanline - (buffer2[0] * detect_cnt);
    8566           0 :                                   free(buffer2);
    8567           0 :                                   j = 0;
    8568           0 :                                   for (l = 0; l < scene_cnt; l++)
    8569             :                                   {
    8570           0 :                                      if(idxmap[j] <= startscanline && idxmap[j+1] >= startscanline)
    8571             :                                      {
    8572           0 :                                         dims[l_index] = j;
    8573           0 :                                         startscandim = j;
    8574             :                                      }
    8575           0 :                                      if(idxmap[j] <= stopscanline && idxmap[j+1] >= stopscanline)
    8576           0 :                                         dims[l_index] = j - startscandim + 2;
    8577           0 :                                      j = j + 2;
    8578           0 :                                      if(idxmap[j] == 0  || idxmap[j+1] == 0)
    8579           0 :                                         l = scene_cnt;
    8580             :                                   }
    8581             : 
    8582             :                                }
    8583             :                          }
    8584             :                       }
    8585           0 :                       if (strcmp(fieldname, "scene_center_latitude") == 0 ||
    8586           0 :                           strcmp(fieldname, "scene_center_longitude") == 0)
    8587             :                       {
    8588           0 :                          startscanline = SWXRegion[regionID]->StartRegion[k];
    8589           0 :                          stopscanline = SWXRegion[regionID]->StopRegion[k];
    8590           0 :                          if(startscanline < idxmap[0])
    8591             :                          {
    8592           0 :                             startscandim = 0;
    8593           0 :                             dims[l_index] = 0;
    8594             :                          }
    8595           0 :                          for (l = 0; l < scene_cnt-1; l++)
    8596             :                          {
    8597           0 :                             if(idxmap[l] <= startscanline && idxmap[l+1] >= startscanline)
    8598           0 :                                if(startscandim == -1)
    8599             :                                {
    8600           0 :                                   dims[l_index] = l;
    8601           0 :                                   startscandim = l;
    8602             :                                }
    8603           0 :                             if(idxmap[l] <= stopscanline && idxmap[l+1] >= stopscanline)
    8604             :                             {
    8605           0 :                                dims[l_index] = l - startscandim + 2;
    8606           0 :                                stopscandim = l + 1;
    8607             :                             }
    8608             :                          }
    8609           0 :                          if(stopscandim == -1)
    8610             :                          {
    8611           0 :                             if(stopscanline > idxmap[scene_cnt - 1])
    8612             :                             {
    8613           0 :                                dims[l_index] = scene_cnt - startscandim;
    8614           0 :                                stopscandim = scene_cnt - 1;
    8615             :                             }
    8616             :                          }
    8617           0 :                          if(SWXRegion[regionID]->band8flag == 1)
    8618             :                          {
    8619           0 :                             if(stopscandim == -1)
    8620           0 :                                if(stopscanline > idxmap[scene_cnt - 1])
    8621             :                                {
    8622           0 :                                   dims[l_index] = scene_cnt - startscandim;
    8623           0 :                                   stopscandim = scene_cnt - 1;
    8624             :                                }
    8625             :                          }
    8626           0 :                          if(SWXRegion[regionID]->band8flag == 2 ||
    8627           0 :                             SWXRegion[regionID]->band8flag == 3)
    8628             :                          {
    8629           0 :                             if(startscandim == -1)
    8630             :                             {
    8631           0 :                                if(startscanline < idxmap[0])
    8632             :                                {
    8633           0 :                                   startscandim = 0;
    8634           0 :                                   dims[l_index] = stopscandim - startscandim + 1;
    8635             :                                }
    8636             :                             }
    8637           0 :                             if(startscandim == -1)
    8638             :                             {
    8639           0 :                                startscanline = SWXRegion[regionID]->StartScan[k] * detect_cnt;
    8640           0 :                                stopscanline = SWXRegion[regionID]->StopScan[k] * detect_cnt;
    8641           0 :                                for (l = 0; l < scene_cnt-1; l++)
    8642             :                                {
    8643           0 :                                   if(idxmap[l] <= startscanline && idxmap[l+1] >= startscanline)
    8644           0 :                                      dims[l_index] = l;
    8645           0 :                                   if(idxmap[l] <= stopscanline && idxmap[l+1] >= stopscanline)
    8646           0 :                                      dims[l_index] = l - dims[l_index] + 1;
    8647             :                                }
    8648             :                             }
    8649             :                          }
    8650             :                       }
    8651             :                    }
    8652             :                    else
    8653             :                    {
    8654           0 :                       if (datafld != 1)
    8655             :                       {
    8656             :              /* Get number of cross tracks in particular region */
    8657             :              /* ----------------------------------------------- */
    8658           0 :              nXtrk = idxmap[SWXRegion[regionID]->StopRegion[k]] -
    8659           0 :                idxmap[SWXRegion[regionID]->StartRegion[k]] + 1;
    8660             : 
    8661           0 :              dims[l_index] += nXtrk;
    8662             :                       }
    8663             :                     }
    8664             :     }
    8665             :       }
    8666             :       else
    8667             :       {
    8668             :     /* Mapping not found */
    8669             :     /* ----------------- */
    8670           0 :           status = -1;  
    8671           0 :     HEpush(DFE_GENAPP, "SWregioninfo",
    8672             :            __FILE__, __LINE__);
    8673           0 :     HEreport(
    8674             :        "Mapping Not Defined for \"%s\" Dimension.\n",
    8675             :        geodim);
    8676             :       }
    8677             :   }
    8678             : 
    8679             : 
    8680             : 
    8681             :   /* Vertical Subset */
    8682             :   /* --------------- */
    8683           0 :   if (status == 0 || status == -1)  /* check the vertical subset in any case -- xhua */
    8684             :   {
    8685           0 :       for (j = 0; j < 8; j++)
    8686             :       {
    8687             :     /* If active vertical subset ... */
    8688             :     /* ----------------------------- */
    8689           0 :     if (SWXRegion[regionID]->StartVertical[j] != -1)
    8690             :     {
    8691             : 
    8692             :         /* Find vertical dimension within dimlist */
    8693             :         /* -------------------------------------- */
    8694           0 :         l_index = EHstrwithin(SWXRegion[regionID]->DimNamePtr[j],
    8695             :           dimlist, ',');
    8696             : 
    8697             :         /* If dimension found ... */
    8698             :         /* ---------------------- */
    8699           0 :         if (l_index != -1)
    8700             :         {
    8701             :       /* Compute dimension size */
    8702             :       /* ---------------------- */
    8703           0 :       dims[l_index] =
    8704           0 :           SWXRegion[regionID]->StopVertical[j] -
    8705           0 :           SWXRegion[regionID]->StartVertical[j] + 1;
    8706             :         }
    8707             :         else
    8708             :         {
    8709             :       /* Vertical dimension not found */
    8710             :       /* ---------------------------- */
    8711           0 :       status = -1;
    8712           0 :       *size = -1;
    8713           0 :       HEpush(DFE_GENAPP, "SWregioninfo", __FILE__, __LINE__);
    8714           0 :       HEreport(errMesg, SWXRegion[regionID]->DimNamePtr[j]);
    8715             :         }
    8716             :     }
    8717             :       }
    8718             : 
    8719             : 
    8720             : 
    8721             :       /* Compute size of region data buffer */
    8722             :       /* ---------------------------------- */
    8723           0 :       if (status == 0)
    8724             :       {
    8725           0 :                 if(idxMapElem == 1 && SWXRegion[regionID]->scanflag == 1 && land_status == 0)
    8726             :                 {
    8727           0 :                     if(startscandim == dims[0])
    8728           0 :                        dims[0] = scene_cnt*2 - startscandim;
    8729             :                 }
    8730             : 
    8731             :     /* Compute number of total elements */
    8732             :     /* -------------------------------- */
    8733           0 :     *size = dims[0];
    8734           0 :     for (j = 1; j < *rank; j++)
    8735             :     {
    8736           0 :         *size *= dims[j];
    8737             :     }
    8738             : 
    8739             :     /* Multiply by size in bytes of numbertype */
    8740             :     /* --------------------------------------- */
    8741           0 :     *size *= DFKNTsize(*ntype);
    8742             :       }
    8743             :   }
    8744             :     }
    8745             : 
    8746             : 
    8747             : 
    8748             :     /* Free l_index mappings if applicable */
    8749             :     /* --------------------------------- */
    8750           0 :     if (idxmap != NULL)
    8751             :     {
    8752           0 :   free(idxmap);
    8753             :     }
    8754           0 :     if(dfieldlist != NULL)
    8755           0 :        free(dfieldlist);
    8756             : 
    8757           0 :     return (status);
    8758             : }
    8759             : 
    8760             : 
    8761             : 
    8762             : /*----------------------------------------------------------------------------|
    8763             : |  BEGIN_PROLOG                                                               |
    8764             : |                                                                             |
    8765             : |  FUNCTION: SWperiodinfo                                                     |
    8766             : |                                                                             |
    8767             : |  DESCRIPTION: Returns size in bytes of region                               |
    8768             : |                                                                             |
    8769             : |                                                                             |
    8770             : |  Return Value    Type     Units     Description                             |
    8771             : |  ============   ======  =========   =====================================   |
    8772             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    8773             : |                                                                             |
    8774             : |  INPUTS:                                                                    |
    8775             : |  swathID        int32               Swath structure ID                      |
    8776             : |  periodID       int32               Period ID                               |
    8777             : |  fieldname      char                Fieldname                               |
    8778             : |                                                                             |
    8779             : |                                                                             |
    8780             : |  OUTPUTS:                                                                   |
    8781             : |  ntype          int32               field number type                       |
    8782             : |  rank           int32               field rank                              |
    8783             : |  dims           int32               dimensions of field region              |
    8784             : |  size           int32               size in bytes of field region           |
    8785             : |                                                                             |
    8786             : |  NOTES:                                                                     |
    8787             : |                                                                             |
    8788             : |                                                                             |
    8789             : |   Date     Programmer   Description                                         |
    8790             : |  ======   ============  =================================================   |
    8791             : |  Jun 96   Joel Gales    Original Programmer                                 |
    8792             : |  Jun 03   Abe Taaheri   added clearing timeflag if SWregioninfo fails       |
    8793             : |                                                                             |
    8794             : |  END_PROLOG                                                                 |
    8795             : -----------------------------------------------------------------------------*/
    8796             : intn
    8797           0 : SWperiodinfo(int32 swathID, int32 periodID, const char *fieldname,
    8798             :        int32 * ntype, int32 * rank, int32 dims[], int32 * size)
    8799             : {
    8800             :     intn            status; /* routine return status variable */
    8801             : 
    8802             : 
    8803           0 :     timeflag = 1;
    8804             :     /* Call SWregioninfo */
    8805             :     /* ----------------- */
    8806           0 :     status = SWregioninfo(swathID, periodID, fieldname, ntype, rank,
    8807             :         dims, size);
    8808           0 :     if (status != 0) timeflag = 0;/* clear timeflag if SWregioninfo failed */
    8809           0 :     return (status);
    8810             : }
    8811             : 
    8812             : 
    8813             : 
    8814             : 
    8815             : 
    8816             : /*----------------------------------------------------------------------------|
    8817             : |  BEGIN_PROLOG                                                               |
    8818             : |                                                                             |
    8819             : |  FUNCTION: SWdefvrtregion                                                   |
    8820             : |                                                                             |
    8821             : |  DESCRIPTION: Finds elements of a monotonic field within a given range.     |
    8822             : |                                                                             |
    8823             : |                                                                             |
    8824             : |  Return Value    Type     Units     Description                             |
    8825             : |  ============   ======  =========   =====================================   |
    8826             : |  regionID       int32               Region ID                               |
    8827             : |                                                                             |
    8828             : |  INPUTS:                                                                    |
    8829             : |  swathID        int32               Swath structure ID                      |
    8830             : |  regionID       int32               Region ID                               |
    8831             : |  vertObj        char                Vertical object to subset               |
    8832             : |  range          float64             Vertical subsetting range               |
    8833             : |                                                                             |
    8834             : |  OUTPUTS:                                                                   |
    8835             : |             None                                                            |
    8836             : |                                                                             |
    8837             : |  NOTES:                                                                     |
    8838             : |                                                                             |
    8839             : |                                                                             |
    8840             : |   Date     Programmer   Description                                         |
    8841             : |  ======   ============  =================================================   |
    8842             : |  Aug 96   Joel Gales    Original Programmer                                 |
    8843             : |  Dec 96   Joel Gales    Add multiple vertical subsetting capability         |
    8844             : |  May 97   Joel Gales    Check for supported field types                     |
    8845             : |                                                                             |
    8846             : |  END_PROLOG                                                                 |
    8847             : -----------------------------------------------------------------------------*/
    8848             : 
    8849             : 
    8850             : /* Macro to initialize swath region entry */
    8851             : /* -------------------------------------- */
    8852             : 
    8853             : /*
    8854             :  * 1) Find empty (inactive) region. 2) Allocate space for region entry. 3)
    8855             :  * Store file ID and swath ID. 4) Set region ID. 5) Initialize vertical
    8856             :  * subset entries to -1.
    8857             :  */
    8858             : 
    8859             : #define SETSWTHREG \
    8860             : \
    8861             : for (k = 0; k < NSWATHREGN; k++) \
    8862             : { \
    8863             :     if (SWXRegion[k] == 0) \
    8864             :     { \
    8865             :         SWXRegion[k] = (struct swathRegion *) \
    8866             :     calloc(1, sizeof(struct swathRegion)); \
    8867             :   SWXRegion[k]->fid = fid; \
    8868             :   SWXRegion[k]->swathID = swathID; \
    8869             :   regionID = k; \
    8870             :   for (j=0; j<8; j++) \
    8871             :         { \
    8872             :              SWXRegion[k]->StartVertical[j] = -1; \
    8873             :              SWXRegion[k]->StopVertical[j]  = -1; \
    8874             :              SWXRegion[k]->StartScan[j] = -1; \
    8875             :              SWXRegion[k]->StopScan[j]  = -1; \
    8876             :              SWXRegion[k]->band8flag  = -1; \
    8877             :         } \
    8878             :   break; \
    8879             :      } \
    8880             : }
    8881             : 
    8882             : 
    8883             : /* Macro to fill vertical subset entry */
    8884             : /* ----------------------------------- */
    8885             : 
    8886             : /*
    8887             :  * 1) Find empty (inactive) vertical region. 2) Set start of vertical region.
    8888             :  * 3) Allocate space for name of vertical dimension. 4) Write vertical
    8889             :  * dimension name.
    8890             :  */
    8891             : 
    8892             : #define FILLVERTREG \
    8893             : for (j=0; j<8; j++) \
    8894             : { \
    8895             :     if (SWXRegion[regionID]->StartVertical[j] == -1) \
    8896             :     { \
    8897             :   SWXRegion[regionID]->StartVertical[j] = i; \
    8898             :   SWXRegion[regionID]->DimNamePtr[j] = \
    8899             :       (char *) malloc(slen + 1); \
    8900             :   memcpy(SWXRegion[regionID]->DimNamePtr[j], \
    8901             :          dimlist, slen + 1); \
    8902             :   break; \
    8903             :     } \
    8904             : } \
    8905             : 
    8906             : 
    8907             : 
    8908             : int32
    8909           0 : SWdefvrtregion(int32 swathID, int32 regionID, const char *vertObj, float64 range[])
    8910             : {
    8911             :     intn            i;    /* Loop index */
    8912           0 :     intn            j = 0;    /* Loop index */
    8913             :     intn            k;    /* Loop index */
    8914             :     intn            status; /* routine return status variable */
    8915             : 
    8916           0 :     uint8           found = 0;  /* Found flag */
    8917             : 
    8918             :     int16           vertINT16;  /* Temporary INT16 variable */
    8919             : 
    8920             :     int32           fid;  /* HDF-EOS file ID */
    8921             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    8922             :     int32           swVgrpID; /* Swath Vgroup ID */
    8923             :     int32           slen; /* String length */
    8924             :     int32           rank; /* Field rank */
    8925             :     int32           nt;   /* Field numbertype */
    8926             :     int32           dims[8];  /* Field dimensions */
    8927             :     int32           size; /* Size of numbertype in bytes */
    8928             :     int32           vertINT32;  /* Temporary INT32 variable */
    8929             : 
    8930             :     float32         vertFLT32;  /* Temporary FLT32 variable */
    8931             : 
    8932             :     float64         vertFLT64;  /* Temporary FLT64 variable */
    8933             : 
    8934             :     char           *vertArr;  /* Pointer to vertical field data buffer */
    8935             :     char            dimlist[256]; /* Dimension list */
    8936             : 
    8937             : 
    8938             :     /* Check for valid swath ID */
    8939             :     /* ------------------------ */
    8940           0 :     status = SWchkswid(swathID, "SWdefvrtregion", &fid, &sdInterfaceID,
    8941             :            &swVgrpID);
    8942             : 
    8943           0 :     if (status == 0)
    8944             :     {
    8945             :   /* Copy first 4 characters of vertObj into dimlist */
    8946             :   /* ----------------------------------------------- */
    8947           0 :   memcpy(dimlist, vertObj, 4);
    8948           0 :   dimlist[4] = 0;
    8949             : 
    8950             : 
    8951             : 
    8952             :   /* If first 4 characters of vertObj = "DIM:" ... */
    8953             :   /* --------------------------------------------- */
    8954             : 
    8955             :   /* Vertical Object is dimension name */
    8956             :   /* --------------------------------- */
    8957           0 :   if (strcmp(dimlist, "DIM:") == 0)
    8958             :   {
    8959             :       /* Get string length of vertObj (minus "DIM:) */
    8960             :       /* ------------------------------------------ */
    8961           0 :       slen = (int)strlen(vertObj) - 4;
    8962             : 
    8963             : 
    8964             :       /* If regionID = -1 then setup swath region entry */
    8965             :       /* ---------------------------------------------- */
    8966           0 :       if (regionID == -1)
    8967             :       {
    8968           0 :     SETSWTHREG;
    8969             :       }
    8970             : 
    8971             : 
    8972             :       /* Find first empty (inactive) vertical subset entry */
    8973             :       /* ------------------------------------------------- */
    8974           0 :       for (j = 0; j < 8; j++)
    8975             :       {
    8976           0 :     if (SWXRegion[regionID]->StartVertical[j] == -1)
    8977             :     {
    8978             :         /* Store start & stop of vertical region */
    8979             :         /* ------------------------------------- */
    8980           0 :         SWXRegion[regionID]->StartVertical[j] = (int32) range[0];
    8981           0 :         SWXRegion[regionID]->StopVertical[j] = (int32) range[1];
    8982             : 
    8983             :         /* Store vertical dimension name */
    8984             :         /* ----------------------------- */
    8985           0 :         SWXRegion[regionID]->DimNamePtr[j] =
    8986           0 :       (char *) malloc(slen + 1);
    8987           0 :         if(SWXRegion[regionID]->DimNamePtr[j] == NULL)
    8988             :         { 
    8989           0 :       HEpush(DFE_NOSPACE,"SWdefvrtregion", __FILE__, __LINE__);
    8990           0 :       return(-1);
    8991             :         }
    8992           0 :         memcpy(SWXRegion[regionID]->DimNamePtr[j],
    8993           0 :          vertObj + 4, slen + 1);
    8994           0 :         break;
    8995             :     }
    8996             :       }
    8997             :   }
    8998             :   else
    8999             :   {
    9000             : 
    9001             :       /* Vertical Object is fieldname */
    9002             :       /* ---------------------------- */
    9003             : 
    9004             : 
    9005             :       /* Check for valid fieldname */
    9006             :       /* ------------------------- */
    9007           0 :       status = SWfieldinfo(swathID, vertObj, &rank, dims, &nt,
    9008             :          dimlist);
    9009             : 
    9010           0 :       if (status != 0)
    9011             :       {
    9012           0 :     status = -1;
    9013           0 :     HEpush(DFE_GENAPP, "SWdefvrtregion", __FILE__, __LINE__);
    9014           0 :     HEreport("Vertical Field: \"%s\" not found.\n", vertObj);
    9015             :       }
    9016             : 
    9017             : 
    9018             : 
    9019             :       /* Check for supported field types */
    9020             :       /* ------------------------------- */
    9021           0 :       if (nt != DFNT_INT16 &&
    9022           0 :     nt != DFNT_INT32 &&
    9023           0 :     nt != DFNT_FLOAT32 &&
    9024           0 :     nt != DFNT_FLOAT64)
    9025             :       {
    9026           0 :     status = -1;
    9027           0 :     HEpush(DFE_GENAPP, "SWdefvrtregion", __FILE__, __LINE__);
    9028           0 :     HEreport("Fieldtype: %d not supported for vertical subsetting.\n", nt);
    9029             :       }
    9030             : 
    9031             : 
    9032             : 
    9033             :       /* Check that vertical dimension is 1D */
    9034             :       /* ----------------------------------- */
    9035           0 :       if (status == 0)
    9036             :       {
    9037           0 :     if (rank != 1)
    9038             :     {
    9039           0 :         status = -1;
    9040           0 :         HEpush(DFE_GENAPP, "SWdefvrtregion", __FILE__, __LINE__);
    9041           0 :         HEreport("Vertical Field: \"%s\" must be 1-dim.\n",
    9042             :            vertObj);
    9043             :     }
    9044             :       }
    9045             : 
    9046             : 
    9047             :       /* If no problems then continue */
    9048             :       /* ---------------------------- */
    9049           0 :       if (status == 0)
    9050             :       {
    9051             :     /* Get string length of vertical dimension */
    9052             :     /* --------------------------------------- */
    9053           0 :     slen = (int)strlen(dimlist);
    9054             : 
    9055             : 
    9056             :     /* Get size in bytes of vertical field numbertype */
    9057             :     /* ---------------------------------------------- */
    9058           0 :     size = DFKNTsize(nt);
    9059             : 
    9060             : 
    9061             :     /* Allocate space for vertical field */
    9062             :     /* --------------------------------- */
    9063           0 :     vertArr = (char *) calloc(dims[0], size);
    9064           0 :     if(vertArr == NULL)
    9065             :     { 
    9066           0 :         HEpush(DFE_NOSPACE,"SWdefvrtregion", __FILE__, __LINE__);
    9067           0 :         return(-1);
    9068             :     }
    9069             : 
    9070             :     /* Read vertical field */
    9071             :     /* ------------------- */
    9072           0 :     status = SWreadfield(swathID, vertObj,
    9073             :              NULL, NULL, NULL, vertArr);
    9074             : 
    9075             : 
    9076             : 
    9077           0 :     switch (nt)
    9078             :     {
    9079           0 :     case DFNT_INT16:
    9080             : 
    9081           0 :         for (i = 0; i < dims[0]; i++)
    9082             :         {
    9083             :       /* Get single element of vertical field */
    9084             :       /* ------------------------------------ */
    9085           0 :       memcpy(&vertINT16, vertArr + i * size, size);
    9086             : 
    9087             : 
    9088             :       /* If within range ... */
    9089             :       /* ------------------- */
    9090           0 :       if (vertINT16 >= range[0] &&
    9091           0 :           vertINT16 <= range[1])
    9092             :       {
    9093             :           /* Set found flag */
    9094             :           /* -------------- */
    9095           0 :           found = 1;
    9096             : 
    9097             : 
    9098             :           /* If regionID=-1 then setup swath region entry */
    9099             :           /* -------------------------------------------- */
    9100           0 :           if (regionID == -1)
    9101             :           {
    9102           0 :         SETSWTHREG;
    9103             :           }
    9104             : 
    9105             : 
    9106             :           /* Fill-in vertical region entries */
    9107             :           /* ------------------------------- */
    9108           0 :           FILLVERTREG;
    9109             : 
    9110           0 :           break;
    9111             :       }
    9112             :         }
    9113             : 
    9114             : 
    9115             :         /* If found read from "bottom" of data field */
    9116             :         /* ----------------------------------------- */
    9117           0 :         if (found == 1)
    9118             :         {
    9119           0 :       for (i = dims[0] - 1; i >= 0; i--)
    9120             :       {
    9121             :           /* Get single element of vertical field */
    9122             :           /* ------------------------------------ */
    9123           0 :           memcpy(&vertINT16, vertArr + i * size, size);
    9124             : 
    9125             : 
    9126             :           /* If within range ... */
    9127             :           /* ------------------- */
    9128           0 :           if (vertINT16 >= range[0] &&
    9129           0 :         vertINT16 <= range[1])
    9130             :           {
    9131             :         /* Set end of vertical region */
    9132             :         /* -------------------------- */
    9133           0 :         SWXRegion[regionID]->StopVertical[j] = i;
    9134           0 :         break;
    9135             :           }
    9136             :       }
    9137             :         }
    9138             :         else
    9139             :         {
    9140             :       /* No vertical entries within region */
    9141             :       /* --------------------------------- */
    9142           0 :       status = -1;
    9143           0 :       HEpush(DFE_GENAPP, "SWdefvrtregion",
    9144             :              __FILE__, __LINE__);
    9145           0 :       HEreport("No vertical field entries within region.\n");
    9146             :         }
    9147           0 :         break;
    9148             : 
    9149             : 
    9150           0 :     case DFNT_INT32:
    9151             : 
    9152           0 :         for (i = 0; i < dims[0]; i++)
    9153             :         {
    9154             :       /* Get single element of vertical field */
    9155             :       /* ------------------------------------ */
    9156           0 :       memcpy(&vertINT32, vertArr + i * size, size);
    9157             : 
    9158             : 
    9159             :       /* If within range ... */
    9160             :       /* ------------------- */
    9161           0 :       if (vertINT32 >= range[0] &&
    9162           0 :           vertINT32 <= range[1])
    9163             :       {
    9164             :           /* Set found flag */
    9165             :           /* -------------- */
    9166           0 :           found = 1;
    9167             : 
    9168             : 
    9169             :           /* If regionID=-1 then setup swath region entry */
    9170             :           /* -------------------------------------------- */
    9171           0 :           if (regionID == -1)
    9172             :           {
    9173           0 :         SETSWTHREG;
    9174             :           }
    9175             : 
    9176             : 
    9177             :           /* Fill-in vertical region entries */
    9178             :           /* ------------------------------- */
    9179           0 :           FILLVERTREG;
    9180             : 
    9181           0 :           break;
    9182             :       }
    9183             :         }
    9184             : 
    9185             : 
    9186             :         /* If found read from "bottom" of data field */
    9187             :         /* ----------------------------------------- */
    9188           0 :         if (found == 1)
    9189             :         {
    9190           0 :       for (i = dims[0] - 1; i >= 0; i--)
    9191             :       {
    9192             :           /* Get single element of vertical field */
    9193             :           /* ------------------------------------ */
    9194           0 :           memcpy(&vertINT32, vertArr + i * size, size);
    9195             : 
    9196             : 
    9197             :           /* If within range ... */
    9198             :           /* ------------------- */
    9199           0 :           if (vertINT32 >= range[0] &&
    9200           0 :         vertINT32 <= range[1])
    9201             :           {
    9202             :         /* Set end of vertical region */
    9203             :         /* -------------------------- */
    9204           0 :         SWXRegion[regionID]->StopVertical[j] = i;
    9205           0 :         break;
    9206             :           }
    9207             :       }
    9208             :         }
    9209             :         else
    9210             :         {
    9211             :       /* No vertical entries within region */
    9212             :       /* --------------------------------- */
    9213           0 :       status = -1;
    9214           0 :       HEpush(DFE_GENAPP, "SWdefvrtregion",
    9215             :              __FILE__, __LINE__);
    9216           0 :       HEreport("No vertical field entries within region.\n");
    9217             :         }
    9218           0 :         break;
    9219             : 
    9220             : 
    9221           0 :     case DFNT_FLOAT32:
    9222             : 
    9223           0 :         for (i = 0; i < dims[0]; i++)
    9224             :         {
    9225             :       /* Get single element of vertical field */
    9226             :       /* ------------------------------------ */
    9227           0 :       memcpy(&vertFLT32, vertArr + i * size, size);
    9228             : 
    9229             : 
    9230             :       /* If within range ... */
    9231             :       /* ------------------- */
    9232           0 :       if (vertFLT32 >= range[0] &&
    9233           0 :           vertFLT32 <= range[1])
    9234             :       {
    9235             :           /* Set found flag */
    9236             :           /* -------------- */
    9237           0 :           found = 1;
    9238             : 
    9239             : 
    9240             :           /* If regionID=-1 then setup swath region entry */
    9241             :           /* -------------------------------------------- */
    9242           0 :           if (regionID == -1)
    9243             :           {
    9244           0 :         SETSWTHREG;
    9245             :           }
    9246             : 
    9247             : 
    9248             :           /* Fill-in vertical region entries */
    9249             :           /* ------------------------------- */
    9250           0 :           FILLVERTREG;
    9251             : 
    9252           0 :           break;
    9253             :       }
    9254             :         }
    9255             : 
    9256             : 
    9257             :         /* If found read from "bottom" of data field */
    9258             :         /* ----------------------------------------- */
    9259           0 :         if (found == 1)
    9260             :         {
    9261           0 :       for (i = dims[0] - 1; i >= 0; i--)
    9262             :       {
    9263             :           /* Get single element of vertical field */
    9264             :           /* ------------------------------------ */
    9265           0 :           memcpy(&vertFLT32, vertArr + i * size, size);
    9266             : 
    9267             : 
    9268             :           /* If within range ... */
    9269             :           /* ------------------- */
    9270           0 :           if (vertFLT32 >= range[0] &&
    9271           0 :         vertFLT32 <= range[1])
    9272             :           {
    9273             :         /* Set end of vertical region */
    9274             :         /* -------------------------- */
    9275           0 :         SWXRegion[regionID]->StopVertical[j] = i;
    9276           0 :         break;
    9277             :           }
    9278             :       }
    9279             :         }
    9280             :         else
    9281             :         {
    9282             :       /* No vertical entries within region */
    9283             :       /* --------------------------------- */
    9284           0 :       status = -1;
    9285           0 :       HEpush(DFE_GENAPP, "SWdefvrtregion",
    9286             :              __FILE__, __LINE__);
    9287           0 :       HEreport("No vertical field entries within region.\n");
    9288             :         }
    9289           0 :         break;
    9290             : 
    9291             : 
    9292           0 :     case DFNT_FLOAT64:
    9293             : 
    9294           0 :         for (i = 0; i < dims[0]; i++)
    9295             :         {
    9296             :       /* Get single element of vertical field */
    9297             :       /* ------------------------------------ */
    9298           0 :       memcpy(&vertFLT64, vertArr + i * size, size);
    9299             : 
    9300             : 
    9301             :       /* If within range ... */
    9302             :       /* ------------------- */
    9303           0 :       if (vertFLT64 >= range[0] &&
    9304           0 :           vertFLT64 <= range[1])
    9305             :       {
    9306             :           /* Set found flag */
    9307             :           /* -------------- */
    9308           0 :           found = 1;
    9309             : 
    9310             : 
    9311             :           /* If regionID=-1 then setup swath region entry */
    9312             :           /* -------------------------------------------- */
    9313           0 :           if (regionID == -1)
    9314             :           {
    9315           0 :         SETSWTHREG;
    9316             :           }
    9317             : 
    9318             : 
    9319             :           /* Fill-in vertical region entries */
    9320             :           /* ------------------------------- */
    9321           0 :           FILLVERTREG;
    9322             : 
    9323           0 :           break;
    9324             :       }
    9325             :         }
    9326             : 
    9327             : 
    9328             :         /* If found read from "bottom" of data field */
    9329             :         /* ----------------------------------------- */
    9330           0 :         if (found == 1)
    9331             :         {
    9332           0 :       for (i = dims[0] - 1; i >= 0; i--)
    9333             :       {
    9334             :           /* Get single element of vertical field */
    9335             :           /* ------------------------------------ */
    9336           0 :           memcpy(&vertFLT64, vertArr + i * size, size);
    9337             : 
    9338             :           /* If within range ... */
    9339             :           /* ------------------- */
    9340           0 :           if (vertFLT64 >= range[0] &&
    9341           0 :         vertFLT64 <= range[1])
    9342             :           {
    9343             :         /* Set end of vertical region */
    9344             :         /* -------------------------- */
    9345           0 :         SWXRegion[regionID]->StopVertical[j] = i;
    9346           0 :         break;
    9347             :           }
    9348             :       }
    9349             :         }
    9350             :         else
    9351             :         {
    9352             :       /* No vertical entries within region */
    9353             :       /* --------------------------------- */
    9354           0 :       status = -1;
    9355           0 :       HEpush(DFE_GENAPP, "SWdefvrtregion",
    9356             :              __FILE__, __LINE__);
    9357           0 :       HEreport("No vertical field entries within region.\n");
    9358             :         }
    9359           0 :         break;
    9360             : 
    9361             :     }   /* End of switch */
    9362           0 :     free(vertArr);
    9363             :       }
    9364             :   }
    9365             :     }
    9366             : 
    9367             : 
    9368             :     /* Set regionID to -1 if bad return status */
    9369             :     /* --------------------------------------- */
    9370           0 :     if (status == -1)
    9371             :     {
    9372           0 :   regionID = -1;
    9373             :     }
    9374             : 
    9375             : 
    9376           0 :     return (regionID);
    9377             : }
    9378             : 
    9379             : 
    9380             : 
    9381             : /*----------------------------------------------------------------------------|
    9382             : |  BEGIN_PROLOG                                                               |
    9383             : |                                                                             |
    9384             : |  FUNCTION: SWdefscanregion                                                  |
    9385             : |                                                                             |
    9386             : |  DESCRIPTION: Initialize the region structure for Landsat 7 float scene     |
    9387             : |               subset                    |
    9388             : |                                                                             |
    9389             : |                                                                             |
    9390             : |  Return Value    Type     Units     Description                             |
    9391             : |  ============   ======  =========   =====================================   |
    9392             : |  regionID       int32               Region ID                               |
    9393             : |                                                                             |
    9394             : |  INPUTS:                                                                    |
    9395             : |  swathID        int32               Swath structure ID                      |
    9396             : |  fieldname      char                Field name to subset                    |
    9397             : |  range          float64             subsetting range                        |
    9398             : |  mode     int32         HDFE_ENDPOINT, HDFE_MIDPOINT or         |
    9399             : |             HDFE_ANYPOINT                           |
    9400             : |                                                                             |
    9401             : |  OUTPUTS:                                                                   |
    9402             : |  regionID   int32         Region ID                               |
    9403             : |                                                                             |
    9404             : |  NOTES:                                                                     |
    9405             : |                                                                             |
    9406             : |                                                                             |
    9407             : |   Date     Programmer   Description                                         |
    9408             : |  ======   ============  =================================================   |
    9409             : |  Jul 99   DaW     Original Programmer                                 |
    9410             : |                                                                             |
    9411             : |  END_PROLOG                                                                 |
    9412             : -----------------------------------------------------------------------------*/
    9413             : int32
    9414           0 : SWdefscanregion(int32 swathID, const char *fieldname, float64 range[], CPL_UNUSED int32 mode)
    9415             : {
    9416             :     intn            j;    /* Loop index */
    9417             :     intn            k;    /* Loop index */
    9418             :     intn            status; /* routine return status variable */
    9419           0 :     intn            land_status = 3;  /* routine return status variable */
    9420           0 :     intn      band81flag = 0;
    9421           0 :     intn      band82flag = 0;
    9422           0 :     intn      band83flag = 0;
    9423           0 :     uint8           detect_cnt = 0;     /* Used to convert scan to scanline  */
    9424             :                                         /*  L7 float scene sub.              */
    9425           0 :     uint8           scene_cnt = 0;
    9426             : 
    9427             : 
    9428           0 :     int32           nmtype = 0; /* Used for L7 float scene sub. */
    9429           0 :     int32           count = 0;   /* Used for L7 float scene sub. */
    9430             :     int32           fid;  /* HDF-EOS file ID */
    9431             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    9432             :     int32           swVgrpID; /* Swath Vgroup ID */
    9433             :     int32           slen; /* String length */
    9434             :     int32     dfrank[8];  /* data fields rank */
    9435             :     int32           rank; /* Field rank */
    9436             :     int32     numtype[8]; /* number type of data fields */
    9437             :     int32           nt;   /* Field numbertype */
    9438             :     int32           dims[8];  /* Field dimensions */
    9439             :     int32           dims2[8]; /* Field dimensions */
    9440           0 :     int32     strbufsize = 0; /* string buffer size */
    9441           0 :     int32     tmprange0 = 0;
    9442             : 
    9443             : 
    9444           0 :     uint16      *buffer = (uint16 *)NULL;
    9445           0 :     int32     *idxmap = (int32 *)NULL;
    9446             : 
    9447           0 :     int32     dimsize = 0;
    9448             : 
    9449           0 :     int32           regionID = -1;  /* Region ID (return) */
    9450             : 
    9451           0 :     float64     scan[2] = {0,0};
    9452           0 :     float64     original_scan[2] = {0,0};
    9453             : 
    9454             :     char            dimlist[256]; /* Dimension list */
    9455             :     char      swathname[80];
    9456           0 :     char      *dfieldlist = (char *)NULL;  /* data field list  */
    9457           0 :     char      *tfieldname = (char *)NULL;  /* temp field buffer  */
    9458           0 :     char      *band81 = (char *)NULL;
    9459           0 :     char      *band82 = (char *)NULL;
    9460           0 :     char      *band83 = (char *)NULL;
    9461             : 
    9462             : 
    9463             :     /* Check for valid swath ID */
    9464             :     /* ------------------------ */
    9465           0 :     status = SWchkswid(swathID, "SWdefscanregion", &fid, &sdInterfaceID,
    9466             :            &swVgrpID);
    9467             : 
    9468             :    /* This code checks for the attribute detector_count */
    9469             :    /* which is found in Landsat 7 files.  It is used    */
    9470             :    /* for some of the loops. The other code checks if   */
    9471             :    /* one scan is requested.                            */
    9472             :    /* ================================================= */
    9473           0 :       land_status = SWattrinfo(swathID, "detector_count", &nmtype, &count);
    9474           0 :       if (land_status == 0)
    9475             :       {
    9476           0 :          scan[0] = range[0];
    9477           0 :          scan[1] = range[1];
    9478           0 :          original_scan[0] = range[0];
    9479           0 :          original_scan[1] = range[1];
    9480             : 
    9481           0 :          land_status = SWreadattr(swathID, "scene_count", &scene_cnt);
    9482           0 :          land_status = SWreadattr(swathID, "detector_count", &detect_cnt);
    9483           0 :          if (range[0] == range[1])
    9484             :          {
    9485           0 :             range[0] = range[0] * detect_cnt - detect_cnt;
    9486           0 :             range[1] = range[0] + detect_cnt - 1;
    9487             :          }
    9488             :          else
    9489             :          {
    9490           0 :             range[0] = range[0] * detect_cnt - detect_cnt;
    9491           0 :             range[1] = range[1] * detect_cnt - 1;
    9492             :          }
    9493             : 
    9494           0 :          Vgetname(SWXSwath[0].IDTable, swathname);
    9495           0 :          band81 = strstr(swathname, "B81");
    9496           0 :          if (band81 != (char *)NULL)
    9497           0 :             band81flag = 1;
    9498           0 :          band82 = strstr(swathname, "B82");
    9499           0 :          if (band82 != (char *)NULL)
    9500           0 :             band82flag = 1;
    9501           0 :          band83 = strstr(swathname, "B83");
    9502           0 :          if (band83 != (char *)NULL)
    9503           0 :             band83flag = 1;
    9504             :       }
    9505             : 
    9506             : 
    9507             :     /* If fieldname is null then subsetting Landsat 7 */
    9508             :     /* floating scene. Get data field name, assume    */
    9509             :     /* only one data field in swath                   */
    9510             :     /* ---------------------------------------------- */
    9511             : 
    9512           0 :     if (fieldname == (char *)NULL)
    9513             :     {
    9514           0 :        (void) SWnentries(swathID, 4, &strbufsize);
    9515           0 :        dfieldlist = (char *)calloc(strbufsize + 1, sizeof(char));
    9516           0 :        (void) SWinqdatafields(swathID, dfieldlist, dfrank, numtype);
    9517           0 :        tfieldname = (char *)calloc(strbufsize + 1, sizeof(char));
    9518           0 :        strcpy(tfieldname, dfieldlist);
    9519             :     }
    9520             :     else
    9521             :     {
    9522           0 :        slen = (int)strlen(fieldname);
    9523           0 :        tfieldname = (char *)calloc(slen + 1, sizeof(char));
    9524           0 :        strcpy(tfieldname, fieldname);
    9525             :     }
    9526             : 
    9527             :     /* Check for valid fieldname */
    9528             :     /* ------------------------- */
    9529           0 :     status = SWfieldinfo(swathID, tfieldname, &rank, dims, &nt,
    9530             :    dimlist);
    9531             : 
    9532           0 :     if (status != 0)
    9533             :     {
    9534           0 :   status = -1;
    9535           0 :   HEpush(DFE_GENAPP, "SWdefscanregion", __FILE__, __LINE__);
    9536           0 :   HEreport("Field: \"%s\" not found.\n", tfieldname);
    9537             :     }
    9538             : 
    9539             : 
    9540             :        /* Check if input range values are within range of */
    9541             :        /* data field                                      */
    9542             :        /* ----------------------------------------------- */
    9543           0 :        if(status == 0)
    9544             :        {
    9545           0 :           status = SWfieldinfo(swathID, "scan_no", &rank, dims2, &nt, dimlist);
    9546           0 :           buffer = (uint16 *)calloc(dims2[0], sizeof(uint16));
    9547           0 :           status = SWreadfield(swathID,"scan_no", NULL, NULL, NULL, buffer);
    9548           0 :           if(scan[0] > buffer[dims2[0]-1])
    9549             :           {
    9550           0 :              HEpush(DFE_GENAPP, "SWdefscanregion", __FILE__, __LINE__);
    9551           0 :              HEreport("Range values not within bounds of data field\n");
    9552           0 :              free(buffer);
    9553           0 :              buffer = (uint16 *)NULL;
    9554           0 :              if (dfieldlist != NULL)
    9555           0 :                 free(dfieldlist);
    9556           0 :              free(tfieldname);
    9557           0 :              return(-1);
    9558             :           }
    9559           0 :           if(scan[0] < buffer[0])
    9560             :           {
    9561           0 :              if(scan[1] < buffer[0])
    9562             :              {
    9563           0 :                 HEpush(DFE_GENAPP, "SWdefscanregion", __FILE__, __LINE__);
    9564           0 :                 HEreport("Range values not within bounds of data field\n");
    9565           0 :                 free(buffer);
    9566           0 :                 buffer = (uint16 *)NULL;
    9567           0 :                 if (dfieldlist != NULL)
    9568           0 :                    free(dfieldlist);
    9569           0 :                 free(tfieldname);
    9570           0 :                 return(-1);
    9571             :              }
    9572             :              else
    9573             :              {
    9574           0 :                 scan[0] = buffer[0];
    9575           0 :                 range[0] = scan[0] * detect_cnt - detect_cnt;
    9576             :              }
    9577             :           }
    9578           0 :           if(scan[1] > buffer[dims2[0] - 1])
    9579             :           {
    9580           0 :              scan[1] = buffer[dims2[0] - 1];
    9581           0 :              range[1] = scan[1] * detect_cnt - 1;
    9582             :           }
    9583             :        }
    9584             : 
    9585           0 :        if(status == 0)
    9586             :        {
    9587           0 :           dimsize = SWdiminfo(swathID, "GeoTrack");
    9588           0 :           if(dimsize > 0)
    9589             :           {
    9590           0 :              idxmap = (int32 *)calloc(dimsize, sizeof(int32));
    9591           0 :              (void) SWidxmapinfo(swathID, "GeoTrack", "ScanLineTrack", idxmap);
    9592           0 :              tmprange0 = (int32)range[0];
    9593           0 :              if(band82flag != 1 && band83flag != 1)
    9594             :              {
    9595           0 :                 if (range[1] > idxmap[scene_cnt*2 - 1])
    9596             :                 {
    9597           0 :                    range[1] = idxmap[scene_cnt*2 - 1];
    9598           0 :                    HEreport("Data length compared to geolocation length\n");
    9599             :                 }
    9600             :              }
    9601           0 :              if(band82flag == 1 || band83flag == 1)
    9602             :              {
    9603           0 :                 tmprange0 = (int32)(range[0] - (buffer[0] * detect_cnt - detect_cnt));
    9604             :              }
    9605           0 :              if(tmprange0 >= idxmap[scene_cnt * 2 - 1])
    9606             :              {
    9607           0 :                 HEpush(DFE_GENAPP, "SWdefscanregion", __FILE__, __LINE__);
    9608           0 :                 HEreport(
    9609             :             "Range values not within bounds of Latitude/Longitude field(s)\n");
    9610           0 :                 if (dfieldlist != NULL)
    9611           0 :                    free(dfieldlist);
    9612           0 :                 free(tfieldname);
    9613           0 :                 free(buffer);
    9614           0 :                 free(idxmap);
    9615           0 :                 return(-1);
    9616             :              }
    9617             :           }
    9618             :        }
    9619             : 
    9620           0 :     if (status == 0)
    9621             :     {
    9622           0 :           slen = (int)strlen(tfieldname);
    9623             : 
    9624           0 :           SETSWTHREG;
    9625             : 
    9626             :     /* Find first empty (inactive) vertical subset entry */
    9627             :     /* ------------------------------------------------- */
    9628           0 :     for (j = 0; j < 8; j++)
    9629             :     {
    9630           0 :        if (SWXRegion[regionID]->StartVertical[j] == -1)
    9631             :        {
    9632             :         /* Store start & stop of region          */
    9633             :         /* ------------------------------------- */
    9634           0 :                 SWXRegion[regionID]->StartScan[j] = (int32) original_scan[0];
    9635           0 :                 SWXRegion[regionID]->StopScan[j] = (int32) original_scan[1];
    9636           0 :         SWXRegion[regionID]->StartRegion[j] = (int32) range[0];
    9637           0 :         SWXRegion[regionID]->StopRegion[j] = (int32) range[1];
    9638           0 :                     ++SWXRegion[regionID]->nRegions;
    9639           0 :                     SWXRegion[regionID]->scanflag = 1;
    9640           0 :                     if(band81flag == 1)
    9641           0 :                        SWXRegion[regionID]->band8flag = 1;
    9642           0 :                     if(band82flag == 1)
    9643           0 :                        SWXRegion[regionID]->band8flag = 2;
    9644           0 :                     if(band83flag == 1)
    9645           0 :                        SWXRegion[regionID]->band8flag = 3;
    9646           0 :                    break;
    9647             :     }
    9648             :       }
    9649             :        }
    9650             : 
    9651             : 
    9652             :     /* Set regionID to -1 if bad return status */
    9653             :     /* --------------------------------------- */
    9654           0 :     if (status == -1)
    9655             :     {
    9656           0 :   regionID = -1;
    9657             :     }
    9658             : 
    9659           0 :     if (dfieldlist != NULL)
    9660           0 :        free(dfieldlist);
    9661           0 :     free(tfieldname);
    9662           0 :     if (buffer != NULL)
    9663           0 :        free(buffer);
    9664           0 :     if (idxmap != NULL)
    9665           0 :     free(idxmap);
    9666             : 
    9667           0 :     return (regionID);
    9668             : }
    9669             : 
    9670             : 
    9671             : /*----------------------------------------------------------------------------|
    9672             : |  BEGIN_PROLOG                                                               |
    9673             : |                                                                             |
    9674             : |  FUNCTION: SWsetfillvalue                                                   |
    9675             : |                                                                             |
    9676             : |  DESCRIPTION: Sets fill value for the specified field.                      |
    9677             : |                                                                             |
    9678             : |                                                                             |
    9679             : |  Return Value    Type     Units     Description                             |
    9680             : |  ============   ======  =========   =====================================   |
    9681             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    9682             : |                                                                             |
    9683             : |  INPUTS:                                                                    |
    9684             : |  swathID        int32               swath structure ID                      |
    9685             : |  fieldname      char                field name                              |
    9686             : |  fillval        void                fill value                              |
    9687             : |                                                                             |
    9688             : |  OUTPUTS:                                                                   |
    9689             : |             None                                                            |
    9690             : |                                                                             |
    9691             : |  NOTES:                                                                     |
    9692             : |                                                                             |
    9693             : |                                                                             |
    9694             : |   Date     Programmer   Description                                         |
    9695             : |  ======   ============  =================================================   |
    9696             : |  Jun 96   Joel Gales    Original Programmer                                 |
    9697             : |                                                                             |
    9698             : |  END_PROLOG                                                                 |
    9699             : -----------------------------------------------------------------------------*/
    9700             : intn
    9701           0 : SWsetfillvalue(int32 swathID, const char *fieldname, VOIDP fillval)
    9702             : {
    9703             :     intn            status; /* routine return status variable */
    9704             : 
    9705             :     int32           fid;  /* HDF-EOS file ID */
    9706             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    9707             :     int32           swVgrpID; /* Swath root Vgroup ID */
    9708             :     int32           sdid; /* SDS id */
    9709             :     int32           nt;   /* Number type */
    9710             :     int32           dims[8];  /* Dimensions array */
    9711             :     int32           dum;  /* Dummy variable */
    9712             :     int32           solo; /* "Solo" (non-merged) field flag */
    9713             : 
    9714             :     char            name[80]; /* Fill value "attribute" name */
    9715             : 
    9716             :     /* Check for valid swath ID and get SDS interface ID */
    9717           0 :     status = SWchkswid(swathID, "SWsetfillvalue",
    9718             :            &fid, &sdInterfaceID, &swVgrpID);
    9719             : 
    9720           0 :     if (status == 0)
    9721             :     {
    9722             :   /* Get field info */
    9723           0 :   status = SWfieldinfo(swathID, fieldname, &dum, dims, &nt, NULL);
    9724             : 
    9725           0 :   if (status == 0)
    9726             :   {
    9727             :       /* Get SDS ID and solo flag */
    9728           0 :       status = SWSDfldsrch(swathID, sdInterfaceID, fieldname,
    9729             :          &sdid, &dum, &dum, &dum,
    9730             :          dims, &solo);
    9731             : 
    9732             :       /* If unmerged field then call HDF set field routine */
    9733           0 :       if (solo == 1)
    9734             :       {
    9735           0 :                 /* status = */ SDsetfillvalue(sdid, fillval);
    9736             :       }
    9737             : 
    9738             :       /*
    9739             :        * Store fill value in attribute.  Name is given by fieldname
    9740             :        * prepended with "_FV_"
    9741             :        */
    9742           0 :       strcpy(name, "_FV_");
    9743           0 :       strcat(name, fieldname);
    9744           0 :       status = SWwriteattr(swathID, name, nt, 1, fillval);
    9745             :   }
    9746             :   else
    9747             :   {
    9748           0 :       HEpush(DFE_GENAPP, "SWsetfillvalue", __FILE__, __LINE__);
    9749           0 :       HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
    9750             :   }
    9751             :     }
    9752           0 :     return (status);
    9753             : }
    9754             : 
    9755             : 
    9756             : 
    9757             : 
    9758             : 
    9759             : /*----------------------------------------------------------------------------|
    9760             : |  BEGIN_PROLOG                                                               |
    9761             : |                                                                             |
    9762             : |  FUNCTION: SWgetfillvalue                                                   |
    9763             : |                                                                             |
    9764             : |  DESCRIPTION: Retrieves fill value for a specified field.                   |
    9765             : |                                                                             |
    9766             : |                                                                             |
    9767             : |  Return Value    Type     Units     Description                             |
    9768             : |  ============   ======  =========   =====================================   |
    9769             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    9770             : |                                                                             |
    9771             : |  INPUTS:                                                                    |
    9772             : |  swathID        int32               swath structure ID                      |
    9773             : |  fieldname      char                field name                              |
    9774             : |                                                                             |
    9775             : |  OUTPUTS:                                                                   |
    9776             : |  fillval        void                fill value                              |
    9777             : |                                                                             |
    9778             : |  NOTES:                                                                     |
    9779             : |                                                                             |
    9780             : |                                                                             |
    9781             : |   Date     Programmer   Description                                         |
    9782             : |  ======   ============  =================================================   |
    9783             : |  Jun 96   Joel Gales    Original Programmer                                 |
    9784             : |                                                                             |
    9785             : |  END_PROLOG                                                                 |
    9786             : -----------------------------------------------------------------------------*/
    9787             : intn
    9788           0 : SWgetfillvalue(int32 swathID, const char *fieldname, VOIDP fillval)
    9789             : {
    9790             :     intn            status; /* routine return status variable */
    9791             : 
    9792             :     int32           nt;   /* Number type */
    9793             :     int32           dims[8];  /* Dimensions array */
    9794             :     int32           dum;  /* Dummy variable */
    9795             : 
    9796             :     char            name[80]; /* Fill value "attribute" name */
    9797             : 
    9798             :     /* Check for valid swath ID */
    9799           0 :     status = SWchkswid(swathID, "SWgetfillvalue", &dum, &dum, &dum);
    9800             : 
    9801           0 :     if (status == 0)
    9802             :     {
    9803             :   /* Get field info */
    9804           0 :   status = SWfieldinfo(swathID, fieldname, &dum, dims, &nt, NULL);
    9805             : 
    9806           0 :   if (status == 0)
    9807             :   {
    9808             :       /* Read fill value attribute */
    9809           0 :       strcpy(name, "_FV_");
    9810           0 :       strcat(name, fieldname);
    9811           0 :       status = SWreadattr(swathID, name, fillval);
    9812             :   }
    9813             :   else
    9814             :   {
    9815           0 :       HEpush(DFE_GENAPP, "SWgetfillvalue", __FILE__, __LINE__);
    9816           0 :       HEreport("Fieldname \"%s\" does not exist.\n", fieldname);
    9817             :   }
    9818             : 
    9819             :     }
    9820           0 :     return (status);
    9821             : }
    9822             : 
    9823             : 
    9824             : /*----------------------------------------------------------------------------|
    9825             : |  BEGIN_PROLOG                                                               |
    9826             : |                                                                             |
    9827             : |  FUNCTION: SWdetach                                                         |
    9828             : |                                                                             |
    9829             : |  DESCRIPTION: Detaches swath structure and performs housekeeping            |
    9830             : |                                                                             |
    9831             : |                                                                             |
    9832             : |  Return Value    Type     Units     Description                             |
    9833             : |  ============   ======  =========   =====================================   |
    9834             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    9835             : |                                                                             |
    9836             : |  INPUTS:                                                                    |
    9837             : |  swathID        int32               swath structure ID                      |
    9838             : |                                                                             |
    9839             : |                                                                             |
    9840             : |  OUTPUTS:                                                                   |
    9841             : |             None                                                            |
    9842             : |                                                                             |
    9843             : |  NOTES:                                                                     |
    9844             : |                                                                             |
    9845             : |                                                                             |
    9846             : |   Date     Programmer   Description                                         |
    9847             : |  ======   ============  =================================================   |
    9848             : |  Jun 96   Joel Gales    Original Programmer                                 |
    9849             : |  Aug 96   Joel Gales    Cleanup Region External Structure                   |
    9850             : |  Sep 96   Joel Gales    Setup dim names for SDsetdimnane in dimbuf1 rather  |
    9851             : |                         than utlstr                                         |
    9852             : |  Nov 96   Joel Gales    Call SWchkgdid to check for proper swath ID         |
    9853             : |  Dec 96   Joel Gales    Add multiple vertical subsetting garbage collection |
    9854             : |                                                                             |
    9855             : |  END_PROLOG                                                                 |
    9856             : -----------------------------------------------------------------------------*/
    9857             : intn
    9858           0 : SWdetach(int32 swathID)
    9859             : 
    9860             : {
    9861             :     intn            i;    /* Loop index */
    9862             :     intn            j;    /* Loop index */
    9863             :     intn            k;    /* Loop index */
    9864           0 :     intn            status = 0; /* routine return status variable */
    9865           0 :     intn            statusFill = 0; /* return status from SWgetfillvalue */
    9866             : 
    9867             :     uint8          *buf;  /* Buffer for blank (initial) 1D records */
    9868             : 
    9869             :     int32           vdataID;  /* Vdata ID */
    9870             :     int32          *namelen;  /* Pointer to name string length array */
    9871             :     int32          *dimlen; /* Pointer to dim string length array */
    9872             :     int32           slen1[3]; /* String length array 1 */
    9873             :     int32           slen2[3]; /* String length array 2 */
    9874             :     int32           nflds;  /* Number of fields */
    9875             :     int32           match[5]; /* Merged field match array */
    9876             :     int32           cmbfldcnt;  /* Number of fields combined */
    9877             :     int32           sdid; /* SDS ID */
    9878             :     int32           vgid; /* Vgroup ID */
    9879             :     int32           dims[3];  /* Dimension array */
    9880             :     int32          *offset; /* Pointer to merged field offset array */
    9881             :     int32          *indvdims; /* Pointer to merged field size array */
    9882             :     int32           sdInterfaceID;  /* SDS interface ID */
    9883             :     int32           sID;  /* Swath ID - offset */
    9884             :     int32           nflds0; /* Number of fields */
    9885             :     int32          *namelen0; /* Pointer to name string length array */
    9886             :     int32           rank; /* Rank of merged field */
    9887             :     int32           truerank; /* True rank of merged field */
    9888           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
    9889             :     int32           dum;  /* Dummy variable */
    9890             : 
    9891             :     char           *nambuf; /* Pointer to name buffer */
    9892             :     char          **nameptr;  /* Pointer to name string pointer array */
    9893             :     char          **dimptr; /* Pointer to dim string pointer array */
    9894             :     char          **nameptr0; /* Pointer to name string pointer array */
    9895             :     char           *ptr1[3];  /* String pointer array */
    9896             :     char           *ptr2[3];  /* String pointer array */
    9897             :     char            dimbuf1[128]; /* Dimension buffer 1 */
    9898             :     char            dimbuf2[128]; /* Dimension buffer 2 */
    9899             :     char            swathname[VGNAMELENMAX + 1];  /* Swath name */
    9900             :     char           *utlbuf; /* Utility buffer */
    9901             :     char            fillval[32];/* Fill value buffer */
    9902             : 
    9903             :     /* Check for proper swath ID and get SD interface ID */
    9904             :     /* ------------------------------------------------- */
    9905           0 :     status = SWchkswid(swathID, "SWdetach", &dum, &sdInterfaceID, &dum);
    9906             : 
    9907           0 :     if (status == 0)
    9908             :     {
    9909             :   /* Subtract off swath ID offset and get swath name */
    9910             :   /* ----------------------------------------------- */
    9911           0 :   sID = swathID % idOffset;
    9912           0 :   Vgetname(SWXSwath[sID].IDTable, swathname);
    9913             : 
    9914             : 
    9915             :   /* Create 1D "orphaned" fields */
    9916             :   /* --------------------------- */
    9917           0 :   i = 0;
    9918             : 
    9919             :   /* Find "active" entries in 1d combination array */
    9920             :   /* --------------------------------------------- */
    9921           0 :   while (SWX1dcomb[3 * i] != 0)
    9922             :   {
    9923             :       /* For fields defined within swath... */
    9924             :       /* ---------------------------------- */
    9925           0 :       if (SWX1dcomb[3 * i + 1] == SWXSwath[sID].IDTable)
    9926             :       {
    9927             :     /* Get dimension size and vdata ID */
    9928             :     /* ------------------------------- */
    9929           0 :     dims[0] = abs(SWX1dcomb[3 * i]);
    9930           0 :     vdataID = SWX1dcomb[3 * i + 2];
    9931             : 
    9932             :     /* Get fieldname (= vdata name) */
    9933             :     /* ---------------------------- */
    9934           0 :     nambuf = (char *) calloc(VSNAMELENMAX + 1, 1);
    9935           0 :     if(nambuf == NULL)
    9936             :     { 
    9937           0 :         HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
    9938           0 :         return(-1);
    9939             :     }
    9940             : 
    9941           0 :     VSgetname(vdataID, nambuf);
    9942             : 
    9943             :     /* Set field within vdata */
    9944             :     /* ---------------------- */
    9945           0 :     VSsetfields(vdataID, nambuf);
    9946             : 
    9947             :     /* Write (blank) records */
    9948             :     /* --------------------- */
    9949           0 :     buf = (uint8 *) calloc(VSsizeof(vdataID, nambuf), dims[0]);
    9950           0 :     if(buf == NULL)
    9951             :     { 
    9952           0 :         HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
    9953           0 :         free(nambuf);
    9954           0 :         return(-1);
    9955             :     }
    9956           0 :     VSwrite(vdataID, buf, dims[0], FULL_INTERLACE);
    9957             : 
    9958           0 :     free(buf);
    9959           0 :     free(nambuf);
    9960             : 
    9961             :     /* Detach Vdata */
    9962             :     /* ------------ */
    9963           0 :     VSdetach(vdataID);
    9964             :       }
    9965           0 :       i++;
    9966             :   }
    9967             : 
    9968             : 
    9969             :   /* SDS combined fields */
    9970             :   /* ------------------- */
    9971           0 :   if (strlen(SWXSDname) == 0)
    9972             :   {
    9973           0 :       nflds = 0;
    9974             : 
    9975             :       /* Allocate "dummy" arrays so free() doesn't bomb later */
    9976             :       /* ---------------------------------------------------- */
    9977           0 :       nameptr = (char **) calloc(1, sizeof(char *));
    9978           0 :       if(nameptr == NULL)
    9979             :       { 
    9980           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
    9981           0 :     return(-1);
    9982             :       }
    9983           0 :       namelen = (int32 *) calloc(1, sizeof(int32));
    9984           0 :       if(namelen == NULL)
    9985             :       { 
    9986           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
    9987           0 :     free(nameptr);
    9988           0 :     return(-1);
    9989             :       }
    9990           0 :       nameptr0 = (char **) calloc(1, sizeof(char *));
    9991           0 :       if(nameptr0 == NULL)
    9992             :       { 
    9993           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
    9994           0 :     free(nameptr);
    9995           0 :     free(namelen);
    9996           0 :     return(-1);
    9997             :       }
    9998           0 :       namelen0 = (int32 *) calloc(1, sizeof(int32));
    9999           0 :       if(namelen0 == NULL)
   10000             :       { 
   10001           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10002           0 :     free(nameptr);
   10003           0 :     free(namelen);
   10004           0 :     free(nameptr0);
   10005           0 :     return(-1);
   10006             :       }
   10007           0 :       dimptr = (char **) calloc(1, sizeof(char *));
   10008           0 :       if(dimptr == NULL)
   10009             :       { 
   10010           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10011           0 :     free(nameptr);
   10012           0 :     free(namelen);
   10013           0 :     free(nameptr0);
   10014           0 :     free(namelen0);
   10015           0 :     return(-1);
   10016             :       }
   10017           0 :       dimlen = (int32 *) calloc(1, sizeof(int32));
   10018           0 :       if(dimlen == NULL)
   10019             :       { 
   10020           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10021           0 :     free(nameptr);
   10022           0 :     free(namelen);
   10023           0 :     free(nameptr0);
   10024           0 :     free(namelen0);
   10025           0 :     free(dimptr);
   10026           0 :     return(-1);
   10027             :       }
   10028           0 :       offset = (int32 *) calloc(1, sizeof(int32));
   10029           0 :       if(offset == NULL)
   10030             :       { 
   10031           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10032           0 :     free(nameptr);
   10033           0 :     free(namelen);
   10034           0 :     free(nameptr0);
   10035           0 :     free(namelen0);
   10036           0 :     free(dimptr);
   10037           0 :     free(dimlen);
   10038           0 :     return(-1);
   10039             :       }
   10040           0 :       indvdims = (int32 *) calloc(1, sizeof(int32));
   10041           0 :       if(indvdims == NULL)
   10042             :       { 
   10043           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10044           0 :     free(nameptr);
   10045           0 :     free(namelen);
   10046           0 :     free(nameptr0);
   10047           0 :     free(namelen0);
   10048           0 :     free(dimptr);
   10049           0 :     free(dimlen);
   10050           0 :     free(offset);
   10051           0 :     return(-1);       
   10052             :       }
   10053             :   }
   10054             :   else
   10055             :   {
   10056             :       /*
   10057             :        * "Trim Off" trailing "," and ";" in SWXSDname & SWXSDdims
   10058             :        * respectively
   10059             :        */
   10060           0 :       SWXSDname[strlen(SWXSDname) - 1] = 0;
   10061           0 :       SWXSDdims[strlen(SWXSDdims) - 1] = 0;
   10062             : 
   10063             : 
   10064             :       /* Get number of fields from SWXSDname string */
   10065             :       /* ------------------------------------------ */
   10066           0 :       nflds = EHparsestr(SWXSDname, ',', NULL, NULL);
   10067             : 
   10068             : 
   10069             :       /* Allocate space for various dynamic arrays */
   10070             :       /* ----------------------------------------- */
   10071           0 :       nameptr = (char **) calloc(nflds, sizeof(char *));
   10072           0 :       if(nameptr == NULL)
   10073             :       { 
   10074           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10075           0 :     return(-1);
   10076             :       }
   10077           0 :       namelen = (int32 *) calloc(nflds, sizeof(int32));
   10078           0 :       if(namelen == NULL)
   10079             :       { 
   10080           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10081           0 :     free(nameptr);
   10082           0 :     return(-1);
   10083             :       }
   10084           0 :       nameptr0 = (char **) calloc(nflds, sizeof(char *));
   10085           0 :       if(nameptr0 == NULL)
   10086             :       { 
   10087           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10088           0 :     free(nameptr);
   10089           0 :     free(namelen);
   10090           0 :     return(-1);
   10091             :       }
   10092           0 :       namelen0 = (int32 *) calloc(nflds, sizeof(int32));
   10093           0 :       if(namelen0 == NULL)
   10094             :       { 
   10095           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10096           0 :     free(nameptr);
   10097           0 :     free(namelen);
   10098           0 :     free(nameptr0);
   10099           0 :     return(-1);
   10100             :       }
   10101           0 :       dimptr = (char **) calloc(nflds, sizeof(char *));
   10102           0 :       if(dimptr == NULL)
   10103             :       { 
   10104           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10105           0 :     free(nameptr);
   10106           0 :     free(namelen);
   10107           0 :     free(nameptr0);
   10108           0 :     free(namelen0);
   10109           0 :     return(-1);
   10110             :       }
   10111           0 :       dimlen = (int32 *) calloc(nflds, sizeof(int32));
   10112           0 :       if(dimlen == NULL)
   10113             :       { 
   10114           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10115           0 :     free(nameptr);
   10116           0 :     free(namelen);
   10117           0 :     free(nameptr0);
   10118           0 :     free(namelen0);
   10119           0 :     free(dimptr);
   10120           0 :     return(-1);
   10121             :       }
   10122           0 :       offset = (int32 *) calloc(nflds, sizeof(int32));
   10123           0 :       if(offset == NULL)
   10124             :       { 
   10125           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10126           0 :     free(nameptr);
   10127           0 :     free(namelen);
   10128           0 :     free(nameptr0);
   10129           0 :     free(namelen0);
   10130           0 :     free(dimptr);
   10131           0 :     free(dimlen);
   10132           0 :     return(-1);
   10133             :       }
   10134           0 :       indvdims = (int32 *) calloc(nflds, sizeof(int32));
   10135           0 :       if(indvdims == NULL)
   10136             :       { 
   10137           0 :     HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10138           0 :     free(nameptr);
   10139           0 :     free(namelen);
   10140           0 :     free(nameptr0);
   10141           0 :     free(namelen0);
   10142           0 :     free(dimptr);
   10143           0 :     free(dimlen);
   10144           0 :     free(offset);
   10145           0 :     return(-1);       
   10146             :       }
   10147             : 
   10148             : 
   10149             :       /* Parse SWXSDname and SWXSDdims strings */
   10150             :       /* ------------------------------------- */
   10151           0 :       nflds = EHparsestr(SWXSDname, ',', nameptr, namelen);
   10152           0 :       nflds = EHparsestr(SWXSDdims, ';', dimptr, dimlen);
   10153             :   }
   10154             : 
   10155             : 
   10156             :   /* Loop through all the fields */
   10157             :   /* --------------------------- */
   10158           0 :   for (i = 0; i < nflds; i++)
   10159             :   {
   10160             :       /* If active entry and field is within swath to be detached ... */
   10161             :       /* ------------------------------------------------------------ */
   10162           0 :       if (SWXSDcomb[5 * i] != 0 &&
   10163           0 :     SWXSDcomb[5 * i + 3] == SWXSwath[sID].IDTable)
   10164             :       {
   10165           0 :     nambuf = (char *) calloc(strlen(SWXSDname) + 1, 1);
   10166           0 :     if(nambuf == NULL)
   10167             :     { 
   10168           0 :         HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10169           0 :         return(-1);
   10170             :     }
   10171           0 :     utlbuf = (char *) calloc(2 * strlen(SWXSDname) + 7, 1);
   10172           0 :     if(utlbuf == NULL)
   10173             :     { 
   10174           0 :         HEpush(DFE_NOSPACE,"SWdetach", __FILE__, __LINE__);
   10175           0 :         free(nambuf);
   10176           0 :         return(-1);
   10177             :     }
   10178             :     /* Zero out dimbuf1 */
   10179             :     /* ---------------- */
   10180           0 :     for (k = 0; k < (intn)sizeof(dimbuf1); k++)
   10181             :     {
   10182           0 :         dimbuf1[k] = 0;
   10183             :     }
   10184             : 
   10185             : 
   10186             :     /* Load array to match, name & parse dims */
   10187             :     /* -------------------------------------- */
   10188           0 :     memcpy(match, &SWXSDcomb[5 * i], 20);
   10189           0 :     memcpy(nambuf, nameptr[i], namelen[i]);
   10190             : 
   10191           0 :     memcpy(dimbuf1, dimptr[i], dimlen[i]);
   10192           0 :     dum = EHparsestr(dimbuf1, ',', ptr1, slen1);
   10193             : 
   10194             : 
   10195             :     /* Separate combined (first) dimension from others */
   10196             :     /* ----------------------------------------------- */
   10197           0 :     dimbuf1[slen1[0]] = 0;
   10198             : 
   10199           0 :     offset[0] = 0;
   10200           0 :     indvdims[0] = abs(match[0]);
   10201             : 
   10202             :     /*
   10203             :      * Loop through remaining fields to check for matches with
   10204             :      * current one
   10205             :      */
   10206           0 :     for (j = i + 1, cmbfldcnt = 0; j < nflds; j++)
   10207             :     {
   10208           0 :         if (SWXSDcomb[5 * j] != 0)
   10209             :         {
   10210             :       /* Zero out dimbuf2 */
   10211             :       /* ---------------- */
   10212           0 :       for (k = 0; k < (intn)sizeof(dimbuf2); k++)
   10213             :       {
   10214           0 :           dimbuf2[k] = 0;
   10215             :       }
   10216             : 
   10217             :       /*
   10218             :        * Parse the dimensions and separate first for this
   10219             :        * entry
   10220             :        */
   10221           0 :       memcpy(dimbuf2, dimptr[j], dimlen[j]);
   10222           0 :       dum = EHparsestr(dimbuf2, ',', ptr2, slen2);
   10223           0 :       dimbuf2[slen2[0]] = 0;
   10224             : 
   10225             : 
   10226             :       /*
   10227             :        * If 2nd & 3rd dimension values and names (1st and
   10228             :        * 2nd for rank=2 array), swath ID, and numbertype
   10229             :        * are equal, then these fields can be combined.
   10230             :        */
   10231           0 :       if (match[1] == SWXSDcomb[5 * j + 1] &&
   10232           0 :           match[2] == SWXSDcomb[5 * j + 2] &&
   10233           0 :           match[3] == SWXSDcomb[5 * j + 3] &&
   10234           0 :           match[4] == SWXSDcomb[5 * j + 4] &&
   10235           0 :           strcmp(dimbuf1 + slen1[0] + 1,
   10236           0 :            dimbuf2 + slen2[0] + 1) == 0)
   10237             :       {
   10238             :           /* Add to combined dimension size */
   10239             :           /* ------------------------------ */
   10240           0 :           match[0] += SWXSDcomb[5 * j];
   10241             : 
   10242             :           /* Concatenate name */
   10243             :           /* ---------------- */
   10244           0 :           strcat(nambuf, ",");
   10245           0 :           memcpy(nambuf + strlen(nambuf),
   10246           0 :            nameptr[j], namelen[j]);
   10247             : 
   10248             :           /*
   10249             :            * Increment number of merged fields, store
   10250             :            * individual dims and dim offsets
   10251             :            */
   10252           0 :           cmbfldcnt++;
   10253           0 :           indvdims[cmbfldcnt] = abs(SWXSDcomb[5 * j]);
   10254           0 :           offset[cmbfldcnt] = offset[cmbfldcnt - 1] +
   10255           0 :         indvdims[cmbfldcnt - 1];
   10256             : 
   10257             :           /* Delete this field from combination list */
   10258             :           /* --------------------------------------- */
   10259           0 :           SWXSDcomb[5 * j] = 0;
   10260             :       }
   10261             :         }
   10262             :     }
   10263             : 
   10264             : 
   10265             :     /* Create SDS */
   10266             :     /* ---------- */
   10267             : 
   10268             :     /* Parse names string */
   10269             :     /* ------------------ */
   10270           0 :     nflds0 = EHparsestr(nambuf, ',', nameptr0, namelen0);
   10271             : 
   10272           0 :     if (abs(match[0]) == 1)
   10273             :     {
   10274             :         /* Two Dimensional Array (no merging has occurred) */
   10275             :         /* ---------------------------------------------- */
   10276           0 :         dims[0] = abs(match[1]);
   10277           0 :         dims[1] = abs(match[2]);
   10278             : 
   10279             :         /* Create SDS */
   10280             :         /* ---------- */
   10281           0 :         rank = 2;
   10282           0 :         sdid = SDcreate(sdInterfaceID, nambuf,
   10283           0 :             SWXSDcomb[5 * i + 4], 2, dims);
   10284             :     }
   10285             :     else
   10286             :     {
   10287             :         /* Three Dimensional Array */
   10288             :         /* ----------------------- */
   10289           0 :         dims[0] = abs(match[0]);
   10290           0 :         dims[1] = abs(match[1]);
   10291           0 :         dims[2] = abs(match[2]);
   10292             : 
   10293           0 :         rank = 3;
   10294             : 
   10295             :         /*
   10296             :          * If merged fields then form string consisting of
   10297             :          * "MRGFLD_" + 1st field in merge + ":" + entire merged
   10298             :          * field list and store in utlbuf. Then write to
   10299             :          * MergedField metadata section
   10300             :          */
   10301           0 :         if (cmbfldcnt > 0)
   10302             :         {
   10303           0 :       strcpy(utlbuf, "MRGFLD_");
   10304           0 :       memcpy(utlbuf + 7, nameptr0[0], namelen0[0]);
   10305           0 :       utlbuf[7 + namelen0[0]] = 0;
   10306           0 :       strcat(utlbuf, ":");
   10307           0 :       strcat(utlbuf, nambuf);
   10308             : 
   10309           0 :       status = EHinsertmeta(sdInterfaceID, swathname, "s",
   10310             :                 6L, utlbuf, NULL);
   10311             :         }
   10312             :         else
   10313             :         {
   10314             :       /*
   10315             :        * If not merged field then store field name in
   10316             :        * utlbuf
   10317             :        */
   10318           0 :       strcpy(utlbuf, nambuf);
   10319             :         }
   10320             : 
   10321             :         /* Create SDS */
   10322             :         /* ---------- */
   10323           0 :         sdid = SDcreate(sdInterfaceID, utlbuf,
   10324           0 :             SWXSDcomb[5 * i + 4], 3, dims);
   10325             : 
   10326             : 
   10327             :         /*
   10328             :          * If merged field then store dimensions and offsets as
   10329             :          * SD attributes
   10330             :          */
   10331           0 :         if (cmbfldcnt > 0)
   10332             :         {
   10333           0 :       SDsetattr(sdid, "Field Dims", DFNT_INT32,
   10334             :           cmbfldcnt + 1, (VOIDP) indvdims);
   10335             : 
   10336           0 :       SDsetattr(sdid, "Field Offsets", DFNT_INT32,
   10337             :           cmbfldcnt + 1, (VOIDP) offset);
   10338             :         }
   10339             :     }
   10340             : 
   10341             : 
   10342             : 
   10343             :     /* Register Dimensions in SDS */
   10344             :     /* -------------------------- */
   10345           0 :     for (k = 0; k < rank; k++)
   10346             :     {
   10347           0 :         if (rank == 2)
   10348             :         {
   10349             :       /* Copy k+1th dimension into dimbuf2 if rank = 2 */
   10350             :       /* --------------------------------------------- */
   10351           0 :       memcpy(dimbuf2, ptr1[k + 1], slen1[k + 1]);
   10352           0 :       dimbuf2[slen1[k + 1]] = 0;
   10353             :         }
   10354             :         else
   10355             :         {
   10356             :       /* Copy kth dimension into dimbuf2 if rank > 2 */
   10357             :       /* ------------------------------------------- */
   10358           0 :       memcpy(dimbuf2, ptr1[k], slen1[k]);
   10359           0 :       dimbuf2[slen1[k]] = 0;
   10360             :         }
   10361             : 
   10362             :         /*
   10363             :          * If first dimension and merged field then generate
   10364             :          * dimension name consisting of "MRGDIM:" + swathname +
   10365             :          * dimension size
   10366             :          */
   10367           0 :         if (k == 0 && cmbfldcnt > 0)
   10368             :         {
   10369           0 :       snprintf(dimbuf2, sizeof(dimbuf2), "%s%s_%ld", "MRGDIM:",
   10370           0 :         swathname, (long)dims[0]);
   10371             :         }
   10372             :         else
   10373             :         {
   10374             :       /* Otherwise concatenate swathname to dim name */
   10375             :       /* ------------------------------------------- */
   10376           0 :       strcat(dimbuf2, ":");
   10377           0 :       strcat(dimbuf2, swathname);
   10378             :         }
   10379             : 
   10380             :         /* Register dimensions using "SDsetdimname" */
   10381             :         /* ---------------------------------------- */
   10382           0 :         SDsetdimname(SDgetdimid(sdid, k), (char *) dimbuf2);
   10383             :     }
   10384             : 
   10385             : 
   10386             : 
   10387             :     /* Write Fill Value */
   10388             :     /* ---------------- */
   10389           0 :     for (k = 0; k < nflds0; k++)
   10390             :     {
   10391             :         /* Check if fill values has been set */
   10392             :         /* --------------------------------- */
   10393           0 :         memcpy(utlbuf, nameptr0[k], namelen0[k]);
   10394           0 :         utlbuf[namelen[k]] = 0;
   10395           0 :         statusFill = SWgetfillvalue(swathID, utlbuf, fillval);
   10396             : 
   10397           0 :         if (statusFill == 0)
   10398             :         {
   10399             :       /*
   10400             :        * If merged field then fill value must be stored
   10401             :        * manually using EHfillfld
   10402             :        */
   10403           0 :       if (cmbfldcnt > 0)
   10404             :       {
   10405           0 :           dims[0] = indvdims[k];
   10406           0 :           truerank = (dims[0] == 1) ? 2 : 3;
   10407           0 :           EHfillfld(sdid, rank, truerank,
   10408           0 :               DFKNTsize(match[4]), offset[k],
   10409             :               dims, fillval);
   10410             :       }
   10411             :       /*
   10412             :        * If single field then just use the HDF set fill
   10413             :        * function
   10414             :        */
   10415             :       else
   10416             :       {
   10417           0 :           status = SDsetfillvalue(sdid, fillval);
   10418             :       }
   10419             :         }
   10420             :     }
   10421             : 
   10422             : 
   10423             :     /*
   10424             :      * Insert SDS within the appropriate Vgroup (geo or data) and
   10425             :      * "detach" newly-created SDS
   10426             :      */
   10427           0 :     vgid = (match[0] < 0)
   10428             :         ? SWXSwath[sID].VIDTable[0]
   10429           0 :         : SWXSwath[sID].VIDTable[1];
   10430             : 
   10431           0 :     Vaddtagref(vgid, DFTAG_NDG, SDidtoref(sdid));
   10432           0 :     SDendaccess(sdid);
   10433             : 
   10434           0 :     free(nambuf);
   10435           0 :     free(utlbuf);
   10436             :       }
   10437             :   }
   10438             : 
   10439             : 
   10440             : 
   10441             :   /* "Contract" 1dcomb array */
   10442             :   /* ----------------------- */
   10443           0 :   i = 0;
   10444           0 :   while (SWX1dcomb[3 * i] != 0)
   10445             :   {
   10446           0 :       if (SWX1dcomb[3 * i + 1] == SWXSwath[sID].IDTable)
   10447             :       {
   10448           0 :     memcpy(&SWX1dcomb[3 * i],
   10449           0 :            &SWX1dcomb[3 * (i + 1)],
   10450           0 :            (512 - i - 1) * 3 * 4);
   10451             :       }
   10452             :       else
   10453           0 :     i++;
   10454             :   }
   10455             : 
   10456             : 
   10457             :   /* "Contract" SDcomb array */
   10458             :   /* ----------------------- */
   10459           0 :   for (i = 0; i < nflds; i++)
   10460             :   {
   10461           0 :       if (SWXSDcomb[5 * i + 3] == SWXSwath[sID].IDTable)
   10462             :       {
   10463           0 :     if (i == (nflds - 1))
   10464             :     {
   10465           0 :         SWXSDcomb[5 * i] = 0;
   10466           0 :         *(nameptr[i] - (nflds != 1)) = 0;
   10467           0 :         *(dimptr[i] - (nflds != 1)) = 0;
   10468             :     }
   10469             :     else
   10470             :     {
   10471           0 :         memmove(&SWXSDcomb[5 * i],
   10472           0 :          &SWXSDcomb[5 * (i + 1)],
   10473           0 :          (512 - i - 1) * 5 * 4);
   10474             : 
   10475           0 :         memmove(nameptr[i],
   10476           0 :          nameptr[i + 1],
   10477           0 :          nameptr[0] + 2048 - nameptr[i + 1] - 1);
   10478             : 
   10479           0 :         memmove(dimptr[i],
   10480           0 :          dimptr[i + 1],
   10481           0 :          dimptr[0] + 2048 * 2 - dimptr[i + 1] - 1);
   10482             :     }
   10483             : 
   10484           0 :     i--;
   10485           0 :     nflds = EHparsestr(SWXSDname, ',', nameptr, namelen);
   10486           0 :     nflds = EHparsestr(SWXSDdims, ';', dimptr, dimlen);
   10487             :       }
   10488             :   }
   10489             : 
   10490             : 
   10491             :   /* Replace trailing delimiters on SWXSDname & SWXSDdims */
   10492             :   /* ---------------------------------------------------- */
   10493           0 :   if (nflds != 0)
   10494             :   {
   10495           0 :       strcat(SWXSDname, ",");
   10496           0 :       strcat(SWXSDdims, ";");
   10497             :   }
   10498             : 
   10499             : 
   10500             : 
   10501             :   /* Free up a bunch of dynamically allocated arrays */
   10502             :   /* ----------------------------------------------- */
   10503           0 :   free(nameptr);
   10504           0 :   free(namelen);
   10505           0 :   free(nameptr0);
   10506           0 :   free(namelen0);
   10507           0 :   free(dimptr);
   10508           0 :   free(dimlen);
   10509           0 :   free(offset);
   10510           0 :   free(indvdims);
   10511             : 
   10512             : 
   10513             : 
   10514             : 
   10515             :   /* "Detach" from previously attached SDSs */
   10516             :   /* -------------------------------------- */
   10517           0 :   for (k = 0; k < SWXSwath[sID].nSDS; k++)
   10518             :   {
   10519           0 :       SDendaccess(SWXSwath[sID].sdsID[k]);
   10520             :   }
   10521           0 :   free(SWXSwath[sID].sdsID);
   10522           0 :   SWXSwath[sID].sdsID = 0;
   10523           0 :   SWXSwath[sID].nSDS = 0;
   10524             : 
   10525             : 
   10526             :   /* Detach Swath Vgroups */
   10527             :   /* -------------------- */
   10528           0 :   Vdetach(SWXSwath[sID].VIDTable[0]);
   10529           0 :   Vdetach(SWXSwath[sID].VIDTable[1]);
   10530           0 :   Vdetach(SWXSwath[sID].VIDTable[2]);
   10531           0 :   Vdetach(SWXSwath[sID].IDTable);
   10532             : 
   10533             : 
   10534             :   /* Delete entries from External Arrays */
   10535             :   /* ----------------------------------- */
   10536           0 :   SWXSwath[sID].active = 0;
   10537           0 :   SWXSwath[sID].VIDTable[0] = 0;
   10538           0 :   SWXSwath[sID].VIDTable[1] = 0;
   10539           0 :   SWXSwath[sID].VIDTable[2] = 0;
   10540           0 :   SWXSwath[sID].IDTable = 0;
   10541           0 :   SWXSwath[sID].fid = 0;
   10542             : 
   10543             : 
   10544             :   /* Free Region Pointers */
   10545             :   /* -------------------- */
   10546           0 :   for (k = 0; k < NSWATHREGN; k++)
   10547             :   {
   10548           0 :       if (SWXRegion[k] != 0 &&
   10549           0 :     SWXRegion[k]->swathID == swathID)
   10550             :       {
   10551           0 :     for (i = 0; i < 8; i++)
   10552             :     {
   10553           0 :         if (SWXRegion[k]->DimNamePtr[i] != 0)
   10554             :         {
   10555           0 :       free(SWXRegion[k]->DimNamePtr[i]);
   10556             :         }
   10557             :     }
   10558             : 
   10559           0 :     free(SWXRegion[k]);
   10560           0 :     SWXRegion[k] = 0;
   10561             :       }
   10562             :   }
   10563             : 
   10564             :     }
   10565           0 :     return (status);
   10566             : }
   10567             : 
   10568             : /*----------------------------------------------------------------------------|
   10569             : |  BEGIN_PROLOG                                                               |
   10570             : |                                                                             |
   10571             : |  FUNCTION: SWclose                                                          |
   10572             : |                                                                             |
   10573             : |  DESCRIPTION: Closes HDF-EOS file                                           |
   10574             : |                                                                             |
   10575             : |                                                                             |
   10576             : |  Return Value    Type     Units     Description                             |
   10577             : |  ============   ======  =========   =====================================   |
   10578             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
   10579             : |                                                                             |
   10580             : |  INPUTS:                                                                    |
   10581             : |  fid            int32               File ID                                 |
   10582             : |                                                                             |
   10583             : |  OUTPUTS:                                                                   |
   10584             : |             None                                                            |
   10585             : |                                                                             |
   10586             : |  NOTES:                                                                     |
   10587             : |                                                                             |
   10588             : |                                                                             |
   10589             : |   Date     Programmer   Description                                         |
   10590             : |  ======   ============  =================================================   |
   10591             : |  Jun 96   Joel Gales    Original Programmer                                 |
   10592             : |                                                                             |
   10593             : |  END_PROLOG                                                                 |
   10594             : -----------------------------------------------------------------------------*/
   10595             : intn
   10596           4 : SWclose(int32 fid)
   10597             : 
   10598             : {
   10599           4 :     intn            status = 0; /* routine return status variable */
   10600             : 
   10601             :     /* Call EHclose to perform file close */
   10602             :     /* ---------------------------------- */
   10603           4 :     status = EHclose(fid);
   10604             : 
   10605           4 :     return (status);
   10606             : }
   10607             : 
   10608             : /*----------------------------------------------------------------------------|
   10609             : |  BEGIN_PROLOG                                                               |
   10610             : |                                                                             |
   10611             : |  FUNCTION: SWupdatescene                                                    |
   10612             : |                                                                             |
   10613             : |  DESCRIPTION: Updates the StartRegion and StopRegion values                 |
   10614             : |               for a specified region.                                       |
   10615             : |                                                                             |
   10616             : |                                                                             |
   10617             : |  Return Value    Type     Units     Description                             |
   10618             : |  ============   ======  =========   =====================================   |
   10619             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
   10620             : |                                                                             |
   10621             : |  INPUTS:                                                                    |
   10622             : |  swathID        int32               Swath structure ID                      |
   10623             : |  regionID       int32               Region ID                               |
   10624             : |                                                                             |
   10625             : |  NOTES:                                                                     |
   10626             : |                                                                             |
   10627             : |   Date     Programmer   Description                                         |
   10628             : |  ======   ============  =================================================   |
   10629             : |  Nov 98   Xinmin Hua    Original developing                                 |
   10630             : |  Aug 99   Abe Taaheri   Added code to exclude regions that have the same    |
   10631             : |                         start and stop.                                     |
   10632             : |                                                                             |
   10633             : |  END_PROLOG                                                                 |
   10634             : -----------------------------------------------------------------------------*/
   10635             : intn
   10636           0 : SWupdatescene(int32 swathID, int32 regionID)
   10637             : {
   10638             :     intn            k;          /* Loop index */
   10639             :     int32           status;     /* routine return status variable */
   10640             :  
   10641             :     int32           fid;        /* HDF-EOS file ID */
   10642             :     int32           sdInterfaceID;      /* HDF SDS interface ID */
   10643             :     int32           swVgrpID;   /* Swath Vgroup ID */
   10644             :  
   10645             :     int32           startReg;   /* Indexed start region */
   10646             :     int32           stopReg;    /* Indexed stop region */
   10647             :     int32           l_index[MAXNREGIONS]; /* to store indices when stop and 
   10648             :              start are different */
   10649             :              
   10650             :     int32           ind;        /* l_index */
   10651             :     int32           tempnRegions; /* temp number of regions */
   10652             : 
   10653           0 :     memset(l_index, 0, sizeof(int32) * MAXNREGIONS);
   10654             : 
   10655             :     /* Check for valid swath ID */
   10656             :     /* ------------------------ */
   10657           0 :     status = SWchkswid(swathID, "SWupdatescene", &fid, &sdInterfaceID,
   10658             :                        &swVgrpID);
   10659             :  
   10660             :  
   10661             :     /* Check for valid region ID */
   10662             :     /* ------------------------- */
   10663           0 :     if (status == 0)
   10664             :     {
   10665           0 :         if (regionID < 0 || regionID >= NSWATHREGN)
   10666             :         {
   10667           0 :             status = -1;
   10668           0 :             HEpush(DFE_RANGE, "SWupdatescene", __FILE__, __LINE__);
   10669           0 :             HEreport("Invalid Region id: %d.\n", regionID);
   10670             :         }
   10671             :     }
   10672             :  
   10673             :     /* Check for active region ID */
   10674             :     /* -------------------------- */
   10675           0 :     if (status == 0)
   10676             :     {
   10677           0 :         if (SWXRegion[regionID] == 0)
   10678             :         {
   10679           0 :             status = -1;
   10680           0 :             HEpush(DFE_GENAPP, "SWupdatescene", __FILE__, __LINE__);
   10681           0 :             HEreport("Inactive Region ID: %d.\n", regionID);
   10682             :         }
   10683             :     }
   10684             :   
   10685           0 :     if (status == 0)
   10686             :     {
   10687           0 :   tempnRegions = SWXRegion[regionID]->nRegions;
   10688           0 :   ind =0;
   10689             :   
   10690           0 :   for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
   10691             :         {
   10692           0 :            startReg = SWXRegion[regionID]->StartRegion[k];
   10693           0 :            stopReg = SWXRegion[regionID]->StopRegion[k];
   10694           0 :      if(startReg == stopReg)
   10695             :      {
   10696             :          /* reduce number of regions by 1, if tempnRegions is 0 issue
   10697             :       error and break from loop*/
   10698           0 :          tempnRegions -= 1;
   10699             :          
   10700           0 :          if(tempnRegions == 0)
   10701             :          {
   10702             :        /* first free allocated memory for SWXRegion[regionID] 
   10703             :           in the function SWdefboxregion and make regionID
   10704             :           inactive */
   10705           0 :        free(SWXRegion[regionID]);
   10706           0 :        SWXRegion[regionID] = 0;
   10707           0 :        status = -1;
   10708           0 :        HEpush(DFE_GENAPP, "SWupdatescene", __FILE__, __LINE__);
   10709           0 :        HEreport("Inactive Region ID: %d.\n", regionID);
   10710           0 :        break;
   10711             :          }
   10712             :      }
   10713             :      else
   10714             :      {
   10715             :          /* store l_index number of regions that have different start and
   10716             :       stop */
   10717           0 :          l_index[ind] = k;
   10718           0 :          ind += 1;
   10719             :      }
   10720             :   }
   10721           0 :   if (status != 0)
   10722             :   {
   10723           0 :       return (status);
   10724             :   }
   10725             :   else
   10726             :   {
   10727           0 :       SWXRegion[regionID]->nRegions = tempnRegions;
   10728             :   }
   10729             :   /* keep starts and stops that are different in the structure  */   
   10730           0 :   for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
   10731             :   {
   10732           0 :       SWXRegion[regionID]->StartRegion[k] =
   10733           0 :         SWXRegion[regionID]->StartRegion[l_index[k]];
   10734           0 :       SWXRegion[regionID]->StopRegion[k] =
   10735           0 :         SWXRegion[regionID]->StopRegion[l_index[k]];
   10736             :   }
   10737             :   
   10738             :     }
   10739             : 
   10740             :     
   10741           0 :     if (status == 0)
   10742             :     {
   10743             :  
   10744           0 :         for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
   10745             :         {
   10746             :  
   10747           0 :            startReg = SWXRegion[regionID]->StartRegion[k];
   10748           0 :            stopReg = SWXRegion[regionID]->StopRegion[k];
   10749             :  
   10750           0 :            if(startReg % 2 == 1) {
   10751             :  
   10752           0 :               SWXRegion[regionID]->StartRegion[k] = ++startReg;
   10753             :  
   10754             :            }
   10755           0 :            if(stopReg % 2 == 0) {
   10756             :  
   10757           0 :               SWXRegion[regionID]->StopRegion[k] = --stopReg;
   10758             :  
   10759             :            }
   10760             :  
   10761             :         }
   10762             :  
   10763             :     }
   10764             :     
   10765           0 :     return(status);
   10766             :  
   10767             : }
   10768             : 
   10769             : /*----------------------------------------------------------------------------|
   10770             : |  BEGIN_PROLOG                                                               |
   10771             : |                                                                             |
   10772             : |  FUNCTION: SWupdateidxmap                                                   |
   10773             : |                                                                             |
   10774             : |  DESCRIPTION: Updates the map l_index for a specified region.                 |
   10775             : |                                                                             |
   10776             : |                                                                             |
   10777             : |  Return Value    Type     Units     Description                             |
   10778             : |  ============   ======  =========   =====================================   |
   10779             : |  nout           int32               return Number of elements in output     |
   10780             : |                                     l_index array if SUCCEED, (-1) FAIL       |
   10781             : |                                                                             |
   10782             : |  INPUTS:                                                                    |
   10783             : |  swathID        int32               Swath structure ID                      |
   10784             : |  regionID       int32               Region ID                               |
   10785             : |  l_indexin        int32               array of l_index values                   |
   10786             : |                                                                             |
   10787             : |  OUTPUTS:                                                                   |
   10788             : |  l_indexout       int32               array of l_index values                   |
   10789             : |  indices    int32         array of start and stop in region       |
   10790             : |                                                                             |
   10791             : |  NOTES:                                                                     |
   10792             : |                                                                             |
   10793             : |                                                                             |
   10794             : |   Date     Programmer   Description                                         |
   10795             : |  ======   ============  =================================================   |
   10796             : |  Aug 97   Abe Taaheri   Original Programmer                                 |
   10797             : |  AUG 97   Abe Taaheri   Add support for l_index mapping                       |
   10798             : |  Sep 99   DaW     Add support for Floating Scene Subsetting Landsat 7 |
   10799             : |                                                                             |
   10800             : |  END_PROLOG                                                                 |
   10801             : -----------------------------------------------------------------------------*/
   10802             : int32
   10803           0 : SWupdateidxmap(int32 swathID, int32 regionID, int32 l_indexin[], int32 l_indexout[], int32 indicies[])
   10804             : {
   10805             :     intn            i;          /* Loop index */
   10806             :     intn            j;          /* Loop index */
   10807             :     intn            k;          /* Loop index */
   10808             :     int32           status;     /* routine return status variable */
   10809           0 :     int32           land_status = 3;     /* routine return status variable */
   10810             :  
   10811             :     int32           fid;        /* HDF-EOS file ID */
   10812             :     int32           sdInterfaceID;      /* HDF SDS interface ID */
   10813             :     int32           swVgrpID;   /* Swath Vgroup ID */
   10814             : 
   10815           0 :     int32           numtype = 0; /* Used for L7 float scene sub. */
   10816           0 :     int32           count = 0;   /* Used for L7 float scene sub. */
   10817             :  
   10818           0 :     int32           startReg = 0;   /* Indexed start region */
   10819           0 :     int32           stopReg = 0;    /* Indexed stop region */
   10820           0 :     int32           nout=-1;       /* Number of elements in output l_index array */
   10821           0 :     int32     indexoffset = 0;
   10822           0 :     uint8     scene_cnt = 0;  /* Used for L7 float scene sub.      */
   10823           0 :     uint8           detect_cnt = 0;     /* Used to convert scan to scanline  */
   10824           0 :     intn      gtflag = 0;
   10825           0 :     intn      ngtflag = 0;
   10826           0 :     int32           *buffer1 = (int32 *)NULL;
   10827           0 :     int32           *buffer2 = (int32 *)NULL;
   10828             :  
   10829             :     /* Check for valid swath ID */
   10830             :     /* ------------------------ */
   10831           0 :     status = SWchkswid(swathID, "SWupdateidxmap", &fid, &sdInterfaceID,
   10832             :                        &swVgrpID);
   10833             :  
   10834             :  
   10835             :     /* Check for valid region ID */
   10836             :     /* ------------------------- */
   10837           0 :     if (status == 0)
   10838             :     {
   10839           0 :         if (regionID < 0 || regionID >= NSWATHREGN)
   10840             :         {
   10841           0 :             status = -1;
   10842           0 :             HEpush(DFE_RANGE, "SWupdateidxmap", __FILE__, __LINE__);
   10843           0 :             HEreport("Invalid Region id: %d.\n", regionID);
   10844             :         }
   10845             :     }
   10846             :  
   10847             :     /* Check for active region ID */
   10848             :     /* -------------------------- */
   10849           0 :     if (status == 0)
   10850             :     {
   10851           0 :         if (SWXRegion[regionID] == 0)
   10852             :         {
   10853           0 :             status = -1;
   10854           0 :             HEpush(DFE_GENAPP, "SWextractregion", __FILE__, __LINE__);
   10855           0 :             HEreport("Inactive Region ID: %d.\n", regionID);
   10856             :         }
   10857             :     }
   10858             :  
   10859           0 :     if (status == 0)
   10860             :     {
   10861             :   /* Loop through all regions */
   10862             :   /* ------------------------ */
   10863           0 :   for (k = 0; k < SWXRegion[regionID]->nRegions; k++)
   10864             :   {
   10865             :       
   10866             :       /* fix overlap l_index mapping problem for Landsat 7 */
   10867             :       
   10868           0 :       startReg = SWXRegion[regionID]->StartRegion[k];
   10869           0 :       stopReg = SWXRegion[regionID]->StopRegion[k];
   10870             :       
   10871             :       
   10872           0 :             if(SWXRegion[regionID]->scanflag == 1)
   10873             :             {
   10874           0 :                indicies[0] = -1;
   10875           0 :                indicies[1] = -1;
   10876           0 :                j = 0;
   10877             :             /* This code checks for the attribute detector_count */
   10878             :             /* which is found in Landsat 7 files.  It is used    */
   10879             :             /* for some of the loops.                            */
   10880             :             /* ================================================= */
   10881           0 :                land_status = SWattrinfo(swathID, "scene_count", &numtype, &count);
   10882           0 :                if (land_status == 0)
   10883             :                {
   10884           0 :                   land_status = SWreadattr(swathID, "scene_count", &scene_cnt);
   10885           0 :                   land_status = SWreadattr(swathID, "detector_count", &detect_cnt);
   10886             :                }
   10887             : 
   10888             :         
   10889             :         /* calculate the offsets first */
   10890           0 :         buffer1 = (int32 *)calloc(74, sizeof(int32));
   10891           0 :         buffer2 = (int32 *)calloc(74, sizeof(int32));
   10892             :         
   10893           0 :         status = SWidxmapinfo(swathID,"GeoTrack",
   10894             :             "ScanLineTrack", (int32*)buffer1);
   10895           0 :         status = SWidxmapinfo(swathID,"UpperTrack",
   10896             :             "ScanLineTrack", (int32*)buffer2);
   10897             :         
   10898           0 :         indexoffset = buffer2[0] - buffer1[0];
   10899           0 :         free(buffer1);
   10900           0 :         free(buffer2);
   10901             : 
   10902           0 :                if(SWXRegion[regionID]->band8flag == -1)
   10903             :                {
   10904           0 :                   for(i=0; i<scene_cnt;i++)
   10905             :                   {
   10906           0 :                      if(l_indexin[j] <= startReg && l_indexin[j+1] >= startReg)
   10907           0 :                         if(indicies[0] == -1)
   10908           0 :                            indicies[0] = j;
   10909           0 :                      if(l_indexin[j] <= stopReg && l_indexin[j+1] >= stopReg)
   10910           0 :                         indicies[1] = j + 1;
   10911           0 :                      j = j + 2;
   10912           0 :                      if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   10913           0 :                         i = scene_cnt;
   10914             :                   }
   10915           0 :                   if(indicies[0] == -1)
   10916             :                   {
   10917           0 :                      if(startReg <= l_indexin[0])
   10918           0 :                         indicies[0] = 0;
   10919             :                   }
   10920           0 :                   if(indicies[0] == -1)
   10921             :                   {
   10922           0 :                      j = 0;
   10923           0 :                      for(i=0; i<scene_cnt; i++)
   10924             :                      {
   10925           0 :                         if(l_indexin[j] <= startReg && l_indexin[j+1] >= startReg)
   10926           0 :                            if(indicies[0] == -1)
   10927           0 :                               indicies[0] = j;
   10928           0 :                         j = j + 1;
   10929           0 :                         if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   10930           0 :                            i = scene_cnt;
   10931             :                      }
   10932             :                   }
   10933           0 :                   if(indicies[1] == -1)
   10934             :                   {
   10935           0 :                      j = 0;
   10936           0 :                      for(i=0; i<scene_cnt; i++)
   10937             :                      {
   10938           0 :                         if(l_indexin[j] <= stopReg && l_indexin[j+1] >= stopReg)
   10939           0 :                            if(indicies[1] == -1)
   10940           0 :                               indicies[1] = j + 1;
   10941           0 :                         j = j + 1;
   10942           0 :                         if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   10943           0 :                            i = scene_cnt;
   10944             :                      }
   10945             :                   }
   10946           0 :                   if(indicies[1] == -1)
   10947           0 :                      if(stopReg > l_indexin[scene_cnt - 1])
   10948           0 :                         indicies[1] = scene_cnt - 1;
   10949             :                }
   10950             : 
   10951             :          /* This section of code handles exceptions in Landsat 7  */
   10952             :          /* data.  The Band 8 data - multiple files, data gaps  */
   10953             :                /* ===================================================== */
   10954           0 :                if(SWXRegion[regionID]->band8flag == 1 ||
   10955           0 :                   SWXRegion[regionID]->band8flag == 2 ||
   10956           0 :                   SWXRegion[regionID]->band8flag == 3)
   10957             :                {
   10958           0 :                   j = 0;
   10959           0 :                   for(i=0; i<scene_cnt; i++)
   10960             :                   {
   10961           0 :                      j = j + 2;
   10962           0 :                      if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   10963             :                      {
   10964           0 :                         if(l_indexin[j] == 0)
   10965           0 :                            gtflag = 1;
   10966             :                         else
   10967           0 :                            ngtflag = 1;
   10968           0 :                         i = scene_cnt;
   10969             :                      }
   10970             :                   }
   10971           0 :                   j = 0;
   10972           0 :                   if(gtflag == 1)
   10973             :                   {
   10974           0 :                      for(i=0; i<scene_cnt; i++)
   10975             :                      {
   10976           0 :           if( startReg >= (l_indexin[j] + indexoffset - detect_cnt) && 
   10977           0 :         startReg <= (l_indexin[j+1] + indexoffset - detect_cnt) )
   10978           0 :                            if(indicies[0] == -1)
   10979           0 :                               indicies[0] = j;
   10980           0 :           if( stopReg >= (l_indexin[j] + indexoffset - detect_cnt ) && 
   10981           0 :         stopReg <= (l_indexin[j+1] + indexoffset - detect_cnt ) )
   10982           0 :                            indicies[1] = j + 1;
   10983           0 :                         j = j + 2;
   10984           0 :                         if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   10985           0 :                            i = scene_cnt;
   10986             :                      }
   10987           0 :                      if(SWXRegion[regionID]->band8flag == 1)
   10988             :                      {
   10989           0 :                         if(indicies[1] == -1)
   10990           0 :                            if(stopReg > (l_indexin[j - 1] + indexoffset - detect_cnt))
   10991           0 :                               indicies[1] = j - 1;
   10992             :                      }
   10993           0 :                      if(SWXRegion[regionID]->band8flag == 2 ||
   10994           0 :                         SWXRegion[regionID]->band8flag == 3)
   10995             :                      {
   10996             :            
   10997           0 :                         if(startReg >= (l_indexin[j - 1] + indexoffset - detect_cnt))
   10998             :                         {
   10999           0 :                            indicies[0] = -1;
   11000           0 :                            indicies[1] = -1;
   11001             :                            /* status = SWfieldinfo(swathID, "scan_no", &rank, dims2, &nt, dimlist);
   11002             :                            buffer = (uint16 *)calloc(dims2[0], sizeof(uint16));
   11003             :                            status = SWreadfield(swathID,"scan_no", NULL, NULL, NULL, buffer);
   11004             :                            indexoffset = buffer[0] * detect_cnt;
   11005             :                            free(buffer);
   11006             :                            startReg = startReg - (indexoffset - detect_cnt);
   11007             :                            stopReg = stopReg - (indexoffset - 1); */
   11008           0 :                            j = 0;
   11009           0 :                            for(i=0; i<scene_cnt; i++)
   11010             :                            {
   11011           0 :            if( startReg >= (l_indexin[j] + indexoffset - detect_cnt) && 
   11012           0 :          startReg <= (l_indexin[j+1] + indexoffset - detect_cnt) )
   11013           0 :              if(indicies[0] == -1)
   11014           0 :          indicies[0] = j;
   11015           0 :            if( stopReg >= (l_indexin[j] + indexoffset - detect_cnt ) && 
   11016           0 :          stopReg <= (l_indexin[j+1] + indexoffset - detect_cnt ) )
   11017           0 :              indicies[1] = j + 1;
   11018           0 :                               j = j + 2;
   11019           0 :                               if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11020           0 :                                  i = scene_cnt;
   11021             :                            }
   11022             :                         }
   11023             : 
   11024           0 :                         if(indicies[0] == -1)
   11025             :                         {
   11026           0 :                            j = 0;
   11027           0 :                            for(i=0; i<scene_cnt; i++)
   11028             :                            {
   11029           0 :            if( startReg >= (l_indexin[j] + indexoffset - detect_cnt) && 
   11030           0 :          startReg <= (l_indexin[j+1] + indexoffset - detect_cnt) )
   11031           0 :              if(indicies[0] == -1)
   11032           0 :          indicies[0] = j;
   11033             :           
   11034           0 :            j = j + 2;
   11035           0 :            if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11036           0 :              i = scene_cnt;
   11037             :                            }
   11038             :                         }
   11039           0 :                         if(indicies[1] == -1)
   11040           0 :                            if(stopReg > (l_indexin[j - 1] + indexoffset - detect_cnt) )
   11041           0 :                               indicies[1] = j - 1;
   11042             :                      }
   11043           0 :                      if(indicies[1] == -1)
   11044             :                      {
   11045           0 :                         j = 0;
   11046           0 :                         for(i=0; i<scene_cnt; i++)
   11047             :                         {
   11048           0 :         if( stopReg >= (l_indexin[j] + indexoffset - detect_cnt ) && 
   11049           0 :             stopReg <= (l_indexin[j+1] + indexoffset - detect_cnt ) )
   11050           0 :           indicies[1] = j;
   11051           0 :         j = j + 2;
   11052           0 :         if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11053           0 :           i = scene_cnt;
   11054             :                         }
   11055             :                      }
   11056             :                   }
   11057             : 
   11058           0 :                   if(ngtflag == 1)
   11059             :                   {
   11060           0 :                      for(i=0; i<scene_cnt; i++)
   11061             :                      {
   11062           0 :           if( startReg >= l_indexin[j] && startReg <= l_indexin[j+1])
   11063           0 :                            if(indicies[0] == -1)
   11064           0 :                               indicies[0] = j;
   11065           0 :           if( stopReg >= l_indexin[j] && stopReg <= l_indexin[j+1])
   11066           0 :                            indicies[1] = j + 1;
   11067           0 :                         j = j + 2;
   11068           0 :                         if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11069           0 :                            i = scene_cnt;
   11070             :                      }
   11071           0 :                      if(SWXRegion[regionID]->band8flag == 2)
   11072             :                      {
   11073           0 :                         if(startReg >= l_indexin[j] )
   11074             :                         {
   11075           0 :                            if(indicies[0] == -1)
   11076           0 :                               indicies[0] = j;
   11077           0 :                            if(indicies[1] == -1)
   11078           0 :                               indicies[1] = j;
   11079             :                         }
   11080           0 :                         if(indicies[0] == -1)
   11081           0 :                            if(startReg <= l_indexin[0])
   11082           0 :                               indicies[0] = 0;
   11083           0 :                         if(indicies[1] == -1)
   11084           0 :                            if(stopReg > l_indexin[j])
   11085           0 :                               indicies[1] = j;
   11086             :                      }
   11087           0 :                      if(indicies[0] == -1)
   11088             :                      {
   11089           0 :                         j = 0;
   11090           0 :                         for(i=0; i<scene_cnt; i++)
   11091             :                         {
   11092           0 :         if( startReg >= l_indexin[j] && startReg <= l_indexin[j+1])
   11093           0 :           indicies[0] = j;
   11094           0 :                            j = j + 2;
   11095           0 :                            if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11096           0 :                               i = scene_cnt;
   11097             :                         }
   11098             :                      }
   11099           0 :                      if(indicies[1] == -1)
   11100             :                      {
   11101           0 :                         j = 0;
   11102           0 :                         for(i=0; i<scene_cnt; i++)
   11103             :                         {
   11104           0 :           if( stopReg >= l_indexin[j] && stopReg <= l_indexin[j+1])
   11105           0 :                               indicies[1] = j;
   11106           0 :                            j = j + 2;
   11107           0 :                            if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11108           0 :                               i = scene_cnt;
   11109             :                         }
   11110             :                      }
   11111           0 :                      if(indicies[1] == -1)
   11112             :                      {
   11113           0 :                         if(stopReg > l_indexin[j])
   11114           0 :                            indicies[1] = j;
   11115             :                      }
   11116             :                   }
   11117           0 :                   if(indicies[0] == -1)
   11118             :                   {
   11119           0 :                      if(startReg <= (l_indexin[0]+ indexoffset - detect_cnt) )
   11120           0 :                         indicies[0] = 0;
   11121           0 :                      if(indicies[1] == -1)
   11122           0 :                         if(stopReg > (l_indexin[j] + indexoffset - detect_cnt))
   11123           0 :                            indicies[1] = j;
   11124             :                   }
   11125             :                }
   11126           0 :                if (indicies[1] == -1)
   11127             :                {
   11128           0 :                   if(SWXRegion[regionID]->band8flag == 2 ||
   11129           0 :                      SWXRegion[regionID]->band8flag == 3)
   11130             :                   {
   11131           0 :                      if(stopReg < (l_indexin[0] + indexoffset - detect_cnt))
   11132             :                      {
   11133             :            /*status = SWfieldinfo(swathID, "scan_no", &rank, dims2, &nt, dimlist);
   11134             :                         buffer = (uint16 *)calloc(dims2[0], sizeof(uint16));
   11135             :                         status = SWreadfield(swathID,"scan_no", NULL, NULL, NULL, buffer);
   11136             :                         indexoffset = buffer[0] * detect_cnt;
   11137             :                         free(buffer);
   11138             :                         startReg = startReg + (indexoffset - detect_cnt);
   11139             :                         stopReg = stopReg + (indexoffset - 1); */
   11140           0 :                         if(stopReg >= (l_indexin[scene_cnt - 1] + indexoffset - detect_cnt))
   11141             :                         {
   11142           0 :                            indicies[1] = scene_cnt - 1;
   11143             :                         }
   11144             :                         else
   11145             :                         {
   11146           0 :                            j = 0;
   11147           0 :                            for(i=0;i<scene_cnt;i++)
   11148             :                            {
   11149           0 :           if( stopReg >= (l_indexin[j] + indexoffset - detect_cnt ) && 
   11150           0 :         stopReg <= (l_indexin[j+1] + indexoffset - detect_cnt ) )
   11151           0 :                indicies[1] = j;
   11152           0 :             j = j + 2;
   11153           0 :                               if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11154           0 :                                  i = scene_cnt;
   11155             :                            }
   11156             :                         } 
   11157             :                      }
   11158             : 
   11159           0 :                      if(startReg > (l_indexin[j - 1] + indexoffset - detect_cnt ))
   11160             :                      {
   11161           0 :                         indicies[0] = -1;
   11162           0 :                         indicies[1] = -1;
   11163             :                         /*status = SWfieldinfo(swathID, "scan_no", &rank, dims2, &nt, dimlist);
   11164             :                         buffer = (uint16 *)calloc(dims2[0], sizeof(uint16));
   11165             :                         status = SWreadfield(swathID,"scan_no", NULL, NULL, NULL, buffer);
   11166             :                         indexoffset = buffer[0] * detect_cnt;
   11167             :                         free(buffer);
   11168             :                         startReg = startReg - (indexoffset - detect_cnt);
   11169             :                         stopReg = stopReg - (indexoffset - 1);*/
   11170           0 :                         j = 0;
   11171           0 :                         for(i=0; i<scene_cnt; i++)
   11172             :                         {
   11173           0 :           if( startReg >= (l_indexin[j] + indexoffset - detect_cnt) && 
   11174           0 :         startReg <= (l_indexin[j+1] + indexoffset - detect_cnt) )
   11175           0 :                               if(indicies[0] == -1)
   11176           0 :                                  indicies[0] = j;
   11177           0 :           if( stopReg >= (l_indexin[j] + indexoffset - detect_cnt ) && 
   11178           0 :         stopReg <= (l_indexin[j+1] + indexoffset - detect_cnt ) )
   11179           0 :                               indicies[1] = j + 1;
   11180           0 :                            j = j + 2;
   11181           0 :                            if(l_indexin[j] == 0 || l_indexin[j+1] == 0)
   11182           0 :                               i = scene_cnt;
   11183             :                         }
   11184           0 :                         if(indicies[0] == -1)
   11185           0 :                            if(startReg < (l_indexin[0] +  indexoffset - detect_cnt))
   11186           0 :                               indicies[0] = 0;
   11187           0 :                         if(indicies[1] == -1)
   11188           0 :                            if(stopReg > (l_indexin[j - 1] + indexoffset - detect_cnt))
   11189           0 :                               indicies[1] = j - 1;
   11190             :                      }
   11191             :                   }
   11192             :                }
   11193             :             }   /* end of if for floating scene update */
   11194             :             else
   11195             :             {
   11196             :          /* If start of region is odd then increment */
   11197             :          /* ---------------------------------------- */
   11198           0 :          if (startReg % 2 == 1)
   11199             :          {
   11200           0 :       startReg++;
   11201             :          }
   11202             :       
   11203             :          /* If end of region is even then decrement */
   11204             :          /* --------------------------------------- */
   11205           0 :          if (stopReg % 2 == 0)
   11206             :          {
   11207           0 :       stopReg--;
   11208             :          }
   11209             : 
   11210           0 :                indicies[0]=startReg;
   11211           0 :                indicies[1]=stopReg;
   11212             :      }
   11213             :         }
   11214             :   
   11215           0 :   if (l_indexout != NULL)
   11216             :   { 
   11217           0 :            if(SWXRegion[regionID]->scanflag == 1)
   11218             :            {
   11219           0 :               nout = (indicies[1] - indicies[0] + 1);
   11220           0 :               j = 0;
   11221           0 :               if (nout == 1)
   11222           0 :                  l_indexout[0] = l_indexin[indicies[0]];
   11223           0 :               for(i=0; i<nout;i++)
   11224             :               {
   11225           0 :                  l_indexout[i] = l_indexin[indicies[0] + i];
   11226             :               }
   11227             :            }
   11228             :            else
   11229             :            {
   11230             :         /* get new l_index values */
   11231             :               /* ==================== */
   11232           0 :         for(i = startReg; i <= stopReg  ; i++)
   11233             :         {
   11234           0 :            l_indexout[i-startReg] = l_indexin[i];
   11235             :         }
   11236           0 :         nout = (stopReg - startReg) + 1;
   11237             :            }
   11238             :         }
   11239             :         else
   11240             :         {
   11241           0 :            nout = indicies[1] - indicies[0] + 1;
   11242             :   }
   11243             :      }
   11244             :    
   11245             :     
   11246           0 :     if(status == -1)
   11247             :     {  
   11248           0 :   return(status);
   11249             :     }
   11250             :     else
   11251             :     {
   11252           0 :         return(nout);
   11253             :     }
   11254             :     
   11255             : }
   11256             : 
   11257             : 
   11258             : 
   11259             : /*----------------------------------------------------------------------------|
   11260             : |  BEGIN_PROLOG                                                               |
   11261             : |                                                                             |
   11262             : |  FUNCTION: SWgeomapinfo                                                     |
   11263             : |                                                                             |
   11264             : |  DESCRIPTION: Returns mapping information for dimension                     |
   11265             : |                                                                             |
   11266             : |                                                                             |
   11267             : |  Return Value    Type     Units     Description                             |
   11268             : |  ============   ======  =========   =====================================   |
   11269             : |  status         intn                2 for l_indexed mapping, 1 for regular    |
   11270             : |                                     mapping, 0 if the dimension is not      |
   11271             : |                                     and (-1) FAIL                           |
   11272             : |                                                                             |
   11273             : |  INPUTS:                                                                    |
   11274             : |  swathID        int32               swath structure id                      |
   11275             : |  geodim         char                geolocation dimension name              |
   11276             : |                                                                             |
   11277             : |  OUTPUTS:                                                                   |
   11278             : |                                                                             |
   11279             : |  NONE                                                                       |
   11280             : |                                                                             |
   11281             : |  NOTES:                                                                     |
   11282             : |                                                                             |
   11283             : |                                                                             |
   11284             : |   Date     Programmer   Description                                         |
   11285             : |  ======   ============  =================================================   |
   11286             : |  Aug 97   Abe Taaheri   Original Programmer                                 |
   11287             : |  Sept 97  DaW           Modified return value so errors can be trapped      |
   11288             : |                                                                             |
   11289             : |  END_PROLOG                                                                 |
   11290             : -----------------------------------------------------------------------------*/
   11291             : intn
   11292           0 : SWgeomapinfo(int32 swathID, const char *geodim)
   11293             : 
   11294             : {
   11295             :     intn            status; /* routine return status variable */
   11296             :     
   11297             :     int32           fid;  /* HDF-EOS file ID */
   11298             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
   11299             :     int32           swVgrpID; /* Swath root Vgroup ID */
   11300           0 :     int32           idOffset = SWIDOFFSET;  /* Swath ID offset */
   11301             : 
   11302             :     char           *metabufr; /* Pointer to structural metadata (SM) */
   11303             :     char           *metabufi; /* Pointer to structural metadata (SM) */
   11304             :     char           *metaptrsr[2];/* Pointers to begin and end of SM section */
   11305             :     char           *metaptrsi[2];/* Pointers to begin and end of SM section */
   11306             :     char            swathname[80];  /* Swath Name */
   11307             :     char           *utlstrr;   /* Utility string */
   11308             :     char           *utlstri;   /* Utility string */
   11309             :    
   11310             :     
   11311             :     /* Allocate space for utility string */
   11312             :     /* --------------------------------- */
   11313           0 :     utlstrr = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
   11314           0 :     if(utlstrr == NULL)
   11315             :     { 
   11316           0 :   HEpush(DFE_NOSPACE,"SWgeomapinfo", __FILE__, __LINE__);
   11317           0 :   return(-1);
   11318             :     }
   11319           0 :     utlstri = (char *) calloc(UTLSTR_MAX_SIZE, sizeof(char));
   11320           0 :     if(utlstri == NULL)
   11321             :     { 
   11322           0 :   HEpush(DFE_NOSPACE,"SWgeomapinfo", __FILE__, __LINE__);
   11323           0 :   free(utlstrr);
   11324           0 :   return(-1);
   11325             :     }
   11326           0 :     status = -1;
   11327             : 
   11328             :     /* Check for valid swath id */
   11329           0 :     status = SWchkswid(swathID, "SWgeomapinfo", &fid, &sdInterfaceID, &swVgrpID);
   11330           0 :     if (status == 0)
   11331             :     {
   11332             :   /* Get swath name */
   11333           0 :   Vgetname(SWXSwath[swathID % idOffset].IDTable, swathname);
   11334             : 
   11335             :   /* Get pointers to "DimensionMap" section within SM */
   11336           0 :   metabufr = EHmetagroup(sdInterfaceID, swathname, "s",
   11337             :                "DimensionMap", metaptrsr);
   11338             : 
   11339           0 :   if(metabufr == NULL)
   11340             :   {
   11341           0 :       free(utlstrr);
   11342           0 :       free(utlstri);
   11343           0 :       return(-1);
   11344             :   }
   11345             :   /* Search for mapping - GeoDim/DataDim (surrounded by quotes) */
   11346           0 :   snprintf(utlstrr, UTLSTR_MAX_SIZE, "%s%s%s", "\t\t\t\tGeoDimension=\"", geodim,
   11347             :     "\"\n\t\t\t\tDataDimension=");
   11348           0 :   metaptrsr[0] = strstr(metaptrsr[0], utlstrr);
   11349             :   
   11350             :   /* Get pointers to "IndexDimensionMap" section within SM */
   11351           0 :   metabufi = EHmetagroup(sdInterfaceID, swathname, "s",
   11352             :                "IndexDimensionMap", metaptrsi);
   11353           0 :   if(metabufi == NULL)
   11354             :   {
   11355           0 :       free(utlstrr);
   11356           0 :       free(utlstri);
   11357           0 :       return(-1);
   11358             :   }
   11359             :   /* Search for mapping - GeoDim/DataDim (surrounded by quotes) */
   11360           0 :   snprintf(utlstri, UTLSTR_MAX_SIZE, "%s%s%s", "\t\t\t\tGeoDimension=\"", geodim,
   11361             :     "\"\n\t\t\t\tDataDimension=");
   11362           0 :   metaptrsi[0] = strstr(metaptrsi[0], utlstri);
   11363             : 
   11364             :   /*
   11365             :   ** If regular mapping found add 1 to status
   11366             :         ** If l_indexed mapping found add 2
   11367             :         */
   11368           0 :   if (metaptrsr[0] < metaptrsr[1] && metaptrsr[0] != NULL)
   11369             :   {
   11370           0 :       status = status + 1;      
   11371             :         }
   11372             : 
   11373           0 :         if (metaptrsi[0] < metaptrsi[1] && metaptrsi[0] != NULL)
   11374             :         {
   11375           0 :            status = status + 2;     
   11376             :         }
   11377             : 
   11378           0 :   free(metabufr);
   11379           0 :   free(metabufi);
   11380             :     }
   11381             : 
   11382           0 :     free(utlstrr);
   11383           0 :     free(utlstri);
   11384             : 
   11385           0 :     return (status);
   11386             : }
   11387             : 
   11388             : /*----------------------------------------------------------------------------|
   11389             : |  BEGIN_PROLOG                                                               |
   11390             : |                                                                             |
   11391             : |  FUNCTION: SWsdid                                                           |
   11392             : |                                                                             |
   11393             : |  DESCRIPTION: Returns SD element ID for swath field                         |
   11394             : |                                                                             |
   11395             : |                                                                             |
   11396             : |  Return Value    Type     Units     Description                             |
   11397             : |  ============   ======  =========   =====================================   |
   11398             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
   11399             : |                                                                             |
   11400             : |  INPUTS:                                                                    |
   11401             : |  swathID        int32               swath structure ID                      |
   11402             : |  fieldname      const char          field name                              |
   11403             : |                                                                             |
   11404             : |                                                                             |
   11405             : |  OUTPUTS:                                                                   |
   11406             : |  sdid           int32               SD element ID                           |
   11407             : |                                                                             |
   11408             : |  NOTES:                                                                     |
   11409             : |                                                                             |
   11410             : |                                                                             |
   11411             : |   Date     Programmer   Description                                         |
   11412             : |  ======   ============  =================================================   |
   11413             : |  Oct 07   Andrey Kiselev  Original Programmer                               |
   11414             : |                                                                             |
   11415             : |  END_PROLOG                                                                 |
   11416             : -----------------------------------------------------------------------------*/
   11417             : intn
   11418           0 : SWsdid(int32 swathID, const char *fieldname, int32 *sdid)
   11419             : {
   11420             :     intn            status;         /* routine return status variable */
   11421             :     int32           fid;          /* HDF-EOS file ID */
   11422             :     int32           sdInterfaceID;      /* HDF SDS interface ID */
   11423             :     int32           dum;          /* Dummy variable */
   11424             :     int32           dims[H4_MAX_VAR_DIMS]; /* Field/SDS dimensions */
   11425             : 
   11426           0 :     status = SWchkswid(swathID, "SWsdid", &fid, &sdInterfaceID, &dum);
   11427           0 :     if (status != -1)
   11428             :     {
   11429           0 :         status = SWSDfldsrch(swathID, sdInterfaceID, fieldname,
   11430             :                              sdid, &dum, &dum, &dum, dims, &dum);
   11431             :     }
   11432             : 
   11433           0 :     return (status);
   11434             : }

Generated by: LCOV version 1.14