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 373 : std::vector<std::string> GetOutputDriversFor(const char *pszDestFilename, 29 : int nFlagRasterVector) 30 : { 31 746 : return CPLStringList(GDALGetOutputDriversForDatasetName( 32 : pszDestFilename, nFlagRasterVector, /* bSingleMatch = */ false, 33 746 : /* bEmitWarning = */ false)); 34 : } 35 : 36 : /* -------------------------------------------------------------------- */ 37 : /* GetOutputDriverForRaster() */ 38 : /* -------------------------------------------------------------------- */ 39 : 40 1890 : CPLString GetOutputDriverForRaster(const char *pszDestFilename) 41 : { 42 : const CPLStringList aosList(GDALGetOutputDriversForDatasetName( 43 : pszDestFilename, GDAL_OF_RASTER, /* bSingleMatch = */ true, 44 3780 : /* bEmitWarning = */ true)); 45 1890 : if (!aosList.empty()) 46 : { 47 1890 : CPLDebug("GDAL", "Using %s driver", aosList[0]); 48 1890 : return aosList[0]; 49 : } 50 0 : return CPLString(); 51 : } 52 : 53 : /* -------------------------------------------------------------------- */ 54 : /* EarlySetConfigOptions() */ 55 : /* -------------------------------------------------------------------- */ 56 : 57 968 : 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 : 64 : // Start with --debug, so that "my_command --config UNKNOWN_CONFIG_OPTION --debug on" 65 : // detects and warns about a unknown config option. 66 6174 : for (int i = 1; i < argc; i++) 67 : { 68 5207 : if (EQUAL(argv[i], "--config") && i + 1 < argc) 69 : { 70 34 : const char *pszArg = argv[i + 1]; 71 34 : if (strchr(pszArg, '=') != nullptr) 72 : { 73 2 : char *pszKey = nullptr; 74 2 : const char *pszValue = CPLParseNameValue(pszArg, &pszKey); 75 2 : if (pszKey && EQUAL(pszKey, "CPL_DEBUG") && pszValue) 76 : { 77 0 : CPLSetConfigOption(pszKey, pszValue); 78 : } 79 2 : CPLFree(pszKey); 80 2 : ++i; 81 : } 82 : else 83 : { 84 32 : if (i + 2 >= argc) 85 : { 86 1 : CPLError(CE_Failure, CPLE_AppDefined, 87 : "--config option given without a key and value " 88 : "argument."); 89 1 : return; 90 : } 91 : 92 31 : if (EQUAL(argv[i + 1], "CPL_DEBUG")) 93 : { 94 0 : CPLSetConfigOption(argv[i + 1], argv[i + 2]); 95 : } 96 : 97 31 : i += 2; 98 33 : } 99 : } 100 5173 : else if (EQUAL(argv[i], "--debug") && i + 1 < argc) 101 : { 102 7 : CPLSetConfigOption("CPL_DEBUG", argv[i + 1]); 103 7 : i += 1; 104 : } 105 : } 106 6180 : for (int i = 1; i < argc; i++) 107 : { 108 5213 : if (EQUAL(argv[i], "--config") && i + 1 < argc) 109 : { 110 33 : const char *pszArg = argv[i + 1]; 111 33 : if (strchr(pszArg, '=') != nullptr) 112 : { 113 2 : char *pszKey = nullptr; 114 2 : const char *pszValue = CPLParseNameValue(pszArg, &pszKey); 115 2 : if (pszKey && !EQUAL(pszKey, "CPL_DEBUG") && pszValue) 116 : { 117 2 : CPLSetConfigOption(pszKey, pszValue); 118 : } 119 2 : CPLFree(pszKey); 120 2 : ++i; 121 : } 122 : else 123 : { 124 31 : if (i + 2 >= argc) 125 : { 126 0 : CPLError(CE_Failure, CPLE_AppDefined, 127 : "--config option given without a key and value " 128 : "argument."); 129 0 : return; 130 : } 131 : 132 31 : if (!EQUAL(argv[i + 1], "CPL_DEBUG")) 133 : { 134 31 : CPLSetConfigOption(argv[i + 1], argv[i + 2]); 135 : } 136 : 137 31 : i += 2; 138 : } 139 : } 140 : } 141 : } 142 : 143 : /************************************************************************/ 144 : /* GDALRemoveBOM() */ 145 : /************************************************************************/ 146 : 147 : /* Remove potential UTF-8 BOM from data (must be NUL terminated) */ 148 6 : void GDALRemoveBOM(GByte *pabyData) 149 : { 150 6 : if (pabyData[0] == 0xEF && pabyData[1] == 0xBB && pabyData[2] == 0xBF) 151 : { 152 1 : memmove(pabyData, pabyData + 3, 153 1 : strlen(reinterpret_cast<char *>(pabyData) + 3) + 1); 154 : } 155 6 : } 156 : 157 : /************************************************************************/ 158 : /* ArgIsNumeric() */ 159 : /************************************************************************/ 160 : 161 215 : int ArgIsNumeric(const char *pszArg) 162 : 163 : { 164 215 : return CPLGetValueType(pszArg) != CPL_VALUE_STRING; 165 : }