docs: def strtol_inner(s, state, region, base, signed, read_length=None):
          """
          :param s: the string address/offset
          :param state: SimState
          :param region: memory, file, etc
          :param base: the base to use to interpret the number
          note: all numbers may start with +/- and base 16 may start with 0x
          :param signed: boolean, true means the result will be signed, otherwise unsigned
          :param read_length: int, the number of bytes parsed in strtol
          :return: expression, value, num_bytes
          the returned expression is a symbolic boolean indicating success, value will be set to 0 on failure
          value is the returned value (set to min/max on overflow)
          num_bytes is the number of bytes read in the string
          """
  
          # sanity check
          if base < 2 or base > 36:
              raise SimProcedureError("base should be in the range [2,36]")
  
          # order matters here since we will use an if then else tree, and -0x will have precedence over -
          prefixes = [b"-", b"+", b""]
          if base == 16:
              prefixes = [b"0x", b"-0x", b"+0x"] + prefixes
  
          cases = []
          conditions = []
          possible_num_bytes = []
  
          for prefix in prefixes:
              if read_length and read_length < len(prefix):
                  continue
              condition, value, num_bytes = strtol._load_num_with_prefix(prefix, s, region, state, base, signed, read_length)
              conditions.append(condition)
              cases.append((condition, value))
              possible_num_bytes.append(num_bytes)
  
          # only one of the cases needed to match
          result = state.solver.ite_cases(cases[:-1], cases[-1][1])
          expression = state.solver.Or(*conditions)
          num_bytes = state.solver.ite_cases(zip(conditions, possible_num_bytes), 0)
          return expression, result, num_bytes