15ffd83dbSDimitry Andric //===-- StringConvert.cpp -------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
9*5f7ddb14SDimitry Andric #include <cstdlib>
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "lldb/Host/StringConvert.h"
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric namespace lldb_private {
140b57cec5SDimitry Andric namespace StringConvert {
150b57cec5SDimitry Andric 
ToSInt32(const char * s,int32_t fail_value,int base,bool * success_ptr)160b57cec5SDimitry Andric int32_t ToSInt32(const char *s, int32_t fail_value, int base,
170b57cec5SDimitry Andric                  bool *success_ptr) {
180b57cec5SDimitry Andric   if (s && s[0]) {
190b57cec5SDimitry Andric     char *end = nullptr;
200b57cec5SDimitry Andric     const long sval = ::strtol(s, &end, base);
210b57cec5SDimitry Andric     if (*end == '\0') {
220b57cec5SDimitry Andric       if (success_ptr)
230b57cec5SDimitry Andric         *success_ptr = ((sval <= INT32_MAX) && (sval >= INT32_MIN));
240b57cec5SDimitry Andric       return (int32_t)sval; // All characters were used, return the result
250b57cec5SDimitry Andric     }
260b57cec5SDimitry Andric   }
270b57cec5SDimitry Andric   if (success_ptr)
280b57cec5SDimitry Andric     *success_ptr = false;
290b57cec5SDimitry Andric   return fail_value;
300b57cec5SDimitry Andric }
310b57cec5SDimitry Andric 
ToUInt32(const char * s,uint32_t fail_value,int base,bool * success_ptr)320b57cec5SDimitry Andric uint32_t ToUInt32(const char *s, uint32_t fail_value, int base,
330b57cec5SDimitry Andric                   bool *success_ptr) {
340b57cec5SDimitry Andric   if (s && s[0]) {
350b57cec5SDimitry Andric     char *end = nullptr;
360b57cec5SDimitry Andric     const unsigned long uval = ::strtoul(s, &end, base);
370b57cec5SDimitry Andric     if (*end == '\0') {
380b57cec5SDimitry Andric       if (success_ptr)
390b57cec5SDimitry Andric         *success_ptr = (uval <= UINT32_MAX);
400b57cec5SDimitry Andric       return (uint32_t)uval; // All characters were used, return the result
410b57cec5SDimitry Andric     }
420b57cec5SDimitry Andric   }
430b57cec5SDimitry Andric   if (success_ptr)
440b57cec5SDimitry Andric     *success_ptr = false;
450b57cec5SDimitry Andric   return fail_value;
460b57cec5SDimitry Andric }
470b57cec5SDimitry Andric 
ToSInt64(const char * s,int64_t fail_value,int base,bool * success_ptr)480b57cec5SDimitry Andric int64_t ToSInt64(const char *s, int64_t fail_value, int base,
490b57cec5SDimitry Andric                  bool *success_ptr) {
500b57cec5SDimitry Andric   if (s && s[0]) {
510b57cec5SDimitry Andric     char *end = nullptr;
520b57cec5SDimitry Andric     int64_t uval = ::strtoll(s, &end, base);
530b57cec5SDimitry Andric     if (*end == '\0') {
540b57cec5SDimitry Andric       if (success_ptr)
550b57cec5SDimitry Andric         *success_ptr = true;
560b57cec5SDimitry Andric       return uval; // All characters were used, return the result
570b57cec5SDimitry Andric     }
580b57cec5SDimitry Andric   }
590b57cec5SDimitry Andric   if (success_ptr)
600b57cec5SDimitry Andric     *success_ptr = false;
610b57cec5SDimitry Andric   return fail_value;
620b57cec5SDimitry Andric }
630b57cec5SDimitry Andric 
ToUInt64(const char * s,uint64_t fail_value,int base,bool * success_ptr)640b57cec5SDimitry Andric uint64_t ToUInt64(const char *s, uint64_t fail_value, int base,
650b57cec5SDimitry Andric                   bool *success_ptr) {
660b57cec5SDimitry Andric   if (s && s[0]) {
670b57cec5SDimitry Andric     char *end = nullptr;
680b57cec5SDimitry Andric     uint64_t uval = ::strtoull(s, &end, base);
690b57cec5SDimitry Andric     if (*end == '\0') {
700b57cec5SDimitry Andric       if (success_ptr)
710b57cec5SDimitry Andric         *success_ptr = true;
720b57cec5SDimitry Andric       return uval; // All characters were used, return the result
730b57cec5SDimitry Andric     }
740b57cec5SDimitry Andric   }
750b57cec5SDimitry Andric   if (success_ptr)
760b57cec5SDimitry Andric     *success_ptr = false;
770b57cec5SDimitry Andric   return fail_value;
780b57cec5SDimitry Andric }
790b57cec5SDimitry Andric 
ToDouble(const char * s,double fail_value,bool * success_ptr)800b57cec5SDimitry Andric double ToDouble(const char *s, double fail_value, bool *success_ptr) {
810b57cec5SDimitry Andric   if (s && s[0]) {
820b57cec5SDimitry Andric     char *end = nullptr;
830b57cec5SDimitry Andric     double val = strtod(s, &end);
840b57cec5SDimitry Andric     if (*end == '\0') {
850b57cec5SDimitry Andric       if (success_ptr)
860b57cec5SDimitry Andric         *success_ptr = true;
870b57cec5SDimitry Andric       return val; // All characters were used, return the result
880b57cec5SDimitry Andric     }
890b57cec5SDimitry Andric   }
900b57cec5SDimitry Andric   if (success_ptr)
910b57cec5SDimitry Andric     *success_ptr = false;
920b57cec5SDimitry Andric   return fail_value;
930b57cec5SDimitry Andric }
940b57cec5SDimitry Andric }
950b57cec5SDimitry Andric }
96