1 // 2 // Copyright 2012 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // numeric_lex.h: Functions to extract numeric values from string. 8 9 #ifndef COMPILER_PREPROCESSOR_NUMERICLEX_H_ 10 #define COMPILER_PREPROCESSOR_NUMERICLEX_H_ 11 12 #include <sstream> 13 14 namespace angle 15 { 16 17 namespace pp 18 { 19 numeric_base_int(const std::string & str)20inline std::ios::fmtflags numeric_base_int(const std::string &str) 21 { 22 if ((str.size() >= 2) && (str[0] == '0') && (str[1] == 'x' || str[1] == 'X')) 23 { 24 return std::ios::hex; 25 } 26 if ((str.size() >= 1) && (str[0] == '0')) 27 { 28 return std::ios::oct; 29 } 30 return std::ios::dec; 31 } 32 33 // The following functions parse the given string to extract a numerical 34 // value of the given type. These functions assume that the string is 35 // of the correct form. They can only fail if the parsed value is too big, 36 // in which case false is returned. 37 38 template <typename IntType> numeric_lex_int(const std::string & str,IntType * value)39bool numeric_lex_int(const std::string &str, IntType *value) 40 { 41 std::istringstream stream(str); 42 // This should not be necessary, but MSVS has a buggy implementation. 43 // It returns incorrect results if the base is not specified. 44 stream.setf(numeric_base_int(str), std::ios::basefield); 45 46 stream >> (*value); 47 return !stream.fail(); 48 } 49 50 } // namespace pp 51 52 } // namespace angle 53 54 #endif // COMPILER_PREPROCESSOR_NUMERICLEX_H_ 55