Coverage Report

Created: 2025-12-31 08:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/ogr/ogrsf_frmts/avc/ogravclayer.cpp
Line
Count
Source
1
/******************************************************************************
2
 *
3
 * Project:  OGR
4
 * Purpose:  Implements OGRAVCLayer class.  This is the base class for E00
5
 *           and binary coverage layer implementations.  It provides some base
6
 *           layer operations, and methods for transforming between OGR
7
 *           features, and the in memory structures of the AVC library.
8
 * Author:   Frank Warmerdam, warmerdam@pobox.com
9
 *
10
 ******************************************************************************
11
 * Copyright (c) 2002, Frank Warmerdam <warmerdam@pobox.com>
12
 *
13
 * SPDX-License-Identifier: MIT
14
 ****************************************************************************/
15
16
#include "ogr_avc.h"
17
#include "cpl_conv.h"
18
#include "cpl_string.h"
19
20
/************************************************************************/
21
/*                           OGRAVCLayer()                           */
22
/************************************************************************/
23
24
OGRAVCLayer::OGRAVCLayer(AVCFileType eSectionTypeIn, OGRAVCDataSource *poDSIn)
25
43.2k
    : poFeatureDefn(nullptr), poDS(poDSIn), eSectionType(eSectionTypeIn)
26
43.2k
{
27
43.2k
}
28
29
/************************************************************************/
30
/*                          ~OGRAVCLayer()                           */
31
/************************************************************************/
32
33
OGRAVCLayer::~OGRAVCLayer()
34
35
43.2k
{
36
43.2k
    if (m_nFeaturesRead > 0 && poFeatureDefn != nullptr)
37
28.1k
    {
38
28.1k
        CPLDebug("AVC", "%d features read on layer '%s'.",
39
28.1k
                 static_cast<int>(m_nFeaturesRead), poFeatureDefn->GetName());
40
28.1k
    }
41
42
43.2k
    if (poFeatureDefn != nullptr)
43
43.2k
        poFeatureDefn->Release();
44
43.2k
}
45
46
/************************************************************************/
47
/*                           TestCapability()                           */
48
/************************************************************************/
49
50
int OGRAVCLayer::TestCapability(const char * /* pszCap */) const
51
0
{
52
0
    return FALSE;
53
0
}
54
55
/************************************************************************/
56
/*                       SetupFeatureDefinition()                       */
57
/************************************************************************/
58
59
int OGRAVCLayer::SetupFeatureDefinition(const char *pszName)
60
61
43.2k
{
62
43.2k
    bool bRet = false;
63
43.2k
    switch (eSectionType)
64
43.2k
    {
65
3.18k
        case AVCFileARC:
66
3.18k
        {
67
3.18k
            poFeatureDefn = new OGRFeatureDefn(pszName);
68
3.18k
            poFeatureDefn->Reference();
69
3.18k
            poFeatureDefn->SetGeomType(wkbLineString);
70
71
3.18k
            OGRFieldDefn oUserId("UserId", OFTInteger);
72
3.18k
            OGRFieldDefn oFNode("FNODE_", OFTInteger);
73
3.18k
            OGRFieldDefn oTNode("TNODE_", OFTInteger);
74
3.18k
            OGRFieldDefn oLPoly("LPOLY_", OFTInteger);
75
3.18k
            OGRFieldDefn oRPoly("RPOLY_", OFTInteger);
76
77
3.18k
            poFeatureDefn->AddFieldDefn(&oUserId);
78
3.18k
            poFeatureDefn->AddFieldDefn(&oFNode);
79
3.18k
            poFeatureDefn->AddFieldDefn(&oTNode);
80
3.18k
            poFeatureDefn->AddFieldDefn(&oLPoly);
81
3.18k
            poFeatureDefn->AddFieldDefn(&oRPoly);
82
83
3.18k
            bRet = true;
84
3.18k
            break;
85
0
        }
86
87
5.30k
        case AVCFilePAL:
88
10.7k
        case AVCFileRPL:
89
10.7k
        {
90
10.7k
            poFeatureDefn = new OGRFeatureDefn(pszName);
91
10.7k
            poFeatureDefn->Reference();
92
10.7k
            poFeatureDefn->SetGeomType(wkbPolygon);
93
94
10.7k
            OGRFieldDefn oArcIds("ArcIds", OFTIntegerList);
95
10.7k
            poFeatureDefn->AddFieldDefn(&oArcIds);
96
97
10.7k
            bRet = true;
98
10.7k
            break;
99
5.30k
        }
100
101
21.7k
        case AVCFileCNT:
102
21.7k
        {
103
21.7k
            poFeatureDefn = new OGRFeatureDefn(pszName);
104
21.7k
            poFeatureDefn->Reference();
105
21.7k
            poFeatureDefn->SetGeomType(wkbPoint);
106
107
21.7k
            OGRFieldDefn oLabelIds("LabelIds", OFTIntegerList);
108
21.7k
            poFeatureDefn->AddFieldDefn(&oLabelIds);
109
110
21.7k
            bRet = true;
111
21.7k
            break;
112
5.30k
        }
113
114
3.04k
        case AVCFileLAB:
115
3.04k
        {
116
3.04k
            poFeatureDefn = new OGRFeatureDefn(pszName);
117
3.04k
            poFeatureDefn->Reference();
118
3.04k
            poFeatureDefn->SetGeomType(wkbPoint);
119
120
3.04k
            OGRFieldDefn oValueId("ValueId", OFTInteger);
121
3.04k
            poFeatureDefn->AddFieldDefn(&oValueId);
122
123
3.04k
            OGRFieldDefn oPolyId("PolyId", OFTInteger);
124
3.04k
            poFeatureDefn->AddFieldDefn(&oPolyId);
125
126
3.04k
            bRet = true;
127
3.04k
            break;
128
5.30k
        }
129
130
1.39k
        case AVCFileTXT:
131
4.51k
        case AVCFileTX6:
132
4.51k
        {
133
4.51k
            poFeatureDefn = new OGRFeatureDefn(pszName);
134
4.51k
            poFeatureDefn->Reference();
135
4.51k
            poFeatureDefn->SetGeomType(wkbPoint);
136
137
4.51k
            OGRFieldDefn oUserId("UserId", OFTInteger);
138
4.51k
            poFeatureDefn->AddFieldDefn(&oUserId);
139
140
4.51k
            OGRFieldDefn oText("Text", OFTString);
141
4.51k
            poFeatureDefn->AddFieldDefn(&oText);
142
143
4.51k
            OGRFieldDefn oHeight("Height", OFTReal);
144
4.51k
            poFeatureDefn->AddFieldDefn(&oHeight);
145
146
4.51k
            OGRFieldDefn oLevel("Level", OFTInteger);
147
4.51k
            poFeatureDefn->AddFieldDefn(&oLevel);
148
149
4.51k
            bRet = true;
150
4.51k
            break;
151
1.39k
        }
152
153
0
        default:
154
0
            poFeatureDefn = nullptr;
155
0
            break;
156
43.2k
    }
157
158
43.2k
    if (poFeatureDefn && poFeatureDefn->GetGeomFieldDefn(0))
159
43.2k
    {
160
43.2k
        poFeatureDefn->GetGeomFieldDefn(0)->SetSpatialRef(
161
43.2k
            poDS->DSGetSpatialRef());
162
43.2k
    }
163
164
43.2k
    SetDescription(pszName);
165
43.2k
    return bRet;
166
43.2k
}
167
168
/************************************************************************/
169
/*                          TranslateFeature()                          */
170
/*                                                                      */
171
/*      Translate the AVC structure for a feature to the                */
172
/*      corresponding OGR definition.  It is assumed that the passed    */
173
/*      in feature is of a type matching the section type               */
174
/*      established by SetupFeatureDefinition().                        */
175
/************************************************************************/
176
177
OGRFeature *OGRAVCLayer::TranslateFeature(void *pAVCFeature)
178
179
259k
{
180
259k
    m_nFeaturesRead++;
181
182
259k
    switch (eSectionType)
183
259k
    {
184
            /* ====================================================================
185
             */
186
            /*      ARC */
187
            /* ====================================================================
188
             */
189
78.3k
        case AVCFileARC:
190
78.3k
        {
191
78.3k
            AVCArc *psArc = static_cast<AVCArc *>(pAVCFeature);
192
193
            /* --------------------------------------------------------------------
194
             */
195
            /*      Create feature. */
196
            /* --------------------------------------------------------------------
197
             */
198
78.3k
            OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
199
78.3k
            poOGRFeature->SetFID(psArc->nArcId);
200
201
            /* --------------------------------------------------------------------
202
             */
203
            /*      Apply the line geometry. */
204
            /* --------------------------------------------------------------------
205
             */
206
78.3k
            OGRLineString *poLine = new OGRLineString();
207
208
78.3k
            poLine->setNumPoints(psArc->numVertices);
209
1.06M
            for (int iVert = 0; iVert < psArc->numVertices; iVert++)
210
982k
                poLine->setPoint(iVert, psArc->pasVertices[iVert].x,
211
982k
                                 psArc->pasVertices[iVert].y);
212
213
78.3k
            poLine->assignSpatialReference(GetSpatialRef());
214
78.3k
            poOGRFeature->SetGeometryDirectly(poLine);
215
216
            /* --------------------------------------------------------------------
217
             */
218
            /*      Apply attributes. */
219
            /* --------------------------------------------------------------------
220
             */
221
78.3k
            poOGRFeature->SetField(0, psArc->nUserId);
222
78.3k
            poOGRFeature->SetField(1, psArc->nFNode);
223
78.3k
            poOGRFeature->SetField(2, psArc->nTNode);
224
78.3k
            poOGRFeature->SetField(3, psArc->nLPoly);
225
78.3k
            poOGRFeature->SetField(4, psArc->nRPoly);
226
78.3k
            return poOGRFeature;
227
0
        }
228
229
            /* ====================================================================
230
             */
231
            /*      PAL (Polygon) */
232
            /*      RPL (Region) */
233
            /* ====================================================================
234
             */
235
13.1k
        case AVCFilePAL:
236
28.0k
        case AVCFileRPL:
237
28.0k
        {
238
28.0k
            AVCPal *psPAL = static_cast<AVCPal *>(pAVCFeature);
239
240
            /* --------------------------------------------------------------------
241
             */
242
            /*      Create feature. */
243
            /* --------------------------------------------------------------------
244
             */
245
28.0k
            OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
246
28.0k
            poOGRFeature->SetFID(psPAL->nPolyId);
247
248
            /* --------------------------------------------------------------------
249
             */
250
            /*      Apply attributes. */
251
            /* --------------------------------------------------------------------
252
             */
253
            // Setup ArcId list.
254
28.0k
            int *panArcs =
255
28.0k
                static_cast<int *>(CPLMalloc(sizeof(int) * psPAL->numArcs));
256
227k
            for (int i = 0; i < psPAL->numArcs; i++)
257
199k
                panArcs[i] = psPAL->pasArcs[i].nArcId;
258
28.0k
            poOGRFeature->SetField(0, psPAL->numArcs, panArcs);
259
28.0k
            CPLFree(panArcs);
260
261
28.0k
            return poOGRFeature;
262
13.1k
        }
263
264
            /* ====================================================================
265
             */
266
            /*      CNT (Centroid) */
267
            /* ====================================================================
268
             */
269
26.6k
        case AVCFileCNT:
270
26.6k
        {
271
26.6k
            AVCCnt *psCNT = (AVCCnt *)pAVCFeature;
272
273
            /* --------------------------------------------------------------------
274
             */
275
            /*      Create feature. */
276
            /* --------------------------------------------------------------------
277
             */
278
26.6k
            OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
279
26.6k
            poOGRFeature->SetFID(psCNT->nPolyId);
280
281
            /* --------------------------------------------------------------------
282
             */
283
            /*      Apply Geometry */
284
            /* --------------------------------------------------------------------
285
             */
286
26.6k
            OGRPoint *poPoint = new OGRPoint(psCNT->sCoord.x, psCNT->sCoord.y);
287
26.6k
            poPoint->assignSpatialReference(GetSpatialRef());
288
26.6k
            poOGRFeature->SetGeometryDirectly(poPoint);
289
290
            /* --------------------------------------------------------------------
291
             */
292
            /*      Apply attributes. */
293
            /* --------------------------------------------------------------------
294
             */
295
26.6k
            poOGRFeature->SetField(0, psCNT->numLabels, psCNT->panLabelIds);
296
297
26.6k
            return poOGRFeature;
298
13.1k
        }
299
300
            /* ====================================================================
301
             */
302
            /*      LAB (Label) */
303
            /* ====================================================================
304
             */
305
119k
        case AVCFileLAB:
306
119k
        {
307
119k
            AVCLab *psLAB = static_cast<AVCLab *>(pAVCFeature);
308
309
            /* --------------------------------------------------------------------
310
             */
311
            /*      Create feature. */
312
            /* --------------------------------------------------------------------
313
             */
314
119k
            OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
315
119k
            poOGRFeature->SetFID(psLAB->nValue);
316
317
            /* --------------------------------------------------------------------
318
             */
319
            /*      Apply Geometry */
320
            /* --------------------------------------------------------------------
321
             */
322
119k
            OGRPoint *poPoint =
323
119k
                new OGRPoint(psLAB->sCoord1.x, psLAB->sCoord1.y);
324
119k
            poPoint->assignSpatialReference(GetSpatialRef());
325
119k
            poOGRFeature->SetGeometryDirectly(poPoint);
326
327
            /* --------------------------------------------------------------------
328
             */
329
            /*      Apply attributes. */
330
            /* --------------------------------------------------------------------
331
             */
332
119k
            poOGRFeature->SetField(0, psLAB->nValue);
333
119k
            poOGRFeature->SetField(1, psLAB->nPolyId);
334
335
119k
            return poOGRFeature;
336
13.1k
        }
337
338
            /* ====================================================================
339
             */
340
            /*      TXT/TX6 (Text) */
341
            /* ====================================================================
342
             */
343
2.44k
        case AVCFileTXT:
344
6.04k
        case AVCFileTX6:
345
6.04k
        {
346
6.04k
            AVCTxt *psTXT = static_cast<AVCTxt *>(pAVCFeature);
347
348
            /* --------------------------------------------------------------------
349
             */
350
            /*      Create feature. */
351
            /* --------------------------------------------------------------------
352
             */
353
6.04k
            OGRFeature *poOGRFeature = new OGRFeature(GetLayerDefn());
354
6.04k
            poOGRFeature->SetFID(psTXT->nTxtId);
355
356
            /* --------------------------------------------------------------------
357
             */
358
            /*      Apply Geometry */
359
            /* --------------------------------------------------------------------
360
             */
361
6.04k
            if (psTXT->numVerticesLine > 0)
362
424
            {
363
424
                OGRPoint *poPoint = new OGRPoint(psTXT->pasVertices[0].x,
364
424
                                                 psTXT->pasVertices[0].y);
365
424
                poPoint->assignSpatialReference(GetSpatialRef());
366
424
                poOGRFeature->SetGeometryDirectly(poPoint);
367
424
            }
368
369
            /* --------------------------------------------------------------------
370
             */
371
            /*      Apply attributes. */
372
            /* --------------------------------------------------------------------
373
             */
374
6.04k
            poOGRFeature->SetField(0, psTXT->nUserId);
375
6.04k
            poOGRFeature->SetField(1, reinterpret_cast<char *>(psTXT->pszText));
376
6.04k
            poOGRFeature->SetField(2, psTXT->dHeight);
377
6.04k
            poOGRFeature->SetField(3, psTXT->nLevel);
378
379
6.04k
            return poOGRFeature;
380
2.44k
        }
381
382
0
        default:
383
0
            return nullptr;
384
259k
    }
385
259k
}
386
387
/************************************************************************/
388
/*                        MatchesSpatialFilter()                        */
389
/************************************************************************/
390
391
bool OGRAVCLayer::MatchesSpatialFilter(void *pFeature)
392
393
184k
{
394
184k
    if (m_poFilterGeom == nullptr)
395
184k
        return true;
396
397
0
    switch (eSectionType)
398
0
    {
399
            /* ====================================================================
400
             */
401
            /*      ARC */
402
            /*                                                                      */
403
            /*      Check each line segment for possible intersection. */
404
            /* ====================================================================
405
             */
406
0
        case AVCFileARC:
407
0
        {
408
0
            AVCArc *psArc = static_cast<AVCArc *>(pFeature);
409
410
0
            for (int iVert = 0; iVert < psArc->numVertices - 1; iVert++)
411
0
            {
412
0
                AVCVertex *psV1 = psArc->pasVertices + iVert;
413
0
                AVCVertex *psV2 = psArc->pasVertices + iVert + 1;
414
415
0
                if ((psV1->x < m_sFilterEnvelope.MinX &&
416
0
                     psV2->x < m_sFilterEnvelope.MinX) ||
417
0
                    (psV1->x > m_sFilterEnvelope.MaxX &&
418
0
                     psV2->x > m_sFilterEnvelope.MaxX) ||
419
0
                    (psV1->y < m_sFilterEnvelope.MinY &&
420
0
                     psV2->y < m_sFilterEnvelope.MinY) ||
421
0
                    (psV1->y > m_sFilterEnvelope.MaxY &&
422
0
                     psV2->y > m_sFilterEnvelope.MaxY))
423
0
                    /* This segment is completely outside extents */;
424
0
                else
425
0
                    return true;
426
0
            }
427
428
0
            return false;
429
0
        }
430
431
            /* ====================================================================
432
             */
433
            /*      PAL (Polygon) */
434
            /*      RPL (Region) */
435
            /*                                                                      */
436
            /*      Check against the polygon bounds stored in the PAL. */
437
            /* ====================================================================
438
             */
439
0
        case AVCFilePAL:
440
0
        case AVCFileRPL:
441
0
        {
442
0
            AVCPal *psPAL = (AVCPal *)pFeature;
443
444
0
            if (psPAL->sMin.x > m_sFilterEnvelope.MaxX ||
445
0
                psPAL->sMax.x < m_sFilterEnvelope.MinX ||
446
0
                psPAL->sMin.y > m_sFilterEnvelope.MaxY ||
447
0
                psPAL->sMax.y < m_sFilterEnvelope.MinY)
448
0
                return false;
449
0
            else
450
0
                return true;
451
0
        }
452
453
            /* ====================================================================
454
             */
455
            /*      CNT (Centroid) */
456
            /* ====================================================================
457
             */
458
0
        case AVCFileCNT:
459
0
        {
460
0
            AVCCnt *psCNT = static_cast<AVCCnt *>(pFeature);
461
462
0
            if (psCNT->sCoord.x < m_sFilterEnvelope.MinX ||
463
0
                psCNT->sCoord.x > m_sFilterEnvelope.MaxX ||
464
0
                psCNT->sCoord.y < m_sFilterEnvelope.MinY ||
465
0
                psCNT->sCoord.y > m_sFilterEnvelope.MaxY)
466
0
                return false;
467
0
            else
468
0
                return true;
469
0
        }
470
471
            /* ====================================================================
472
             */
473
            /*      LAB (Label) */
474
            /* ====================================================================
475
             */
476
0
        case AVCFileLAB:
477
0
        {
478
0
            AVCLab *psLAB = (AVCLab *)pFeature;
479
480
0
            if (psLAB->sCoord1.x < m_sFilterEnvelope.MinX ||
481
0
                psLAB->sCoord1.x > m_sFilterEnvelope.MaxX ||
482
0
                psLAB->sCoord1.y < m_sFilterEnvelope.MinY ||
483
0
                psLAB->sCoord1.y > m_sFilterEnvelope.MaxY)
484
0
                return false;
485
0
            else
486
0
                return true;
487
0
        }
488
489
            /* ====================================================================
490
             */
491
            /*      TXT/TX6 (Text) */
492
            /* ====================================================================
493
             */
494
0
        case AVCFileTXT:
495
0
        case AVCFileTX6:
496
0
        {
497
0
            AVCTxt *psTXT = static_cast<AVCTxt *>(pFeature);
498
499
0
            if (psTXT->numVerticesLine == 0)
500
0
                return true;
501
502
0
            if (psTXT->pasVertices[0].x < m_sFilterEnvelope.MinX ||
503
0
                psTXT->pasVertices[0].x > m_sFilterEnvelope.MaxX ||
504
0
                psTXT->pasVertices[0].y < m_sFilterEnvelope.MinY ||
505
0
                psTXT->pasVertices[0].y > m_sFilterEnvelope.MaxY)
506
0
                return false;
507
508
0
            return true;
509
0
        }
510
511
0
        default:
512
0
            return true;
513
0
    }
514
0
}
515
516
/************************************************************************/
517
/*                       AppendTableDefinition()                        */
518
/*                                                                      */
519
/*      Add fields to this layers feature definition based on the       */
520
/*      definition from the coverage.                                   */
521
/************************************************************************/
522
523
bool OGRAVCLayer::AppendTableDefinition(AVCTableDef *psTableDef)
524
525
5.08k
{
526
30.3k
    for (int iField = 0; iField < psTableDef->numFields; iField++)
527
25.2k
    {
528
25.2k
        AVCFieldInfo *psFInfo = psTableDef->pasFieldDef + iField;
529
25.2k
        char szFieldName[128];
530
531
        /* Strip off white space */
532
25.2k
        strcpy(szFieldName, psFInfo->szName);
533
25.2k
        if (strstr(szFieldName, " ") != nullptr)
534
12.1k
            *(strstr(szFieldName, " ")) = '\0';
535
536
25.2k
        OGRFieldDefn oFDefn(szFieldName, OFTInteger);
537
538
25.2k
        if (psFInfo->nIndex < 0)
539
0
            continue;
540
541
        // Skip FNODE#, TNODE#, LPOLY# and RPOLY# from AAT table.
542
25.2k
        if (eSectionType == AVCFileARC && iField < 4)
543
2.24k
            continue;
544
545
22.9k
        oFDefn.SetWidth(psFInfo->nFmtWidth);
546
547
22.9k
        if (psFInfo->nType1 * 10 == AVC_FT_DATE ||
548
21.9k
            psFInfo->nType1 * 10 == AVC_FT_CHAR)
549
11.9k
            oFDefn.SetType(OFTString);
550
551
11.0k
        else if (psFInfo->nType1 * 10 == AVC_FT_FIXINT ||
552
9.32k
                 psFInfo->nType1 * 10 == AVC_FT_BININT)
553
3.36k
            oFDefn.SetType(OFTInteger);
554
555
7.66k
        else if (psFInfo->nType1 * 10 == AVC_FT_FIXNUM ||
556
3.72k
                 psFInfo->nType1 * 10 == AVC_FT_BINFLOAT)
557
6.03k
        {
558
6.03k
            oFDefn.SetType(OFTReal);
559
6.03k
            if (psFInfo->nFmtPrec > 0)
560
3.54k
                oFDefn.SetPrecision(psFInfo->nFmtPrec);
561
6.03k
        }
562
563
22.9k
        poFeatureDefn->AddFieldDefn(&oFDefn);
564
22.9k
    }
565
5.08k
    return TRUE;
566
5.08k
}
567
568
/************************************************************************/
569
/*                        TranslateTableFields()                        */
570
/************************************************************************/
571
572
bool OGRAVCLayer::TranslateTableFields(OGRFeature *poFeature, int nFieldBase,
573
                                       AVCTableDef *psTableDef,
574
                                       AVCField *pasFields)
