LCOV - code coverage report
Current view: top level - frmts/sdts - sdtsattrreader.cpp (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 51 59 86.4 %
Date: 2024-11-21 22:18:42 Functions: 10 11 90.9 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Project:  SDTS Translator
       4             :  * Purpose:  Implementation of SDTSAttrReader class.
       5             :  * Author:   Frank Warmerdam, warmerdam@pobox.com
       6             :  *
       7             :  ******************************************************************************
       8             :  * Copyright (c) 1999, Frank Warmerdam
       9             :  *
      10             :  * SPDX-License-Identifier: MIT
      11             :  ****************************************************************************/
      12             : 
      13             : #include "sdts_al.h"
      14             : 
      15             : /************************************************************************/
      16             : /* ==================================================================== */
      17             : /*                             SDTSAttrRecord                           */
      18             : /* ==================================================================== */
      19             : /************************************************************************/
      20             : 
      21             : /************************************************************************/
      22             : /*                           SDTSAttrRecord()                           */
      23             : /************************************************************************/
      24             : 
      25         353 : SDTSAttrRecord::SDTSAttrRecord() : poWholeRecord(nullptr), poATTR(nullptr)
      26             : {
      27         353 : }
      28             : 
      29             : /************************************************************************/
      30             : /*                          ~SDTSAttrRecord()                           */
      31             : /************************************************************************/
      32             : 
      33         706 : SDTSAttrRecord::~SDTSAttrRecord()
      34             : 
      35             : {
      36         353 :     if (poWholeRecord != nullptr)
      37         353 :         delete poWholeRecord;
      38         706 : }
      39             : 
      40             : /************************************************************************/
      41             : /*                                Dump()                                */
      42             : /************************************************************************/
      43             : 
      44           0 : void SDTSAttrRecord::Dump(FILE *fp)
      45             : 
      46             : {
      47           0 :     if (poATTR != nullptr)
      48           0 :         poATTR->Dump(fp);
      49           0 : }
      50             : 
      51             : /************************************************************************/
      52             : /* ==================================================================== */
      53             : /*                             SDTSAttrReader                           */
      54             : /*                                                                      */
      55             : /*      This is the class used to read a primary attribute module.      */
      56             : /* ==================================================================== */
      57             : /************************************************************************/
      58             : 
      59             : /************************************************************************/
      60             : /*                           SDTSAttrReader()                           */
      61             : /************************************************************************/
      62             : 
      63           3 : SDTSAttrReader::SDTSAttrReader() : bIsSecondary(FALSE)
      64             : {
      65           3 : }
      66             : 
      67             : /************************************************************************/
      68             : /*                          ~SDTSAttrReader()                           */
      69             : /************************************************************************/
      70             : 
      71           6 : SDTSAttrReader::~SDTSAttrReader()
      72             : {
      73           3 :     Close();
      74           6 : }
      75             : 
      76             : /************************************************************************/
      77             : /*                               Close()                                */
      78             : /************************************************************************/
      79             : 
      80           3 : void SDTSAttrReader::Close()
      81             : 
      82             : {
      83           3 :     ClearIndex();
      84           3 :     oDDFModule.Close();
      85           3 : }
      86             : 
      87             : /************************************************************************/
      88             : /*                                Open()                                */
      89             : /*                                                                      */
      90             : /*      Open the requested attr file, and prepare to start reading      */
      91             : /*      data records.                                                   */
      92             : /************************************************************************/
      93             : 
      94           3 : int SDTSAttrReader::Open(const char *pszFilename)
      95             : 
      96             : {
      97           3 :     bool bSuccess = CPL_TO_BOOL(oDDFModule.Open(pszFilename));
      98             : 
      99           3 :     if (bSuccess)
     100           3 :         bIsSecondary = (oDDFModule.FindFieldDefn("ATTS") != nullptr);
     101             : 
     102           3 :     return bSuccess;
     103             : }
     104             : 
     105             : /************************************************************************/
     106             : /*                           GetNextRecord()                            */
     107             : /************************************************************************/
     108             : 
     109         357 : DDFField *SDTSAttrReader::GetNextRecord(SDTSModId *poModId,
     110             :                                         DDFRecord **ppoRecord, int bDuplicate)
     111             : 
     112             : {
     113             :     /* -------------------------------------------------------------------- */
     114             :     /*      Fetch a record.                                                 */
     115             :     /* -------------------------------------------------------------------- */
     116         357 :     if (ppoRecord != nullptr)
     117         357 :         *ppoRecord = nullptr;
     118             : 
     119         357 :     if (oDDFModule.GetFP() == nullptr)
     120           0 :         return nullptr;
     121             : 
     122         357 :     DDFRecord *poRecord = oDDFModule.ReadRecord();
     123             : 
     124         357 :     if (poRecord == nullptr)
     125           4 :         return nullptr;
     126             : 
     127             :     /* -------------------------------------------------------------------- */
     128             :     /*      Make a copy of the record for persistent use if requested by    */
     129             :     /*      the caller.                                                     */
     130             :     /* -------------------------------------------------------------------- */
     131         353 :     if (bDuplicate)
     132         353 :         poRecord = poRecord->Clone();
     133             : 
     134             :     /* -------------------------------------------------------------------- */
     135             :     /*      Find the ATTP field.                                            */
     136             :     /* -------------------------------------------------------------------- */
     137         353 :     DDFField *poATTP = poRecord->FindField("ATTP", 0);
     138         353 :     if (poATTP == nullptr)
     139             :     {
     140           0 :         poATTP = poRecord->FindField("ATTS", 0);
     141             :     }
     142             : 
     143         353 :     if (poATTP == nullptr)
     144           0 :         return nullptr;
     145             : 
     146             :     /* -------------------------------------------------------------------- */
     147             :     /*      Update the module ID if required.                               */
     148             :     /* -------------------------------------------------------------------- */
     149         353 :     if (poModId != nullptr)
     150             :     {
     151         353 :         DDFField *poATPR = poRecord->FindField("ATPR");
     152             : 
     153         353 :         if (poATPR == nullptr)
     154           0 :             poATPR = poRecord->FindField("ATSC");
     155             : 
     156         353 :         if (poATPR != nullptr)
     157         353 :             poModId->Set(poATPR);
     158             :     }
     159             : 
     160             :     /* -------------------------------------------------------------------- */
     161             :     /*      return proper answer.                                           */
     162             :     /* -------------------------------------------------------------------- */
     163         353 :     if (ppoRecord != nullptr)
     164         353 :         *ppoRecord = poRecord;
     165             : 
     166         353 :     return poATTP;
     167             : }
     168             : 
     169             : /************************************************************************/
     170             : /*                         GetNextAttrRecord()                          */
     171             : /************************************************************************/
     172             : 
     173         357 : SDTSAttrRecord *SDTSAttrReader::GetNextAttrRecord()
     174             : 
     175             : {
     176         357 :     SDTSModId oModId;
     177         357 :     DDFRecord *poRawRecord = nullptr;
     178             : 
     179         357 :     DDFField *poATTRField = GetNextRecord(&oModId, &poRawRecord, TRUE);
     180             : 
     181         357 :     if (poATTRField == nullptr)
     182           4 :         return nullptr;
     183             : 
     184         353 :     SDTSAttrRecord *poAttrRecord = new SDTSAttrRecord();
     185             : 
     186         353 :     poAttrRecord->poWholeRecord = poRawRecord;
     187         353 :     poAttrRecord->poATTR = poATTRField;
     188         353 :     memcpy(&(poAttrRecord->oModId), &oModId, sizeof(SDTSModId));
     189             : 
     190         353 :     return poAttrRecord;
     191             : }

Generated by: LCOV version 1.14