LCOV - code coverage report
Current view: top level - frmts/pcidsk/sdk/core - pcidsk_scanint.h (source / functions) Hit Total Coverage
Test: gdal_filtered.info Lines: 48 63 76.2 %
Date: 2024-11-21 22:18:42 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /******************************************************************************
       2             :  *
       3             :  * Purpose:  Functions to convert an ascii string to an integer value.
       4             :  *
       5             :  ******************************************************************************
       6             :  * Copyright (c) 2011
       7             :  * PCI Geomatics, 90 Allstate Parkway, Markham, Ontario, Canada.
       8             :  *
       9             :  * SPDX-License-Identifier: MIT
      10             :  ****************************************************************************/
      11             : 
      12             : #ifndef PCIDSK_SCANINT_H
      13             : #define PCIDSK_SCANINT_H
      14             : 
      15             : #include "pcidsk_config.h"
      16             : #include <cassert>
      17             : #include <cmath>
      18             : 
      19             : namespace PCIDSK
      20             : {
      21             : 
      22             : extern const int16 ganCharTo1[256];
      23             : extern const int16 ganCharTo10[256];
      24             : extern const int16 ganCharTo100[256];
      25             : extern const int16 ganCharTo1000[256];
      26             : extern const int32 ganCharTo10000[256];
      27             : extern const int32 ganCharTo100000[256];
      28             : extern const int32 ganCharTo1000000[256];
      29             : extern const int32 ganCharTo10000000[256];
      30             : extern const int32 ganCharTo100000000[256];
      31             : extern const int64 ganCharTo1000000000[256];
      32             : extern const int64 ganCharTo10000000000[256];
      33             : extern const int64 ganCharTo100000000000[256];
      34             : 
      35             : inline int16 ScanInt1(const uint8 * string)
      36             : {
      37             :     if (*string != '-')
      38             :     {
      39             :         int16 nValue =
      40             :             (ganCharTo1 [*(string)]);
      41             : 
      42             :         return nValue;
      43             :     }
      44             :     else
      45             :     {
      46             :         return 0;
      47             :     }
      48             : }
      49             : 
      50             : inline int16 ScanInt2(const uint8 * string)
      51             : {
      52             :     if (*string != '-')
      53             :     {
      54             :         int16 nValue =
      55             :             (ganCharTo10[*(string    )] +
      56             :              ganCharTo1 [*(string + 1)]);
      57             : 
      58             :         return nValue;
      59             :     }
      60             :     else
      61             :     {
      62             :         return ganCharTo1[*(string + 1)] * -1;
      63             :     }
      64             : }
      65             : 
      66          24 : inline int16 ScanInt3(const uint8 * string)
      67             : {
      68          24 :     int16 nValue =
      69          24 :         (ganCharTo100[*(string    )] +
      70          24 :          ganCharTo10 [*(string + 1)] +
      71          24 :          ganCharTo1  [*(string + 2)]);
      72             : 
      73          24 :     if (nValue < 0)
      74             :     {
      75           0 :         const uint8 * pbyIter = string;
      76           0 :         while (*pbyIter != '-')
      77           0 :             ++pbyIter;
      78           0 :         return (int16) -std::pow((double) 10,
      79           0 :                                  2 - (int) (pbyIter - string)) - nValue;
      80             :     }
      81             : 
      82          24 :     return nValue;
      83             : }
      84             : 
      85         102 : inline int16 ScanInt4(const uint8 * string)
      86             : {
      87         102 :     int16 nValue =
      88         102 :         (ganCharTo1000[*(string    )] +
      89         102 :          ganCharTo100 [*(string + 1)] +
      90         102 :          ganCharTo10  [*(string + 2)] +
      91         102 :          ganCharTo1   [*(string + 3)]);
      92             : 
      93         102 :     if (nValue < 0)
      94             :     {
      95           0 :         const uint8 * pbyIter = string;
      96           0 :         while (*pbyIter != '-')
      97           0 :             ++pbyIter;
      98           0 :         return (int16) -std::pow((double) 10,
      99           0 :                                  3 - (int) (pbyIter - string)) - nValue;
     100             :     }
     101             : 
     102         102 :     return nValue;
     103             : }
     104             : 
     105             : inline int32 ScanInt5(const uint8 * string)
     106             : {
     107             :     int32 nValue =
     108             :         (ganCharTo10000[*(string    )] +
     109             :          ganCharTo1000 [*(string + 1)] +
     110             :          ganCharTo100  [*(string + 2)] +
     111             :          ganCharTo10   [*(string + 3)] +
     112             :          ganCharTo1    [*(string + 4)]);
     113             : 
     114             :     if (nValue < 0)
     115             :     {
     116             :         const uint8 * pbyIter = string;
     117             :         while (*pbyIter != '-')
     118             :             ++pbyIter;
     119             :         return (int32) -std::pow((double) 10,
     120             :                                  4 - (int) (pbyIter - string)) - nValue;
     121             :     }
     122             : 
     123             :     return nValue;
     124             : }
     125             : 
     126             : inline int32 ScanInt6(const uint8 * string)
     127             : {
     128             :     int32 nValue =
     129             :         (ganCharTo100000[*(string    )] +
     130             :          ganCharTo10000 [*(string + 1)] +
     131             :          ganCharTo1000  [*(string + 2)] +
     132             :          ganCharTo100   [*(string + 3)] +
     133             :          ganCharTo10    [*(string + 4)] +
     134             :          ganCharTo1     [*(string + 5)]);
     135             : 
     136             :     if (nValue < 0)
     137             :     {
     138             :         const uint8 * pbyIter = string;
     139             :         while (*pbyIter != '-')
     140             :             ++pbyIter;
     141             :         return (int32) -std::pow((double) 10,
     142             :                                  5 - (int) (pbyIter - string)) - nValue;
     143             :     }
     144             : 
     145             :     return nValue;
     146             : }
     147             : 
     148             : inline int32 ScanInt7(const uint8 * string)
     149             : {
     150             :     int32 nValue =
     151             :         (ganCharTo1000000[*(string    )] +
     152             :          ganCharTo100000 [*(string + 1)] +
     153             :          ganCharTo10000  [*(string + 2)] +
     154             :          ganCharTo1000   [*(string + 3)] +
     155             :          ganCharTo100    [*(string + 4)] +
     156             :          ganCharTo10     [*(string + 5)] +
     157             :          ganCharTo1      [*(string + 6)]);
     158             : 
     159             :     if (nValue < 0)
     160             :     {
     161             :         const uint8 * pbyIter = string;
     162             :         while (*pbyIter != '-')
     163             :             ++pbyIter;
     164             :         return (int32) -std::pow((double) 10,
     165             :                                  6 - (int) (pbyIter - string)) - nValue;
     166             :     }
     167             : 
     168             :     return nValue;
     169             : }
     170             : 
     171         248 : inline int32 ScanInt8(const uint8 * string)
     172             : {
     173         248 :     int32 nValue =
     174         248 :         (ganCharTo10000000[*(string    )] +
     175         248 :          ganCharTo1000000 [*(string + 1)] +
     176         248 :          ganCharTo100000  [*(string + 2)] +
     177         248 :          ganCharTo10000   [*(string + 3)] +
     178         248 :          ganCharTo1000    [*(string + 4)] +
     179         248 :          ganCharTo100     [*(string + 5)] +
     180         248 :          ganCharTo10      [*(string + 6)] +
     181         248 :          ganCharTo1       [*(string + 7)]);
     182             : 
     183         248 :     if (nValue < 0)
     184             :     {
     185          10 :         const uint8 * pbyIter = string;
     186          70 :         while (*pbyIter != '-')
     187          60 :             ++pbyIter;
     188          20 :         return (int32) -std::pow((double) 10,
     189          10 :                                  7 - (int) (pbyIter - string)) - nValue;
     190             :     }
     191             : 
     192         238 :     return nValue;
     193             : }
     194             : 
     195             : inline int32 ScanInt9(const uint8 * string)
     196             : {
     197             :     int32 nValue =
     198             :         (ganCharTo100000000[*(string    )] +
     199             :          ganCharTo10000000 [*(string + 1)] +
     200             :          ganCharTo1000000  [*(string + 2)] +
     201             :          ganCharTo100000   [*(string + 3)] +
     202             :          ganCharTo10000    [*(string + 4)] +
     203             :          ganCharTo1000     [*(string + 5)] +
     204             :          ganCharTo100      [*(string + 6)] +
     205             :          ganCharTo10       [*(string + 7)] +
     206             :          ganCharTo1        [*(string + 8)]);
     207             : 
     208             :     if (nValue < 0)
     209             :     {
     210             :         const uint8 * pbyIter = string;
     211             :         while (*pbyIter != '-')
     212             :             ++pbyIter;
     213             :         return (int32) -std::pow((double) 10,
     214             :                                  8 - (int) (pbyIter - string)) - nValue;
     215             :     }
     216             : 
     217             :     return nValue;
     218             : }
     219             : 
     220             : inline int64 ScanInt10(const uint8 * string)
     221             : {
     222             :     int64 nValue =
     223             :         (ganCharTo1000000000[*(string    )] +
     224             :          ganCharTo100000000 [*(string + 1)] +
     225             :          ganCharTo10000000  [*(string + 2)] +
     226             :          ganCharTo1000000   [*(string + 3)] +
     227             :          ganCharTo100000    [*(string + 4)] +
     228             :          ganCharTo10000     [*(string + 5)] +
     229             :          ganCharTo1000      [*(string + 6)] +
     230             :          ganCharTo100       [*(string + 7)] +
     231             :          ganCharTo10        [*(string + 8)] +
     232             :          ganCharTo1         [*(string + 9)]);
     233             : 
     234             :     if (nValue < 0)
     235             :     {
     236             :         const uint8 * pbyIter = string;
     237             :         while (*pbyIter != '-')
     238             :             ++pbyIter;
     239             :         return (int64) -std::pow((double) 10,
     240             :                                  9 - (int) (pbyIter - string)) - nValue;
     241             :     }
     242             : 
     243             :     return nValue;
     244             : }
     245             : 
     246             : inline int64 ScanInt11(const uint8 * string)
     247             : {
     248             :     int64 nValue =
     249             :         (ganCharTo10000000000[*(string    )] +
     250             :          ganCharTo1000000000 [*(string + 1)] +
     251             :          ganCharTo100000000  [*(string + 2)] +
     252             :          ganCharTo10000000   [*(string + 3)] +
     253             :          ganCharTo1000000    [*(string + 4)] +
     254             :          ganCharTo100000     [*(string + 5)] +
     255             :          ganCharTo10000      [*(string + 6)] +
     256             :          ganCharTo1000       [*(string + 7)] +
     257             :          ganCharTo100        [*(string + 8)] +
     258             :          ganCharTo10         [*(string + 9)] +
     259             :          ganCharTo1          [*(string + 10)]);
     260             : 
     261             :     if (nValue < 0)
     262             :     {
     263             :         const uint8 * pbyIter = string;
     264             :         while (*pbyIter != '-')
     265             :             ++pbyIter;
     266             :         return (int64) -std::pow((double) 10,
     267             :                                  10 - (int) (pbyIter - string)) - nValue;
     268             :     }
     269             : 
     270             :     return nValue;
     271             : }
     272             : 
     273          26 : inline int64 ScanInt12(const uint8 * string)
     274             : {
     275          26 :     int64 nValue =
     276          26 :         (ganCharTo100000000000[*(string    )] +
     277          26 :          ganCharTo10000000000 [*(string + 1)] +
     278          26 :          ganCharTo1000000000  [*(string + 2)] +
     279          26 :          ganCharTo100000000   [*(string + 3)] +
     280          26 :          ganCharTo10000000    [*(string + 4)] +
     281          26 :          ganCharTo1000000     [*(string + 5)] +
     282          26 :          ganCharTo100000      [*(string + 6)] +
     283          26 :          ganCharTo10000       [*(string + 7)] +
     284          26 :          ganCharTo1000        [*(string + 8)] +
     285          26 :          ganCharTo100         [*(string + 9)] +
     286          26 :          ganCharTo10          [*(string + 10)] +
     287          26 :          ganCharTo1           [*(string + 11)]);
     288             : 
     289          26 :     if (nValue < 0)
     290             :     {
     291           0 :         const uint8 * pbyIter = string;
     292           0 :         while (*pbyIter != '-')
     293           0 :             ++pbyIter;
     294           0 :         return (int64) -std::pow((double) 10,
     295           0 :                                  11 - (int) (pbyIter - string)) - nValue;
     296             :     }
     297             : 
     298          26 :     return nValue;
     299             : }
     300             : 
     301             : } // namespace PCIDSK
     302             : 
     303             : #endif

Generated by: LCOV version 1.14