Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [rfc/mi] ui_list_* to ui_*
@ 2001-03-23 18:39 Andrew Cagney
  2001-03-24  5:51 ` Fernando Nasser
  0 siblings, 1 reply; 5+ messages in thread
From: Andrew Cagney @ 2001-03-23 18:39 UTC (permalink / raw)
  To: GDB Patches

Hello,

The attached patch introduces:

	ui_begin (...type...)
	ui_end (...type...)

where type is either UI_OUT_TUPPLE or UI_OUT_LIST.  The interface:

	ui_list_begin()
	ui_list_end()

remains but it is re-implemented using ui_begin/ui_end.

This is step 1 in updating MI's syntax.

	Andrew
2001-03-23  Andrew Cagney  <ac131313@redhat.com>

	* ui-out.h (enum ui_out_type): Declare.
	(ui_out_begin, ui_out_begin, ui_out_begin_cleanup_end): Declare.
	(begin_ftype, end_ftype): Replace list_begin_ftype and
	list_end_ftype.
	(struct ui_out_impl): Update.
	(MAX_UI_OUT_LEVELS): Declare.

	* ui-out.c: Include "gdb_assert.h".
	(struct ui_out_level): Define.
	(struct ui_out): Replace ``list_flag'' and ``field_count'' with
	``level'' and ``levels''.
	(top_level, push_level, pop_level): New functions.
	(default_begin, default_end): Replace default_list_begin and
	default_list_end.
	(ou_begin, ou_end): Replace ou_list_begin, ou_list_end.
	(ui_out_begin, ui_out_end, ui_out_begin_cleanup_end): New
	functions.
	(ui_out_list_begin, ui_out_list_end): Call ui_out_begin and
	ui_out_end.
	(ui_out_field_int, ui_out_field_skip)
	(ui_out_field_string, ui_out_field_fmt, ui_out_new): Update

	* cli-out.c (cli_begin, cli_end): Replace cli_list_begin and
	cli_list_end.

Index: cli-out.c
===================================================================
RCS file: /cvs/src/src/gdb/cli-out.c,v
retrieving revision 1.6
diff -p -r1.6 cli-out.c
*** cli-out.c	2001/03/06 08:21:06	1.6
--- cli-out.c	2001/03/24 02:33:31
*************** static void cli_table_body (struct ui_ou
*** 43,50 ****
  static void cli_table_end (struct ui_out *uiout);
  static void cli_table_header (struct ui_out *uiout, int width,
  			      enum ui_align alig, char *colhdr);
! static void cli_list_begin (struct ui_out *uiout, int list_flag, char *lstid);
! static void cli_list_end (struct ui_out *uiout, int list_flag);
  static void cli_field_int (struct ui_out *uiout, int fldno, int width,
  			   enum ui_align alig, char *fldname, int value);
  static void cli_field_skip (struct ui_out *uiout, int fldno, int width,
--- 43,50 ----
  static void cli_table_end (struct ui_out *uiout);
  static void cli_table_header (struct ui_out *uiout, int width,
  			      enum ui_align alig, char *colhdr);
! static void cli_begin (struct ui_out *uiout, enum ui_out_type type, int level, const char *lstid);
! static void cli_end (struct ui_out *uiout, enum ui_out_type type, int level);
  static void cli_field_int (struct ui_out *uiout, int fldno, int width,
  			   enum ui_align alig, char *fldname, int value);
  static void cli_field_skip (struct ui_out *uiout, int fldno, int width,
*************** static struct ui_out_impl cli_ui_out_imp
*** 73,80 ****
    cli_table_body,
    cli_table_end,
    cli_table_header,
!   cli_list_begin,
!   cli_list_end,
    cli_field_int,
    cli_field_skip,
    cli_field_string,
--- 73,80 ----
    cli_table_body,
    cli_table_end,
    cli_table_header,
!   cli_begin,
!   cli_end,
    cli_field_int,
    cli_field_skip,
    cli_field_string,
*************** cli_table_header (struct ui_out *uiout, 
*** 134,147 ****
  /* Mark beginning of a list */
  
  void
! cli_list_begin (struct ui_out *uiout, int list_flag, char *lstid)
  {
  }
  
  /* Mark end of a list */
  
  void
! cli_list_end (struct ui_out *uiout, int list_flag)
  {
  }
  
--- 134,148 ----
  /* Mark beginning of a list */
  
  void
! cli_begin (struct ui_out *uiout, enum ui_out_type type, int level,
! 	   const char *lstid)
  {
  }
  
  /* Mark end of a list */
  
  void
! cli_end (struct ui_out *uiout, enum ui_out_type type, int level)
  {
  }
  
Index: ui-out.c
===================================================================
RCS file: /cvs/src/src/gdb/ui-out.c,v
retrieving revision 1.8
diff -p -r1.8 ui-out.c
*** ui-out.c	2001/02/08 06:03:54	1.8
--- ui-out.c	2001/03/24 02:33:31
***************
*** 25,30 ****
--- 25,31 ----
  #include "expression.h"		/* For language.h */
  #include "language.h"
  #include "ui-out.h"
+ #include "gdb_assert.h"
  
  /* Convenience macro for allocting typesafe memory. */
  
*************** struct ui_out_hdr
*** 42,47 ****
--- 43,56 ----
      struct ui_out_hdr *next;
    };
  
+ struct ui_out_level
+   {
+     enum ui_out_type type;
+ 
+     /* we count each field; the first element is for non-list fields */
+     int field_count;
+   };
+ 
  /* The ui_out structure */
  /* Any change here requires a corresponding one in the initialization
     of the default uiout, which is statically initialized */
*************** struct ui_out_hdr
*** 49,58 ****
--- 58,72 ----
  struct ui_out
    {
      int flags;
+ 
      /* specific implementation of ui-out */
      struct ui_out_impl *impl;
      struct ui_out_data *data;
  
+     /* Sub structure tracking the table depth. */
+     int level;
+     struct ui_out_level levels[MAX_UI_OUT_LEVELS];
+ 
      /* if on, a table is being generated */
      int table_flag;
  
*************** struct ui_out
*** 65,76 ****
      /* strinf identifying the table (as specified in the table_begin call) */
      char *table_id;
  
-     /* if on, a list is being generated.  The value is the level of nesting */
-     int list_flag;
- 
-     /* we count each field; the first element is for non-list fields */
-     int field_count[5];
- 
      /* points to the first header (if any) */
      struct ui_out_hdr *headerfirst;
  
--- 79,84 ----
*************** struct ui_out
*** 82,87 ****
--- 90,130 ----
  
    };
  
+ static struct ui_out_level *
+ top_level (struct ui_out *uiout)
+ {
+   return &uiout->levels[uiout->level];
+ }
+ 
+ /* Create a new level, return that levels index. */
+ 
+ static int
+ push_level (struct ui_out *uiout,
+ 	    enum ui_out_type type,
+ 	    const char *id)
+ {
+   /* We had better not underflow the buffer. */
+   gdb_assert (uiout->level < MAX_UI_OUT_LEVELS - 1);
+   uiout->level++;
+   top_level (uiout)->type = type;
+   top_level (uiout)->field_count = 0;
+   return uiout->level;
+ }
+ 
+ /* Discard the current level, return the discarded levels index */
+ 
+ static int
+ pop_level (struct ui_out *uiout,
+ 	   enum ui_out_type type)
+ {
+   /* We had better not underflow the buffer. */
+   gdb_assert (uiout->level > 0);
+   gdb_assert (top_level (uiout)->type == type);
+   uiout->level--;
+   return uiout->level + 1;
+ }
+ 
+ 
  /* These are the default implementation functions */
  
  static void default_table_begin (struct ui_out *uiout, int nbrofcols,
*************** static void default_table_body (struct u
*** 90,98 ****
  static void default_table_end (struct ui_out *uiout);
  static void default_table_header (struct ui_out *uiout, int width,
  				  enum ui_align alig, char *colhdr);
! static void default_list_begin (struct ui_out *uiout, int list_flag,
! 				char *lstid);
! static void default_list_end (struct ui_out *uiout, int list_flag);
  static void default_field_int (struct ui_out *uiout, int fldno, int width,
  			       enum ui_align alig, char *fldname, int value);
  static void default_field_skip (struct ui_out *uiout, int fldno, int width,
--- 133,142 ----
  static void default_table_end (struct ui_out *uiout);
  static void default_table_header (struct ui_out *uiout, int width,
  				  enum ui_align alig, char *colhdr);
! static void default_list_begin (struct ui_out *uiout, int depth, char *lstid);
! static void default_list_end (struct ui_out *uiout, int depth);
! static void default_begin (struct ui_out *uiout, enum ui_out_type type, int level, const char *id);
! static void default_end (struct ui_out *uiout, enum ui_out_type type, int level);
  static void default_field_int (struct ui_out *uiout, int fldno, int width,
  			       enum ui_align alig, char *fldname, int value);
  static void default_field_skip (struct ui_out *uiout, int fldno, int width,
*************** struct ui_out_impl default_ui_out_impl =
*** 118,125 ****
    default_table_body,
    default_table_end,
    default_table_header,
!   default_list_begin,
!   default_list_end,
    default_field_int,
    default_field_skip,
    default_field_string,
--- 162,169 ----
    default_table_body,
    default_table_end,
    default_table_header,
!   default_begin,
!   default_end,
    default_field_int,
    default_field_skip,
    default_field_string,
*************** static void uo_table_body (struct ui_out
*** 152,159 ****
  static void uo_table_end (struct ui_out *uiout);
  static void uo_table_header (struct ui_out *uiout, int width,
  			     enum ui_align align, char *colhdr);
! static void uo_list_begin (struct ui_out *uiout, int list_flag, char *lstid);
! static void uo_list_end (struct ui_out *uiout, int list_flag);
  static void uo_field_int (struct ui_out *uiout, int fldno, int width,
  			  enum ui_align align, char *fldname, int value);
  static void uo_field_skip (struct ui_out *uiout, int fldno, int width,
--- 196,203 ----
  static void uo_table_end (struct ui_out *uiout);
  static void uo_table_header (struct ui_out *uiout, int width,
  			     enum ui_align align, char *colhdr);
! static void uo_begin (struct ui_out *uiout, enum ui_out_type, int level, const char *lstid);
! static void uo_end (struct ui_out *uiout, enum ui_out_type, int level);
  static void uo_field_int (struct ui_out *uiout, int fldno, int width,
  			  enum ui_align align, char *fldname, int value);
  static void uo_field_skip (struct ui_out *uiout, int fldno, int width,
*************** and before table_body.");
*** 259,305 ****
  }
  
  void
! ui_out_list_begin (struct ui_out *uiout, char *lstid)
  {
    if (uiout->table_flag && !uiout->body_flag)
      internal_error (__FILE__, __LINE__,
  		    "table header or table_body expected; lists must be \
  specified after table_body.");
!   if (uiout->list_flag >= 4)
!     internal_error (__FILE__, __LINE__,
! 		    "list depth exceeded; only 4 levels of lists can be \
! nested.");
! 
!   uiout->list_flag++;
!   uiout->field_count[uiout->list_flag] = 0;
!   if (uiout->table_flag && (uiout->list_flag == 1))
      uiout->headercurr = uiout->headerfirst;
  
!   uo_list_begin (uiout, uiout->list_flag, lstid);
  }
  
  void
! ui_out_list_end (struct ui_out *uiout)
  {
!   if (!uiout->list_flag)
!     internal_error (__FILE__, __LINE__,
! 		    "misplaced list_end; there is no list to be closed.");
  
!   uo_list_end (uiout, uiout->list_flag);
  
!   uiout->list_flag--;
  }
  
! static void
! do_list_end (void *uiout)
  {
!   ui_out_list_end (uiout);
  }
  
  struct cleanup *
  make_cleanup_ui_out_list_end (struct ui_out *uiout)
  {
!   return make_cleanup (do_list_end, uiout);
  }
  
  void
--- 303,381 ----
  }
  
  void
! ui_out_begin (struct ui_out *uiout,
! 	      enum ui_out_type type,
! 	      const char *id)
  {
+   int level;
    if (uiout->table_flag && !uiout->body_flag)
      internal_error (__FILE__, __LINE__,
  		    "table header or table_body expected; lists must be \
  specified after table_body.");
!   level = push_level (uiout, type, id);
!   if (uiout->table_flag && (level == 1))
      uiout->headercurr = uiout->headerfirst;
  
!   uo_begin (uiout, type, level, id);
  }
  
  void
! ui_out_end (struct ui_out *uiout, enum ui_out_type type)
  {
!   int level = pop_level (uiout, type);
!   uo_end (uiout, type, level);
! }
  
! struct ui_out_end_cleanup_data
! {
!   struct ui_out *uiout;
!   enum ui_out_type type;
! };
  
! static void
! do_cleanup_end (void *data)
! {
!   struct ui_out_end_cleanup_data *end_cleanup_data = data;
!   ui_out_end (end_cleanup_data->uiout, end_cleanup_data->type);
!   xfree (end_cleanup_data);
! }
! 
! static struct cleanup *
! make_cleanup_ui_out_end (struct ui_out *uiout,
! 			 enum ui_out_type type)
! {
!   struct ui_out_end_cleanup_data *end_cleanup_data;
!   end_cleanup_data = XMALLOC (struct ui_out_end_cleanup_data);
!   end_cleanup_data->uiout = uiout;
!   end_cleanup_data->type = type;
!   return make_cleanup (do_cleanup_end, end_cleanup_data);
  }
  
! struct cleanup *
! ui_out_begin_cleanup_end (struct ui_out *uiout,
! 			  enum ui_out_type type,
! 			  const char *id)
! {
!   ui_out_begin (uiout, type, id);
!   return make_cleanup_ui_out_end (uiout, type);
! }
! 
! void
! ui_out_list_begin (struct ui_out *uiout, char *id)
! {
!   ui_out_begin (uiout, UI_OUT_LIST, id);
! }
! 
! void
! ui_out_list_end (struct ui_out *uiout)
  {
!   ui_out_end (uiout, UI_OUT_LIST);
  }
  
  struct cleanup *
  make_cleanup_ui_out_list_end (struct ui_out *uiout)
  {
!   return make_cleanup_ui_out_end (uiout, UI_OUT_LIST);
  }
  
  void
*************** ui_out_field_int (struct ui_out *uiout, 
*** 311,318 ****
  
    verify_field_proper_position (uiout);
  
!   uiout->field_count[uiout->list_flag] += 1;
!   fldno = uiout->field_count[uiout->list_flag];
  
    verify_field_alignment (uiout, fldno, &width, &align);
  
--- 387,394 ----
  
    verify_field_proper_position (uiout);
  
!   top_level (uiout)->field_count += 1;
!   fldno = top_level (uiout)->field_count;
  
    verify_field_alignment (uiout, fldno, &width, &align);
  
*************** ui_out_field_skip (struct ui_out *uiout,
*** 356,363 ****
  
    verify_field_proper_position (uiout);
  
!   uiout->field_count[uiout->list_flag] += 1;
!   fldno = uiout->field_count[uiout->list_flag];
  
    verify_field_alignment (uiout, fldno, &width, &align);
  
--- 432,439 ----
  
    verify_field_proper_position (uiout);
  
!   top_level (uiout)->field_count += 1;
!   fldno = top_level (uiout)->field_count;
  
    verify_field_alignment (uiout, fldno, &width, &align);
  
*************** ui_out_field_string (struct ui_out *uiou
*** 375,382 ****
  
    verify_field_proper_position (uiout);
  
!   uiout->field_count[uiout->list_flag] += 1;
!   fldno = uiout->field_count[uiout->list_flag];
  
    verify_field_alignment (uiout, fldno, &width, &align);
  
--- 451,458 ----
  
    verify_field_proper_position (uiout);
  
!   top_level (uiout)->field_count += 1;
!   fldno = top_level (uiout)->field_count;
  
    verify_field_alignment (uiout, fldno, &width, &align);
  
*************** ui_out_field_fmt (struct ui_out *uiout, 
*** 394,401 ****
  
    verify_field_proper_position (uiout);
  
!   uiout->field_count[uiout->list_flag] += 1;
!   fldno = uiout->field_count[uiout->list_flag];
  
    /* will not align, but has to call anyway */
    verify_field_alignment (uiout, fldno, &width, &align);
--- 470,477 ----
  
    verify_field_proper_position (uiout);
  
!   top_level (uiout)->field_count += 1;
!   fldno = top_level (uiout)->field_count;
  
    /* will not align, but has to call anyway */
    verify_field_alignment (uiout, fldno, &width, &align);
*************** default_table_header (struct ui_out *uio
*** 592,603 ****
  }
  
  static void
! default_list_begin (struct ui_out *uiout, int list_flag, char *lstid)
  {
  }
  
  static void
! default_list_end (struct ui_out *uiout, int list_flag)
  {
  }
  
--- 668,679 ----
  }
  
  static void
! default_begin (struct ui_out *uiout, enum ui_out_type type, int level, const char *lstid)
  {
  }
  
  static void
! default_end (struct ui_out *uiout, enum ui_out_type type, int level)
  {
  }
  
*************** uo_table_header (struct ui_out *uiout, i
*** 691,709 ****
  }
  
  void
! uo_list_begin (struct ui_out *uiout, int list_flag, char *lstid)
  {
!   if (!uiout->impl->list_begin)
      return;
!   uiout->impl->list_begin (uiout, list_flag, lstid);
  }
  
  void
! uo_list_end (struct ui_out *uiout, int list_flag)
  {
!   if (!uiout->impl->list_end)
      return;
!   uiout->impl->list_end (uiout, list_flag);
  }
  
  void
--- 767,785 ----
  }
  
  void
! uo_begin (struct ui_out *uiout, enum ui_out_type type, int level, const char *id)
  {
!   if (uiout->impl->begin == NULL)
      return;
!   uiout->impl->begin (uiout, type, level, id);
  }
  
  void
! uo_end (struct ui_out *uiout, enum ui_out_type type, int level)
  {
!   if (uiout->impl->end == NULL)
      return;
!   uiout->impl->end (uiout, type, level);
  }
  
  void
*************** verify_field_proper_position (struct ui_
*** 862,868 ****
  	internal_error (__FILE__, __LINE__,
  			"table_body missing; table fields must be \
  specified after table_body and inside a list.");
!       if (!uiout->list_flag)
  	internal_error (__FILE__, __LINE__,
  			"list_begin missing; table fields must be \
  specified after table_body and inside a list.");
--- 938,944 ----
  	internal_error (__FILE__, __LINE__,
  			"table_body missing; table fields must be \
  specified after table_body and inside a list.");
!       if (!uiout->level)
  	internal_error (__FILE__, __LINE__,
  			"list_begin missing; table fields must be \
  specified after table_body and inside a list.");
*************** ui_out_new (struct ui_out_impl *impl,
*** 922,929 ****
    uiout->flags = flags;
    uiout->table_flag = 0;
    uiout->body_flag = 0;
!   uiout->list_flag = 0;
!   uiout->field_count[0] = 0;
    uiout->headerfirst = NULL;
    uiout->headerlast = NULL;
    uiout->headercurr = NULL;
--- 998,1005 ----
    uiout->flags = flags;
    uiout->table_flag = 0;
    uiout->body_flag = 0;
!   uiout->level = 0;
!   top_level (uiout)->field_count = 0;
    uiout->headerfirst = NULL;
    uiout->headerlast = NULL;
    uiout->headercurr = NULL;
Index: ui-out.h
===================================================================
RCS file: /cvs/src/src/gdb/ui-out.h,v
retrieving revision 1.5
diff -p -r1.5 ui-out.h
*** ui-out.h	2001/03/14 16:42:30	1.5
--- ui-out.h	2001/03/24 02:33:31
*************** enum ui_flags
*** 51,56 ****
--- 51,58 ----
      ui_source_list = 2
    };
  
+ /* Max nr of levels that ui-out object can be nested. */
+ enum { MAX_UI_OUT_LEVELS = 5 };
  
  /* The ui_out stream structure. */
  /* NOTE: cagney/2000-02-01: The ui_stream object can be subsumed by
*************** struct ui_stream
*** 62,68 ****
      struct ui_file *stream;
    };
  
- 
  /* Prototypes for ui-out API. */
  
  extern void ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
--- 64,69 ----
*************** extern void ui_out_table_body (struct ui
*** 75,80 ****
--- 76,101 ----
  
  extern void ui_out_table_end (struct ui_out *uiout);
  
+ /* Level categories. */
+ enum ui_out_type
+   {
+     UI_OUT_TUPPLE,
+     UI_OUT_LIST
+   };
+ 
+ extern void ui_out_begin (struct ui_out *uiout,
+ 			  enum ui_out_type level_type,
+ 			  const char *lstid);
+ 
+ extern void ui_out_end (struct ui_out *uiout, enum ui_out_type type);
+ 
+ extern struct cleanup *ui_out_begin_cleanup_end (struct ui_out *uiout,
+ 						 enum ui_out_type level_type,
+ 						 const char *id);
+ 
+ /* Compatibility wrappers, new code should use ui_out_begin() and
+    ui_out_end(). */
+ 
  extern void ui_out_list_begin (struct ui_out *uiout, char *lstid);
  
  extern void ui_out_list_end (struct ui_out *uiout);
*************** extern void ui_out_error_begin (struct u
*** 142,153 ****
  extern void ui_out_error_end (struct ui_out *uiout);
  #endif
  
- #if 0
- extern void gdb_error (struct ui_out *uiout, int severity, char *format, ...);
- 
- extern void gdb_query (struct ui_out *uiout, int qflags, char *qprompt);
- #endif
- 
  /* From here on we have things that are only needed by implementation
     routines and main.c.   We should pehaps have a separate file for that,
     like a  ui-out-impl.h  file */
--- 163,168 ----
*************** extern void gdb_query (struct ui_out *ui
*** 156,170 ****
  
  /* Type definition of all implementation functions. */
  
  typedef void (table_begin_ftype) (struct ui_out * uiout,
  				  int nbrofcols, char *tblid);
  typedef void (table_body_ftype) (struct ui_out * uiout);
  typedef void (table_end_ftype) (struct ui_out * uiout);
  typedef void (table_header_ftype) (struct ui_out * uiout, int width,
  				   enum ui_align align, char *colhdr);
! typedef void (list_begin_ftype) (struct ui_out * uiout,
! 				 int list_flag, char *lstid);
! typedef void (list_end_ftype) (struct ui_out * uiout, int list_flag);
  typedef void (field_int_ftype) (struct ui_out * uiout, int fldno, int width,
  			     enum ui_align align, char *fldname, int value);
  typedef void (field_skip_ftype) (struct ui_out * uiout, int fldno, int width,
--- 171,191 ----
  
  /* Type definition of all implementation functions. */
  
+ /* A table is a special tupple/list combination.  It can be thought of
+    as ``body = { hdr = { header, ... } , body = [ { field, ... },
+    ... ] }'' */
  typedef void (table_begin_ftype) (struct ui_out * uiout,
  				  int nbrofcols, char *tblid);
  typedef void (table_body_ftype) (struct ui_out * uiout);
  typedef void (table_end_ftype) (struct ui_out * uiout);
  typedef void (table_header_ftype) (struct ui_out * uiout, int width,
  				   enum ui_align align, char *colhdr);
! /* NOTE: level > 0 (0 is reserved). */
! typedef void (begin_ftype) (struct ui_out * uiout,
! 			    enum ui_out_type type,
! 			    int level, const char *lstid);
! typedef void (end_ftype) (struct ui_out * uiout,
! 			  enum ui_out_type type, int level);
  typedef void (field_int_ftype) (struct ui_out * uiout, int fldno, int width,
  			     enum ui_align align, char *fldname, int value);
  typedef void (field_skip_ftype) (struct ui_out * uiout, int fldno, int width,
*************** struct ui_out_impl
*** 193,200 ****
      table_body_ftype *table_body;
      table_end_ftype *table_end;
      table_header_ftype *table_header;
!     list_begin_ftype *list_begin;
!     list_end_ftype *list_end;
      field_int_ftype *field_int;
      field_skip_ftype *field_skip;
      field_string_ftype *field_string;
--- 214,221 ----
      table_body_ftype *table_body;
      table_end_ftype *table_end;
      table_header_ftype *table_header;
!     begin_ftype *begin;
!     end_ftype *end;
      field_int_ftype *field_int;
      field_skip_ftype *field_skip;
      field_string_ftype *field_string;
Index: mi/ChangeLog
===================================================================
RCS file: /cvs/src/src/gdb/mi/ChangeLog,v
retrieving revision 1.13
diff -p -r1.13 ChangeLog
*** ChangeLog	2001/03/20 17:19:04	1.13
--- ChangeLog	2001/03/24 02:33:34
***************
*** 1,3 ****
--- 1,9 ----
+ 2001-03-23  Andrew Cagney  <ac131313@redhat.com>
+ 
+ 	* mi-out.c (mi_begin, mi_end): Replace mi_list_begin and
+ 	mi_list_end.
+ 	(mi_open, mi_close): Replace list_open and list_close.
+ 
  2001-03-20  Andrew Cagney  <ac131313@redhat.com>
  
  	* mi-cmd-disas.c (mi_cmd_disassemble): Initialize ``file_string''
Index: mi/mi-out.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-out.c,v
retrieving revision 1.6
diff -p -r1.6 mi-out.c
*** mi-out.c	2001/03/06 08:21:45	1.6
--- mi-out.c	2001/03/24 02:33:34
*************** static void mi_table_body (struct ui_out
*** 43,50 ****
  static void mi_table_end (struct ui_out *uiout);
  static void mi_table_header (struct ui_out *uiout, int width,
  			     enum ui_align alig, char *colhdr);
! static void mi_list_begin (struct ui_out *uiout, int list_flag, char *lstid);
! static void mi_list_end (struct ui_out *uiout, int list_flag);
  static void mi_field_int (struct ui_out *uiout, int fldno, int width,
  			  enum ui_align alig, char *fldname, int value);
  static void mi_field_skip (struct ui_out *uiout, int fldno, int width,
--- 43,50 ----
  static void mi_table_end (struct ui_out *uiout);
  static void mi_table_header (struct ui_out *uiout, int width,
  			     enum ui_align alig, char *colhdr);
! static void mi_begin (struct ui_out *uiout, enum ui_out_type type, int level, const char *id);
! static void mi_end (struct ui_out *uiout, enum ui_out_type type, int level);
  static void mi_field_int (struct ui_out *uiout, int fldno, int width,
  			  enum ui_align alig, char *fldname, int value);
  static void mi_field_skip (struct ui_out *uiout, int fldno, int width,
*************** struct ui_out_impl mi_ui_out_impl =
*** 73,80 ****
    mi_table_body,
    mi_table_end,
    mi_table_header,
!   mi_list_begin,
!   mi_list_end,
    mi_field_int,
    mi_field_skip,
    mi_field_string,
--- 73,80 ----
    mi_table_body,
    mi_table_end,
    mi_table_header,
!   mi_begin,
!   mi_end,
    mi_field_int,
    mi_field_skip,
    mi_field_string,
*************** struct ui_out_impl mi_ui_out_impl =
*** 90,97 ****
  
  extern void _initialize_mi_out (void);
  static void field_separator (struct ui_out *uiout);
! static void list_open (struct ui_out *uiout);
! static void list_close (struct ui_out *uiout);
  
  static void out_field_fmt (struct ui_out *uiout, int fldno, char *fldname,
  			   char *format,...);
--- 90,97 ----
  
  extern void _initialize_mi_out (void);
  static void field_separator (struct ui_out *uiout);
! static void mi_open (struct ui_out *uiout, enum ui_out_type type);
! static void mi_close (struct ui_out *uiout, enum ui_out_type type);
  
  static void out_field_fmt (struct ui_out *uiout, int fldno, char *fldname,
  			   char *format,...);
*************** mi_table_begin (struct ui_out *uiout, in
*** 105,111 ****
    field_separator (uiout);
    if (tblid)
      fprintf_unfiltered (data->buffer, "%s=", tblid);
!   list_open (uiout);
    data->first_header = 0;
    data->supress_field_separator = 1;
  }
--- 105,111 ----
    field_separator (uiout);
    if (tblid)
      fprintf_unfiltered (data->buffer, "%s=", tblid);
!   mi_open (uiout, UI_OUT_TUPPLE);
    data->first_header = 0;
    data->supress_field_separator = 1;
  }
*************** mi_table_body (struct ui_out *uiout)
*** 118,124 ****
    struct ui_out_data *data = ui_out_data (uiout);
    /* close the table header line if there were any headers */
    if (data->first_header)
!     list_close (uiout);
  }
  
  /* Mark end of a table */
--- 118,124 ----
    struct ui_out_data *data = ui_out_data (uiout);
    /* close the table header line if there were any headers */
    if (data->first_header)
!     mi_close (uiout, UI_OUT_TUPPLE);
  }
  
  /* Mark end of a table */
*************** void
*** 127,133 ****
  mi_table_end (struct ui_out *uiout)
  {
    struct ui_out_data *data = ui_out_data (uiout);
!   list_close (uiout);
    /* If table was empty this flag did not get reset yet */
    data->supress_field_separator = 0;
  }
--- 127,133 ----
  mi_table_end (struct ui_out *uiout)
  {
    struct ui_out_data *data = ui_out_data (uiout);
!   mi_close (uiout, UI_OUT_TUPPLE);
    /* If table was empty this flag did not get reset yet */
    data->supress_field_separator = 0;
  }
*************** mi_table_header (struct ui_out *uiout, i
*** 141,147 ****
    if (!data->first_header++)
      {
        fputs_unfiltered ("hdr=", data->buffer);
!       list_open (uiout);
      }
    mi_field_string (uiout, 0, width, alignment, 0, colhdr);
  }
--- 141,147 ----
    if (!data->first_header++)
      {
        fputs_unfiltered ("hdr=", data->buffer);
!       mi_open (uiout, UI_OUT_TUPPLE);
      }
    mi_field_string (uiout, 0, width, alignment, 0, colhdr);
  }
*************** mi_table_header (struct ui_out *uiout, i
*** 149,171 ****
  /* Mark beginning of a list */
  
  void
! mi_list_begin (struct ui_out *uiout, int list_flag, char *lstid)
  {
    struct ui_out_data *data = ui_out_data (uiout);
    field_separator (uiout);
    data->supress_field_separator = 1;
    if (lstid)
      fprintf_unfiltered (data->buffer, "%s=", lstid);
!   list_open (uiout);
  }
  
  /* Mark end of a list */
  
  void
! mi_list_end (struct ui_out *uiout, int list_flag)
  {
    struct ui_out_data *data = ui_out_data (uiout);
!   list_close (uiout);
    /* If list was empty this flag did not get reset yet */
    data->supress_field_separator = 0;
  }
--- 149,171 ----
  /* Mark beginning of a list */
  
  void
! mi_begin (struct ui_out *uiout, enum ui_out_type type, int level, const char *lstid)
  {
    struct ui_out_data *data = ui_out_data (uiout);
    field_separator (uiout);
    data->supress_field_separator = 1;
    if (lstid)
      fprintf_unfiltered (data->buffer, "%s=", lstid);
!   mi_open (uiout, type);
  }
  
  /* Mark end of a list */
  
  void
! mi_end (struct ui_out *uiout, enum ui_out_type type, int level)
  {
    struct ui_out_data *data = ui_out_data (uiout);
!   mi_close (uiout, type);
    /* If list was empty this flag did not get reset yet */
    data->supress_field_separator = 0;
  }
*************** field_separator (struct ui_out *uiout)
*** 297,310 ****
  }
  
  static void
! list_open (struct ui_out *uiout)
  {
    struct ui_out_data *data = ui_out_data (uiout);
    fputc_unfiltered ('{', data->buffer);
  }
  
  static void
! list_close (struct ui_out *uiout)
  {
    struct ui_out_data *data = ui_out_data (uiout);
    fputc_unfiltered ('}', data->buffer);
--- 297,312 ----
  }
  
  static void
! mi_open (struct ui_out *uiout,
! 	 enum ui_out_type type)
  {
    struct ui_out_data *data = ui_out_data (uiout);
    fputc_unfiltered ('{', data->buffer);
  }
  
  static void
! mi_close (struct ui_out *uiout,
! 	  enum ui_out_type type)
  {
    struct ui_out_data *data = ui_out_data (uiout);
    fputc_unfiltered ('}', data->buffer);
From eliz@delorie.com Fri Mar 23 23:58:00 2001
From: Eli Zaretskii <eliz@delorie.com>
To: ac131313@cygnus.com
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [rfc/mi] ui_list_* to ui_*
Date: Fri, 23 Mar 2001 23:58:00 -0000
Message-id: <200103240758.CAA05291@indy.delorie.com>
References: <3ABC08BD.7CEABD7@cygnus.com>
X-SW-Source: 2001-03/msg00447.html
Content-length: 595

> Date: Fri, 23 Mar 2001 21:38:53 -0500
> From: Andrew Cagney <ac131313@cygnus.com>
> 
> The attached patch introduces:
> 
>	ui_begin (...type...)
>	ui_end (...type...)
> 
> where type is either UI_OUT_TUPPLE or UI_OUT_LIST.  The interface:
> 
>	ui_list_begin()
>	ui_list_end()
> 
> remains but it is re-implemented using ui_begin/ui_end.
> 
> This is step 1 in updating MI's syntax.

Hmm, I see that ui_* functions are yet another aspect of GDB internals
that isn't mentioned anywhere in gdbint.texinfo.  Perhaps we should
consider adding some minimal docs as a necessary part of this change.


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [rfc/mi] ui_list_* to ui_*
  2001-03-23 18:39 [rfc/mi] ui_list_* to ui_* Andrew Cagney
@ 2001-03-24  5:51 ` Fernando Nasser
  2001-03-24  6:35   ` Eli Zaretskii
  0 siblings, 1 reply; 5+ messages in thread
From: Fernando Nasser @ 2001-03-24  5:51 UTC (permalink / raw)
  To: Andrew Cagney; +Cc: GDB Patches

Nice.

My only concerns are with code documentation (see below).  

P.S.: Eli mentioned the manual.  I remember that we wrote a document
describing the ui_out calls and I thought it was texi-ized already...


Andrew Cagney wrote:
> 
>         (struct ui_out): Replace ``list_flag'' and ``field_count'' with
>         ``level'' and ``levels''.

These names "thing" and "things" are sort of confusing.  Isn't there a
better way to describe these?


> + /* Level categories. */
> + enum ui_out_type
> +   {
> +     UI_OUT_TUPPLE,
> +     UI_OUT_LIST
> +   };
> +

I guess some comments defining what is a UI_OUT_TUPPLE (and even a
UI_OUT_LIST) are in order here.


Some comments before the top/pop_level stuff and struct ui_out_level
would not hurt as well.  It is always good to describe these objects. 
Think of it as a class description. 



 

-- 
Fernando Nasser
Red Hat Canada Ltd.                     E-Mail:  fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario   M4P 2C9


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [rfc/mi] ui_list_* to ui_*
  2001-03-24  5:51 ` Fernando Nasser
