xref: /openbsd-src/gnu/llvm/lldb/tools/debugserver/source/StringConvert.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1*f6aab3d8Srobert //===-- StringConvert.cpp -------------------------------------------------===//
2*f6aab3d8Srobert //
3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information.
5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f6aab3d8Srobert //
7*f6aab3d8Srobert //===----------------------------------------------------------------------===//
8*f6aab3d8Srobert 
9*f6aab3d8Srobert #include <cstdlib>
10*f6aab3d8Srobert 
11*f6aab3d8Srobert #include "StringConvert.h"
12*f6aab3d8Srobert 
13*f6aab3d8Srobert namespace StringConvert {
14*f6aab3d8Srobert 
ToSInt64(const char * s,int64_t fail_value,int base,bool * success_ptr)15*f6aab3d8Srobert int64_t ToSInt64(const char *s, int64_t fail_value, int base,
16*f6aab3d8Srobert                  bool *success_ptr) {
17*f6aab3d8Srobert   if (s && s[0]) {
18*f6aab3d8Srobert     char *end = nullptr;
19*f6aab3d8Srobert     int64_t uval = ::strtoll(s, &end, base);
20*f6aab3d8Srobert     if (*end == '\0') {
21*f6aab3d8Srobert       if (success_ptr)
22*f6aab3d8Srobert         *success_ptr = true;
23*f6aab3d8Srobert       return uval; // All characters were used, return the result
24*f6aab3d8Srobert     }
25*f6aab3d8Srobert   }
26*f6aab3d8Srobert   if (success_ptr)
27*f6aab3d8Srobert     *success_ptr = false;
28*f6aab3d8Srobert   return fail_value;
29*f6aab3d8Srobert }
30*f6aab3d8Srobert 
ToUInt64(const char * s,uint64_t fail_value,int base,bool * success_ptr)31*f6aab3d8Srobert uint64_t ToUInt64(const char *s, uint64_t fail_value, int base,
32*f6aab3d8Srobert                   bool *success_ptr) {
33*f6aab3d8Srobert   if (s && s[0]) {
34*f6aab3d8Srobert     char *end = nullptr;
35*f6aab3d8Srobert     uint64_t uval = ::strtoull(s, &end, base);
36*f6aab3d8Srobert     if (*end == '\0') {
37*f6aab3d8Srobert       if (success_ptr)
38*f6aab3d8Srobert         *success_ptr = true;
39*f6aab3d8Srobert       return uval; // All characters were used, return the result
40*f6aab3d8Srobert     }
41*f6aab3d8Srobert   }
42*f6aab3d8Srobert   if (success_ptr)
43*f6aab3d8Srobert     *success_ptr = false;
44*f6aab3d8Srobert   return fail_value;
45*f6aab3d8Srobert }
46*f6aab3d8Srobert 
ToDouble(const char * s,double fail_value,bool * success_ptr)47*f6aab3d8Srobert double ToDouble(const char *s, double fail_value, bool *success_ptr) {
48*f6aab3d8Srobert   if (s && s[0]) {
49*f6aab3d8Srobert     char *end = nullptr;
50*f6aab3d8Srobert     double val = strtod(s, &end);
51*f6aab3d8Srobert     if (*end == '\0') {
52*f6aab3d8Srobert       if (success_ptr)
53*f6aab3d8Srobert         *success_ptr = true;
54*f6aab3d8Srobert       return val; // All characters were used, return the result
55*f6aab3d8Srobert     }
56*f6aab3d8Srobert   }
57*f6aab3d8Srobert   if (success_ptr)
58*f6aab3d8Srobert     *success_ptr = false;
59*f6aab3d8Srobert   return fail_value;
60*f6aab3d8Srobert }
61*f6aab3d8Srobert 
62*f6aab3d8Srobert } // namespace StringConvert
63