Coverage Report

Created: 2026-09-26 08:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/ntf/ogrntfdriver.cpp
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  UK NTF Reader
4
 * Purpose:  Implements OGRNTFDriver
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 "ntf.h"
14
#include "cpl_conv.h"
15
16
/************************************************************************/
17
/* ==================================================================== */
18
/*                            OGRNTFDriver                              */
19
/* ==================================================================== */
20
/************************************************************************/
21
22
/************************************************************************/
23
/*                                Open()                                */
24
/************************************************************************/
25
26
static GDALDataset *OGRNTFDriverOpen(GDALOpenInfo *poOpenInfo)
27
28
198k
{
29
198k
    if (!poOpenInfo->bStatOK)
30
45.1k
        return nullptr;
31
32
153k
    if (poOpenInfo->nHeaderBytes != 0)
33
140k
    {
34
140k
        if (poOpenInfo->nHeaderBytes < 80)
35
5.22k
            return nullptr;
36
135k
        const char *pszHeader = (const char *)poOpenInfo->pabyHeader;
37
135k
        if (!STARTS_WITH_CI(pszHeader, "01"))
38
134k
            return nullptr;
39
40
695
        int j = 0;  // Used after for.
41
51.6k
        for (; j < 80; j++)
42
51.1k
        {
43
51.1k
            if (pszHeader[j] == 10 || pszHeader[j] == 13)
44
198
                break;
45
51.1k
        }
46
47
695
        if (j == 80 || pszHeader[j - 1] != '%')
48
688
            return nullptr;
49
695
    }
50
51
12.6k
    OGRNTFDataSource *poDS = new OGRNTFDataSource;
52
12.6k
    if (!poDS->Open(poOpenInfo->pszFilename, TRUE))
53
12.6k
    {
54
12.6k
        delete poDS;
55
12.6k
        poDS = nullptr;
56
12.6k
    }
57
58
12.6k
    if (poDS != nullptr && poOpenInfo->eAccess == GA_Update)
59
0
    {
60
0
        CPLError(CE_Failure, CPLE_OpenFailed,
61
0
                 "NTF Driver doesn't support update.");
62
0
        delete poDS;
63
0
        poDS = nullptr;
64
0
    }
65
66
12.6k
    return poDS;
67
153k
}
68
69
/************************************************************************/
70
/*                           RegisterOGRNTF()                           */
71
/************************************************************************/
72
73
void RegisterOGRNTF()
74
75
24
{
76
24
    if (GDALGetDriverByName("UK .NTF") != nullptr)
77
0
        return;
78
79
24
    GDALDriver *poDriver = new GDALDriver();
80
81
24
    poDriver->SetDescription("UK .NTF");
82
24
    poDriver->SetMetadataItem(GDAL_DCAP_VECTOR, "YES");
83
24
    poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "UK .NTF");
84
24
    poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "drivers/vector/ntf.html");
85
24
    poDriver->SetMetadataItem(GDAL_DCAP_VIRTUALIO, "YES");
86
24
    poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES");
87
24
    poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE");
88
89
24
    poDriver->pfnOpen = OGRNTFDriverOpen;
90
91
24
    GetGDALDriverManager()->RegisterDriver(poDriver);
92
24
}