| /* Pascal language support definitions for GDB, the GNU debugger. | 
 |  | 
 |    Copyright (C) 2000-2024 Free Software Foundation, Inc. | 
 |  | 
 |    This file is part of GDB. | 
 |  | 
 |    This program is free software; you can redistribute it and/or modify | 
 |    it under the terms of the GNU General Public License as published by | 
 |    the Free Software Foundation; either version 3 of the License, or | 
 |    (at your option) any later version. | 
 |  | 
 |    This program is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |    GNU General Public License for more details. | 
 |  | 
 |    You should have received a copy of the GNU General Public License | 
 |    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
 |  | 
 | #ifndef GDB_P_LANG_H | 
 | #define GDB_P_LANG_H | 
 |  | 
 | /* This file is derived from c-lang.h */ | 
 |  | 
 | struct value; | 
 | struct parser_state; | 
 |  | 
 | /* Determines if type TYPE is a pascal string type.  Returns a positive | 
 |    value if the type is a known pascal string type.  This function is used | 
 |    by p-valprint.c code to allow better string display.  If it is a pascal | 
 |    string type, then it also sets info needed to get the length and the | 
 |    data of the string length_pos, length_size and string_pos are given in | 
 |    bytes.  char_size gives the element size in bytes.  FIXME: if the | 
 |    position or the size of these fields are not multiple of TARGET_CHAR_BIT | 
 |    then the results are wrong but this does not happen for Free Pascal nor | 
 |    for GPC.  */ | 
 |  | 
 | extern int pascal_is_string_type (struct type *type,int *length_pos, | 
 | 				  int *length_size, int *string_pos, | 
 | 				  struct type **char_type, | 
 | 				  const char **arrayname); | 
 |  | 
 | /* Defined in p-lang.c */ | 
 |  | 
 | extern const char *pascal_main_name (void); | 
 |  | 
 | /* These are in p-lang.c: */ | 
 |  | 
 | extern int is_pascal_string_type (struct type *, int *, int *, int *, | 
 | 				  struct type **, const char **); | 
 |  | 
 | extern int pascal_object_is_vtbl_ptr_type (struct type *); | 
 |  | 
 | extern int pascal_object_is_vtbl_member (struct type *); | 
 |  | 
 | /* Class representing the Pascal language.  */ | 
 |  | 
 | class pascal_language : public language_defn | 
 | { | 
 | public: | 
 |   pascal_language () | 
 |     : language_defn (language_pascal) | 
 |   { /* Nothing.  */ } | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   const char *name () const override | 
 |   { return "pascal"; } | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   const char *natural_name () const override | 
 |   { return "Pascal"; } | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   const std::vector<const char *> &filename_extensions () const override | 
 |   { | 
 |     static const std::vector<const char *> extensions | 
 |       = { ".pas", ".p", ".pp" }; | 
 |     return extensions; | 
 |   } | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void language_arch_info (struct gdbarch *gdbarch, | 
 | 			   struct language_arch_info *lai) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void print_type (struct type *type, const char *varstring, | 
 | 		   struct ui_file *stream, int show, int level, | 
 | 		   const struct type_print_options *flags) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void value_print (struct value *val, struct ui_file *stream, | 
 | 		    const struct value_print_options *options) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void value_print_inner | 
 | 	(struct value *val, struct ui_file *stream, int recurse, | 
 | 	 const struct value_print_options *options) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   int parser (struct parser_state *ps) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void emitchar (int ch, struct type *chtype, | 
 | 		 struct ui_file *stream, int quoter) const override | 
 |   { | 
 |     int in_quotes = 0; | 
 |  | 
 |     print_one_char (ch, stream, &in_quotes); | 
 |     if (in_quotes) | 
 |       gdb_puts ("'", stream); | 
 |   } | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void printchar (int ch, struct type *chtype, | 
 | 		  struct ui_file *stream) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void printstr (struct ui_file *stream, struct type *elttype, | 
 | 		 const gdb_byte *string, unsigned int length, | 
 | 		 const char *encoding, int force_ellipses, | 
 | 		 const struct value_print_options *options) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   void print_typedef (struct type *type, struct symbol *new_symbol, | 
 | 		      struct ui_file *stream) const override; | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   bool is_string_type_p (struct type *type) const override | 
 |   { | 
 |     return pascal_is_string_type(type, nullptr, nullptr, nullptr, | 
 | 				 nullptr, nullptr) > 0; | 
 |   } | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   const char *name_of_this () const override | 
 |   { return "this"; } | 
 |  | 
 |   /* See language.h.  */ | 
 |  | 
 |   bool range_checking_on_by_default () const override | 
 |   { return true; } | 
 |  | 
 | private: | 
 |  | 
 |   /* Print the character C on STREAM as part of the contents of a literal | 
 |      string.  IN_QUOTES is reset to 0 if a char is written with #4 notation.  */ | 
 |  | 
 |   void print_one_char (int c, struct ui_file *stream, int *in_quotes) const; | 
 |  | 
 |   /* Print the name of the type (or the ultimate pointer target, | 
 |      function value or array element), or the description of a | 
 |      structure or union. | 
 |  | 
 |      SHOW positive means print details about the type (e.g. enum values), | 
 |      and print structure elements passing SHOW - 1 for show.  SHOW negative | 
 |      means just print the type name or struct tag if there is one.  If | 
 |      there is no name, print something sensible but concise like "struct | 
 |      {...}". | 
 |      SHOW zero means just print the type name or struct tag if there is one. | 
 |      If there is no name, print something sensible but not as concise like | 
 |      "struct {int x; int y;}". | 
 |  | 
 |      LEVEL is the number of spaces to indent by. | 
 |      We increase it for some recursive calls.  */ | 
 |  | 
 |   void type_print_base (struct type *type, struct ui_file *stream, int show, | 
 | 			int level, | 
 | 			const struct type_print_options *flags) const; | 
 |  | 
 |  | 
 |   /* Print any array sizes, function arguments or close parentheses | 
 |      needed after the variable name (to describe its type). | 
 |      Args work like pascal_type_print_varspec_prefix.  */ | 
 |  | 
 |   void type_print_varspec_suffix (struct type *type, struct ui_file *stream, | 
 | 				  int show, int passed_a_ptr, | 
 | 				  int demangled_args, | 
 | 				  const struct type_print_options *flags) const; | 
 |  | 
 |   /* Helper for pascal_language::type_print_varspec_suffix to print the | 
 |      suffix of a function or method.  */ | 
 |  | 
 |   void type_print_func_varspec_suffix | 
 | 	(struct type *type, struct ui_file *stream, int show, | 
 | 	 int passed_a_ptr, int demangled_args, | 
 | 	 const struct type_print_options *flags) const; | 
 |  | 
 |   /* Print any asterisks or open-parentheses needed before the | 
 |      variable name (to describe its type). | 
 |  | 
 |      On outermost call, pass 0 for PASSED_A_PTR. | 
 |      On outermost call, SHOW > 0 means should ignore | 
 |      any typename for TYPE and show its details. | 
 |      SHOW is always zero on recursive calls.  */ | 
 |  | 
 |   void type_print_varspec_prefix | 
 | 	(struct type *type, struct ui_file *stream, int show, | 
 | 	 int passed_a_ptr, const struct type_print_options *flags) const; | 
 |  | 
 |   /* Print the function args from TYPE (a TYPE_CODE_FUNC) to STREAM taking | 
 |      FLAGS into account where appropriate.  */ | 
 |  | 
 |   void  print_func_args (struct type *type, struct ui_file *stream, | 
 | 			 const struct type_print_options *flags) const; | 
 |  | 
 |   /* Print the Pascal method arguments for PHYSNAME and METHODNAME to the | 
 |      file STREAM.  */ | 
 |  | 
 |   void type_print_method_args (const char *physname, const char *methodname, | 
 | 			       struct ui_file *stream) const; | 
 |  | 
 |   /* If TYPE is a derived type, then print out derivation information. | 
 |      Print only the actual base classes of this type, not the base classes | 
 |      of the base classes.  I.e. for the derivation hierarchy: | 
 |  | 
 |      class A { int a; }; | 
 |      class B : public A {int b; }; | 
 |      class C : public B {int c; }; | 
 |  | 
 |      Print the type of class C as: | 
 |  | 
 |      class C : public B { | 
 |      int c; | 
 |      } | 
 |  | 
 |      Not as the following (like gdb used to), which is not legal C++ syntax | 
 |      for derived types and may be confused with the multiple inheritance | 
 |      form: | 
 |  | 
 |      class C : public B : public A { | 
 |      int c; | 
 |      } | 
 |  | 
 |      In general, gdb should try to print the types as closely as possible | 
 |      to the form that they appear in the source code.  */ | 
 |  | 
 |   void type_print_derivation_info (struct ui_file *stream, | 
 | 				   struct type *type) const; | 
 | }; | 
 |  | 
 | #endif /* GDB_P_LANG_H */ |