docs: def _parse(self, fmt_idx):
          """
          Parse format strings.
  
          :param fmt_idx: The index of the (pointer to the) format string in the arguments list.
          :returns:       A FormatString object which can be used for replacing the format specifiers with arguments or
                          for scanning into arguments.
          """
  
          fmtstr_ptr = self.arg(fmt_idx)
  
          if self.state.solver.symbolic(fmtstr_ptr):
              raise SimProcedureError("Symbolic pointer to (format) string :(")
  
          length = self._sim_strlen(fmtstr_ptr)
          if self.state.solver.symbolic(length):
              all_lengths = self.state.solver.eval_upto(length, 2)
              if len(all_lengths) != 1:
                  raise SimProcedureError("Symbolic (format) string, game over :(")
              length = all_lengths[0]
  
          if self.state.solver.is_true(length == 0):
              return FormatString(self, [b""])
  
          fmt_xpr = self.state.memory.load(fmtstr_ptr, length)
  
          fmt = [ ]
          for i in range(fmt_xpr.size(), 0, -8):
              char = fmt_xpr[i - 1 : i - 8]
              try:
                  conc_char = self.state.solver.eval_one(char)
              except SimSolverError:
                  # For symbolic chars, just keep them symbolic
                  fmt.append(char)
              else:
                  # Concrete chars are directly appended to the list
                  fmt.append(bytes([conc_char]))
  
          # make a FormatString object
          fmt_str = self._get_fmt(fmt)
  
          l.debug("Fmt: %r", fmt_str)
  
          return fmt_str