stage4/generate_c/generate_c.cc
changeset 793 268bf4ca5fa1
parent 762 a3d917474ae4
parent 706 31553c22f318
child 810 d9c48ad646f1
equal deleted inserted replaced
785:b08167f156a1 793:268bf4ca5fa1
   107 
   107 
   108 
   108 
   109 /* Variable declaration symbol for accessor macros */
   109 /* Variable declaration symbol for accessor macros */
   110 #define DECLARE_VAR "__DECLARE_VAR"
   110 #define DECLARE_VAR "__DECLARE_VAR"
   111 #define DECLARE_GLOBAL "__DECLARE_GLOBAL"
   111 #define DECLARE_GLOBAL "__DECLARE_GLOBAL"
       
   112 #define DECLARE_GLOBAL_FB "__DECLARE_GLOBAL_FB"
   112 #define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION"
   113 #define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION"
   113 #define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED"
   114 #define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED"
   114 #define DECLARE_EXTERNAL "__DECLARE_EXTERNAL"
   115 #define DECLARE_EXTERNAL "__DECLARE_EXTERNAL"
       
   116 #define DECLARE_EXTERNAL_FB "__DECLARE_EXTERNAL_FB"
   115 #define DECLARE_LOCATED "__DECLARE_LOCATED"
   117 #define DECLARE_LOCATED "__DECLARE_LOCATED"
   116 #define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE"
   118 #define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE"
   117 
   119 
   118 /* Variable declaration symbol for accessor macros */
   120 /* Variable declaration symbol for accessor macros */
   119 #define INIT_VAR "__INIT_VAR"
   121 #define INIT_VAR "__INIT_VAR"
   120 #define INIT_GLOBAL "__INIT_GLOBAL"
   122 #define INIT_GLOBAL "__INIT_GLOBAL"
       
   123 #define INIT_GLOBAL_FB "__INIT_GLOBAL_FB"
   121 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED"
   124 #define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED"
   122 #define INIT_EXTERNAL "__INIT_EXTERNAL"
   125 #define INIT_EXTERNAL "__INIT_EXTERNAL"
       
   126 #define INIT_EXTERNAL_FB "__INIT_EXTERNAL_FB"
   123 #define INIT_LOCATED "__INIT_LOCATED"
   127 #define INIT_LOCATED "__INIT_LOCATED"
   124 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE"
   128 #define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE"
   125 
   129 
   126 /* Variable getter symbol for accessor macros */
   130 /* Variable getter symbol for accessor macros */
   127 #define GET_VAR "__GET_VAR"
   131 #define GET_VAR "__GET_VAR"
   128 #define GET_EXTERNAL "__GET_EXTERNAL"
   132 #define GET_EXTERNAL "__GET_EXTERNAL"
       
   133 #define GET_EXTERNAL_FB "__GET_EXTERNAL_FB"
   129 #define GET_LOCATED "__GET_LOCATED"
   134 #define GET_LOCATED "__GET_LOCATED"
   130 #define GET_VAR_BY_REF "__GET_VAR_BY_REF"
   135 #define GET_VAR_BY_REF "__GET_VAR_BY_REF"
   131 #define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF"
   136 #define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF"
       
   137 #define GET_EXTERNAL_FB_BY_REF "__GET_EXTERNAL_FB_BY_REF"
   132 #define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF"
   138 #define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF"
   133 
   139 
   134 /* Variable setter symbol for accessor macros */
   140 /* Variable setter symbol for accessor macros */
   135 #define SET_VAR "__SET_VAR"
   141 #define SET_VAR "__SET_VAR"
   136 #define SET_EXTERNAL "__SET_EXTERNAL"
   142 #define SET_EXTERNAL "__SET_EXTERNAL"
       
   143 #define SET_EXTERNAL_FB "__SET_EXTERNAL_FB"
   137 #define SET_LOCATED "__SET_LOCATED"
   144 #define SET_LOCATED "__SET_LOCATED"
   138 
   145 
   139 /* Variable initial value symbol for accessor macros */
   146 /* Variable initial value symbol for accessor macros */
   140 #define INITIAL_VALUE "__INITIAL_VALUE"
   147 #define INITIAL_VALUE "__INITIAL_VALUE"
   141 
   148 
   590       generate_c_datatypes_c::s4o_ptr = s4o_ptr;
   597       generate_c_datatypes_c::s4o_ptr = s4o_ptr;
   591       current_mode = none_im;
   598       current_mode = none_im;
   592     };
   599     };
   593     virtual ~generate_c_datatypes_c(void) {
   600     virtual ~generate_c_datatypes_c(void) {
   594       while (!inline_array_defined.empty()) {
   601       while (!inline_array_defined.empty()) {
   595     	inline_array_defined.erase(inline_array_defined.begin());
   602         inline_array_defined.erase(inline_array_defined.begin());
   596       }
   603       }
   597     }
   604     }
   598 
   605 
   599     /*************************/
   606     /*************************/
   600     /* B.1 - Common elements */
   607     /* B.1 - Common elements */
   624     /* B 1.3.1 - Elementary Data Types */
   631     /* B 1.3.1 - Elementary Data Types */
   625     /***********************************/
   632     /***********************************/
   626 
   633 
   627     #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\
   634     #define HANDLE_ELEMENTARY_DATA_TYPE(datatype_symbol, datatype_name)\
   628     void *visit(datatype_symbol *symbol) {\
   635     void *visit(datatype_symbol *symbol) {\
   629 	  switch (current_mode) {\
   636       switch (current_mode) {\
   630 		case arrayname_im:\
   637         case arrayname_im:\
   631 		  current_array_name += datatype_name;\
   638           current_array_name += datatype_name;\
   632 		  break;\
   639           break;\
   633         case arraydeclaration_im:\
   640         case arraydeclaration_im:\
   634           s4o_incl.print(datatype_name);\
   641           s4o_incl.print(datatype_name);\
   635           break;\
   642           break;\
   636 		default:\
   643         default:\
   637 		  return generate_c_base_c::visit(symbol);\
   644           return generate_c_base_c::visit(symbol);\
   638 		  break;\
   645           break;\
   639 	  }\
   646       }\
   640 	  return NULL;\
   647       return NULL;\
   641 	}
   648     }
   642 
   649 
   643     HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME")
   650     HANDLE_ELEMENTARY_DATA_TYPE(time_type_name_c, "TIME")
   644     HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL")
   651     HANDLE_ELEMENTARY_DATA_TYPE(bool_type_name_c, "BOOL")
   645     HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT")
   652     HANDLE_ELEMENTARY_DATA_TYPE(sint_type_name_c, "SINT")
   646     HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT")
   653     HANDLE_ELEMENTARY_DATA_TYPE(int_type_name_c, "INT")
   661     HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD")
   668     HANDLE_ELEMENTARY_DATA_TYPE(lword_type_name_c, "LWORD")
   662     HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING")
   669     HANDLE_ELEMENTARY_DATA_TYPE(string_type_name_c, "STRING")
   663     HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING")
   670     HANDLE_ELEMENTARY_DATA_TYPE(wstring_type_name_c, "WSTRING")
   664 
   671 
   665     HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME")
   672     HANDLE_ELEMENTARY_DATA_TYPE(safetime_type_name_c, "TIME")
   666 	HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL")
   673     HANDLE_ELEMENTARY_DATA_TYPE(safebool_type_name_c, "BOOL")
   667 	HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT")
   674     HANDLE_ELEMENTARY_DATA_TYPE(safesint_type_name_c, "SINT")
   668 	HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT")
   675     HANDLE_ELEMENTARY_DATA_TYPE(safeint_type_name_c, "INT")
   669 	HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT")
   676     HANDLE_ELEMENTARY_DATA_TYPE(safedint_type_name_c, "DINT")
   670 	HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT")
   677     HANDLE_ELEMENTARY_DATA_TYPE(safelint_type_name_c, "LINT")
   671 	HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT")
   678     HANDLE_ELEMENTARY_DATA_TYPE(safeusint_type_name_c, "USINT")
   672 	HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT")
   679     HANDLE_ELEMENTARY_DATA_TYPE(safeuint_type_name_c, "UINT")
   673 	HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT")
   680     HANDLE_ELEMENTARY_DATA_TYPE(safeudint_type_name_c, "UDINT")
   674 	HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT")
   681     HANDLE_ELEMENTARY_DATA_TYPE(safeulint_type_name_c, "ULINT")
   675 	HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL")
   682     HANDLE_ELEMENTARY_DATA_TYPE(safereal_type_name_c, "REAL")
   676 	HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL")
   683     HANDLE_ELEMENTARY_DATA_TYPE(safelreal_type_name_c, "LREAL")
   677 	HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE")
   684     HANDLE_ELEMENTARY_DATA_TYPE(safedate_type_name_c, "DATE")
   678 	HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD")
   685     HANDLE_ELEMENTARY_DATA_TYPE(safetod_type_name_c, "TOD")
   679 	HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT")
   686     HANDLE_ELEMENTARY_DATA_TYPE(safedt_type_name_c, "DT")
   680 	HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE")
   687     HANDLE_ELEMENTARY_DATA_TYPE(safebyte_type_name_c, "BYTE")
   681 	HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD")
   688     HANDLE_ELEMENTARY_DATA_TYPE(safeword_type_name_c, "WORD")
   682 	HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD")
   689     HANDLE_ELEMENTARY_DATA_TYPE(safedword_type_name_c, "DWORD")
   683 	HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD")
   690     HANDLE_ELEMENTARY_DATA_TYPE(safelword_type_name_c, "LWORD")
   684 	HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING")
   691     HANDLE_ELEMENTARY_DATA_TYPE(safestring_type_name_c, "STRING")
   685 	HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING")
   692     HANDLE_ELEMENTARY_DATA_TYPE(safewstring_type_name_c, "WSTRING")
       
   693 
       
   694     /***********************************/
       
   695     /* B 1.3.2 - Generic Data Types    */
       
   696     /***********************************/
       
   697 
       
   698     /*  structure_type_name ':' structure_specification */
       
   699     //SYM_REF2(structure_type_declaration_c, structure_type_name, structure_specification)
       
   700     void *visit(structure_type_declaration_c *symbol) {
       
   701       current_mode = arraydeclaration_im;
       
   702       symbol->structure_specification->accept(*this);
       
   703       current_mode = arrayname_im;
       
   704       generate_c_typedecl_c::visit(symbol);
       
   705       current_mode = none_im;
       
   706       return NULL;
       
   707     }
       
   708 
       
   709     /* helper symbol for structure_declaration */
       
   710     /* structure_declaration:  STRUCT structure_element_declaration_list END_STRUCT */
       
   711     /* structure_element_declaration_list structure_element_declaration ';' */
       
   712     //SYM_LIST(structure_element_declaration_list_c)
       
   713     void *visit(structure_element_declaration_list_c *symbol) {
       
   714       switch (current_mode) {
       
   715         case arraydeclaration_im:
       
   716           iterator_visitor_c::visit(symbol);
       
   717           break;
       
   718         default:
       
   719           generate_c_typedecl_c::visit(symbol);
       
   720           break;
       
   721       }
       
   722       return NULL;
       
   723     }
       
   724 
       
   725     /*  structure_element_name ':' spec_init */
       
   726     //SYM_REF2(structure_element_declaration_c, structure_element_name, spec_init)
       
   727     void *visit(structure_element_declaration_c *symbol) {
       
   728       switch (current_mode) {
       
   729         case arraydeclaration_im:
       
   730           {
       
   731             array_spec_init_c *spec_init = dynamic_cast<array_spec_init_c*>(symbol->spec_init);
       
   732             if (spec_init != NULL) {
       
   733               symbol->spec_init->accept(*this);
       
   734             }
       
   735           }
       
   736           break;
       
   737         default:
       
   738           generate_c_typedecl_c::visit(symbol);
       
   739           break;
       
   740       }
       
   741       return NULL;
       
   742     }
   686 
   743 
   687     /******************************************/
   744     /******************************************/
   688     /* B 1.4.3 - Declaration & Initialization */
   745     /* B 1.4.3 - Declaration & Initialization */
   689     /******************************************/
   746     /******************************************/
   690 
   747 
   710     }
   767     }
   711 
   768 
   712     /*  var1_list ':' array_spec_init */
   769     /*  var1_list ':' array_spec_init */
   713     // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
   770     // SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
   714     void *visit(array_var_init_decl_c *symbol) {
   771     void *visit(array_var_init_decl_c *symbol) {
   715       current_mode = arrayname_im;
   772       current_mode = arraydeclaration_im;
   716       symbol->array_spec_init->accept(*this);
   773       symbol->array_spec_init->accept(*this);
   717       current_mode = none_im;
   774       current_mode = none_im;
   718       return NULL;
   775       return NULL;
   719     }
   776     }
   720 
   777 
   721     /* array_specification [ASSIGN array_initialization] */
   778     /* array_specification [ASSIGN array_initialization] */
   722     /* array_initialization may be NULL ! */
   779     /* array_initialization may be NULL ! */
   723     void *visit(array_spec_init_c *symbol) {
   780     void *visit(array_spec_init_c *symbol) {
   724       switch (current_mode) {
   781       switch (current_mode) {
   725     	case arrayname_im:
   782         case arraydeclaration_im:
   726     	  {
   783         case arrayname_im:
   727     	    array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   784           {
       
   785             array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   728             if (specification != NULL)
   786             if (specification != NULL)
   729               symbol->array_specification->accept(*this);
   787               symbol->array_specification->accept(*this);
   730           }
   788           }
   731           break;
   789           break;
   732     	default:
   790         default:
   733     	  return generate_c_typedecl_c::visit(symbol);
   791           return generate_c_typedecl_c::visit(symbol);
   734           break;
   792           break;
   735       }
   793       }
   736       return NULL;
   794       return NULL;
   737     }
   795     }
   738 
   796 
   739     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   797     /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
   740     void *visit(array_specification_c *symbol) {
   798     void *visit(array_specification_c *symbol) {
   741       switch (current_mode) {
   799       switch (current_mode) {
   742         case arrayname_im:
   800         case arraydeclaration_im:
   743           {
   801           {
       
   802             current_mode = arrayname_im;
   744             std::map<std::string,int>::iterator definition;
   803             std::map<std::string,int>::iterator definition;
   745             current_array_name = "__";
   804             current_array_name = "__";
   746             symbol->non_generic_type_name->accept(*this);
   805             symbol->non_generic_type_name->accept(*this);
   747             symbol->array_subrange_list->accept(*this);
   806             symbol->array_subrange_list->accept(*this);
       
   807             current_mode = arraydeclaration_im;
   748 
   808 
   749             definition = inline_array_defined.find(current_array_name);
   809             definition = inline_array_defined.find(current_array_name);
   750             if (definition == inline_array_defined.end()) {
   810             if (definition == inline_array_defined.end()) {
   751               current_mode = arraydeclaration_im;
       
   752 
       
   753               s4o_incl.print("__DECLARE_ARRAY_TYPE(");
   811               s4o_incl.print("__DECLARE_ARRAY_TYPE(");
   754               s4o_incl.print(current_array_name);
   812               s4o_incl.print(current_array_name);
   755               s4o_incl.print(",");
   813               s4o_incl.print(",");
   756               symbol->non_generic_type_name->accept(*this);
   814               symbol->non_generic_type_name->accept(*this);
   757               s4o_incl.print(",");
   815               s4o_incl.print(",");
   758               symbol->array_subrange_list->accept(*this);
   816               symbol->array_subrange_list->accept(*this);
   759               s4o_incl.print(")\n\n");
   817               s4o_incl.print(")\n\n");
   760 
   818 
   761               inline_array_defined[current_array_name] = 0;
   819               inline_array_defined[current_array_name] = 0;
   762             }
   820             }
       
   821           }
       
   822           break;
       
   823         case arrayname_im:
       
   824           {
       
   825               std::map<std::string,int>::iterator definition;
       
   826               current_array_name = "__";
       
   827               symbol->non_generic_type_name->accept(*this);
       
   828               symbol->array_subrange_list->accept(*this);
       
   829               s4o_incl.print(current_array_name);
   763           }
   830           }
   764           break;
   831           break;
   765         default:
   832         default:
   766           return generate_c_typedecl_c::visit(symbol);
   833           return generate_c_typedecl_c::visit(symbol);
   767           break;
   834           break;
   819 
   886 
   820     /*  var1_list ':' array_specification */
   887     /*  var1_list ':' array_specification */
   821     //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
   888     //SYM_REF2(array_var_declaration_c, var1_list, array_specification)
   822     void *visit(array_var_declaration_c *symbol) {
   889     void *visit(array_var_declaration_c *symbol) {
   823       array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   890       array_specification_c *specification = dynamic_cast<array_specification_c*>(symbol->array_specification);
   824 	  if (specification != NULL) {
   891       if (specification != NULL) {
   825         current_mode = arrayname_im;
   892         current_mode = arraydeclaration_im;
   826         symbol->array_specification->accept(*this);
   893         symbol->array_specification->accept(*this);
   827         current_mode = none_im;
   894         current_mode = none_im;
   828       }
   895       }
   829       return NULL;
   896       return NULL;
   830     }
   897     }
   861     /* variable_name -> may be NULL ! */
   928     /* variable_name -> may be NULL ! */
   862     //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
   929     //SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
   863     void *visit(located_var_decl_c *symbol) {
   930     void *visit(located_var_decl_c *symbol) {
   864       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init);
   931       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->located_var_spec_init);
   865       if (array_spec_init != NULL) {
   932       if (array_spec_init != NULL) {
   866     	current_mode = arrayname_im;
   933         current_mode = arraydeclaration_im;
   867     	symbol->located_var_spec_init->accept(*this);
   934         symbol->located_var_spec_init->accept(*this);
   868     	current_mode = none_im;
   935         current_mode = none_im;
   869       }
   936       }
   870       return NULL;
   937       return NULL;
   871     }
   938     }
   872 
   939 
   873     /*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */
   940     /*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */
   881     /*  global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */
   948     /*  global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */
   882     //SYM_REF2(external_declaration_c, global_var_name, specification)
   949     //SYM_REF2(external_declaration_c, global_var_name, specification)
   883     void *visit(external_declaration_c *symbol) {
   950     void *visit(external_declaration_c *symbol) {
   884       array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification);
   951       array_specification_c* array_specification = dynamic_cast<array_specification_c*>(symbol->specification);
   885       if (array_specification != NULL) {
   952       if (array_specification != NULL) {
   886         current_mode = arrayname_im;
   953         current_mode = arraydeclaration_im;
   887         symbol->specification->accept(*this);
   954         symbol->specification->accept(*this);
   888         current_mode = none_im;
   955         current_mode = none_im;
   889       }
   956       }
   890       return NULL;
   957       return NULL;
   891     }
   958     }
   902     /* type_specification ->may be NULL ! */
   969     /* type_specification ->may be NULL ! */
   903     // SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
   970     // SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
   904     void *visit(global_var_decl_c *symbol) {
   971     void *visit(global_var_decl_c *symbol) {
   905       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification);
   972       array_spec_init_c* array_spec_init = dynamic_cast<array_spec_init_c*>(symbol->type_specification);
   906       if (array_spec_init != NULL) {
   973       if (array_spec_init != NULL) {
   907         current_mode = arrayname_im;
   974         current_mode = arraydeclaration_im;
   908         symbol->type_specification->accept(*this);
   975         symbol->type_specification->accept(*this);
   909         current_mode = none_im;
   976         current_mode = none_im;
   910       }
   977       }
   911       return NULL;
   978       return NULL;
   912     }
   979     }
   960       /* Print and __end label for return statements!
  1027       /* Print and __end label for return statements!
   961        * If label is not used by at least one goto, compiler will generate a warning.
  1028        * If label is not used by at least one goto, compiler will generate a warning.
   962        * To work around this we introduce the useless goto.
  1029        * To work around this we introduce the useless goto.
   963        */
  1030        */
   964       s4o.print("\n");
  1031       s4o.print("\n");
   965       s4o.print(s4o.indent_spaces);
  1032       /* to humour the compiler, we insert a goto */
   966       s4o.print("/* to humour the compiler, we insert a goto */\n");
       
   967       s4o.print(s4o.indent_spaces);
  1033       s4o.print(s4o.indent_spaces);
   968       s4o.print("goto ");
  1034       s4o.print("goto ");
   969       s4o.print(END_LABEL);
  1035       s4o.print(END_LABEL);
   970       s4o.print(";\n");
  1036       s4o.print(";\n");
   971       s4o.indent_left();
  1037       s4o.indent_left();