575
576
69.5k
{
577
69.5k
    int iOutField = nFieldBase;
578
579
326k
    for (int iField = 0; iField < psTableDef->numFields; iField++)
580
256k
    {
581
256k
        AVCFieldInfo *psFInfo = psTableDef->pasFieldDef + iField;
582
256k
        int nType = psFInfo->nType1 * 10;
583
584
256k
        if (psFInfo->nIndex < 0)
585
0
            continue;
586
587
        // Skip FNODE#, TNODE#, LPOLY# and RPOLY# from AAT table.
588
256k
        if (eSectionType == AVCFileARC && iField < 4)
589
3.06k
            continue;
590
591
253k
        if (nType == AVC_FT_DATE || nType == AVC_FT_CHAR ||
592
190k
            nType == AVC_FT_FIXINT || nType == AVC_FT_FIXNUM)
593
224k
        {
594
224k
            if (nType == AVC_FT_CHAR)
595
55.8k
            {
596
                /* Remove trailing spaces in char fields */
597
55.8k
                size_t nLen =
598
55.8k
                    strlen(reinterpret_cast<char *>(pasFields[iField].pszStr));
599
77.4k
                while (nLen > 0 && pasFields[iField].pszStr[nLen - 1] == ' ')
600
21.6k
                    nLen--;
601
55.8k
                pasFields[iField].pszStr[nLen] = '\0';
602
55.8k
            }
603
224k
            poFeature->SetField(iOutField++, reinterpret_cast<char *>(
604
224k
                                                 pasFields[iField].pszStr));
605
224k
        }
606
28.9k
        else if (nType == AVC_FT_BININT && psFInfo->nSize == 4)
607
11.6k
        {
608
11.6k
            poFeature->SetField(iOutField++, pasFields[iField].nInt32);
609
11.6k
        }
610
17.3k
        else if (nType == AVC_FT_BININT && psFInfo->nSize == 2)
611
1.33k
        {
612
1.33k
            poFeature->SetField(iOutField++, pasFields[iField].nInt16);
613
1.33k
        }
614
15.9k
        else if (nType == AVC_FT_BINFLOAT && psFInfo->nSize == 4)
615
12.4k
        {
616
12.4k
            poFeature->SetField(iOutField++, pasFields[iField].fFloat);
617
12.4k
        }
618
3.51k
        else if (nType == AVC_FT_BINFLOAT && psFInfo->nSize == 8)
619
3.51k
        {
620
3.51k
            poFeature->SetField(iOutField++, pasFields[iField].dDouble);
621
3.51k
        }
622
0
        else
623
0
        {
624
0
            CPLAssert(false);
625
0
            return false;
626
0
        }
627
253k
    }
628
629
69.5k
    return true;
630
69.5k
}