@ 2001-03-24  6:35   ` Eli Zaretskii
  2001-03-24  7:43     ` Fernando Nasser
  0 siblings, 1 reply; 5+ messages in thread
From: Eli Zaretskii @ 2001-03-24  6:35 UTC (permalink / raw)
  To: fnasser; +Cc: ac131313, gdb-patches

> Date: Sat, 24 Mar 2001 08:47:32 -0500
> From: Fernando Nasser <fnasser@redhat.com>
> 
> P.S.: Eli mentioned the manual.  I remember that we wrote a document
> describing the ui_out calls and I thought it was texi-ized already...

Even if that document is not in Texinfo, please tell where to find it.
It is much easier to add Texinfo markup than to come up with the
content.

TIA


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [rfc/mi] ui_list_* to ui_*
  2001-03-24  6:35   ` Eli Zaretskii
@ 2001-03-24  7:43     ` Fernando Nasser
  2001-03-24 12:03       ` Eli Zaretskii
  0 siblings, 1 reply; 5+ messages in thread
From: Fernando Nasser @ 2001-03-24  7:43 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: ac131313, gdb-patches

Eli,

This is what I wrote originally.  I had the impression that Andrew had a
revised/edited version of this, but I may be mistaken.

The text below does not reflect the changes that Andrew has posted (he
must add the doc part to the patch).


GUIDE TO UI_OUT FUNCTIONS
=========================


A FEW DEFINITIONS

The execution of gdb commands generally produces some sort of output
and can even generate an input request.

Output can be generated as: 

  ."result" of an operation;

  ."info", or side-effects of a requested operation;

  ."notification" of an asynchronous event (including the progress of
   a slow asynchronous operation);

  ."error" messages (including warnings);

  ."debug" data;

  ."query prompts" (a special case).

This document concentrates on how to build result output, although some
of it also applies to other kinds of output.

Result output generated usually includes some of the following:

  .the actual data;

  .console output formatting (to make it user readable);

  .machine oriented formatting (a more terse formatting for easy of
parsing);

  .annotation for helping a GUI (or emacs) to identify interesting
   parts of a console formatted output.

The ui_out routines take care of the first three cases.  Annotation is
done by separate annotation routines.  Use of annotation as a GUI to
gdb interface is deprecated.

Output can be in the form of a single item, which we call "field", a
list of fields or a table (which is a list of a list of fields with a
header).  In a BNF-like form:

<field> ::= any single item of data kept by gdb ;;

<list> ::= { <field> } ;;

<table> ::= <header> { <list> } ;;

<header> ::= { <column> } ;;

<column> ::= <width> <alignment> <title> ;;



GENERAL INFORMATION

All ui_out routines currently are of type "void", except for
ui_out_stream_new() which returns a pointer to the new object created.

The first parameter is always the ui_out vector object.

The "format" parameter is like in printf.  When it is present, there
is usually also a variable list of arguments used to complete the %
entries
in that.

When a character string argument is not used in a ui_out function
call, a NULL pointer has to be supplied instead.


TABLE AND LIST FUNCTIONS

This section introduces ui_out routines to build lists and tables.
The routines to output the actual data items (fields) are presented in
the next section.

A list is a sequence of fields with information about an object.

A table is a list of lists, each on a separate line, prefixed by a
header line with the column titles.

Use the table functions if your output is composed of a list of fields
for several objects and the console output shall have a header.  Use
this even when you are listing just one object but you still want the
header.

Use the list functions for the output of each object of a table or if
your output consists of a single list of fields.

You can nest a list into a table but not the opposite.

Lists can be nested (some of your fields may be a list (or
a tuple), like a {name,value} pair).  The maximum nesting level is
currently 4.

Function descriptions:

ui_out_table_begin (uiout, nbrofcols, tblid)

  nbrofcols - number of columns in the table.
  tblid - an optional string identifying the table
  
ui_out_table_header (uiout, width, alignment, colhdr)

  width - column width in chars.
  alignment - {left, center, right}
  colhdr - column header string

ui_out_table_body (uiout)

ui_out_table_end (uiout)

The functions ui_out_table_begin() and ui_out_table_end() are to be
used as brackets around output code that generated table data. The
calls to ui_out_table_header() must follow the call to
ui_out_table_begin() and precede ui_out_table_body(). The lists that
represent the table rows must follow the ui_out_table_begin() call and
precede the call to ui_out_table_end().


ui_out_list_begin (uiout, lstid)

  listid - an optional string identifying the list

ui_out_list_end (uiout)


These functions are to be used as brackets around code that produce
the actual list output.  A listheader can be supplied and will precede
the list fields.


Thus, the structure of the table output code is something like:

  ui_out_table_begin
    ui_out_table_header
    ...
  ui_out_table_body
    ui_out_list_begin
      ui_out_field_*
      ...
    ui_out_list_end
    ...
  ui_out_table_end



ITEM OUTPUT FUNCTIONS

These are the functions that produce output with the actual data
items, or fields, which contain information about the object.

Choose the appropriate function accordingly to your particular needs.


ui_out_field_fmt (uiout, fldname, format, ...)

  fldname - name of the field.
  format - format string (like in printf) to display the field data.
  ... - variable list.

Use ui_out_field_fmt() for elements of a list.  It can also be used for
single item output, if it is generated in a single call.  This generic
function should be used only when it is not possible to use one of the
specialized versions (see below). 

ui_out_field_int (uiout, fldname, value)

Specialized version of ui_out_field() for int variables.  It assumes a
"%d" output conversion specification.

ui_out_field_core_addr (uiout, fldname, address)

Specialized version of ui_out_field() which correctly handles
CORE_ADDR.

ui_out_field_string (uiout, fldname, string)

Specialized version of ui_out_field() for strings.  It assumes a "%s"
output conversion specification.


streambuffer = ui_out_stream_new (uiout)

ui_out_stream_delete (streambuffer)

ui_out_field_stream (uiout, fieldname, streambuffer)

Use these functions if you have to compose your output piece by piece,
using fprintf_stream() or fputc_stream() lower level routines.  Just
pass the stream created by ui_out_stream_new(), streambuffer->stream,
(you have to declare the pointer somewhere) to these routines and the
output is accumulated.

ui_out_field_stream() grabs all data so far accumulated and works like
ui_out_field_string() for all other purposes.  Calling
ui_out_field_stream()
frees the accumulated string (i.e., the data in the buffer is consumed)
but not the stream descriptor.  When it is no longer necessary, you must
call ui_out_stream_delete() to deallocate the memory.

Important: If there is any chance the current function will bail out
before
completing and reaching the point where ui_out_stream_delete() is
called,
it is necessary to set a cleanup.  You can do it as follows:
  mybuf = ui_out_stream_new (uiout);
  old_cleanup = make_cleanup (ui_out_stream_delete, mybuf);
  ...
  do_cleanup (old_cleanup);
If the function already has the old_cleanup part set, you just have to
add:
  mybuf = ui_out_stream_new (uiout);
  make_cleanup (ui_out_stream_delete, mybuf);
Note that with cleanups in place, you should not call
ui_out_stream_delete()
directly or you would attempt to free the same buffer twice.


ui_out_field_skip (uiout, fieldname)

Use this one if you have to ommit a field in a table, so that the
columns
are handled correctly.


ui_out_text (uiout, string)

  string - string to be used for human readability.

ui_out_spaces (uiout, numspaces)

  numspaces - number of spaces to include in the current output
location.

The above functions are used to insert text around the actual field
data for readability.  This is important if the output is to be
displayed at the console, for instance, or if it will be displayed in
an unmodified form by the GUI.


ui_out_message (uiout, verbosity, format, ...)

  verbosity - indicates the minimum verbosity level required for this
              information to be displayed.

Used to generate free format messages.


ui_out_wrap_hint (uiout, identstring)

This gives the console output filter (paging filter) a hint of where
to break lines which are too long.  Ignored for all other output
consumers.


ui_out_flush (uiout)

Flushes whatever output has been accumulated so far in UIs that buffer
output.


EXAMPLES OF USE OF UI_OUT FUNCTIONS
===================================

On breakpoints.c  breakpoint_1()

Was:

        if (!found_a_breakpoint++)
          {
            annotate_breakpoints_headers ();

            annotate_field (0);
            printf_filtered ("Num ");
            annotate_field (1);
            printf_filtered ("Type           ");
            annotate_field (2);
            printf_filtered ("Disp ");
            annotate_field (3);
            printf_filtered ("Enb ");
            if (addressprint)
              {
                annotate_field (4);
                printf_filtered ("Address    ");
              }
            annotate_field (5);
            printf_filtered ("What\n");

            annotate_breakpoints_table ();
          }

Became:

        if (!found_a_breakpoint++)
          {
            annotate_breakpoints_headers ();
            if (addressprint)
              ui_out_table_begin (ui, 6);
            else
              ui_out_table_begin (ui, 5);

            annotate_field (0);
            ui_out_table_header (ui, 4, left, "Num");
            annotate_field (1);
            ui_out_table_header (ui, 15, left, "Type");
            annotate_field (2);
            ui_out_table_header (ui, 5, left, "Disp");
            annotate_field (3);
            ui_out_table_header (ui, 4, left, "Enb");
            if (addressprint)
              {
                annotate_field (4);
                ui_out_table_header (ui, 11, left, "Address");
              }
            annotate_field (5);
            ui_out_table_header (ui, 40, left, "What");

            ui_out_table_body (ui);
            annotate_breakpoints_table ();
          }


Was:

        annotate_record ();
        annotate_field (0);
        printf_filtered ("%-3d ", b->number);
        annotate_field (1);
        if ((int)b->type > (sizeof(bptypes)/sizeof(bptypes[0])))
          error ("bptypes table does not describe type #%d.",
(int)b->type);
        if ((int)b->type != bptypes[(int)b->type].type)
          error ("bptypes table does not describe type #%d?",
(int)b->type);
        printf_filtered ("%-14s ", bptypes[(int)b->type].description);
        annotate_field (2);
        printf_filtered ("%-4s ", bpdisps[(int)b->disposition]);
        annotate_field (3);
        printf_filtered ("%-3c ", bpenables[(int)b->enable]);

Became:

        annotate_record ();
        ui_out_list_begin (ui, 0);
        annotate_field (0);
        ui_out_field_int (ui, "Number", b->number);
        ui_out_spaces (ui, 1);
        annotate_field (1);
        if ((int)b->type > (sizeof(bptypes)/sizeof(bptypes[0])))
          error ("bptypes table does not describe type #%d.",
(int)b->type);
        if ((int)b->type != bptypes[(int)b->type].type)
          error ("bptypes table does not describe type #%d?",
(int)b->type);
        ui_out_field_string (ui, "Type",
bptypes[(int)b->type].description);
        ui_out_spaces (ui, 1);
        annotate_field (2);
        ui_out_field_string (ui, "Disp", bpdisps[(int)b->disposition]);
        ui_out_spaces (ui, 1);
        annotate_field (3);
        ui_out_field_fmt (ui, "Enabled", "%c",
bpenables[(int)b->enable]);
        ui_out_spaces (ui, 3);


Was:

            annotate_field (5);
            print_expression (b->exp, gdb_stdout);

Became:

            GDB_FILE *local_stream;

            annotate_field (5);
            ui_out_newstream (ui, &local_stream);
            print_expression (b->exp, local_stream);
            ui_out_field_stream (ui, "What", local_stream);
            ui_out_destroystream (ui, &local_stream);

Was:

            annotate_field (5);
            if (b->dll_pathname == NULL)
              printf_filtered ("<any library> ");
            else
              printf_filtered ("library \"%s\" ", b->dll_pathname);

Became:

            annotate_field (5);
            if (b->dll_pathname == NULL)
              {
                ui_out_field_string (ui, "What", "<any library>");
                ui_out_spaces (ui, 1);
              }
            else
              {
                ui_out_padding ("library \"");
                ui_out_field_string (ui, "What", b->dll_pathname);
                ui_out_padding ("\" ");
              }


Was:

            annotate_field (5);
            if (b->forked_inferior_pid != 0)
              printf_filtered ("process %d ", b->forked_inferior_pid);

Became:

            annotate_field (5);
            if (b->forked_inferior_pid != 0)
              {
                ui_out_padding ("process ");
                ui_out_field_int (ui, "What", b->forked_inferior_pid);
                ui_out_spaces (ui, 1);
              }

Was:

            annotate_field (5);
            if (b->exec_pathname != NULL)
              printf_filtered ("program \"%s\" ", b->exec_pathname);

Became:

            annotate_field (5);
            if (b->exec_pathname != NULL)
              {
                ui_out_padding ("program \"");
                ui_out_field_string (ui, "What", b->exec_pathname);
                ui_out_padding ("\" ");
              }

Was:

            annotate_field (5);
            printf_filtered ("exception catch ");

Became:

            annotate_field (5);
            ui_out_field_string (ui, "What", "exception catch");
            ui_out_spaces (ui, 1);

Was:
            annotate_field (5);
            printf_filtered ("exception throw ");

Became:

            annotate_field (5);
            ui_out_field_string (ui, "What", "exception throw");
            ui_out_spaces (ui, 1);

Was:

                annotate_field (4);
                /* FIXME-32x64: need a print_address_numeric with
                   field width */
                printf_filtered
                  ("%s ",
                   local_hex_string_custom
                   ((unsigned long) b->address, "08l"));

Became:

                annotate_field (4);
                ui_out_field_core_addr (ui, "Address", b->address);
                ui_out_spaces (ui, 1);




-- 
Fernando Nasser
Red Hat Canada Ltd.                     E-Mail:  fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario   M4P 2C9


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [rfc/mi] ui_list_* to ui_*
  2001-03-24  7:43     ` Fernando Nasser
@ 2001-03-24 12:03       ` Eli Zaretskii
  0 siblings, 0 replies; 5+ messages in thread
From: Eli Zaretskii @ 2001-03-24 12:03 UTC (permalink / raw)
  To: fnasser; +Cc: ac131313, gdb-patches

> Date: Sat, 24 Mar 2001 10:39:57 -0500
> From: Fernando Nasser <fnasser@redhat.com>
> 
> This is what I wrote originally.  I had the impression that Andrew had a
> revised/edited version of this, but I may be mistaken.
> 
> The text below does not reflect the changes that Andrew has posted (he
> must add the doc part to the patch).
> 
> 
> GUIDE TO UI_OUT FUNCTIONS
> =========================

Thanks!


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2001-03-24 12:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-03-23 18:39 [rfc/mi] ui_list_* to ui_* Andrew Cagney
2001-03-24  5:51 ` Fernando Nasser
2001-03-24  6:35   ` Eli Zaretskii
2001-03-24  7:43     ` Fernando Nasser
2001-03-24 12:03       ` Eli Zaretskii

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox