From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Martin M. Hunt" To: Insight Mailing List Subject: [RFA] gdbtk_set_result Date: Fri, 02 Nov 2001 16:20:00 -0000 Message-id: <200111030001.QAA15373@cygnus.com> X-SW-Source: 2001-q4/msg00262.html This patch uses the new function gdbtk_set_result() to correctly set return strings on errors. -- Martin Hunt GDB Engineer Red Hat, Inc. 2001-11-02 Martin M. Hunt * generic/gdbtk-cmds.h (gdbtk_set_result): Declare. A printf-like function to return error messages. * generic/gdbtk-cmds.c (gdbtk_set_result): New function. (gdb_cmd): Use gdbtk_set_result. (gdb_immediate_command): Ditto. (gdb_load_info): Ditto. (gdb_find_file_command): Ditto. (gdb_listfuncs): Ditto. (gdb_load_disassembly): Ditto. (gdb_loc): Ditto. (gdb_set_mem): Ditto. (gdb_get_mem): Ditto. (gdb_loadfile): Ditto. * generic/gdbtk-varobj.c (variable_format): Ditto. (variable_value): Ditto. * generic/gdbtk-stack.c (gdb_get_vars_command): Ditto. * generic/gdbtk-bp.c (gdb_get_breakpoint_info): Ditto. (gdb_set_bp): Ditto. (gdb_set_bp_addr): Ditto. (gdb_get_tracepoint_info): Ditto. Index: gdbtk-bp.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-bp.c,v retrieving revision 1.12 diff -u -p -r1.12 gdbtk-bp.c --- gdbtk-bp.c 2001/10/29 21:45:31 1.12 +++ gdbtk-bp.c 2001/11/02 23:59:40 @@ -309,10 +309,7 @@ gdb_get_breakpoint_info (ClientData clie b = (bpnum <= breakpoint_list_size ? breakpoint_list[bpnum] : NULL); if (!b || b->type != bp_breakpoint) { - char *err_buf; - xasprintf (&err_buf, "Breakpoint #%d does not exist.", bpnum); - Tcl_SetStringObj (result_ptr->obj_ptr, err_buf, -1); - free(err_buf); + gdbtk_set_result (interp, "Breakpoint #%d does not exist.", bpnum); return TCL_ERROR; } @@ -513,8 +510,7 @@ gdb_set_bp (ClientData clientData, Tcl_I disp = disp_donttouch; else { - Tcl_SetObjResult (interp, - Tcl_NewStringObj ("type must be \"temp\" or \"normal\"", -1)); + gdbtk_set_result (interp, "type must be \"temp\" or \"normal\""); return TCL_ERROR; } @@ -587,8 +583,7 @@ gdb_set_bp_addr (ClientData clientData, disp = disp_donttouch; else { - Tcl_SetObjResult (interp, - Tcl_NewStringObj ("type must be \"temp\" or \"normal\"", -1)); + gdbtk_set_result (interp, "type must be \"temp\" or \"normal\""); return TCL_ERROR; } @@ -830,10 +825,7 @@ gdb_get_tracepoint_info (ClientData clie if (tp == NULL) { - char *buff; - xasprintf (&buff, "Tracepoint #%d does not exist", tpnum); - Tcl_SetStringObj (result_ptr->obj_ptr, buff, -1); - free(buff); + gdbtk_set_result (interp, "Tracepoint #%d does not exist", tpnum); return TCL_ERROR; } Index: gdbtk-cmds.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.c,v retrieving revision 1.42 diff -u -p -r1.42 gdbtk-cmds.c --- gdbtk-cmds.c 2001/10/29 19:37:05 1.42 +++ gdbtk-cmds.c 2001/11/02 23:59:41 @@ -688,8 +688,7 @@ gdb_cmd (clientData, interp, objc, objv) { if (Tcl_GetBooleanFromObj (NULL, objv[2], &from_tty) != TCL_OK) { - Tcl_SetStringObj (result_ptr->obj_ptr, "from_tty must be a boolean.", - -1); + gdbtk_set_result (interp, "from_tty must be a boolean."); return TCL_ERROR; } } @@ -758,8 +757,7 @@ gdb_immediate_command (clientData, inter { if (Tcl_GetBooleanFromObj (NULL, objv[2], &from_tty) != TCL_OK) { - Tcl_SetStringObj (result_ptr->obj_ptr, "from_tty must be a boolean.", - -1); + gdbtk_set_result (interp, "from_tty must be a boolean."); return TCL_ERROR; } } @@ -923,14 +921,14 @@ gdb_load_info (clientData, interp, objc, loadfile_bfd = bfd_openr (filename, gnutarget); if (loadfile_bfd == NULL) { - Tcl_SetStringObj (result_ptr->obj_ptr, "Open failed", -1); + gdbtk_set_result (interp, "Open of %s failed", filename); return TCL_ERROR; } old_cleanups = make_cleanup_bfd_close (loadfile_bfd); if (!bfd_check_format (loadfile_bfd, bfd_object)) { - Tcl_SetStringObj (result_ptr->obj_ptr, "Bad Object File", -1); + gdbtk_set_result (interp, "Bad Object File"); return TCL_ERROR; } @@ -1109,8 +1107,7 @@ gdb_find_file_command (clientData, inter /* We should always get a symtab. */ if (!st) { - Tcl_SetStringObj ( result_ptr->obj_ptr, - "File not found in symtab (2)", -1); + gdbtk_set_result (interp, "File not found in symtab (2)"); return TCL_ERROR; } @@ -1282,7 +1279,6 @@ gdb_search (clientData, interp, objc, ob if (objc < 3) { Tcl_WrongNumArgs (interp, 1, objv, "option regexp ?arg ...?"); - result_ptr->flags |= GDBTK_IN_TCL_RESULT; return TCL_ERROR; } @@ -1477,10 +1473,11 @@ gdb_listfuncs (clientData, interp, objc, symtab = full_lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL)); if (!symtab) { - Tcl_SetStringObj (result_ptr->obj_ptr, "No such file", -1); + gdbtk_set_result (interp, "No such file (%s)", + Tcl_GetStringFromObj (objv[1], NULL)); return TCL_ERROR; } - + if (mangled == NULL) { mangled = Tcl_NewBooleanObj (1); @@ -1651,14 +1648,13 @@ gdb_load_disassembly (ClientData clientD if ( Tk_NameToWindow (interp, client_data.widget, Tk_MainWindow (interp)) == NULL) { - Tcl_SetStringObj (result_ptr->obj_ptr, "Invalid widget name.", -1); + gdbtk_set_result (interp, "Invalid widget name."); return TCL_ERROR; } if (!Tcl_GetCommandInfo (interp, client_data.widget, &client_data.cmd)) { - Tcl_SetStringObj (result_ptr->obj_ptr, "Can't get widget command info", - -1); + gdbtk_set_result (interp, "Can't get widget command info"); return TCL_ERROR; } @@ -1669,8 +1665,7 @@ gdb_load_disassembly (ClientData clientD mixed_source_and_assembly = 0; else { - Tcl_SetStringObj (result_ptr->obj_ptr, - "Second arg must be 'source' or 'nosource'", -1); + gdbtk_set_result (interp, "Second arg must be 'source' or 'nosource'"); return TCL_ERROR; } @@ -1695,7 +1690,7 @@ gdb_load_disassembly (ClientData clientD client_data.map_arr = "map_array"; if (Tcl_UpVar (interp, "1", map_name, client_data.map_arr, 0) != TCL_OK) { - Tcl_SetStringObj (result_ptr->obj_ptr, "Can't link map array.", -1); + gdbtk_set_result (interp, "Can't link map array."); return TCL_ERROR; } @@ -2376,7 +2371,7 @@ gdb_loc (ClientData clientData, Tcl_Inte if (sals.nelts != 1) { - Tcl_SetStringObj (result_ptr->obj_ptr, "Ambiguous line spec", -1); + gdbtk_set_result (interp, "Ambiguous line spec", -1); return TCL_ERROR; } resolve_sal_pc (&sal); @@ -2538,11 +2533,7 @@ gdb_set_mem (clientData, interp, objc, o if (size < 0) { /* Error in input */ - char *res; - - xasprintf (&res, "Invalid hexadecimal input: \"0x%s\"", hexstr); - Tcl_SetObjResult (interp, Tcl_NewStringObj (res, -1)); - free (res); + gdbtk_set_result (interp, "Invalid hexadecimal input: \"0x%s\"", hexstr); return TCL_ERROR; } @@ -2589,7 +2580,7 @@ gdb_get_mem (ClientData clientData, Tcl_ } else if (size <= 0) { - Tcl_SetObjResult (interp, Tcl_NewStringObj ("Invalid size, must be > 0", -1)); + gdbtk_set_result (interp, "Invalid size, must be > 0"); return TCL_ERROR; } @@ -2600,8 +2591,7 @@ gdb_get_mem (ClientData clientData, Tcl_ } else if (nbytes <= 0) { - Tcl_SetObjResult (interp, - Tcl_NewStringObj ("Invalid number of bytes, must be > 0", -1)); + gdbtk_set_result (interp, "Invalid number of bytes, must be > 0"); return TCL_ERROR; } @@ -2612,8 +2602,7 @@ gdb_get_mem (ClientData clientData, Tcl_ } else if (bpr <= 0) { - Tcl_SetObjResult (interp, - Tcl_NewStringObj ("Invalid bytes per row, must be > 0", -1)); + gdbtk_set_result (interp, "Invalid bytes per row, must be > 0"); return TCL_ERROR; } @@ -2623,7 +2612,7 @@ gdb_get_mem (ClientData clientData, Tcl_ mbuf = (char *) malloc (nbytes + 32); if (!mbuf) { - Tcl_SetObjResult (interp, Tcl_NewStringObj ("Out of memory.", -1)); + gdbtk_set_result (interp, "Out of memory."); return TCL_ERROR; } @@ -2773,8 +2762,7 @@ gdb_loadfile (ClientData clientData, Tcl if (!Tcl_GetCommandInfo (interp, widget, &text_cmd)) { - Tcl_SetStringObj (result_ptr->obj_ptr, "Can't get widget command info", - -1); + gdbtk_set_result (interp, "Can't get widget command info"); return TCL_ERROR; } @@ -2784,15 +2772,14 @@ gdb_loadfile (ClientData clientData, Tcl symtab = full_lookup_symtab (file); if (!symtab) { - Tcl_SetStringObj ( result_ptr->obj_ptr, "File not found in symtab", -1); + gdbtk_set_result (interp, "File not found in symtab"); return TCL_ERROR; } file = symtab_to_filename ( symtab ); if ((fp = fopen ( file, "r" )) == NULL) { - Tcl_SetStringObj ( result_ptr->obj_ptr, "Can't open file for reading", - -1); + gdbtk_set_result (interp, "Can't open file for reading"); return TCL_ERROR; } @@ -2823,8 +2810,8 @@ gdb_loadfile (ClientData clientData, Tcl ltable = (char *)malloc (LTABLE_SIZE); if (ltable == NULL) { - Tcl_SetStringObj ( result_ptr->obj_ptr, "Out of memory.", -1); fclose (fp); + gdbtk_set_result (interp, "Out of memory."); return TCL_ERROR; } @@ -2844,10 +2831,9 @@ gdb_loadfile (ClientData clientData, Tcl ltable_size *= 2; if (new_ltable == NULL) { - Tcl_SetStringObj ( result_ptr->obj_ptr, "Out of memory.", - -1); free (ltable); fclose (fp); + gdbtk_set_result (interp, "Out of memory."); return TCL_ERROR; } ltable = new_ltable; @@ -3103,4 +3089,17 @@ pc_function_name (pc) funcname = ""; return funcname; +} + +void +gdbtk_set_result (Tcl_Interp *interp, const char *fmt,...) +{ + va_list args; + char *buf; + + va_start (args, fmt); + xvasprintf (&buf, fmt, args); + va_end (args); + Tcl_SetObjResult (interp, Tcl_NewStringObj (buf, -1)); + xfree(buf); } Index: gdbtk-cmds.h =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.h,v retrieving revision 1.1 diff -u -p -r1.1 gdbtk-cmds.h --- gdbtk-cmds.h 2001/05/10 18:04:23 1.1 +++ gdbtk-cmds.h 2001/11/02 23:59:41 @@ -50,6 +50,9 @@ extern char *pc_function_name (CORE_ADDR a Tcl list object. */ extern void sprintf_append_element_to_obj (Tcl_Obj * objp, char *format, ...); +/* printf-like function to return error messages */ +extern void gdbtk_set_result (Tcl_Interp *interp, const char *fmt,...); + /* Module init routines: Each module of commands should be declared here. */ extern int Gdbtk_Breakpoint_Init (Tcl_Interp *interp); extern int Gdbtk_Stack_Init (Tcl_Interp *interp); Index: gdbtk-stack.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-stack.c,v retrieving revision 1.4 diff -u -p -r1.4 gdbtk-stack.c --- gdbtk-stack.c 2001/10/17 20:35:32 1.4 +++ gdbtk-stack.c 2001/11/02 23:59:42 @@ -101,7 +101,6 @@ gdb_block_vars (clientData, interp, objc if (objc < 3) { Tcl_WrongNumArgs (interp, 1, objv, "startAddr endAddr"); - result_ptr->flags |= GDBTK_IN_TCL_RESULT; return TCL_ERROR; } @@ -319,8 +318,7 @@ gdb_get_vars_command (clientData, interp sals = decode_line_1 (&args, 1, NULL, 0, &canonical); if (sals.nelts == 0) { - Tcl_SetStringObj (result_ptr->obj_ptr, - "error decoding line", -1); + gdbtk_set_result (interp, "error decoding line"); return TCL_ERROR; } @@ -479,7 +477,6 @@ gdb_stack (clientData, interp, objc, obj if (objc < 3) { Tcl_WrongNumArgs (interp, 1, objv, "start count"); - result_ptr->flags |= GDBTK_IN_TCL_RESULT; return TCL_ERROR; } Index: gdbtk-varobj.c =================================================================== RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-varobj.c,v retrieving revision 1.9 diff -u -p -r1.9 gdbtk-varobj.c --- gdbtk-varobj.c 2001/10/17 20:35:32 1.9 +++ gdbtk-varobj.c 2001/11/02 23:59:42 @@ -510,11 +510,9 @@ variable_format (interp, objc, objv, var varobj_set_display_format (var, FORMAT_OCTAL); else { - Tcl_Obj *obj = Tcl_NewStringObj (NULL, 0); - Tcl_AppendStringsToObj (obj, "unknown display format \"", - fmt, "\": must be: \"natural\", \"binary\"" - ", \"decimal\", \"hexadecimal\", or \"octal\"", NULL); - Tcl_SetObjResult (interp, obj); + gdbtk_set_result (interp, "unknown display format \"", + fmt, "\": must be: \"natural\", \"binary\"" + ", \"decimal\", \"hexadecimal\", or \"octal\""); return TCL_ERROR; } } @@ -597,9 +595,7 @@ variable_value (interp, objc, objv, var) s = Tcl_GetStringFromObj (objv[2], NULL); if (!varobj_set_value (var, s)) { - r = error_last_message (); - Tcl_SetObjResult (interp, Tcl_NewStringObj (r, -1)); - FREEIF (r); + gdbtk_set_result (interp, "%s", error_last_message()); return TCL_ERROR; } }