LCOV - code coverage report
Current view: top level - frmts/hdf4/hdf-eos - EHapi.c (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 109 596 18.3 %
Date: 2025-01-18 12:42:00 Functions: 6 21 28.6 %

          Line data    Source code
       1             : /*****************************************************************************
       2             :  *
       3             :  * This module has a number of additions and improvements over the original
       4             :  * implementation to be suitable for usage in GDAL HDF driver.
       5             :  *
       6             :  * Andrey Kiselev <dron@ak4719.spb.edu> is responsible for all the changes.
       7             :  ****************************************************************************/
       8             : 
       9             : /*
      10             : Copyright (C) 1996 Hughes and Applied Research Corporation
      11             : 
      12             : Permission to use, modify, and distribute this software and its documentation
      13             : for any purpose without fee is hereby granted, provided that the above
      14             : copyright notice appear in all copies and that both that copyright notice and
      15             : this permission notice appear in supporting documentation.
      16             : */
      17             : 
      18             : #include "cpl_port.h"
      19             : #include <errno.h>
      20             : #include "mfhdf.h"
      21             : #include "HdfEosDef.h"
      22             : 
      23             : /* Set maximum number of HDF-EOS files to HDF limit (MAX_FILE) */
      24             : #define NEOSHDF MAX_FILE
      25             : static intn  EHXmaxfilecount = 0;
      26             : static uint8 *EHXtypeTable = NULL;
      27             : static uint8 *EHXacsTable = NULL;
      28             : static int32 *EHXfidTable = NULL;
      29             : static int32 *EHXsdTable = NULL;
      30             : 
      31             : /* define a macro for the string size of the utility strings and some dimension
      32             :    list strings. The value in previous versions of this code may not be
      33             :    enough in some cases. The length now is 512 which seems to be more than
      34             :    enough to hold larger strings. */
      35             : 
      36             : #define UTLSTR_MAX_SIZE 512
      37             : #define UTLSTRSIZE  32000
      38             : 
      39             : #define EHIDOFFSET 524288
      40             : 
      41             : #define HDFEOSVERSION 2.12
      42             : #define HDFEOSVERSION1 "2.12"
      43             : #include "HDFEOSVersion.h"
      44             : 
      45             : #define MAX_RETRIES 10
      46             : 
      47             : /* Function Prototypes */
      48             : static intn EHreset_maxopenfiles(intn);
      49             : static intn EHget_maxopenfiles(intn *, intn *);
      50             : static intn EHget_numfiles(void);
      51             : 
      52             : /*----------------------------------------------------------------------------|
      53             : |  BEGIN_PROLOG                                                               |
      54             : |                                                                             |
      55             : |  FUNCTION: EHopen                                                           |
      56             : |                                                                             |
      57             : |  DESCRIPTION: Opens HDF-EOS file and returns file handle                    |
      58             : |                                                                             |
      59             : |                                                                             |
      60             : |  Return Value    Type     Units     Description                             |
      61             : |  ============   ======  =========   =====================================   |
      62             : |  fid            int32               HDF-EOS file ID                         |
      63             : |                                                                             |
      64             : |  INPUTS:                                                                    |
      65             : |  filename       char                Filename                                |
      66             : |  access         intn                HDF access code                         |
      67             : |                                                                             |
      68             : |  OUTPUTS:                                                                   |
      69             : |             None                                                            |
      70             : |                                                                             |
      71             : |  NOTES:                                                                     |
      72             : |                                                                             |
      73             : |                                                                             |
      74             : |   Date     Programmer   Description                                         |
      75             : |  ======   ============  =================================================   |
      76             : |  Jun 96   Joel Gales    Original Programmer                                 |
      77             : |  Jul 96   Joel Gales    Add file id offset EHIDOFFSET                       |
      78             : |  Aug 96   Joel Gales    Add "END" statement to structural metadata          |
      79             : |  Sep 96   Joel Gales    Reverse order of Hopen ane SDstart statements       |
      80             : |                         for RDWR and READ access                            |
      81             : |  Oct 96   Joel Gales    Trap CREATE & RDWR (no write permission)            |
      82             : |                         access errors                                       |
      83             : |  Apr 97   Joel Gales    Fix problem with RDWR open when file previously     |
      84             : |                         open for READONLY access                            |
      85             : |                                                                             |
      86             : |  END_PROLOG                                                                 |
      87             : -----------------------------------------------------------------------------*/
      88             : int32
      89           8 : EHopen(const char *filename, intn access)
      90             : 
      91             : {
      92             :     intn            i;    /* Loop index */
      93           8 :     intn            status = 0; /* routine return status variable */
      94             :     intn            dum;  /* Dummy variable */
      95           8 :     intn            curr_max = 0; /* maximum # of HDF files to open */
      96           8 :     intn            sys_limit = 0;  /* OS limit for maximum # of opened files */
      97             : 
      98           8 :     int32           HDFfid = 0; /* HDF file ID */
      99           8 :     int32           fid = -1; /* HDF-EOS file ID */
     100           8 :     int32           sdInterfaceID = 0;  /* HDF SDS interface ID */
     101             :     int32           attrIndex;  /* Structural Metadata attribute index */
     102             : 
     103           8 :     uint8           acs = 0;  /* Read (0) / Write (1) access code */
     104             : 
     105             :     char           *testname; /* Test filename */
     106             :     char            errbuf[256];/* Error report buffer */
     107             :     char           *metabuf;  /* Pointer to structural metadata buffer */
     108             :     char            hdfeosVersion[32];  /* HDFEOS version string */
     109             : 
     110             :     intn            retryCount;
     111             : 
     112             :     /* Request the system allowed number of opened files */
     113             :     /* and increase HDFEOS file tables to the same size  */
     114             :     /* ------------------------------------------------- */
     115           8 :     if (EHget_maxopenfiles(&curr_max, &sys_limit) >= 0
     116           8 :         && curr_max < sys_limit)
     117             :     {
     118           8 :         if (EHreset_maxopenfiles(sys_limit) < 0)
     119             :         {
     120           0 :       HEpush(DFE_ALROPEN, "EHopen", __FILE__, __LINE__);
     121           0 :       HEreport("Can't set maximum opened files number to \"%d\".\n", curr_max);
     122           0 :       return -1;
     123             :         }
     124             :     }
     125             : 
     126             :     /* Setup file interface */
     127             :     /* -------------------- */
     128           8 :     if (EHget_numfiles() < EHXmaxfilecount)
     129             :     {
     130             : 
     131             :   /*
     132             :    * Check that file has not been previously opened for write access if
     133             :    * current open request is not READONLY
     134             :    */
     135           8 :   if (access != DFACC_READ)
     136             :   {
     137             :       /* Loop through all files */
     138             :       /* ---------------------- */
     139           0 :       for (i = 0; i < EHXmaxfilecount; i++)
     140             :       {
     141             :     /* if entry is active file opened for write access ... */
     142             :     /* --------------------------------------------------- */
     143           0 :     if (EHXtypeTable[i] != 0 && EHXacsTable[i] == 1)
     144             :     {
     145             :         /* Get filename (testname) */
     146             :         /* ----------------------- */
     147           0 :         Hfidinquire(EHXfidTable[i], &testname, &dum, &dum);
     148             : 
     149             : 
     150             :         /* if same as filename then report error */
     151             :         /* ------------------------------------- */
     152           0 :         if (strcmp(testname, filename) == 0)
     153             :         {
     154           0 :       status = -1;
     155           0 :       fid = -1;
     156           0 :       HEpush(DFE_ALROPEN, "EHopen", __FILE__, __LINE__);
     157           0 :       HEreport("\"%s\" already open.\n", filename);
     158           0 :       break;
     159             :         }
     160             :     }
     161             :       }
     162             :   }
     163           8 :   if (status == 0)
     164             :   {
     165             :       /* Create HDF-EOS file */
     166             :       /* ------------------- */
     167           8 :       switch (access)
     168             :       {
     169           0 :       case DFACC_CREATE:
     170             : 
     171             :     /* Get SDS interface ID */
     172             :     /* -------------------- */
     173           0 :     sdInterfaceID = SDstart(filename, DFACC_CREATE);
     174             : 
     175             :     /* If SDstart successful ... */
     176             :     /* ------------------------- */
     177           0 :     if (sdInterfaceID != -1)
     178             :     {
     179             :         /* Set HDFEOS version number in file */
     180             :         /* --------------------------------- */
     181           0 :         snprintf(hdfeosVersion, sizeof(hdfeosVersion), "%s%s", "HDFEOS_V",
     182             :           HDFEOSVERSION1);
     183           0 :         SDsetattr(sdInterfaceID, "HDFEOSVersion", DFNT_CHAR8,
     184           0 :             (int)strlen(hdfeosVersion), hdfeosVersion);
     185             : 
     186             : 
     187             :         /* Get HDF file ID */
     188             :         /* --------------- */
     189           0 :         HDFfid = Hopen(filename, DFACC_RDWR, 0);
     190             : 
     191             :         /* Set open access to write */
     192             :         /* ------------------------ */
     193           0 :         acs = 1;
     194             : 
     195             :         /* Setup structural metadata */
     196             :         /* ------------------------- */
     197           0 :         metabuf = (char *) calloc(32000, 1);
     198           0 :         if(metabuf == NULL)
     199             :         {
     200           0 :       HEpush(DFE_NOSPACE,"EHopen", __FILE__, __LINE__);
     201           0 :       return(-1);
     202             :         }
     203             : 
     204           0 :         strcpy(metabuf, "GROUP=SwathStructure\n");
     205           0 :         strcat(metabuf, "END_GROUP=SwathStructure\n");
     206           0 :         strcat(metabuf, "GROUP=GridStructure\n");
     207           0 :         strcat(metabuf, "END_GROUP=GridStructure\n");
     208           0 :         strcat(metabuf, "GROUP=PointStructure\n");
     209           0 :         strcat(metabuf, "END_GROUP=PointStructure\n");
     210           0 :         strcat(metabuf, "END\n");
     211             : 
     212             :         /* Write Structural metadata */
     213             :         /* ------------------------- */
     214           0 :         SDsetattr(sdInterfaceID, "StructMetadata.0",
     215             :             DFNT_CHAR8, 32000, metabuf);
     216           0 :         free(metabuf);
     217             :     } else
     218             :     {
     219             :         /* If error in SDstart then report */
     220             :         /* ------------------------------- */
     221           0 :         fid = -1;
     222           0 :         status = -1;
     223           0 :         HEpush(DFE_FNF, "EHopen", __FILE__, __LINE__);
     224           0 :         snprintf(errbuf, sizeof(errbuf), "%s%s%s", "\"", filename,
     225             :           "\" cannot be created.");
     226           0 :         HEreport("%s\n", errbuf);
     227             :     }
     228             : 
     229           0 :     break;
     230             : 
     231             :     /* Open existing HDF-EOS file for read/write access */
     232             :     /* ------------------------------------------------ */
     233           0 :       case DFACC_RDWR:
     234             : 
     235             :     /* Get HDF file ID */
     236             :     /* --------------- */
     237             : #ifndef _PGS_OLDNFS
     238             : /* The following loop around the function Hopen is intended to deal with the NFS cache
     239             :    problem when opening file fails with errno = 150 or 151. When NFS cache is updated,
     240             :    this part of change is no longer necessary.              10/18/1999   */
     241           0 :                 retryCount = 0;
     242           0 :                 HDFfid = -1;
     243           0 :                 while ((HDFfid == -1) && (retryCount < MAX_RETRIES))
     244             :                 {
     245           0 :                 HDFfid = Hopen(filename, DFACC_RDWR, 0);
     246           0 :                 if((HDFfid == -1) && (errno == 150 || errno == 151))
     247             :                     {
     248           0 :                     HEpush(DFE_FNF, "EHopen", __FILE__, __LINE__);
     249           0 :                     snprintf(errbuf, sizeof(errbuf), "\"%s\" cannot be opened for READ/WRITE access, will retry %d times.", filename,  (MAX_RETRIES - retryCount - 1));
     250           0 :                     HEreport("%s\n", errbuf);
     251             :                     }
     252           0 :                 retryCount++;
     253             :                 }
     254             : #else
     255             :                 HDFfid = Hopen(filename, DFACC_RDWR, 0);
     256             : #endif
     257             : 
     258             :     /* If Hopen successful ... */
     259             :     /* ----------------------- */
     260           0 :     if (HDFfid != -1)
     261             :     {
     262             :         /* Get SDS interface ID */
     263             :         /* -------------------- */
     264           0 :         sdInterfaceID = SDstart(filename, DFACC_RDWR);
     265             : 
     266             :                     /* If SDstart successful ... */
     267             :                     /* ------------------------- */
     268           0 :                     if (sdInterfaceID != -1)
     269             :                     {
     270             :                        /* Set HDFEOS version number in file */
     271             :                        /* --------------------------------- */
     272             : 
     273           0 :           attrIndex = SDfindattr(sdInterfaceID, "HDFEOSVersion");
     274           0 :           if (attrIndex == -1)
     275             :       {
     276           0 :         snprintf(hdfeosVersion, sizeof(hdfeosVersion), "%s%s", "HDFEOS_V",
     277             :           HDFEOSVERSION1);
     278           0 :         SDsetattr(sdInterfaceID, "HDFEOSVersion", DFNT_CHAR8,
     279           0 :             (int)strlen(hdfeosVersion), hdfeosVersion);
     280             :       }
     281             :            /* Set open access to write */
     282             :            /* ------------------------ */
     283           0 :            acs = 1;
     284             : 
     285             :            /* Get structural metadata attribute ID */
     286             :            /* ------------------------------------ */
     287           0 :            attrIndex = SDfindattr(sdInterfaceID, "StructMetadata.0");
     288             : 
     289             :            /* Write structural metadata if it doesn't exist */
     290             :            /* --------------------------------------------- */
     291           0 :            if (attrIndex == -1)
     292             :            {
     293           0 :         metabuf = (char *) calloc(32000, 1);
     294           0 :         if(metabuf == NULL)
     295             :         {
     296           0 :             HEpush(DFE_NOSPACE,"EHopen", __FILE__, __LINE__);
     297           0 :             return(-1);
     298             :         }
     299             : 
     300           0 :         strcpy(metabuf, "GROUP=SwathStructure\n");
     301           0 :         strcat(metabuf, "END_GROUP=SwathStructure\n");
     302           0 :         strcat(metabuf, "GROUP=GridStructure\n");
     303           0 :         strcat(metabuf, "END_GROUP=GridStructure\n");
     304           0 :         strcat(metabuf, "GROUP=PointStructure\n");
     305           0 :         strcat(metabuf, "END_GROUP=PointStructure\n");
     306           0 :         strcat(metabuf, "END\n");
     307             : 
     308           0 :         SDsetattr(sdInterfaceID, "StructMetadata.0",
     309             :           DFNT_CHAR8, 32000, metabuf);
     310           0 :         free(metabuf);
     311             :            }
     312             :                     } else
     313             :                     {
     314             :                         /* If error in SDstart then report */
     315             :                         /* ------------------------------- */
     316           0 :                         fid = -1;
     317           0 :                         status = -1;
     318           0 :                         HEpush(DFE_FNF, "EHopen", __FILE__, __LINE__);
     319           0 :                         snprintf(errbuf, sizeof(errbuf), "%s%s%s", "\"", filename,
     320             :                             "\" cannot be opened for read/write access.");
     321           0 :                         HEreport("%s\n", errbuf);
     322             :                     }
     323             :     } else
     324             :     {
     325             :         /* If error in Hopen then report */
     326             :         /* ----------------------------- */
     327           0 :         fid = -1;
     328           0 :         status = -1;
     329           0 :         HEpush(DFE_FNF, "EHopen", __FILE__, __LINE__);
     330           0 :         snprintf(errbuf, sizeof(errbuf), "%s%s%s", "\"", filename,
     331             :           "\" cannot be opened for RDWR access.");
     332           0 :         HEreport("%s\n", errbuf);
     333             :     }
     334             : 
     335           0 :     break;
     336             : 
     337             : 
     338             :     /* Open existing HDF-EOS file for read-only access */
     339             :     /* ----------------------------------------------- */
     340           8 :       case DFACC_READ:
     341             : 
     342             :     /* Get HDF file ID */
     343             :     /* --------------- */
     344             : #ifndef _PGS_OLDNFS
     345             : /* The following loop around the function Hopen is intended to deal with the NFS cache
     346             :    problem when opening file fails with errno = 150 or 151. When NFS cache is updated,
     347             :    this part of change is no longer necessary.              10/18/1999   */
     348           8 :                 retryCount = 0;
     349           8 :                 HDFfid = -1;
     350          16 :                 while ((HDFfid == -1) && (retryCount < MAX_RETRIES))
     351             :                 {
     352           8 :                 HDFfid = Hopen(filename, DFACC_READ, 0);
     353           8 :                 if((HDFfid == -1) && (errno == 150 || errno == 151))
     354             :                     {
     355           0 :                     HEpush(DFE_FNF, "EHopen", __FILE__, __LINE__);
     356           0 :                     snprintf(errbuf, sizeof(errbuf), "\"%s\" cannot be opened for READONLY access, will retry %d times.", filename,  (MAX_RETRIES - retryCount - 1));
     357           0 :                     HEreport("%s\n", errbuf);
     358             :                     }
     359           8 :                 retryCount++;
     360             :                 }
     361             : #else
     362             :                 HDFfid = Hopen(filename, DFACC_READ, 0);
     363             : #endif
     364             : 
     365             :     /* If file does not exist report error */
     366             :     /* ----------------------------------- */
     367           8 :     if (HDFfid == -1)
     368             :     {
     369           0 :         fid = -1;
     370           0 :         status = -1;
     371           0 :         HEpush(DFE_FNF, "EHopen", __FILE__, __LINE__);
     372           0 :             snprintf(errbuf, sizeof(errbuf), "\"%s\" (opened for READONLY access) does not exist.", filename);
     373           0 :         HEreport("%s\n", errbuf);
     374             :     } else
     375             :     {
     376             :         /* If file exists then get SD interface ID */
     377             :         /* --------------------------------------- */
     378           8 :         sdInterfaceID = SDstart(filename, DFACC_RDONLY);
     379             : 
     380             :                         /* If SDstart successful ... */
     381             :                         /* ------------------------- */
     382           8 :                         if (sdInterfaceID != -1)
     383             :                         {
     384             : 
     385             :                /* Set open access to read-only */
     386             :                /* ---------------------------- */
     387           8 :                acs = 0;
     388             :              } else
     389             :                         {
     390             :                             /* If error in SDstart then report */
     391             :                             /* ------------------------------- */
     392           0 :                             fid = -1;
     393           0 :                             status = -1;
     394           0 :                             HEpush(DFE_FNF, "EHopen", __FILE__, __LINE__);
     395           0 :                             snprintf(errbuf, sizeof(errbuf), "%s%s%s", "\"", filename,
     396             :                             "\" cannot be opened for read access.");
     397           0 :                             HEreport("%s\n", errbuf);
     398             :                         }
     399             :     }
     400             : 
     401           8 :     break;
     402             : 
     403           0 :       default:
     404             :     /* Invalid Access Code */
     405             :     /* ------------------- */
     406           0 :     fid = -1;
     407           0 :     status = -1;
     408           0 :     HEpush(DFE_BADACC, "EHopen", __FILE__, __LINE__);
     409           0 :     HEreport("Access Code: %d (%s).\n", access, filename);
     410             :       }
     411             : 
     412           0 :   }
     413             :     } else
     414             :     {
     415             :   /* Too many files opened */
     416             :   /* --------------------- */
     417           0 :   status = -1;
     418           0 :   fid = -1;
     419           0 :   HEpush(DFE_TOOMANY, "EHopen", __FILE__, __LINE__);
     420           0 :   HEreport("No more than %d files may be open simultaneously (%s).\n",
     421             :      EHXmaxfilecount, filename);
     422             :     }
     423             : 
     424             : 
     425             : 
     426             : 
     427           8 :     if (status == 0)
     428             :     {
     429             :   /* Initialize Vgroup Access */
     430             :   /* ------------------------ */
     431           8 :   Vstart(HDFfid);
     432             : 
     433             : 
     434             :   /* Assign HDFEOS fid # & Load HDF fid and sdInterfaceID tables */
     435             :   /* ----------------------------------------------------------- */
     436           8 :   for (i = 0; i < EHXmaxfilecount; i++)
     437             :   {
     438           8 :       if (EHXtypeTable[i] == 0)
     439             :       {
     440           8 :     fid = i + EHIDOFFSET;
     441           8 :     EHXacsTable[i] = acs;
     442           8 :     EHXtypeTable[i] = 1;
     443           8 :     EHXfidTable[i] = HDFfid;
     444           8 :     EHXsdTable[i] = sdInterfaceID;
     445           8 :     break;
     446             :       }
     447             :   }
     448             : 
     449             :     }
     450           8 :     return (fid);
     451             : }
     452             : 
     453             : 
     454             : 
     455             : 
     456             : /*----------------------------------------------------------------------------|
     457             : |  BEGIN_PROLOG                                                               |
     458             : |                                                                             |
     459             : |  FUNCTION: EHchkfid                                                         |
     460             : |                                                                             |
     461             : |  DESCRIPTION: Checks for valid file id and returns HDF file ID and          |
     462             : |               SD interface ID                                               |
     463             : |                                                                             |
     464             : |                                                                             |
     465             : |  Return Value    Type     Units     Description                             |
     466             : |  ============   ======  =========   =====================================   |
     467             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     468             : |                                                                             |
     469             : |  INPUTS:                                                                    |
     470             : |  fid            int32               HDF-EOS file ID                         |
     471             : |  name           char                Structure name                          |
     472             : |                                                                             |
     473             : |  OUTPUTS:                                                                   |
     474             : |  HDFfid         int32               HDF File ID                             |
     475             : |  sdInterfaceID  int32               SDS interface ID                        |
     476             : |  access         uint8               access code                             |
     477             : |                                                                             |
     478             : |  NOTES:                                                                     |
     479             : |                                                                             |
     480             : |                                                                             |
     481             : |   Date     Programmer   Description                                         |
     482             : |  ======   ============  =================================================   |
     483             : |  Jun 96   Joel Gales    Original Programmer                                 |
     484             : |  Jul 96   Joel Gales    set status=-1 if failure                            |
     485             : |  Jul 96   Joel Gales    Add file id offset EHIDOFFSET                       |
     486             : |                                                                             |
     487             : |  END_PROLOG                                                                 |
     488             : -----------------------------------------------------------------------------*/
     489             : intn
     490           0 : EHchkfid(int32 fid, const char *name, int32 * HDFfid, int32 * sdInterfaceID,
     491             :    uint8 * access)
     492             : 
     493             : {
     494           0 :     intn            status = 0; /* routine return status variable */
     495             :     intn            fid0; /* HDFEOS file ID - Offset */
     496             : 
     497             : 
     498             :     /* Check for valid HDFEOS file ID range */
     499             :     /* ------------------------------------ */
     500           0 :     if (fid < EHIDOFFSET || fid > EHXmaxfilecount + EHIDOFFSET)
     501             :     {
     502           0 :   status = -1;
     503           0 :   HEpush(DFE_RANGE, "EHchkfid", __FILE__, __LINE__);
     504           0 :   HEreport("Invalid file id: %d.  ID must be >= %d and < %d (%s).\n",
     505             :      fid, EHIDOFFSET, EHXmaxfilecount + EHIDOFFSET, name);
     506             :     } else
     507             :     {
     508             :   /* Compute "reduced" file ID */
     509             :   /* ------------------------- */
     510           0 :   fid0 = fid % EHIDOFFSET;
     511             : 
     512             : 
     513             :   /* Check that HDFEOS file ID is active */
     514             :   /* ----------------------------------- */
     515           0 :   if (EHXtypeTable[fid0] == 0)
     516             :   {
     517           0 :       status = -1;
     518           0 :       HEpush(DFE_GENAPP, "EHchkfid", __FILE__, __LINE__);
     519           0 :       HEreport("File id %d not active (%s).\n", fid, name);
     520             :   } else
     521             :   {
     522             :       /*
     523             :        * Get HDF file ID, SD interface ID and file access from external
     524             :        * arrays
     525             :        */
     526           0 :       *HDFfid = EHXfidTable[fid0];
     527           0 :       *sdInterfaceID = EHXsdTable[fid0];
     528           0 :       *access = EHXacsTable[fid0];
     529             :   }
     530             :     }
     531             : 
     532           0 :     return (status);
     533             : }
     534             : 
     535             : 
     536             : 
     537             : 
     538             : /*----------------------------------------------------------------------------|
     539             : |  BEGIN_PROLOG                                                               |
     540             : |                                                                             |
     541             : |  FUNCTION: EHidinfo                                                         |
     542             : |                                                                             |
     543             : |  DESCRIPTION: Gets Hopen and SD interface IDs from HDF-EOS id               |
     544             : |                                                                             |
     545             : |                                                                             |
     546             : |  Return Value    Type     Units     Description                             |
     547             : |  ============   ======  =========   =====================================   |
     548             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     549             : |                                                                             |
     550             : |  INPUTS:                                                                    |
     551             : |  fid            int32               HDF-EOS file ID                         |
     552             : |                                                                             |
     553             : |  OUTPUTS:                                                                   |
     554             : |  HDFfid         int32               HDF File ID                             |
     555             : |  sdInterfaceID  int32               SDS interface ID                        |
     556             : |                                                                             |
     557             : |  NOTES:                                                                     |
     558             : |                                                                             |
     559             : |                                                                             |
     560             : |   Date     Programmer   Description                                         |
     561             : |  ======   ============  =================================================   |
     562             : |  Jul 96   Joel Gales    Original Programmer                                 |
     563             : |                                                                             |
     564             : |  END_PROLOG                                                                 |
     565             : -----------------------------------------------------------------------------*/
     566             : intn
     567           0 : EHidinfo(int32 fid, int32 * HDFfid, int32 * sdInterfaceID)
     568             : 
     569             : {
     570           0 :     intn            status = 0; /* routine return status variable */
     571             :     uint8           dum;  /* Dummy variable */
     572             : 
     573             :     /* Call EHchkfid to get HDF and SD interface IDs */
     574             :     /* --------------------------------------------- */
     575           0 :     status = EHchkfid(fid, "EHidinfo", HDFfid, sdInterfaceID, &dum);
     576             : 
     577           0 :     return (status);
     578             : }
     579             : 
     580             : 
     581             : /*----------------------------------------------------------------------------|
     582             : |  BEGIN_PROLOG                                                               |
     583             : |                                                                             |
     584             : |  FUNCTION: EHgetversion                                                     |
     585             : |                                                                             |
     586             : |  DESCRIPTION: Returns HDF-EOS version string                                |
     587             : |                                                                             |
     588             : |                                                                             |
     589             : |  Return Value    Type     Units     Description                             |
     590             : |  ============   ======  =========   =====================================   |
     591             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
     592             : |                                                                             |
     593             : |  INPUTS:                                                                    |
     594             : |  fid            int32               HDF-EOS file id                         |
     595             : |                                                                             |
     596             : |  OUTPUTS:                                                                   |
     597             : |  version        char                HDF-EOS version string                  |
     598             : |                                                                             |
     599             : |  NOTES:                                                                     |
     600             : |                                                                             |
     601             : |                                                                             |
     602             : |   Date     Programmer   Description                                         |
     603             : |  ======   ============  =================================================   |
     604             : |  Mar 97   Joel Gales    Original Programmer                                 |
     605             : |                                                                             |
     606             : |  END_PROLOG                                                                 |
     607             : -----------------------------------------------------------------------------*/
     608             : intn
     609           0 : EHgetversion(int32 fid, char *version)
     610             : {
     611           0 :     intn            status = 0; /* routine return status variable */
     612             : 
     613             :     uint8           access; /* Access code */
     614             :     int32           dum;  /* Dummy variable */
     615           0 :     int32           sdInterfaceID = 0;  /* HDF SDS interface ID */
     616             :     int32           attrIndex;  /* HDFEOS version attribute index */
     617             :     int32           count;  /* Version string size */
     618             : 
     619             :     char            attrname[16]; /* Attribute name */
     620             : 
     621             : 
     622             :     /* Get SDS interface ID */
     623             :     /* -------------------- */
     624           0 :     status = EHchkfid(fid, "EHgetversion", &dum, &sdInterfaceID, &access);
     625             : 
     626             : 
     627             :     /* Get attribute index number */
     628             :     /* -------------------------- */
     629           0 :     attrIndex = SDfindattr(sdInterfaceID, "HDFEOSVersion");
     630             : 
     631             :     /* No such attribute */
     632             :     /* ----------------- */
     633           0 :     if (attrIndex < 0)
     634           0 :         return (-1);
     635             : 
     636             :     /* Get attribute size */
     637             :     /* ------------------ */
     638           0 :     status = SDattrinfo(sdInterfaceID, attrIndex, attrname, &dum, &count);
     639             : 
     640             :     /* Check return status */
     641             :     /* ------------------- */
     642           0 :     if (status < 0)
     643           0 :         return (-1);
     644             : 
     645             :     /* Read version attribute */
     646             :     /* ---------------------- */
     647           0 :     status = SDreadattr(sdInterfaceID, attrIndex, (VOIDP) version);
     648             : 
     649             : 
     650             :     /* Place string terminator on version string */
     651             :     /* ----------------------------------------- */
     652           0 :     version[count] = 0;
     653             : 
     654             : 
     655           0 :     return (status);
     656             : }
     657             : 
     658             : 
     659             : 
     660             : 
     661             : /*----------------------------------------------------------------------------|
     662             : |  BEGIN_PROLOG                                                               |
     663             : |                                                                             |
     664             : |  FUNCTION: EHconvAng                                                        |
     665             : |                                                                             |
     666             : |  DESCRIPTION: Angle conversion Utility                                      |
     667             : |                                                                             |
     668             : |                                                                             |
     669             : |  Return Value    Type     Units     Description                             |
     670             : |  ============   ======  =========   =====================================   |
     671             : |  outAngle       float64             Output Angle value                      |
     672             : |                                                                             |
     673             : |  INPUTS:                                                                    |
     674             : |  inAngle        float64             Input Angle value                       |
     675             : |  code           intn                Conversion code                         |
     676             : !                                       HDFE_RAD_DEG (0)                      |
     677             : |                                       HDFE_DEG_RAD (1)                      |
     678             : |                                       HDFE_DMS_DEG (2)                      |
     679             : |                                       HDFE_DEG_DMS (3)                      |
     680             : |                                       HDFE_RAD_DMS (4)                      |
     681             : |                                       HDFE_DMS_RAD (5)                      |
     682             : |                                                                             |
     683             : |  OUTPUTS:                                                                   |
     684             : |     None                                                                    |
     685             : |                                                                             |
     686             : |  NOTES:                                                                     |
     687             : |                                                                             |
     688             : |                                                                             |
     689             : |   Date     Programmer   Description                                         |
     690             : |  ======   ============  =================================================   |
     691             : |  Jun 96   Joel Gales    Original Programmer                                 |
     692             : |  Feb 97   Joel Gales    Correct "60" min & "60" sec in _DMS conversion      |
     693             : |                                                                             |
     694             : |  END_PROLOG                                                                 |
     695             : -----------------------------------------------------------------------------*/
     696             : float64
     697           0 : EHconvAng(float64 inAngle, intn code)
     698             : {
     699             : #define RADIANS_TO_DEGREES 180. / 3.14159265358979324
     700             : #define DEGREES_TO_RADIANS 3.14159265358979324 / 180.
     701             : 
     702             :     int32           min;  /* Truncated Minutes */
     703             :     int32           deg;  /* Truncated Degrees */
     704             : 
     705             :     float64         sec;  /* Seconds */
     706           0 :     float64         outAngle = 0.0; /* Angle in desired units */
     707             : 
     708           0 :     switch (code)
     709             :     {
     710             : 
     711             :   /* Convert radians to degrees */
     712             :   /* -------------------------- */
     713           0 :     case HDFE_RAD_DEG:
     714           0 :   outAngle = inAngle * RADIANS_TO_DEGREES;
     715           0 :   break;
     716             : 
     717             : 
     718             :   /* Convert degrees to radians */
     719             :   /* -------------------------- */
     720           0 :     case HDFE_DEG_RAD:
     721           0 :   outAngle = inAngle * DEGREES_TO_RADIANS;
     722           0 :   break;
     723             : 
     724             : 
     725             :   /* Convert packed degrees to degrees */
     726             :   /* --------------------------------- */
     727           0 :     case HDFE_DMS_DEG:
     728           0 :   deg = (int32)(inAngle / 1000000);
     729           0 :   min = (int32)((inAngle - deg * 1000000) / 1000);
     730           0 :   sec = (inAngle - deg * 1000000 - min * 1000);
     731           0 :   outAngle = deg + min / 60.0 + sec / 3600.0;
     732           0 :   break;
     733             : 
     734             : 
     735             :   /* Convert degrees to packed degrees */
     736             :   /* --------------------------------- */
     737           0 :     case HDFE_DEG_DMS:
     738           0 :   deg = (int32)(inAngle);
     739           0 :   min = (int32)((inAngle - deg) * 60);
     740           0 :   sec = (inAngle - deg - min / 60.0) * 3600;
     741             : 
     742           0 :   if ((intn) sec == 60)
     743             :   {
     744           0 :       sec = sec - 60;
     745           0 :       min = min + 1;
     746             :   }
     747           0 :   if (min == 60)
     748             :   {
     749           0 :       min = min - 60;
     750           0 :       deg = deg + 1;
     751             :   }
     752           0 :   outAngle = deg * 1000000 + min * 1000 + sec;
     753           0 :   break;
     754             : 
     755             : 
     756             :   /* Convert radians to packed degrees */
     757             :   /* --------------------------------- */
     758           0 :     case HDFE_RAD_DMS:
     759           0 :   inAngle = inAngle * RADIANS_TO_DEGREES;
     760           0 :   deg = (int32)(inAngle);
     761           0 :   min = (int32)((inAngle - deg) * 60);
     762           0 :   sec = (inAngle - deg - min / 60.0) * 3600;
     763             : 
     764           0 :   if ((intn) sec == 60)
     765             :   {
     766           0 :       sec = sec - 60;
     767           0 :       min = min + 1;
     768             :   }
     769           0 :   if (min == 60)
     770             :   {
     771           0 :       min = min - 60;
     772           0 :       deg = deg + 1;
     773             :   }
     774           0 :   outAngle = deg * 1000000 + min * 1000 + sec;
     775           0 :   break;
     776             : 
     777             : 
     778             :   /* Convert packed degrees to radians */
     779             :   /* --------------------------------- */
     780           0 :     case HDFE_DMS_RAD:
     781           0 :   deg = (int32)(inAngle / 1000000);
     782           0 :   min = (int32)((inAngle - deg * 1000000) / 1000);
     783           0 :   sec = (inAngle - deg * 1000000 - min * 1000);
     784           0 :   outAngle = deg + min / 60.0 + sec / 3600.0;
     785           0 :   outAngle = outAngle * DEGREES_TO_RADIANS;
     786           0 :   break;
     787             :     }
     788           0 :     return (outAngle);
     789             : }
     790             : 
     791             : #undef TO_DEGREES
     792             : #undef TO_RADIANS
     793             : 
     794             : 
     795             : /*----------------------------------------------------------------------------|
     796             : |  BEGIN_PROLOG                                                               |
     797             : |                                                                             |
     798             : |  FUNCTION: EHparsestr                                                       |
     799             : |                                                                             |
     800             : |  DESCRIPTION: String Parser Utility                                         |
     801             : |                                                                             |
     802             : |                                                                             |
     803             : |  Return Value    Type     Units     Description                             |
     804             : |  ============   ======  =========   =====================================   |
     805             : |  count          int32               Number of string entries                |
     806             : |                                                                             |
     807             : |  INPUTS:                                                                    |
     808             : |  instring       const char          Input string                            |
     809             : |  delim          const char          string delimiter                        |
     810             : |                                                                             |
     811             : |  OUTPUTS:                                                                   |
     812             : |  pntr           char *              Pointer array to beginning of each      |
     813             : |                                     string entry                            |
     814             : |  len            int32               Array of string entry lengths           |
     815             : |                                                                             |
     816             : |  NOTES:                                                                     |
     817             : |                                                                             |
     818             : |                                                                             |
     819             : |   Date     Programmer   Description                                         |
     820             : |  ======   ============  =================================================   |
     821             : |  Jun 96   Joel Gales    Original Programmer                                 |
     822             : |  Aug 96   Joel Gales    NULL pointer array returns count only               |
     823             : |                                                                             |
     824             : |  END_PROLOG                                                                 |
     825             : -----------------------------------------------------------------------------*/
     826             : int32
     827           0 : EHparsestr(const char *instring, const char delim, char *pntr[], int32 len[])
     828             : {
     829             :     int32           i;    /* Loop index */
     830           0 :     int32           prevDelimPos = 0; /* Previous delimiter position */
     831             :     int32           count;  /* Number of elements in string list */
     832             :     int32           slen; /* String length */
     833             : 
     834             :     char           *delimitor;  /* Pointer to delimiter */
     835             : 
     836             : 
     837             :     /* Get length of input string list & Point to first delimiter */
     838             :     /* ---------------------------------------------------------- */
     839           0 :     slen = (int)strlen(instring);
     840           0 :     delimitor = strchr(instring, delim);
     841             : 
     842             :     /* If NULL string set count to zero otherwise set to 1 */
     843             :     /* --------------------------------------------------- */
     844           0 :     count = (slen == 0) ? 0 : 1;
     845             : 
     846             : 
     847             :     /* if string pointers are requested set first one to beginning of string */
     848             :     /* --------------------------------------------------------------------- */
     849           0 :     if (&pntr[0] != NULL)
     850             :     {
     851           0 :   pntr[0] = (char *)instring;
     852             :     }
     853             :     /* If delimiter not found ... */
     854             :     /* ---------------------------- */
     855           0 :     if (delimitor == NULL)
     856             :     {
     857             :   /* if string length requested then set to input string length */
     858             :   /* ---------------------------------------------------------- */
     859           0 :   if (len != NULL)
     860             :   {
     861           0 :       len[0] = slen;
     862             :   }
     863             :     } else
     864             :   /* Delimiters Found */
     865             :   /* ---------------- */
     866             :     {
     867             :   /* Loop through all characters in string */
     868             :   /* ------------------------------------- */
     869           0 :   for (i = 1; i < slen; i++)
     870             :   {
     871             :       /* If character is a delimiter ... */
     872             :       /* ------------------------------- */
     873           0 :       if (instring[i] == delim)
     874             :       {
     875             : 
     876             :     /* If string pointer requested */
     877             :     /* --------------------------- */
     878           0 :     if (&pntr[0] != NULL)
     879             :     {
     880             :         /* if requested then compute string length of entry */
     881             :         /* ------------------------------------------------ */
     882           0 :         if (len != NULL)
     883             :         {
     884           0 :       len[count - 1] = i - prevDelimPos;
     885             :         }
     886             :         /* Point to beginning of string entry */
     887             :         /* ---------------------------------- */
     888           0 :         pntr[count] = (char *)instring + i + 1;
     889             :     }
     890             :     /* Reset previous delimiter position and increment counter */
     891             :     /* ------------------------------------------------------- */
     892           0 :     prevDelimPos = i + 1;
     893           0 :     count++;
     894             :       }
     895             :   }
     896             : 
     897             :   /* Compute string length of last entry */
     898             :   /* ----------------------------------- */
     899           0 :   if (&pntr[0] != NULL && len != NULL)
     900             :   {
     901           0 :       len[count - 1] = i - prevDelimPos;
     902             :   }
     903             :     }
     904             : 
     905           0 :     return (count);
     906             : }
     907             : 
     908             : 
     909             : 
     910             : 
     911             : /*----------------------------------------------------------------------------|
     912             : |  BEGIN_PROLOG                                                               |
     913             : |                                                                             |
     914             : |  FUNCTION: EHstrwithin                                                      |
     915             : |                                                                             |
     916             : |  DESCRIPTION: Searches for string within target string                      |
     917             : |                                                                             |
     918             : |                                                                             |
     919             : |  Return Value    Type     Units     Description                             |
     920             : |  ============   ======  =========   =====================================   |
     921             : |  indx           int32               Element index (0 - based)               |
     922             : |                                                                             |
     923             : |  INPUTS:                                                                    |
     924             : |  target         const char          Target string                           |
     925             : |  search         const char          Search string                           |
     926             : |  delim          const char          Delimiter                               |
     927             : |                                                                             |
     928             : |  OUTPUTS:                                                                   |
     929             : |             None                                                            |
     930             : |                                                                             |
     931             : |  NOTES:                                                                     |
     932             : |                                                                             |
     933             : |                                                                             |
     934             : |   Date     Programmer   Description                                         |
     935             : |  ======   ============  =================================================   |
     936             : |  Jun 96   Joel Gales    Original Programmer                                 |
     937             : |  Jan 97   Joel Gales    Change ptr & slen to dynamic arrays                 |
     938             : |                                                                             |
     939             : |  END_PROLOG                                                                 |
     940             : -----------------------------------------------------------------------------*/
     941             : int32
     942           0 : EHstrwithin(const char *target, const char *search, const char delim)
     943             : {
     944           0 :     intn            found = 0;  /* Target string found flag */
     945             : 
     946             :     int32           indx; /* Loop index */
     947             :     int32           nentries; /* Number of entries in search string */
     948             :     int32          *slen; /* Pointer to string length array */
     949             : 
     950             :     char          **ptr;  /* Pointer to string pointer array */
     951             :     char            buffer[128];/* Buffer to hold "test" string entry */
     952             : 
     953             : 
     954             :     /* Count number of entries in search string list */
     955             :     /* --------------------------------------------- */
     956           0 :     nentries = EHparsestr(search, delim, NULL, NULL);
     957             : 
     958             : 
     959             :     /* Allocate string pointer and length arrays */
     960             :     /* ----------------------------------------- */
     961           0 :     ptr = (char **) calloc(nentries, sizeof(char *));
     962           0 :     if(ptr == NULL)
     963             :     {
     964           0 :   HEpush(DFE_NOSPACE,"EHstrwithin", __FILE__, __LINE__);
     965           0 :   return(-1);
     966             :     }
     967           0 :     slen = (int32 *) calloc(nentries, sizeof(int32));
     968           0 :     if(slen == NULL)
     969             :     {
     970           0 :   HEpush(DFE_NOSPACE,"EHstrwithin", __FILE__, __LINE__);
     971           0 :   free(ptr);
     972           0 :   return(-1);
     973             :     }
     974             : 
     975             : 
     976             :     /* Parse search string */
     977             :     /* ------------------- */
     978           0 :     nentries = EHparsestr(search, delim, ptr, slen);
     979             : 
     980             : 
     981             :     /* Loop through all elements in search string list */
     982             :     /* ----------------------------------------------- */
     983           0 :     for (indx = 0; indx < nentries; indx++)
     984             :     {
     985             :   /* Copy string entry into buffer */
     986             :   /* ----------------------------- */
     987           0 :   memcpy(buffer, ptr[indx], slen[indx]);
     988           0 :   buffer[slen[indx]] = 0;
     989             : 
     990             : 
     991             :   /* Compare target string with string entry */
     992             :   /* --------------------------------------- */
     993           0 :   if (strcmp(target, buffer) == 0)
     994             :   {
     995           0 :       found = 1;
     996           0 :       break;
     997             :   }
     998             :     }
     999             : 
    1000             :     /* If not found set return to -1 */
    1001             :     /* ----------------------------- */
    1002           0 :     if (found == 0)
    1003             :     {
    1004           0 :   indx = -1;
    1005             :     }
    1006           0 :     free(slen);
    1007           0 :     free(ptr);
    1008             : 
    1009           0 :     return (indx);
    1010             : }
    1011             : 
    1012             : 
    1013             : 
    1014             : 
    1015             : 
    1016             : /*----------------------------------------------------------------------------|
    1017             : |  BEGIN_PROLOG                                                               |
    1018             : |                                                                             |
    1019             : |  FUNCTION: EHloadliststr                                                    |
    1020             : |                                                                             |
    1021             : |  DESCRIPTION: Builds list string from string array                          |
    1022             : |                                                                             |
    1023             : |                                                                             |
    1024             : |  Return Value    Type     Units     Description                             |
    1025             : |  ============   ======  =========   =====================================   |
    1026             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1027             : |                                                                             |
    1028             : |  INPUTS:                                                                    |
    1029             : |  ptr            char                String pointer array                    |
    1030             : |  nentries       int32               Number of string array elements         |
    1031             : |  delim          char                Delimiter                               |
    1032             : |                                                                             |
    1033             : |  OUTPUTS:                                                                   |
    1034             : |  liststr        char                Output list string                      |
    1035             : |                                                                             |
    1036             : |  NOTES:                                                                     |
    1037             : |                                                                             |
    1038             : |                                                                             |
    1039             : |   Date     Programmer   Description                                         |
    1040             : |  ======   ============  =================================================   |
    1041             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1042             : |                                                                             |
    1043             : |  END_PROLOG                                                                 |
    1044             : -----------------------------------------------------------------------------*/
    1045             : intn
    1046           0 : EHloadliststr(char *ptr[], int32 nentries, char *liststr, char delim)
    1047             : {
    1048           0 :     intn            status = 0; /* routine return status variable */
    1049             : 
    1050             :     int32           i;    /* Loop index */
    1051             :     int32           slen; /* String entry length */
    1052           0 :     int32           off = 0;  /* Position of next entry along string list */
    1053             :     char            dstr[2];    /* string version of input variable "delim" */
    1054             : 
    1055           0 :     dstr[0] = delim;
    1056           0 :     dstr[1] = '\0';
    1057             : 
    1058             : 
    1059             :     /* Loop through all entries in string array */
    1060             :     /* ---------------------------------------- */
    1061           0 :     for (i = 0; i < nentries; i++)
    1062             :     {
    1063             :   /* Get string length of string array entry */
    1064             :   /* --------------------------------------- */
    1065           0 :   slen = (int)strlen(ptr[i]);
    1066             : 
    1067             : 
    1068             :   /* Copy string entry to string list */
    1069             :   /* -------------------------------- */
    1070           0 :   memcpy(liststr + off, ptr[i], slen + 1);
    1071             : 
    1072             : 
    1073             :   /* Concatenate with delimiter */
    1074             :   /* -------------------------- */
    1075           0 :   if (i != nentries - 1)
    1076             :   {
    1077           0 :       strcat(liststr, dstr);
    1078             :   }
    1079             :   /* Get position of next entry for string list */
    1080             :   /* ------------------------------------------ */
    1081           0 :   off += slen + 1;
    1082             :     }
    1083             : 
    1084           0 :     return (status);
    1085             : }
    1086             : 
    1087             : 
    1088             : 
    1089             : 
    1090             : 
    1091             : /*----------------------------------------------------------------------------|
    1092             : |  BEGIN_PROLOG                                                               |
    1093             : |                                                                             |
    1094             : |  FUNCTION: EHgetid                                                          |
    1095             : |                                                                             |
    1096             : |  DESCRIPTION: Get Vgroup/Vdata ID from name                                 |
    1097             : |                                                                             |
    1098             : |                                                                             |
    1099             : |  Return Value    Type     Units     Description                             |
    1100             : |  ============   ======  =========   =====================================   |
    1101             : |  outID          int32               Output ID                               |
    1102             : |                                                                             |
    1103             : |  INPUTS:                                                                    |
    1104             : |  fid            int32               HDF-EOS file ID                         |
    1105             : |  vgid           int32               Vgroup ID                               |
    1106             : |  objectname     const char          object name                             |
    1107             : |  code           intn                object code (0 - Vgroup, 1 - Vdata)     |
    1108             : |  access         const char          access ("w/r")                          |
    1109             : |                                                                             |
    1110             : |                                                                             |
    1111             : |  OUTPUTS:                                                                   |
    1112             : |             None                                                            |
    1113             : |                                                                             |
    1114             : |  NOTES:                                                                     |
    1115             : |                                                                             |
    1116             : |                                                                             |
    1117             : |   Date     Programmer   Description                                         |
    1118             : |  ======   ============  =================================================   |
    1119             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1120             : |                                                                             |
    1121             : |  END_PROLOG                                                                 |
    1122             : -----------------------------------------------------------------------------*/
    1123             : int32
    1124           0 : EHgetid(int32 fid, int32 vgid, const char *objectname, intn code,
    1125             :         const char *access)
    1126             : {
    1127             :     intn            i;    /* Loop index */
    1128             : 
    1129             :     int32           nObjects; /* # of objects in Vgroup */
    1130             :     int32          *tags; /* Pnt to Vgroup object tags array */
    1131             :     int32          *refs; /* Pnt to Vgroup object refs array */
    1132             :     int32           id;   /* Object ID */
    1133           0 :     int32           outID = -1; /* Desired object ID */
    1134             : 
    1135             :     char            name[128];  /* Object name */
    1136             : 
    1137             : 
    1138             :     /* Get Number of objects */
    1139             :     /* --------------------- */
    1140           0 :     nObjects = Vntagrefs(vgid);
    1141             : 
    1142             :     /* If objects exist ... */
    1143             :     /* -------------------- */
    1144           0 :     if (nObjects != 0)
    1145             :     {
    1146             : 
    1147             :   /* Get tags and references of objects */
    1148             :   /* ---------------------------------- */
    1149           0 :   tags = (int32 *) malloc(sizeof(int32) * nObjects);
    1150           0 :   if(tags == NULL)
    1151             :   {
    1152           0 :       HEpush(DFE_NOSPACE,"EHgetid", __FILE__, __LINE__);
    1153           0 :       return(-1);
    1154             :   }
    1155           0 :   refs = (int32 *) malloc(sizeof(int32) * nObjects);
    1156           0 :   if(refs == NULL)
    1157             :   {
    1158           0 :       HEpush(DFE_NOSPACE,"EHgetid", __FILE__, __LINE__);
    1159           0 :       free(tags);
    1160           0 :       return(-1);
    1161             :   }
    1162             : 
    1163           0 :   Vgettagrefs(vgid, tags, refs, nObjects);
    1164             : 
    1165             : 
    1166             :   /* Vgroup ID Section */
    1167             :   /* ----------------- */
    1168           0 :   if (code == 0)
    1169             :   {
    1170             :       /* Loop through objects */
    1171             :       /* -------------------- */
    1172           0 :       for (i = 0; i < nObjects; i++)
    1173             :       {
    1174             : 
    1175             :     /* If object is Vgroup ... */
    1176             :     /* ----------------------- */
    1177           0 :     if (*(tags + i) == DFTAG_VG)
    1178             :     {
    1179             : 
    1180             :         /* Get ID and name */
    1181             :         /* --------------- */
    1182           0 :         id = Vattach(fid, *(refs + i), access);
    1183           0 :         Vgetname(id, name);
    1184             : 
    1185             :         /* If name equals desired object name get ID */
    1186             :         /* ----------------------------------------- */
    1187           0 :         if (strcmp(name, objectname) == 0)
    1188             :         {
    1189           0 :       outID = id;
    1190           0 :       break;
    1191             :         }
    1192             :         /* If not desired object then detach */
    1193             :         /* --------------------------------- */
    1194           0 :         Vdetach(id);
    1195             :     }
    1196             :       }
    1197           0 :   } else if (code == 1)
    1198             :   {
    1199             : 
    1200             :       /* Loop through objects */
    1201             :       /* -------------------- */
    1202           0 :       for (i = 0; i < nObjects; i++)
    1203             :       {
    1204             : 
    1205             :     /* If object is Vdata ... */
    1206             :     /* ---------------------- */
    1207           0 :     if (*(tags + i) == DFTAG_VH)
    1208             :     {
    1209             : 
    1210             :         /* Get ID and name */
    1211             :         /* --------------- */
    1212           0 :         id = VSattach(fid, *(refs + i), access);
    1213           0 :         VSgetname(id, name);
    1214             : 
    1215             :         /* If name equals desired object name get ID */
    1216             :         /* ----------------------------------------- */
    1217           0 :         if (EHstrwithin(objectname, name, ',') != -1)
    1218             :         {
    1219           0 :       outID = id;
    1220           0 :       break;
    1221             :         }
    1222             :         /* If not desired object then detach */
    1223             :         /* --------------------------------- */
    1224           0 :         VSdetach(id);
    1225             :     }
    1226             :       }
    1227             :   }
    1228           0 :   free(tags);
    1229           0 :   free(refs);
    1230             :     }
    1231           0 :     return (outID);
    1232             : }
    1233             : 
    1234             : 
    1235             : 
    1236             : 
    1237             : 
    1238             : /*----------------------------------------------------------------------------|
    1239             : |  BEGIN_PROLOG                                                               |
    1240             : |                                                                             |
    1241             : |  FUNCTION: EHrevflds                                                        |
    1242             : |                                                                             |
    1243             : |  DESCRIPTION: Reverses elements in a string list                            |
    1244             : |                                                                             |
    1245             : |                                                                             |
    1246             : |  Return Value    Type     Units     Description                             |
    1247             : |  ============   ======  =========   =====================================   |
    1248             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1249             : |                                                                             |
    1250             : |  INPUTS:                                                                    |
    1251             : |  dimlist        char                Original dimension list                 |
    1252             : |                                                                             |
    1253             : |  OUTPUTS:                                                                   |
    1254             : |  revdimlist     char                Reversed dimension list                 |
    1255             : |                                                                             |
    1256             : |  NOTES:                                                                     |
    1257             : |                                                                             |
    1258             : |                                                                             |
    1259             : |   Date     Programmer   Description                                         |
    1260             : |  ======   ============  =================================================   |
    1261             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1262             : |                                                                             |
    1263             : |  END_PROLOG                                                                 |
    1264             : -----------------------------------------------------------------------------*/
    1265             : intn
    1266           0 : EHrevflds(const char *dimlist, char *revdimlist)
    1267             : {
    1268           0 :     intn            status = 0; /* routine return status variable */
    1269             : 
    1270             :     int32           indx; /* Loop index */
    1271             :     int32           nentries; /* Number of entries in search string */
    1272             :     int32          *slen; /* Pointer to string length array */
    1273             : 
    1274             :     char          **ptr;  /* Pointer to string pointer array */
    1275             :     char           *tempPtr;  /* Temporary string pointer */
    1276             :     char           *tempdimlist;/* Temporary dimension list */
    1277             : 
    1278             : 
    1279             :     /* Copy dimlist into temp dimlist */
    1280             :     /* ------------------------------ */
    1281           0 :     tempdimlist = (char *) malloc(strlen(dimlist) + 1);
    1282           0 :     if(tempdimlist == NULL)
    1283             :     {
    1284           0 :   HEpush(DFE_NOSPACE,"EHrevflds", __FILE__, __LINE__);
    1285           0 :   return(-1);
    1286             :     }
    1287           0 :     strcpy(tempdimlist, dimlist);
    1288             : 
    1289             : 
    1290             :     /* Count number of entries in search string list */
    1291             :     /* --------------------------------------------- */
    1292           0 :     nentries = EHparsestr(tempdimlist, ',', NULL, NULL);
    1293             : 
    1294             : 
    1295             :     /* Allocate string pointer and length arrays */
    1296             :     /* ----------------------------------------- */
    1297           0 :     ptr = (char **) calloc(nentries, sizeof(char *));
    1298           0 :     if(ptr == NULL)
    1299             :     {
    1300           0 :   HEpush(DFE_NOSPACE,"EHrevflds", __FILE__, __LINE__);
    1301           0 :   free(tempdimlist);
    1302           0 :   return(-1);
    1303             :     }
    1304           0 :     slen = (int32 *) calloc(nentries, sizeof(int32));
    1305           0 :     if(slen == NULL)
    1306             :     {
    1307           0 :   HEpush(DFE_NOSPACE,"EHrevflds", __FILE__, __LINE__);
    1308           0 :   free(ptr);
    1309           0 :   free(tempdimlist);
    1310           0 :   return(-1);
    1311             :     }
    1312             : 
    1313             : 
    1314             :     /* Parse search string */
    1315             :     /* ------------------- */
    1316           0 :     nentries = EHparsestr(tempdimlist, ',', ptr, slen);
    1317             : 
    1318             : 
    1319             :     /* Reverse entries in string pointer array */
    1320             :     /* --------------------------------------- */
    1321           0 :     for (indx = 0; indx < nentries / 2; indx++)
    1322             :     {
    1323           0 :   tempPtr = ptr[indx];
    1324           0 :   ptr[indx] = ptr[nentries - 1 - indx];
    1325           0 :   ptr[nentries - 1 - indx] = tempPtr;
    1326             :     }
    1327             : 
    1328             : 
    1329             :     /* Replace comma delimiters by nulls */
    1330             :     /* --------------------------------- */
    1331           0 :     for (indx = 0; indx < nentries - 1; indx++)
    1332             :     {
    1333           0 :   *(ptr[indx] - 1) = 0;
    1334             :     }
    1335             : 
    1336             : 
    1337             :     /* Build new string list */
    1338             :     /* --------------------- */
    1339           0 :     status = EHloadliststr(ptr, nentries, revdimlist, ',');
    1340             : 
    1341             : 
    1342           0 :     free(slen);
    1343           0 :     free(ptr);
    1344           0 :     free(tempdimlist);
    1345             : 
    1346           0 :     return (status);
    1347             : }
    1348             : 
    1349             : /*----------------------------------------------------------------------------|
    1350             : |  BEGIN_PROLOG                                                               |
    1351             : |                                                                             |
    1352             : |  FUNCTION: EHgetmetavalue                                                   |
    1353             : |                                                                             |
    1354             : |  DESCRIPTION: Returns metadata value                                        |
    1355             : |                                                                             |
    1356             : |                                                                             |
    1357             : |  Return Value    Type     Units     Description                             |
    1358             : |  ============   ======  =========   =====================================   |
    1359             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1360             : |                                                                             |
    1361             : |  INPUTS:                                                                    |
    1362             : |  metaptrs        char               Begin and end of metadata section       |
    1363             : |  parameter      char                parameter to access                     |
    1364             : |                                                                             |
    1365             : |  OUTPUTS:                                                                   |
    1366             : |  metaptr        char                Ptr to (updated) beginning of metadata  |
    1367             : |  retstr         char                return string containing value          |
    1368             : |                                                                             |
    1369             : |  NOTES:                                                                     |
    1370             : |                                                                             |
    1371             : |                                                                             |
    1372             : |   Date     Programmer   Description                                         |
    1373             : |  ======   ============  =================================================   |
    1374             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1375             : |  Jan 97   Joel Gales    Check string pointer against end of meta section    |
    1376             : |                                                                             |
    1377             : |  END_PROLOG                                                                 |
    1378             : -----------------------------------------------------------------------------*/
    1379             : intn
    1380           0 : EHgetmetavalue(char *metaptrs[], const char *parameter, char *retstr)
    1381             : {
    1382           0 :     intn            status = 0; /* routine return status variable */
    1383             : 
    1384             :     int32           slen; /* String length */
    1385             :     char           *newline;  /* Position of new line character */
    1386             :     char           *sptr; /* string pointer within metadata */
    1387             : 
    1388             : 
    1389             :     /* Get string length of parameter string + 1 */
    1390             :     /* ----------------------------------------- */
    1391           0 :     slen = (int)strlen(parameter) + 1;
    1392             : 
    1393             : 
    1394             :     /* Build search string (parameter string + "=") */
    1395             :     /* -------------------------------------------- */
    1396           0 :     strcpy(retstr, parameter);
    1397           0 :     strcat(retstr, "=");
    1398             : 
    1399             : 
    1400             :     /* Search for string within metadata (beginning at metaptrs[0]) */
    1401             :     /* ------------------------------------------------------------ */
    1402           0 :     sptr = strstr(metaptrs[0], retstr);
    1403             : 
    1404             : 
    1405             :     /* If string found within desired section ... */
    1406             :     /* ------------------------------------------ */
    1407           0 :     if (sptr != NULL && sptr < metaptrs[1])
    1408             :     {
    1409             :   /* Store position of string within metadata */
    1410             :   /* ---------------------------------------- */
    1411           0 :   metaptrs[0] = sptr;
    1412             : 
    1413             :   /* Find newline "\n" character */
    1414             :   /* --------------------------- */
    1415           0 :   newline = strchr(metaptrs[0], '\n');
    1416           0 :   if (newline == NULL)
    1417             :   {
    1418           0 :     retstr[0] = 0;
    1419           0 :     return -1;
    1420             :   }
    1421             : 
    1422             :   /* Copy from "=" to "\n" (exclusive) into return string */
    1423             :   /* ---------------------------------------------------- */
    1424           0 :   memcpy(retstr, metaptrs[0] + slen, newline - metaptrs[0] - slen);
    1425             : 
    1426             :   /* Terminate return string with null */
    1427             :   /* --------------------------------- */
    1428           0 :   retstr[newline - metaptrs[0] - slen] = 0;
    1429             :     } else
    1430             :     {
    1431             :   /*
    1432             :    * if parameter string not found within section, null return string
    1433             :    * and set status to -1.
    1434             :    */
    1435           0 :   retstr[0] = 0;
    1436           0 :   status = -1;
    1437             :     }
    1438             : 
    1439           0 :     return (status);
    1440             : }
    1441             : 
    1442             : 
    1443             : 
    1444             : 
    1445             : /*----------------------------------------------------------------------------|
    1446             : |  BEGIN_PROLOG                                                               |
    1447             : |                                                                             |
    1448             : |  FUNCTION: EHmetagroup                                                      |
    1449             : |                                                                             |
    1450             : |  DESCRIPTION: Returns pointers to beginning and end of metadata group       |
    1451             : |                                                                             |
    1452             : |                                                                             |
    1453             : |  Return Value    Type     Units     Description                             |
    1454             : |  ============   ======  =========   =====================================   |
    1455             : |  metabuf        char                Pointer to HDF-EOS object in metadata   |
    1456             : |                                                                             |
    1457             : |  INPUTS:                                                                    |
    1458             : |  sdInterfaceID  int32               SDS interface ID                        |
    1459             : |  structname     char                HDF-EOS structure name                  |
    1460             : |  structcode     char                Structure code ("s/g/p")                |
    1461             : |  groupname      char                Metadata group name                     |
    1462             : |                                                                             |
    1463             : |  OUTPUTS:                                                                   |
    1464             : |  metaptrs       char                pointers to begin and end of metadata   |
    1465             : |                                                                             |
    1466             : |  NOTES:                                                                     |
    1467             : |                                                                             |
    1468             : |                                                                             |
    1469             : |   Date     Programmer   Description                                         |
    1470             : |  ======   ============  =================================================   |
    1471             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1472             : |  Aug 96   Joel Gales    Make metadata ODL compliant                         |
    1473             : |                                                                             |
    1474             : |  END_PROLOG                                                                 |
    1475             : -----------------------------------------------------------------------------*/
    1476             : char           *
    1477           0 : EHmetagroup(int32 sdInterfaceID, const char *structname, const char *structcode,
    1478             :       const char *groupname, char *metaptrs[])
    1479             : {
    1480             :     intn            i;    /* Loop index */
    1481             : 
    1482             :     int32           attrIndex;  /* Structural metadata attribute index */
    1483             :     int32           nmeta;  /* Number of 32000 byte metadata sections */
    1484             :     int32           metalen;  /* Length of structural metadata */
    1485             : 
    1486             :     char           *metabuf;  /* Pointer (handle) to structural metadata */
    1487           0 :     char           *endptr = NULL;  /* Pointer to end of metadata section */
    1488             :     char           *metaptr;  /* Metadata pointer */
    1489             :     char           *prevmetaptr;/* Previous position of metadata pointer */
    1490             :     char           *utlstr;     /* Utility string */
    1491             : 
    1492             : 
    1493             : 
    1494             :      /* Allocate memory for utility string */
    1495             :      /* ---------------------------------- */
    1496           0 :     utlstr = (char *) calloc(UTLSTR_MAX_SIZE,sizeof(char));
    1497           0 :     if(utlstr == NULL)
    1498             :     {
    1499           0 :         HEpush(DFE_NOSPACE,"EHEHmetagroup", __FILE__, __LINE__);
    1500             : 
    1501           0 :         return( NULL);
    1502             :     }
    1503             :     /* Determine number of structural metadata "sections" */
    1504             :     /* -------------------------------------------------- */
    1505           0 :     nmeta = 0;
    1506             :     while (1)
    1507             :     {
    1508             :   /* Search for "StructMetadata.x" attribute */
    1509             :   /* --------------------------------------- */
    1510           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%d", "StructMetadata.", (int)nmeta);
    1511           0 :   attrIndex = SDfindattr(sdInterfaceID, utlstr);
    1512             : 
    1513             : 
    1514             :   /* If found then increment metadata section counter else exit loop */
    1515             :   /* --------------------------------------------------------------- */
    1516           0 :   if (attrIndex != -1)
    1517             :   {
    1518           0 :       nmeta++;
    1519             :   } else
    1520             :   {
    1521           0 :       break;
    1522             :   }
    1523             :     }
    1524             : 
    1525             : 
    1526             :     /* Allocate space for metadata (in units of 32000 bytes) */
    1527             :     /* ----------------------------------------------------- */
    1528           0 :     metabuf = (char *) calloc(32000 * nmeta, 1);
    1529             : 
    1530           0 :     if(metabuf == NULL)
    1531             :     {
    1532           0 :   HEpush(DFE_NOSPACE,"EHmetagroup", __FILE__, __LINE__);
    1533           0 :   free(utlstr);
    1534           0 :   return(metabuf);
    1535             :     }
    1536             : 
    1537             : 
    1538             :     /* Read structural metadata */
    1539             :     /* ------------------------ */
    1540           0 :     for (i = 0; i < nmeta; i++)
    1541             :     {
    1542           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%d", "StructMetadata.", i);
    1543           0 :   attrIndex = SDfindattr(sdInterfaceID, utlstr);
    1544           0 :   metalen = (int)strlen(metabuf);
    1545           0 :   SDreadattr(sdInterfaceID, attrIndex, metabuf + metalen);
    1546             :     }
    1547             : 
    1548             :     /* Determine length (# of characters) of metadata */
    1549             :     /* ---------------------------------------------- */
    1550           0 :     metalen = (int)strlen(metabuf);
    1551             : 
    1552             : 
    1553             : 
    1554             :     /* Find HDF-EOS structure "root" group in metadata */
    1555             :     /* ----------------------------------------------- */
    1556             : 
    1557             :     /* Setup proper search string */
    1558             :     /* -------------------------- */
    1559           0 :     if (strcmp(structcode, "s") == 0)
    1560             :     {
    1561           0 :   strcpy(utlstr, "GROUP=SwathStructure");
    1562           0 :     } else if (strcmp(structcode, "g") == 0)
    1563             :     {
    1564           0 :   strcpy(utlstr, "GROUP=GridStructure");
    1565           0 :     } else if (strcmp(structcode, "p") == 0)
    1566             :     {
    1567           0 :   strcpy(utlstr, "GROUP=PointStructure");
    1568             :     }
    1569             :     /* Use string search routine (strstr) to move through metadata */
    1570             :     /* ----------------------------------------------------------- */
    1571           0 :     metaptr = strstr(metabuf, utlstr);
    1572             : 
    1573             : 
    1574             : 
    1575             :     /* Save current metadata pointer */
    1576             :     /* ----------------------------- */
    1577           0 :     prevmetaptr = metaptr;
    1578             : 
    1579             : 
    1580             :     /* First loop for "old-style" (non-ODL) metadata string */
    1581             :     /* ---------------------------------------------------- */
    1582           0 :     if (strcmp(structcode, "s") == 0)
    1583             :     {
    1584           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s", "SwathName=\"", structname);
    1585           0 :     } else if (strcmp(structcode, "g") == 0)
    1586             :     {
    1587           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s", "GridName=\"", structname);
    1588           0 :     } else if (strcmp(structcode, "p") == 0)
    1589             :     {
    1590           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s", "PointName=\"", structname);
    1591             :     }
    1592             :     /* Do string search */
    1593             :     /* ---------------- */
    1594           0 :     if (metaptr)
    1595           0 :         metaptr = strstr(metaptr, utlstr);
    1596             : 
    1597             : 
    1598             :     /*
    1599             :      * If not found then return to previous position in metadata and look for
    1600             :      * "new-style" (ODL) metadata string
    1601             :      */
    1602           0 :     if (metaptr == NULL)
    1603             :     {
    1604           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s", "GROUP=\"", structname);
    1605           0 :   metaptr = strstr(prevmetaptr, utlstr);
    1606             :     }
    1607             :     /* Find group within structure */
    1608             :     /* --------------------------- */
    1609           0 :     if (metaptr && groupname != NULL)
    1610             :     {
    1611           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s", "GROUP=", groupname);
    1612           0 :   metaptr = strstr(metaptr, utlstr);
    1613             : 
    1614           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s%s", "\t\tEND_GROUP=", groupname);
    1615           0 :   if (metaptr)
    1616           0 :       endptr = strstr(metaptr, utlstr);
    1617             :   else
    1618           0 :       endptr = NULL;
    1619           0 :     } else if (metaptr)
    1620             :     {
    1621             :   /* If groupname == NULL then find end of structure in metadata */
    1622             :   /* ----------------------------------------------------------- */
    1623           0 :   snprintf(utlstr, UTLSTR_MAX_SIZE, "%s", "\n\tEND_GROUP=");
    1624           0 :   endptr = strstr(metaptr, utlstr);
    1625             :     }
    1626             : 
    1627             : 
    1628             :     /* Return beginning and ending pointers */
    1629             :     /* ------------------------------------ */
    1630           0 :     metaptrs[0] = metaptr;
    1631           0 :     metaptrs[1] = endptr;
    1632             : 
    1633           0 :     free(utlstr);
    1634             : 
    1635           0 :     return (metabuf);
    1636             : }
    1637             : 
    1638             : 
    1639             : /*----------------------------------------------------------------------------|
    1640             : |  BEGIN_PROLOG                                                               |
    1641             : |                                                                             |
    1642             : |  FUNCTION: EHattr                                                           |
    1643             : |                                                                             |
    1644             : |  DESCRIPTION: Reads/Writes attributes for HDF-EOS structures                |
    1645             : |                                                                             |
    1646             : |                                                                             |
    1647             : |  Return Value    Type     Units     Description                             |
    1648             : |  ============   ======  =========   =====================================   |
    1649             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1650             : |                                                                             |
    1651             : |  INPUTS:                                                                    |
    1652             : |  fid            int32               HDF-EOS file ID                         |
    1653             : |  attrVgrpID     int32               Attribute Vgroup ID                     |
    1654             : |  attrname       char                attribute name                          |
    1655             : |  numbertype     int32               attribute HDF numbertype                |
    1656             : |  count          int32               Number of attribute elements            |
    1657             : |  wrcode         char                Read/Write Code "w/r"                   |
    1658             : |  datbuf         void                I/O buffer                              |
    1659             : |                                                                             |
    1660             : |                                                                             |
    1661             : |  OUTPUTS:                                                                   |
    1662             : |  datbuf         void                I/O buffer                              |
    1663             : |                                                                             |
    1664             : |  NOTES:                                                                     |
    1665             : |                                                                             |
    1666             : |                                                                             |
    1667             : |   Date     Programmer   Description                                         |
    1668             : |  ======   ============  =================================================   |
    1669             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1670             : |  Oct 96   Joel Gales    Pass Vgroup id as routine parameter                 |
    1671             : |  Oct 96   Joel Gales    Remove Vdetach call                                 |
    1672             : |                                                                             |
    1673             : |  END_PROLOG                                                                 |
    1674             : -----------------------------------------------------------------------------*/
    1675             : intn
    1676           0 : EHattr(int32 fid, int32 attrVgrpID, const char *attrname, int32 numbertype,
    1677             :        int32 count, const char *wrcode, VOIDP datbuf)
    1678             : 
    1679             : {
    1680           0 :     intn            status = 0; /* routine return status variable */
    1681             :     int32           vdataID;  /* Attribute Vdata ID */
    1682             : 
    1683             :     /*
    1684             :      * Attributes are stored as Vdatas with name given by the user, class:
    1685             :      * "Attr0.0" and fieldname: "AttrValues"
    1686             :      */
    1687             : 
    1688             : 
    1689             :     /* Get Attribute Vdata ID and "open" with appropriate I/O code */
    1690             :     /* ----------------------------------------------------------- */
    1691           0 :     vdataID = EHgetid(fid, attrVgrpID, attrname, 1, wrcode);
    1692             : 
    1693             :     /* Write Attribute Section */
    1694             :     /* ----------------------- */
    1695           0 :     if (strcmp(wrcode, "w") == 0)
    1696             :     {
    1697             :   /* Create Attribute Vdata (if it doesn't exist) */
    1698             :   /* -------------------------------------------- */
    1699           0 :   if (vdataID == -1)
    1700             :   {
    1701           0 :       vdataID = VSattach(fid, -1, "w");
    1702           0 :       VSsetname(vdataID, attrname);
    1703           0 :       VSsetclass(vdataID, "Attr0.0");
    1704             : 
    1705           0 :       VSfdefine(vdataID, "AttrValues", numbertype, count);
    1706           0 :       Vinsert(attrVgrpID, vdataID);
    1707             :   }
    1708             :   /* Write Attribute */
    1709             :   /* --------------- */
    1710           0 :   VSsetfields(vdataID, "AttrValues");
    1711           0 :   (void) VSsizeof(vdataID, (char*) "AttrValues");
    1712           0 :   VSwrite(vdataID, datbuf, 1, FULL_INTERLACE);
    1713             : 
    1714           0 :   VSdetach(vdataID);
    1715             :     }
    1716             :     /* Read Attribute Section */
    1717             :     /* ---------------------- */
    1718           0 :     if (strcmp(wrcode, "r") == 0)
    1719             :     {
    1720             :   /* If attribute doesn't exist report error */
    1721             :   /* --------------------------------------- */
    1722           0 :   if (vdataID == -1)
    1723             :   {
    1724           0 :       status = -1;
    1725           0 :       HEpush(DFE_GENAPP, "EHattr", __FILE__, __LINE__);
    1726           0 :       HEreport("Attribute %s not defined.\n", attrname);
    1727             :   } else
    1728             :   {
    1729           0 :       VSsetfields(vdataID, "AttrValues");
    1730           0 :       (void) VSsizeof(vdataID, (char*) "AttrValues");
    1731           0 :       VSread(vdataID, datbuf, 1, FULL_INTERLACE);
    1732           0 :       VSdetach(vdataID);
    1733             :   }
    1734             :     }
    1735           0 :     return (status);
    1736             : }
    1737             : 
    1738             : 
    1739             : 
    1740             : 
    1741             : /*----------------------------------------------------------------------------|
    1742             : |  BEGIN_PROLOG                                                               |
    1743             : |                                                                             |
    1744             : |  FUNCTION: EHattrinfo                                                       |
    1745             : |                                                                             |
    1746             : |  DESCRIPTION: Returns numbertype and count of given HDF-EOS attribute       |
    1747             : |                                                                             |
    1748             : |                                                                             |
    1749             : |  Return Value    Type     Units     Description                             |
    1750             : |  ============   ======  =========   =====================================   |
    1751             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    1752             : |                                                                             |
    1753             : |  INPUTS:                                                                    |
    1754             : |  fid            int32               HDF-EOS file ID                         |
    1755             : |  attrVgrpID     int32               Attribute Vgroup ID                     |
    1756             : |  attrname       char                attribute name                          |
    1757             : |                                                                             |
    1758             : |  OUTPUTS:                                                                   |
    1759             : |  numbertype     int32               attribute HDF numbertype                |
    1760             : |  count          int32               Number of attribute elements            |
    1761             : |                                                                             |
    1762             : |  NOTES:                                                                     |
    1763             : |                                                                             |
    1764             : |                                                                             |
    1765             : |   Date     Programmer   Description                                         |
    1766             : |  ======   ============  =================================================   |
    1767             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1768             : |  Oct 96   Joel Gales    Pass Vgroup id as routine parameter                 |
    1769             : |  Oct 96   Joel Gales    Remove Vdetach call                                 |
    1770             : |                                                                             |
    1771             : |  END_PROLOG                                                                 |
    1772             : -----------------------------------------------------------------------------*/
    1773             : intn
    1774           0 : EHattrinfo(int32 fid, int32 attrVgrpID, const char *attrname, int32 * numbertype,
    1775             :      int32 * count)
    1776             : 
    1777             : {
    1778           0 :     intn            status = 0; /* routine return status variable */
    1779             :     int32           vdataID;  /* Attribute Vdata ID */
    1780             : 
    1781             :     /* Get Attribute Vdata ID */
    1782             :     /* ---------------------- */
    1783           0 :     vdataID = EHgetid(fid, attrVgrpID, attrname, 1, "r");
    1784             : 
    1785             :     /* If attribute not defined then report error */
    1786             :     /* ------------------------------------------ */
    1787           0 :     if (vdataID == -1)
    1788             :     {
    1789           0 :   status = -1;
    1790           0 :   HEpush(DFE_GENAPP, "EHattr", __FILE__, __LINE__);
    1791           0 :   HEreport("Attribute %s not defined.\n", attrname);
    1792             :     } else
    1793             :     {
    1794             :   /* Get attribute info */
    1795             :   /* ------------------ */
    1796           0 :   VSsetfields(vdataID, "AttrValues");
    1797           0 :   *count = VSsizeof(vdataID, (char*) "AttrValues");
    1798           0 :   *numbertype = VFfieldtype(vdataID, 0);
    1799           0 :   VSdetach(vdataID);
    1800             :     }
    1801             : 
    1802           0 :     return (status);
    1803             : }
    1804             : 
    1805             : 
    1806             : 
    1807             : 
    1808             : 
    1809             : /*----------------------------------------------------------------------------|
    1810             : |  BEGIN_PROLOG                                                               |
    1811             : |                                                                             |
    1812             : |  FUNCTION: EHattrcat                                                        |
    1813             : |                                                                             |
    1814             : |  DESCRIPTION: Returns a listing of attributes within an HDF-EOS structure   |
    1815             : |                                                                             |
    1816             : |                                                                             |
    1817             : |  Return Value    Type     Units     Description                             |
    1818             : |  ============   ======  =========   =====================================   |
    1819             : |  nattr          int32               Number of attributes in swath struct    |
    1820             : |                                                                             |
    1821             : |  INPUTS:                                                                    |
    1822             : |  fid            int32               HDF-EOS file ID                         |
    1823             : |  attrVgrpID     int32               Attribute Vgroup ID                     |
    1824             : |  structcode     char                Structure Code ("s/g/p")                |
    1825             : |                                                                             |
    1826             : |  OUTPUTS:                                                                   |
    1827             : |  attrnames      char                Attribute names in swath struct         |
    1828             : |                                     (Comma-separated list)                  |
    1829             : |  strbufsize     int32               Attributes name list string length      |
    1830             : |                                                                             |
    1831             : |  NOTES:                                                                     |
    1832             : |                                                                             |
    1833             : |                                                                             |
    1834             : |   Date     Programmer   Description                                         |
    1835             : |  ======   ============  =================================================   |
    1836             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1837             : |  Oct 96   Joel Gales    Pass Vgroup id as routine parameter                 |
    1838             : |  Oct 96   Joel Gales    Remove Vdetach call                                 |
    1839             : |                                                                             |
    1840             : |  END_PROLOG                                                                 |
    1841             : -----------------------------------------------------------------------------*/
    1842             : int32
    1843           0 : EHattrcat(int32 fid, int32 attrVgrpID, char *attrnames, int32 * strbufsize)
    1844             : {
    1845             :     intn            i;            /* Loop index */
    1846             : 
    1847             :     int32           nObjects;         /* # of objects in Vgroup */
    1848             :     int32          *tags;         /* Pnt to Vgroup object tags array */
    1849             :     int32          *refs;         /* Pnt to Vgroup object refs array */
    1850             :     int32           vdataID;          /* Attribute Vdata ID */
    1851             : 
    1852           0 :     int32           nattr = 0;          /* Number of attributes */
    1853             :     int32           slen;         /* String length */
    1854             : 
    1855             :     char            name[80];         /* Attribute name */
    1856             :     static const char indxstr[] = "INDXMAP:"; /* Index Mapping reserved
    1857             :                                                  string */
    1858             :     static const char fvstr[] = "_FV_"; /* Flag Value reserved string */
    1859             :     static const char bsom[] = "_BLKSOM:";/* Block SOM Offset reserved string */
    1860             : 
    1861             : 
    1862             :     /* Set string buffer size to 0 */
    1863             :     /* --------------------------- */
    1864           0 :     *strbufsize = 0;
    1865             : 
    1866             : 
    1867             :     /* Get number of attributes within Attribute Vgroup */
    1868             :     /* ------------------------------------------------ */
    1869           0 :     nObjects = Vntagrefs(attrVgrpID);
    1870             : 
    1871             : 
    1872             :     /* If attributes exist ... */
    1873             :     /* ----------------------- */
    1874           0 :     if (nObjects > 0)
    1875             :     {
    1876             :   /* Get tags and references of attribute Vdatas */
    1877             :   /* ------------------------------------------- */
    1878           0 :   tags = (int32 *) malloc(sizeof(int32) * nObjects);
    1879           0 :   if(tags == NULL)
    1880             :   {
    1881           0 :       HEpush(DFE_NOSPACE,"EHattrcat", __FILE__, __LINE__);
    1882           0 :       return(-1);
    1883             :   }
    1884           0 :   refs = (int32 *) malloc(sizeof(int32) * nObjects);
    1885           0 :   if(refs == NULL)
    1886             :   {
    1887           0 :       HEpush(DFE_NOSPACE,"EHattrcat", __FILE__, __LINE__);
    1888           0 :       free(tags);
    1889           0 :       return(-1);
    1890             :   }
    1891             : 
    1892           0 :   Vgettagrefs(attrVgrpID, tags, refs, nObjects);
    1893             : 
    1894             :   /* Get attribute vdata IDs and names */
    1895             :   /* --------------------------------- */
    1896           0 :   for (i = 0; i < nObjects; i++)
    1897             :   {
    1898           0 :       vdataID = VSattach(fid, *(refs + i), "r");
    1899           0 :       VSgetname(vdataID, name);
    1900             : 
    1901             :       /*
    1902             :        * Don't return fill value, index mapping & block SOM attributes
    1903             :        */
    1904           0 :       if (memcmp(name, indxstr, strlen(indxstr)) != 0 &&
    1905           0 :     memcmp(name, fvstr, strlen(fvstr)) != 0 &&
    1906           0 :     memcmp(name, bsom, strlen(bsom)) != 0)
    1907             :       {
    1908             :     /* Increment attribute counter and add name to list */
    1909             :     /* ------------------------------------------------ */
    1910           0 :     nattr++;
    1911           0 :     if (attrnames != NULL)
    1912             :     {
    1913           0 :         if (nattr == 1)
    1914             :         {
    1915           0 :       strcpy(attrnames, name);
    1916             :         } else
    1917             :         {
    1918           0 :       strcat(attrnames, ",");
    1919           0 :       strcat(attrnames, name);
    1920             :         }
    1921             :     }
    1922             :     /* Increment attribute names string length */
    1923             :     /* --------------------------------------- */
    1924           0 :     slen = (nattr == 1) ? (int)strlen(name) : (int)strlen(name) + 1;
    1925           0 :     *strbufsize += slen;
    1926             :       }
    1927           0 :       VSdetach(vdataID);
    1928             :   }
    1929           0 :   free(tags);
    1930           0 :   free(refs);
    1931             :     }
    1932           0 :     return (nattr);
    1933             : }
    1934             : 
    1935             : 
    1936             : 
    1937             : /*----------------------------------------------------------------------------|
    1938             : |  BEGIN_PROLOG                                                               |
    1939             : |                                                                             |
    1940             : |  FUNCTION: EHinquire                                                        |
    1941             : |                                                                             |
    1942             : |  DESCRIPTION: Returns number and names of HDF-EOS structures in file        |
    1943             : |                                                                             |
    1944             : |                                                                             |
    1945             : |  Return Value    Type     Units     Description                             |
    1946             : |  ============   ======  =========   =====================================   |
    1947             : |  nobj           int32               Number of HDF-EOS structures in file    |
    1948             : |                                                                             |
    1949             : |  INPUTS:                                                                    |
    1950             : |  filename       char                HDF-EOS filename                        |
    1951             : |  type           char                Object Type ("SWATH/GRID/POINT")        |
    1952             : |                                                                             |
    1953             : |  OUTPUTS:                                                                   |
    1954             : |  objectlist     char                List of object names (comma-separated)  |
    1955             : |  strbufsize     int32               Length of objectlist                    |
    1956             : |                                                                             |
    1957             : |  NOTES:                                                                     |
    1958             : |                                                                             |
    1959             : |                                                                             |
    1960             : |   Date     Programmer   Description                                         |
    1961             : |  ======   ============  =================================================   |
    1962             : |  Jun 96   Joel Gales    Original Programmer                                 |
    1963             : |                                                                             |
    1964             : |  END_PROLOG                                                                 |
    1965             : -----------------------------------------------------------------------------*/
    1966             : int32
    1967           8 : EHinquire(const char *filename, const char *type, char *objectlist, int32 * strbufsize)
    1968             : {
    1969             :     int32           HDFfid; /* HDF file ID */
    1970             :     int32           vgRef;  /* Vgroup reference number */
    1971             :     int32           vGrpID; /* Vgroup ID */
    1972           8 :     int32           nobj = 0; /* Number of HDFEOS objects in file */
    1973             :     int32           slen; /* String length */
    1974             : 
    1975             :     char            name[512];  /* Object name */
    1976             :     char            class[80];  /* Object class */
    1977             : 
    1978             : 
    1979             :     /* Open HDFEOS file of read-only access */
    1980             :     /* ------------------------------------ */
    1981           8 :     HDFfid = Hopen(filename, DFACC_READ, 0);
    1982             : 
    1983             : 
    1984             :     /* Start Vgroup Interface */
    1985             :     /* ---------------------- */
    1986           8 :     Vstart(HDFfid);
    1987             : 
    1988             : 
    1989             :     /* If string buffer size is requested then zero out counter */
    1990             :     /* -------------------------------------------------------- */
    1991           8 :     if (strbufsize != NULL)
    1992             :     {
    1993           8 :   *strbufsize = 0;
    1994             :     }
    1995             :     /* Search for objects from beginning of HDF file */
    1996             :     /* -------------------------------------------- */
    1997           8 :     vgRef = -1;
    1998             : 
    1999             :     /* Loop through all objects */
    2000             :     /* ------------------------ */
    2001             :     while (1)
    2002             :     {
    2003             :   /* Get Vgroup reference number */
    2004             :   /* --------------------------- */
    2005          36 :   vgRef = Vgetid(HDFfid, vgRef);
    2006             : 
    2007             :   /* If no more then exist search loop */
    2008             :   /* --------------------------------- */
    2009          36 :   if (vgRef == -1)
    2010             :   {
    2011           8 :       break;
    2012             :   }
    2013             :   /* Get Vgroup ID, name, and class */
    2014             :   /* ------------------------------ */
    2015          28 :   vGrpID = Vattach(HDFfid, vgRef, "r");
    2016          28 :   Vgetname(vGrpID, name);
    2017          28 :   Vgetclass(vGrpID, class);
    2018             : 
    2019             : 
    2020             :   /* If object of desired type (SWATH, POINT, GRID) ... */
    2021             :   /* -------------------------------------------------- */
    2022          28 :   if (strcmp(class, type) == 0)
    2023             :   {
    2024             : 
    2025             :       /* Increment counter */
    2026             :       /* ----------------- */
    2027           0 :       nobj++;
    2028             : 
    2029             : 
    2030             :       /* If object list requested add name to list */
    2031             :       /* ----------------------------------------- */
    2032           0 :       if (objectlist != NULL)
    2033             :       {
    2034           0 :     if (nobj == 1)
    2035             :     {
    2036           0 :         strcpy(objectlist, name);
    2037             :     } else
    2038             :     {
    2039           0 :         strcat(objectlist, ",");
    2040           0 :         strcat(objectlist, name);
    2041             :     }
    2042             :       }
    2043             :       /* Compute string length of object entry */
    2044             :       /* ------------------------------------- */
    2045           0 :       slen = (nobj == 1) ? (int)strlen(name) : (int)strlen(name) + 1;
    2046             : 
    2047             : 
    2048             :       /* If string buffer size is requested then increment buffer size */
    2049             :       /* ------------------------------------------------------------- */
    2050           0 :       if (strbufsize != NULL)
    2051             :       {
    2052           0 :     *strbufsize += slen;
    2053             :       }
    2054             :   }
    2055             :   /* Detach Vgroup */
    2056             :   /* ------------- */
    2057          28 :   Vdetach(vGrpID);
    2058             :     }
    2059             : 
    2060             :     /* "Close" Vgroup interface and HDFEOS file */
    2061             :     /* ---------------------------------------- */
    2062           8 :     Vend(HDFfid);
    2063           8 :     Hclose(HDFfid);
    2064             : 
    2065           8 :     return (nobj);
    2066             : }
    2067             : 
    2068             : 
    2069             : 
    2070             : /*----------------------------------------------------------------------------|
    2071             : |  BEGIN_PROLOG                                                               |
    2072             : |                                                                             |
    2073             : |  FUNCTION: EHclose                                                          |
    2074             : |                                                                             |
    2075             : |  DESCRIPTION: Closes HDF-EOS file                                           |
    2076             : |                                                                             |
    2077             : |                                                                             |
    2078             : |  Return Value    Type     Units     Description                             |
    2079             : |  ============   ======  =========   =====================================   |
    2080             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2081             : |                                                                             |
    2082             : |  INPUTS:                                                                    |
    2083             : |  fid            int32               HDF-EOS File ID                         |
    2084             : |                                                                             |
    2085             : |  OUTPUTS:                                                                   |
    2086             : |             None                                                            |
    2087             : |                                                                             |
    2088             : |  NOTES:                                                                     |
    2089             : |                                                                             |
    2090             : |                                                                             |
    2091             : |   Date     Programmer   Description                                         |
    2092             : |  ======   ============  =================================================   |
    2093             : |  Jun 96   Joel Gales    Original Programmer                                 |
    2094             : |  Jul 96   Joel Gales    Add file id offset EHIDOFFSET                       |
    2095             : |  Aug 96   Joel Gales    Add HE error report if file id out of bounds        |
    2096             : |  Nov 96   Joel Gales    Add EHXacsTable array to "garbage collection"       |
    2097             : |                                                                             |
    2098             : |  END_PROLOG                                                                 |
    2099             : -----------------------------------------------------------------------------*/
    2100             : intn
    2101           8 : EHclose(int32 fid)
    2102             : {
    2103           8 :     intn            status = 0; /* routine return status variable */
    2104             : 
    2105             :     int32           HDFfid; /* HDF file ID */
    2106             :     int32           sdInterfaceID;  /* HDF SDS interface ID */
    2107             :     int32           fid0; /* HDF EOS file id - offset */
    2108             : 
    2109             : 
    2110             :     /* Check for valid HDFEOS file ID range */
    2111             :     /* ------------------------------------ */
    2112           8 :     if (fid >= EHIDOFFSET && fid < EHXmaxfilecount + EHIDOFFSET)
    2113             :     {
    2114             :   /* Compute "reduced" file ID */
    2115             :   /* ------------------------- */
    2116           8 :   fid0 = fid % EHIDOFFSET;
    2117             : 
    2118             : 
    2119             :   /* Get HDF file ID and SD interface ID */
    2120             :   /* ----------------------------------- */
    2121           8 :   HDFfid = EHXfidTable[fid0];
    2122           8 :   sdInterfaceID = EHXsdTable[fid0];
    2123             : 
    2124             :   /* "Close" SD interface, Vgroup interface, and HDF file */
    2125             :   /* ---------------------------------------------------- */
    2126           8 :   status = SDend(sdInterfaceID);
    2127           8 :   status = Vend(HDFfid);
    2128           8 :   status = Hclose(HDFfid);
    2129             : 
    2130             :   /* Clear out external array entries */
    2131             :   /* -------------------------------- */
    2132           8 :   EHXtypeTable[fid0] = 0;
    2133           8 :   EHXacsTable[fid0] = 0;
    2134           8 :   EHXfidTable[fid0] = 0;
    2135           8 :   EHXsdTable[fid0] = 0;
    2136           8 :         if (EHget_numfiles() == 0)
    2137             :         {
    2138           8 :             free(EHXtypeTable);
    2139           8 :             EHXtypeTable = NULL;
    2140           8 :             free(EHXacsTable);
    2141           8 :             EHXacsTable = NULL;
    2142           8 :             free(EHXfidTable);
    2143           8 :             EHXfidTable = NULL;
    2144           8 :             free(EHXsdTable);
    2145           8 :             EHXsdTable = NULL;
    2146           8 :             EHXmaxfilecount = 0;
    2147             :         }
    2148             :     } else
    2149             :     {
    2150           0 :   status = -1;
    2151           0 :   HEpush(DFE_RANGE, "EHclose", __FILE__, __LINE__);
    2152           0 :   HEreport("Invalid file id: %d.  ID must be >= %d and < %d.\n",
    2153             :      fid, EHIDOFFSET, EHXmaxfilecount + EHIDOFFSET);
    2154             :     }
    2155             : 
    2156           8 :     return (status);
    2157             : }
    2158             : 
    2159             : /*----------------------------------------------------------------------------|
    2160             : |  BEGIN_PROLOG                                                               |
    2161             : |                                                                             |
    2162             : |  FUNCTION: EHnumstr                                                         |
    2163             : |                                                                             |
    2164             : |  DESCRIPTION: Returns numerical type code of the given string               |
    2165             : |               representation.                                               |
    2166             : |                                                                             |
    2167             : |                                                                             |
    2168             : |  Return Value    Type     Units     Description                             |
    2169             : |  ============   ======  =========   =====================================   |
    2170             : |  numbertype     int32               numerical type code                     |
    2171             : |                                                                             |
    2172             : |  INPUTS:                                                                    |
    2173             : |  strcode        const char          string representation of the type code  |
    2174             : |                                                                             |
    2175             : |                                                                             |
    2176             : |  OUTPUTS:                                                                   |
    2177             : |             None                                                            |
    2178             : |                                                                             |
    2179             : |  NOTES:                                                                     |
    2180             : |                                                                             |
    2181             : |                                                                             |
    2182             : |   Date     Programmer   Description                                         |
    2183             : |  ======   ============  =================================================   |
    2184             : |  Nov 07   Andrey Kiselev  Original Programmer                               |
    2185             : |                                                                             |
    2186             : |  END_PROLOG                                                                 |
    2187             : -----------------------------------------------------------------------------*/
    2188             : int32
    2189           0 : EHnumstr(const char *strcode)
    2190             : {
    2191           0 :     if (strcmp(strcode, "DFNT_UCHAR8") == 0)
    2192           0 :         return DFNT_UCHAR8;
    2193           0 :     else if (strcmp(strcode, "DFNT_CHAR8") == 0)
    2194           0 :         return DFNT_CHAR8;
    2195           0 :     else if (strcmp(strcode, "DFNT_FLOAT32") == 0)
    2196           0 :         return DFNT_FLOAT32;
    2197           0 :     else if (strcmp(strcode, "DFNT_FLOAT64") == 0)
    2198           0 :         return DFNT_FLOAT64;
    2199           0 :     else if (strcmp(strcode, "DFNT_INT8") == 0)
    2200           0 :         return DFNT_INT8;
    2201           0 :     else if (strcmp(strcode, "DFNT_UINT8") == 0)
    2202           0 :         return DFNT_UINT8;
    2203           0 :     else if (strcmp(strcode, "DFNT_INT16") == 0)
    2204           0 :         return DFNT_INT16;
    2205           0 :     else if (strcmp(strcode, "DFNT_UINT16") == 0)
    2206           0 :         return DFNT_UINT16;
    2207           0 :     else if (strcmp(strcode, "DFNT_INT32") == 0)
    2208           0 :         return DFNT_INT32;
    2209           0 :     else if (strcmp(strcode, "DFNT_UINT32") == 0)
    2210           0 :         return DFNT_UINT32;
    2211             :     else
    2212           0 :         return DFNT_NONE;
    2213             : }
    2214             : 
    2215             : /*----------------------------------------------------------------------------|
    2216             : |  BEGIN_PROLOG                                                               |
    2217             : |                                                                             |
    2218             : |  FUNCTION: EHreset_maxopenfiles                                             |
    2219             : |                                                                             |
    2220             : |  DESCRIPTION: Change the allowed number of opened HDFEOS files.             |
    2221             : |                                                                             |
    2222             : |                                                                             |
    2223             : |  Return Value    Type     Units     Description                             |
    2224             : |  ============   ======  =========   =====================================   |
    2225             : |  numbertype     intn                The current maximum number of opened    |
    2226             : |                                     files allowed, or -1, if unable         |
    2227             : |                                     to reset it.                            |
    2228             : |                                                                             |
    2229             : |  INPUTS:                                                                    |
    2230             : |  strcode        intn                Requested number of opened files.       |
    2231             : |                                                                             |
    2232             : |                                                                             |
    2233             : |  OUTPUTS:                                                                   |
    2234             : |             None                                                            |
    2235             : |                                                                             |
    2236             : |  NOTES:                                                                     |
    2237             : |                                                                             |
    2238             : |                                                                             |
    2239             : |   Date        Programmer     Description                                    |
    2240             : |  ==========   ============   ============================================== |
    2241             : |  2013.04.03   Andrey Kiselev Original Programmer                            |
    2242             : |                                                                             |
    2243             : |  END_PROLOG                                                                 |
    2244             : -----------------------------------------------------------------------------*/
    2245             : static intn
    2246           8 : EHreset_maxopenfiles(intn req_max)
    2247             : {
    2248             :     intn    ret_value;
    2249             : 
    2250           8 :     if (req_max <= EHXmaxfilecount)
    2251           0 :         return EHXmaxfilecount;
    2252             : 
    2253             :     /* Falback to built-in NEOSHDF constant if           */
    2254             :     /* SDreset_maxopenfiles() interface is not available */
    2255             :     /* ------------------------------------------------- */
    2256             : #ifdef HDF4_HAS_MAXOPENFILES
    2257           8 :     ret_value = SDreset_maxopenfiles(req_max);
    2258             : #else
    2259             :     ret_value = NEOSHDF;
    2260             : #endif /* HDF4_HAS_MAXOPENFILES */
    2261             : 
    2262           8 :     if (ret_value > 0)
    2263             :     {
    2264           8 :         EHXtypeTable = realloc(EHXtypeTable, ret_value * sizeof(*EHXtypeTable));
    2265           8 :         memset(EHXtypeTable + EHXmaxfilecount, 0,
    2266           8 :                (ret_value - EHXmaxfilecount) * sizeof(*EHXtypeTable));
    2267           8 :         EHXacsTable = realloc(EHXacsTable, ret_value * sizeof(*EHXacsTable));
    2268           8 :         memset(EHXacsTable + EHXmaxfilecount, 0,
    2269           8 :                (ret_value - EHXmaxfilecount) * sizeof(*EHXacsTable));
    2270           8 :         EHXfidTable = realloc(EHXfidTable, ret_value * sizeof(*EHXfidTable));
    2271           8 :         memset(EHXfidTable + EHXmaxfilecount, 0,
    2272           8 :                (ret_value - EHXmaxfilecount) * sizeof(*EHXfidTable));
    2273           8 :         EHXsdTable = realloc(EHXsdTable, ret_value * sizeof(*EHXsdTable));
    2274           8 :         memset(EHXsdTable + EHXmaxfilecount, 0,
    2275           8 :                (ret_value - EHXmaxfilecount) * sizeof(*EHXsdTable));
    2276           8 :         EHXmaxfilecount = ret_value;
    2277             :     }
    2278             : 
    2279           8 :     return ret_value;
    2280             : }
    2281             : 
    2282             : /*----------------------------------------------------------------------------|
    2283             : |  BEGIN_PROLOG                                                               |
    2284             : |                                                                             |
    2285             : |  FUNCTION: EHget_maxopenfiles                                               |
    2286             : |                                                                             |
    2287             : |  DESCRIPTION: Request the allowed number of opened HDFEOS files and maximum |
    2288             : |               number of opened files allowed in the system.                 |
    2289             : |                                                                             |
    2290             : |                                                                             |
    2291             : |  Return Value    Type     Units     Description                             |
    2292             : |  ============   ======  =========   =====================================   |
    2293             : |  status         intn                return status (0) SUCCEED, (-1) FAIL    |
    2294             : |                                                                             |
    2295             : |  INPUTS:                                                                    |
    2296             : |             None                                                            |
    2297             : |                                                                             |
    2298             : |                                                                             |
    2299             : |  OUTPUTS:                                                                   |
    2300             : |  curr_max       intn                Current number of open files allowed.   |
    2301             : |  sys_limit      intn                Maximum number of open files allowed    |
    2302             : |                                     in the system.                          |
    2303             : |                                                                             |
    2304             : |  NOTES:                                                                     |
    2305             : |                                                                             |
    2306             : |                                                                             |
    2307             : |   Date        Programmer     Description                                    |
    2308             : |  ==========   ============   ============================================== |
    2309             : |  2013.04.03   Andrey Kiselev Original Programmer                            |
    2310             : |                                                                             |
    2311             : |  END_PROLOG                                                                 |
    2312             : -----------------------------------------------------------------------------*/
    2313             : static intn
    2314           8 : EHget_maxopenfiles(intn *curr_max,
    2315             :        intn *sys_limit)
    2316             : {
    2317           8 :     intn ret_value = 0;
    2318             : 
    2319             : #ifdef HDF4_HAS_MAXOPENFILES
    2320           8 :     ret_value = SDget_maxopenfiles(curr_max, sys_limit);
    2321             : #else
    2322             :     *sys_limit = NEOSHDF;
    2323             : #endif /* HDF4_HAS_MAXOPENFILES */
    2324             : 
    2325           8 :     *curr_max = EHXmaxfilecount;
    2326             : 
    2327           8 :     return ret_value;
    2328             : }
    2329             : 
    2330             : /*----------------------------------------------------------------------------|
    2331             : |  BEGIN_PROLOG                                                               |
    2332             : |                                                                             |
    2333             : |  FUNCTION: EHget_numfiles                                                   |
    2334             : |                                                                             |
    2335             : |  DESCRIPTION: Request the number of HDFEOS files currently opened.          |
    2336             : |                                                                             |
    2337             : |                                                                             |
    2338             : |  Return Value    Type     Units     Description                             |
    2339             : |  ============   ======  =========   =====================================   |
    2340             : |  nfileopen      intn                Number of HDFEOS files already opened.  |
    2341             : |                                                                             |
    2342             : |  INPUTS:                                                                    |
    2343             : |             None                                                            |
    2344             : |                                                                             |
    2345             : |                                                                             |
    2346             : |  OUTPUTS:                                                                   |
    2347             : |             None                                                            |
    2348             : |                                     in the system.                          |
    2349             : |                                                                             |
    2350             : |  NOTES:                                                                     |
    2351             : |                                                                             |
    2352             : |                                                                             |
    2353             : |   Date        Programmer     Description                                    |
    2354             : |  ==========   ============   ============================================== |
    2355             : |  2013.04.03   Andrey Kiselev Original Programmer                            |
    2356             : |                                                                             |
    2357             : |  END_PROLOG                                                                 |
    2358             : -----------------------------------------------------------------------------*/
    2359             : static intn
    2360          16 : EHget_numfiles()
    2361             : {
    2362             :     intn            i;        /* Loop index */
    2363          16 :     intn            nfileopen = 0;  /* # of HDF files open */
    2364             : 
    2365          16 :     if (EHXtypeTable)
    2366             :     {
    2367             :         /* Determine number of files currently opened */
    2368             :         /* ------------------------------------------ */
    2369      320016 :         for (i = 0; i < EHXmaxfilecount; i++)
    2370             :         {
    2371      320000 :             nfileopen += EHXtypeTable[i];
    2372             :         }
    2373             :     }
    2374             : 
    2375          16 :     return nfileopen;
    2376             : }

Generated by: LCOV version 1.14