Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL Utilities 4 : * Purpose: Common utility routines 5 : * Author: Even Rouault, <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2011-2012, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "commonutils.h" 14 : 15 : #include <cstdio> 16 : #include <cstring> 17 : 18 : #include <string> 19 : 20 : #include "cpl_conv.h" 21 : #include "cpl_string.h" 22 : #include "gdal.h" 23 : 24 : /* -------------------------------------------------------------------- */ 25 : /* GetOutputDriversFor() */ 26 : /* -------------------------------------------------------------------- */ 27 : 28 338 : std::vector<std::string> GetOutputDriversFor(const char *pszDestFilename, 29 : int nFlagRasterVector) 30 : { 31 676 : return CPLStringList(GDALGetOutputDriversForDatasetName( 32 : pszDestFilename, nFlagRasterVector, /* bSingleMatch = */ false, 33 676 : /* bEmitWarning = */ false)); 34 : } 35 : 36 : /* -------------------------------------------------------------------- */ 37 : /* GetOutputDriverForRaster() */ 38 : /* -------------------------------------------------------------------- */ 39 : 40 1851 : CPLString GetOutputDriverForRaster(const char *pszDestFilename) 41 : { 42 : const CPLStringList aosList(GDALGetOutputDriversForDatasetName( 43 : pszDestFilename, GDAL_OF_RASTER, /* bSingleMatch = */ true, 44 3702 : /* bEmitWarning = */ true)); 45 1851 : if (!aosList.empty()) 46 : { 47 1851 : CPLDebug("GDAL", "Using %s driver", aosList[0]); 48 1851 : return aosList[0]; 49 : } 50 0 : return CPLString(); 51 : } 52 : 53 : /* -------------------------------------------------------------------- */ 54 : /* EarlySetConfigOptions() */ 55 : /* -------------------------------------------------------------------- */ 56 : 57 954 : void EarlySetConfigOptions(int argc, char **argv) 58 : { 59 : // Must process some config options before GDALAllRegister() or 60 : // OGRRegisterAll(), but we can't call GDALGeneralCmdLineProcessor() or 61 : // OGRGeneralCmdLineProcessor(), because it needs the drivers to be 62 : // registered for the --format or --formats options. 63 6137 : for (int i = 1; i < argc; i++) 64 : { 65 5183 : if (EQUAL(argv[i], "--config") && i + 2 < argc) 66 : { 67 31 : CPLSetConfigOption(argv[i + 1], argv[i + 2]); 68 : 69 31 : i += 2; 70 : } 71 5152 : else if (EQUAL(argv[i], "--debug") && i + 1 < argc) 72 : { 73 7 : CPLSetConfigOption("CPL_DEBUG", argv[i + 1]); 74 7 : i += 1; 75 : } 76 : } 77 954 : } 78 : 79 : /************************************************************************/ 80 : /* GDALRemoveBOM() */ 81 : /************************************************************************/ 82 : 83 : /* Remove potential UTF-8 BOM from data (must be NUL terminated) */ 84 6 : void GDALRemoveBOM(GByte *pabyData) 85 : { 86 6 : if (pabyData[0] == 0xEF && pabyData[1] == 0xBB && pabyData[2] == 0xBF) 87 : { 88 1 : memmove(pabyData, pabyData + 3, 89 1 : strlen(reinterpret_cast<char *>(pabyData) + 3) + 1); 90 : } 91 6 : } 92 : 93 : /************************************************************************/ 94 : /* GDALRemoveSQLComments() */ 95 : /************************************************************************/ 96 : 97 5 : std::string GDALRemoveSQLComments(const std::string &osInput) 98 : { 99 : const CPLStringList aosLines( 100 10 : CSLTokenizeStringComplex(osInput.c_str(), "\r\n", FALSE, FALSE)); 101 5 : std::string osSQL; 102 20 : for (const char *pszLine : aosLines) 103 : { 104 15 : char chQuote = 0; 105 15 : int i = 0; 106 173 : for (; pszLine[i] != '\0'; ++i) 107 : { 108 166 : if (chQuote) 109 : { 110 12 : if (pszLine[i] == chQuote) 111 : { 112 4 : if (pszLine[i + 1] == chQuote) 113 : { 114 2 : i++; 115 : } 116 : else 117 : { 118 2 : chQuote = 0; 119 : } 120 : } 121 : } 122 154 : else if (pszLine[i] == '\'' || pszLine[i] == '"') 123 : { 124 2 : chQuote = pszLine[i]; 125 : } 126 152 : else if (pszLine[i] == '-' && pszLine[i + 1] == '-') 127 : { 128 8 : break; 129 : } 130 : } 131 15 : if (i > 0) 132 : { 133 9 : osSQL.append(pszLine, i); 134 : } 135 15 : osSQL += ' '; 136 : } 137 10 : return osSQL; 138 : } 139 : 140 : /************************************************************************/ 141 : /* ArgIsNumeric() */ 142 : /************************************************************************/ 143 : 144 205 : int ArgIsNumeric(const char *pszArg) 145 : 146 : { 147 205 : return CPLGetValueType(pszArg) != CPL_VALUE_STRING; 148 : }