c &= 0xFF;			  if (PRINT_LITERAL_FORM (c)) { if (c == '\\' || c == quoter) { fputs_filtered ("\\", stream); } fprintf_filtered (stream, "%c", c); } else { switch (c) { case '\n': fputs_filtered ("\\n", stream); break; case '\b': fputs_filtered ("\\b", stream); break; case '\t': fputs_filtered ("\\t", stream); break; case '\f': fputs_filtered ("\\f", stream); break; case '\r': fputs_filtered ("\\r", stream); break; case '\033': fputs_filtered ("\\e", stream); break; case '\007': fputs_filtered ("\\a", stream); break; default: fprintf_filtered (stream, "\\%.3o", (unsigned int) c); break; } } }    static void m2_printchar (c, stream) int c; GDB_FILE *stream; { fputs_filtered ("'", stream); emit_char (c, stream, '\''); fputs_filtered ("'", stream); }    static void m2_printstr (stream, string, length, force_ellipses) GDB_FILE *stream; char *string; unsigned int length; int force_ellipses; { register unsigned int i; unsigned int things_printed = 0; int in_quotes = 0; int need_comma = 0; extern int inspect_it; extern int repeat_count_threshold; extern int print_max;  if (length == 0) { fputs_filtered ("\"\"", gdb_stdout); return; }  for (i = 0; i < length && things_printed < print_max; ++i) {  unsigned int rep1;  unsigned int reps;  QUIT;  if (need_comma) { fputs_filtered (", ", stream); need_comma = 0; }  rep1 = i + 1; reps = 1; while (rep1 < length && string[rep1] == string[i]) { ++rep1; ++reps; }  if (reps > repeat_count_threshold) { if (in_quotes) { if (inspect_it) fputs_filtered ("\\\", ", stream); else fputs_filtered ("\", ", stream); in_quotes = 0; } m2_printchar (string[i], stream); fprintf_filtered (stream, " <repeats %u times>", reps); i = rep1 - 1; things_printed += repeat_count_threshold; need_comma = 1; } else { if (!in_quotes) { if (inspect_it) fputs_filtered ("\\\"", stream); else fputs_filtered ("\"", stream); in_quotes = 1; } emit_char (string[i], stream, '"'); ++things_printed; } }   if (in_quotes) { if (inspect_it) fputs_filtered ("\\\"", stream); else fputs_filtered ("\"", stream); }  if (force_ellipses || i < length) fputs_filtered ("...", stream); }    static struct type * m2_create_fundamental_type (objfile, typeid) struct objfile *objfile; int typeid; { register struct type *type = NULL;
struct type *type = NULL;
static struct type *m2_create_fundamental_type PARAMS ((struct objfile *, int));static void m2_printstr PARAMS ((GDB_FILE *, char *, unsigned int, int));static void m2_printchar PARAMS ((int, GDB_FILE *));static void emit_char PARAMS ((int, GDB_FILE *, int));/* Print the character C on STREAM as part of the contents of a literal   string whose delimiter is QUOTER.  Note that that format for printing   characters and strings is language specific.   FIXME:  This is a copy of the same function from c-exp.y.  It should   be replaced with a true Modula version. */static voidemit_char (c, stream, quoter)     register int c;     GDB_FILE *stream;     int quoter;{  c &= 0xFF;			/* Avoid sign bit follies */  if (PRINT_LITERAL_FORM (c))    {      if (c == '\\' || c == quoter)	{	  fputs_filtered ("\\", stream);	}      fprintf_filtered (stream, "%c", c);    }  else    {      switch (c)	{	case '\n':	  fputs_filtered ("\\n", stream);	  break;	case '\b':	  fputs_filtered ("\\b", stream);	  break;	case '\t':	  fputs_filtered ("\\t", stream);	  break;	case '\f':	  fputs_filtered ("\\f", stream);	  break;	case '\r':	  fputs_filtered ("\\r", stream);	  break;	case '\033':	  fputs_filtered ("\\e", stream);	  break;	case '\007':	  fputs_filtered ("\\a", stream);	  break;	default:	  fprintf_filtered (stream, "\\%.3o", (unsigned int) c);	  break;	}    }}/* FIXME:  This is a copy of the same function from c-exp.y.  It should   be replaced with a true Modula version. */static voidm2_printchar (c, stream)     int c;     GDB_FILE *stream;{  fputs_filtered ("'", stream);  emit_char (c, stream, '\'');  fputs_filtered ("'", stream);}/* Print the character string STRING, printing at most LENGTH characters.   Printing stops early if the number hits print_max; repeat counts   are printed as appropriate.  Print ellipses at the end if we   had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.   FIXME:  This is a copy of the same function from c-exp.y.  It should   be replaced with a true Modula version. */static voidm2_printstr (stream, string, length, force_ellipses)     GDB_FILE *stream;     char *string;     unsigned int length;     int force_ellipses;{  register unsigned int i;  unsigned int things_printed = 0;  int in_quotes = 0;  int need_comma = 0;  extern int inspect_it;  extern int repeat_count_threshold;  extern int print_max;  if (length == 0)    {      fputs_filtered ("\"\"", gdb_stdout);      return;    }  for (i = 0; i < length && things_printed < print_max; ++i)    {      /* Position of the character we are examining	 to see whether it is repeated.  */      unsigned int rep1;      /* Number of repetitions we have detected so far.  */      unsigned int reps;      QUIT;      if (need_comma)	{	  fputs_filtered (", ", stream);	  need_comma = 0;	}      rep1 = i + 1;      reps = 1;      while (rep1 < length && string[rep1] == string[i])	{	  ++rep1;	  ++reps;	}      if (reps > repeat_count_threshold)	{	  if (in_quotes)	    {	      if (inspect_it)		fputs_filtered ("\\\", ", stream);	      else		fputs_filtered ("\", ", stream);	      in_quotes = 0;	    }	  m2_printchar (string[i], stream);	  fprintf_filtered (stream, " <repeats %u times>", reps);	  i = rep1 - 1;	  things_printed += repeat_count_threshold;	  need_comma = 1;	}      else	{	  if (!in_quotes)	    {	      if (inspect_it)		fputs_filtered ("\\\"", stream);	      else		fputs_filtered ("\"", stream);	      in_quotes = 1;	    }	  emit_char (string[i], stream, '"');	  ++things_printed;	}    }  /* Terminate the quotes if necessary.  */  if (in_quotes)    {      if (inspect_it)	fputs_filtered ("\\\"", stream);      else	fputs_filtered ("\"", stream);    }  if (force_ellipses || i < length)    fputs_filtered ("...", stream);}/* FIXME:  This is a copy of c_create_fundamental_type(), before   all the non-C types were stripped from it.  Needs to be fixed   by an experienced Modula programmer. */static struct type *m2_create_fundamental_type (objfile, typeid)     struct objfile *objfile;     int typeid;{  register struct type *type = NULL;  switch (typeid)    {      default:	/* FIXME:  For now, if we are asked to produce a type not in this	   language, create the equivalent of a C integer type with the	   name "<?type?>".  When all the dust settles from the type	   reconstruction work, this should probably become an error. */	type = init_type (TYPE_CODE_INT,			  TARGET_INT_BIT / TARGET_CHAR_BIT,			  0, "<?type?>", objfile);        warning ("internal error: no Modula fundamental type %d", typeid);	break;      case FT_VOID:	type = init_type (TYPE_CODE_VOID,			  TARGET_CHAR_BIT / TARGET_CHAR_BIT,			  0, "void", objfile);	break;      case FT_BOOLEAN:	type = init_type (TYPE_CODE_BOOL,			  TARGET_CHAR_BIT / TARGET_CHAR_BIT,			  TYPE_FLAG_UNSIGNED, "boolean", objfile);	break;      case FT_STRING:	type = init_type (TYPE_CODE_STRING,			  TARGET_CHAR_BIT / TARGET_CHAR_BIT,			  0, "string", objfile);	break;      case FT_CHAR:	type = init_type (TYPE_CODE_INT,			  TARGET_CHAR_BIT / TARGET_CHAR_BIT,			  0, "char", objfile);	break;      case FT_SIGNED_CHAR:	type = init_type (TYPE_CODE_INT,			  TARGET_CHAR_BIT / TARGET_CHAR_BIT,			  0, "signed char", objfile);	break;      case FT_UNSIGNED_CHAR:	type = init_type (TYPE_CODE_INT,			  TARGET_CHAR_BIT / TARGET_CHAR_BIT,			  TYPE_FLAG_UNSIGNED, "unsigned char", objfile);	break;      case FT_SHORT:	type = init_type (TYPE_CODE_INT,			  TARGET_SHORT_BIT / TARGET_CHAR_BIT,			  0, "short", objfile);	break;      case FT_SIGNED_SHORT:	type = init_type (TYPE_CODE_INT,			  TARGET_SHORT_BIT / TARGET_CHAR_BIT,			  0, "short", objfile);	/* FIXME-fnf */	break;      case FT_UNSIGNED_SHORT:	type = init_type (TYPE_CODE_INT,			  TARGET_SHORT_BIT / TARGET_CHAR_BIT,			  TYPE_FLAG_UNSIGNED, "unsigned short", objfile);	break;      case FT_INTEGER:	type = init_type (TYPE_CODE_INT,			  TARGET_INT_BIT / TARGET_CHAR_BIT,			  0, "int", objfile);	break;      case FT_SIGNED_INTEGER:	type = init_type (TYPE_CODE_INT,			  TARGET_INT_BIT / TARGET_CHAR_BIT,			  0, "int", objfile); /* FIXME -fnf */	break;      case FT_UNSIGNED_INTEGER:	type = init_type (TYPE_CODE_INT,			  TARGET_INT_BIT / TARGET_CHAR_BIT,			  TYPE_FLAG_UNSIGNED, "unsigned int", objfile);	break;      case FT_FIXED_DECIMAL:	type = init_type (TYPE_CODE_INT,			  TARGET_INT_BIT / TARGET_CHAR_BIT,			  0, "fixed decimal", objfile);	break;      case FT_LONG:	type = init_type (TYPE_CODE_INT,			  TARGET_LONG_BIT / TARGET_CHAR_BIT,			  0, "long", objfile);	break;      case FT_SIGNED_LONG:	type = init_type (TYPE_CODE_INT,			  TARGET_LONG_BIT / TARGET_CHAR_BIT,			  0, "long", objfile); /* FIXME -fnf */	break;      case FT_UNSIGNED_LONG:	type = init_type (TYPE_CODE_INT,			  TARGET_LONG_BIT / TARGET_CHAR_BIT,			  TYPE_FLAG_UNSIGNED, "unsigned long", objfile);	break;      case FT_LONG_LONG:	type = init_type (TYPE_CODE_INT,			  TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,			  0, "long long", objfile);	break;      case FT_SIGNED_LONG_LONG:	type = init_type (TYPE_CODE_INT,			  TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,			  0, "signed long long", objfile);	break;      case FT_UNSIGNED_LONG_LONG:	type = init_type (TYPE_CODE_INT,			  TARGET_LONG_LONG_BIT / TARGET_CHAR_BIT,			  TYPE_FLAG_UNSIGNED, "unsigned long long", objfile);	break;      case FT_FLOAT:	type = init_type (TYPE_CODE_FLT,			  TARGET_FLOAT_BIT / TARGET_CHAR_BIT,			  0, "float", objfile);	break;      case FT_DBL_PREC_FLOAT:	type = init_type (TYPE_CODE_FLT,			  TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,			  0, "double", objfile);	break;      case FT_FLOAT_DECIMAL:	type = init_type (TYPE_CODE_FLT,			  TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,			  0, "floating decimal", objfile);	break;      case FT_EXT_PREC_FLOAT:	type = init_type (TYPE_CODE_FLT,			  TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,			  0, "long double", objfile);	break;      case FT_COMPLEX:	type = init_type (TYPE_CODE_COMPLEX,			  2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,			  0, "complex", objfile);	TYPE_TARGET_TYPE (type)	  = m2_create_fundamental_type (objfile, FT_FLOAT);	break;      case FT_DBL_PREC_COMPLEX:	type = init_type (TYPE_CODE_COMPLEX,			  2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,			  0, "double complex", objfile);	TYPE_TARGET_TYPE (type)	  = m2_create_fundamental_type (objfile, FT_DBL_PREC_FLOAT);	break;      case FT_EXT_PREC_COMPLEX:	type = init_type (TYPE_CODE_COMPLEX,			  2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,			  0, "long double complex", objfile);	TYPE_TARGET_TYPE (type)	  = m2_create_fundamental_type (objfile, FT_EXT_PREC_FLOAT);	break;      }  return (type);}