/* gdb commands implemented in Python
- Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2008-2012 Free Software Foundation, Inc.
This file is part of GDB.
/* Python symbol name. */
char *name;
/* Completion function. */
- char **(*completer) (struct cmd_list_element *, char *, char *);
+ completer_ftype *completer;
};
static struct cmdpy_completer completers[] =
static PyTypeObject cmdpy_object_type;
-
/* Constants used by this module. */
static PyObject *invoke_cst;
static PyObject *complete_cst;
}
/* Called by gdb for command completion. */
+
static char **
cmdpy_completer (struct cmd_list_element *command, char *text, char *word)
{
{
/* User code may also return one of the completion constants,
thus requesting that sort of completion. */
- long value = PyInt_AsLong (resultobj);
+ long value;
- if (value >= 0 && value < (long) N_COMPLETERS)
+ if (! gdb_py_int_as_long (resultobj, &value))
+ {
+ /* Ignore. */
+ PyErr_Clear ();
+ }
+ else if (value >= 0 && value < (long) N_COMPLETERS)
result = completers[value].completer (command, text, word);
}
/* Helper for cmdpy_init which locates the command list to use and
pulls out the command name.
- TEXT is the command name list. The final word in the list is the
+ NAME is the command name list. The final word in the list is the
name of the new command. All earlier words must be existing prefix
commands.
This function returns the xmalloc()d name of the new command. On
error sets the Python error and returns NULL. */
+
char *
-gdbpy_parse_command_name (char *text,
+gdbpy_parse_command_name (const char *name,
struct cmd_list_element ***base_list,
struct cmd_list_element **start_list)
{
struct cmd_list_element *elt;
- int len = strlen (text);
+ int len = strlen (name);
int i, lastchar;
- char *prefix_text;
+ char *prefix_text, *prefix_text2;
char *result;
/* Skip trailing whitespace. */
- for (i = len - 1; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
+ for (i = len - 1; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
;
if (i < 0)
{
lastchar = i;
/* Find first character of the final word. */
- for (; i > 0 && (isalnum (text[i - 1])
- || text[i - 1] == '-'
- || text[i - 1] == '_');
+ for (; i > 0 && (isalnum (name[i - 1])
+ || name[i - 1] == '-'
+ || name[i - 1] == '_');
--i)
;
result = xmalloc (lastchar - i + 2);
- memcpy (result, &text[i], lastchar - i + 1);
+ memcpy (result, &name[i], lastchar - i + 1);
result[lastchar - i + 1] = '\0';
/* Skip whitespace again. */
- for (--i; i >= 0 && (text[i] == ' ' || text[i] == '\t'); --i)
+ for (--i; i >= 0 && (name[i] == ' ' || name[i] == '\t'); --i)
;
if (i < 0)
{
}
prefix_text = xmalloc (i + 2);
- memcpy (prefix_text, text, i + 1);
+ memcpy (prefix_text, name, i + 1);
prefix_text[i + 1] = '\0';
- text = prefix_text;
- elt = lookup_cmd_1 (&text, *start_list, NULL, 1);
+ prefix_text2 = prefix_text;
+ elt = lookup_cmd_1 (&prefix_text2, *start_list, NULL, 1);
if (!elt || elt == (struct cmd_list_element *) -1)
{
PyErr_Format (PyExc_RuntimeError, _("Could not find command prefix %s."),
If PREFIX is True, then this command is a prefix command.
The documentation for the command is taken from the doc string for
- the python class.
-
-*/
+ the python class. */
+
static int
cmdpy_init (PyObject *self, PyObject *args, PyObject *kw)
{
cmdpy_object *obj = (cmdpy_object *) self;
- char *name;
+ const char *name;
int cmdtype;
int completetype = -1;
char *docstring = NULL;
&& cmdtype != class_files && cmdtype != class_support
&& cmdtype != class_info && cmdtype != class_breakpoint
&& cmdtype != class_trace && cmdtype != class_obscure
- && cmdtype != class_maintenance)
+ && cmdtype != class_maintenance && cmdtype != class_user)
{
PyErr_Format (PyExc_RuntimeError, _("Invalid command class argument."));
return -1;
pfx_name[out] = '\0';
}
else if (cmp < 0)
+ {
+ xfree (cmd_name);
return -1;
+ }
}
if (PyObject_HasAttr (self, gdbpy_doc_cst))
{
\f
/* Initialize the 'commands' code. */
+
void
gdbpy_initialize_commands (void)
{
int i;
+ cmdpy_object_type.tp_new = PyType_GenericNew;
if (PyType_Ready (&cmdpy_object_type) < 0)
return;
|| PyModule_AddIntConstant (gdb_module, "COMMAND_OBSCURE",
class_obscure) < 0
|| PyModule_AddIntConstant (gdb_module, "COMMAND_MAINTENANCE",
- class_maintenance) < 0)
+ class_maintenance) < 0
+ || PyModule_AddIntConstant (gdb_module, "COMMAND_USER", class_user) < 0)
return;
for (i = 0; i < N_COMPLETERS; ++i)
0, /* tp_dictoffset */
cmdpy_init, /* tp_init */
0, /* tp_alloc */
- PyType_GenericNew /* tp_new */
};
\f
gdbpy_string_to_argv (PyObject *self, PyObject *args)
{
PyObject *py_argv;
- char *input;
+ const char *input;
if (!PyArg_ParseTuple (args, "s", &input))
return NULL;
if (argp == NULL
|| PyList_Append (py_argv, argp) < 0)
{
- if (argp != NULL)
- {
- Py_DECREF (argp);
- }
+ Py_XDECREF (argp);
Py_DECREF (py_argv);
freeargv (c_argv);
return NULL;
}
+ Py_DECREF (argp);
}
freeargv (c_argv);