std::string user_args::insert_args (const char *line) const { std::string new_line; const char *p; while ((p = locate_arg (line))) { new_line.append (line, p - line); if (p[4] == 'c') { new_line += std::to_string (m_args.size ()); line = p + 5; } else { char *tmp; unsigned long i; errno = 0; i = strtoul (p + 4, &tmp, 10); if ((i == 0 && tmp == p + 4) || errno != 0) line = p + 4; else if (i >= m_args.size ()) error (_("Missing argument %ld in user function."), i); else { new_line.append (m_args[i].str, m_args[i].len); line = tmp; } } } /* Don't forget the tail. */ new_line.append (line); return new_line; }
static char * insert_args (char *line) { char *p, *save_line, *new_line; unsigned len, i; /* If we are not in a user-defined function, treat $argc, $arg0, et cetera as normal convenience variables. */ if (user_args == NULL) return xstrdup (line); /* First we need to know how much memory to allocate for the new line. */ save_line = line; len = 0; while ((p = locate_arg (line))) { len += p - line; i = p[4] - '0'; if (p[4] == 'c') { /* $argc. Number will be <=10. */ len += user_args->count == 10 ? 2 : 1; } else if (i >= user_args->count) { error (_("Missing argument %d in user function."), i); return NULL; } else { len += user_args->a[i].len; } line = p + 5; } /* Don't forget the tail. */ len += strlen (line); /* Allocate space for the new line and fill it in. */ new_line = (char *) xmalloc (len + 1); if (new_line == NULL) return NULL; /* Restore pointer to beginning of old line. */ line = save_line; /* Save pointer to beginning of new line. */ save_line = new_line; while ((p = locate_arg (line))) { int i, len; memcpy (new_line, line, p - line); new_line += p - line; if (p[4] == 'c') { gdb_assert (user_args->count >= 0 && user_args->count <= 10); if (user_args->count == 10) { *(new_line++) = '1'; *(new_line++) = '0'; } else *(new_line++) = user_args->count + '0'; } else { i = p[4] - '0'; len = user_args->a[i].len; if (len) { memcpy (new_line, user_args->a[i].arg, len); new_line += len; } } line = p + 5; } /* Don't forget the tail. */ strcpy (new_line, line); /* Return a pointer to the beginning of the new line. */ return save_line; }