blob: d12b6d31e8871737f97e1220763a0dd52f06aee1 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_DEBUG_ZXDB_EXPR_NUMBER_PARSER_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_EXPR_NUMBER_PARSER_H_
#include <string_view>
#include "src/developer/debug/zxdb/common/err.h"
#include "src/developer/debug/zxdb/expr/expr_language.h"
#include "src/developer/debug/zxdb/expr/expr_value.h"
namespace zxdb {
class ExprToken;
// Converts the given string to a number. Currently this only handles integers (no floating point).
//
// It tries to compute a value of the correct type given the input, taking into account size
// suffixes and the magnitude of the number. The rules are somewhat simplified from C++ in that the
// base of the number is not considered and it will pick the smallest type that will fit (C++ has
// different rules for decimal numbers, see the .cc file).
ErrOrValue StringToNumber(std::string_view str);
struct IntegerPrefix {
enum Sign { kPositive, kNegative };
enum Base : int { kBin = 2, kOct = 8, kDec = 10, kHex = 16 };
// Differentiates the two ways an octal prefix can be expressed.
enum class OctalType {
kC, // "0123"
kRust // "0o123"
};
Sign sign = kPositive;
Base base = kDec;
// Valid when base == kOct;
OctalType octal_type = OctalType::kC;
};
// Checks for a sign and base prefix for a number in the given string view. It does not check for
// overall number validity.
//
// The number prefix will be trimmed from the given string view so it contains only the part of the
// number after the prefix (if any). The base of the number will be returned.
//
// It is assumed whitespace has already been trimmed.
//
// If there is no prefix (including if it's not a valid number), it will report positive base 10 and
// not trim anything.
IntegerPrefix ExtractIntegerPrefix(std::string_view* s);
struct IntegerSuffix {
enum Signed { kSigned, kUnsigned };
bool type_signed = kSigned;
// The numeric values allow these to be compared via integer comparisons.
enum class Length { kInteger = 0, kLong = 1, kLongLong = 2 };
Length length = Length::kInteger;
};
// Checks for a type suffix on a number in the given string view and returns the suffix structure.
// It does not check for overall number validity.
//
// On success, the number suffix ("u", "l", "ll") will be trimmed from the given string view so it
// contains only the part of the number before the suffix (if any).
//
// It is assumed whitespace has already been trimmed.
//
// If there is no suffix, it will return a signed integer and not trim anything. If the suffix is
// invalid, return the error.
ErrOr<IntegerSuffix> ExtractIntegerSuffix(std::string_view* s);
// Checks if the current input begins with a floating-point literal and returns its length if it
// does. Returns 0 if it does not begin a floating point literal.
//
// Whitespace is not stripped so leading whitespace will not be considered a floating point token.
// As in C, a leading '-' is not considered part of the token. "-23.5" is a unary '-' operator
// applied to a positive floating-point literal.
//
// On success, the identified token may not represent a valid floating-point number. It may have
// extra garbage in it, or may be malformed in various ways. It is just the range of text to be
// considered a float. See ValueForFloatToken for conversion + validation.
size_t GetFloatTokenLength(ExprLanguage lang, std::string_view input);
enum class FloatSuffix {
kNone, // No known suffix.
kFloat, // 'f' or "F" meaning "float" instead of a double.
kLong, // "l" or "L" meaning "long double".
};
// Identifies and strips the suffix from the end of a float token. The suffix is assumed to be the
// last character of the input.
FloatSuffix StripFloatSuffix(std::string_view* view);
// Given a floating-point token, returns the ExprValue for it if possible.
ErrOrValue ValueForFloatToken(ExprLanguage lang, const ExprToken& token);
} // namespace zxdb
#endif // SRC_DEVELOPER_DEBUG_ZXDB_EXPR_NUMBER_PARSER_H_