stage4/generate_c/generate_c.cc
changeset 330 d2facfcf485a
parent 318 746a357b8747
child 337 9a2262fb7994
child 350 2c3c4dc34979
equal deleted inserted replaced
329:882f5f1e5f6f 330:d2facfcf485a
   451       s4o.print("\n");
   451       s4o.print("\n");
   452       s4o.print(s4o.indent_spaces);
   452       s4o.print(s4o.indent_spaces);
   453       s4o.print(END_LABEL);
   453       s4o.print(END_LABEL);
   454       s4o.print(":\n");
   454       s4o.print(":\n");
   455       s4o.indent_right();
   455       s4o.indent_right();
   456 
       
   457       /* since every label must be followed by at least one statement, and
       
   458        * only the functions will introduce the return statement after this label,
       
   459        * function blocks written in IL would result in invalid C++ code.
       
   460        * To work around this we introduce the equivalent of a 'nop' operation
       
   461        * to humour the compiler...
       
   462        */
       
   463       s4o.print(s4o.indent_spaces);
       
   464       s4o.print("/* to humour the compiler, we insert a nop */\n");
       
   465       s4o.print(s4o.indent_spaces);
       
   466       s4o.print("if (0);\n\n");
       
   467     }
   456     }
   468   
   457   
   469 
   458 
   470 
   459 
   471   public:
   460   public:
   839 
   828 
   840   /* (C.5) Function code */
   829   /* (C.5) Function code */
   841   generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->fblock_name, symbol, FB_FUNCTION_PARAM"->");
   830   generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->fblock_name, symbol, FB_FUNCTION_PARAM"->");
   842   symbol->fblock_body->accept(generate_c_code);
   831   symbol->fblock_body->accept(generate_c_code);
   843   print_end_of_block_label();
   832   print_end_of_block_label();
       
   833   s4o.print(s4o.indent_spaces + "return;\n");
   844   s4o.indent_left();
   834   s4o.indent_left();
   845   s4o.print(s4o.indent_spaces + "} // ");
   835   s4o.print(s4o.indent_spaces + "} // ");
   846   symbol->fblock_name->accept(*this);
   836   symbol->fblock_name->accept(*this);
   847   s4o.print(FB_FUNCTION_SUFFIX);
   837   s4o.print(FB_FUNCTION_SUFFIX);
   848   s4o.print(s4o.indent_spaces + "() \n\n");
   838   s4o.print(s4o.indent_spaces + "() \n\n");
  1000 
   990 
  1001   /* (C.5) Function code */
   991   /* (C.5) Function code */
  1002   generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->program_type_name, symbol, FB_FUNCTION_PARAM"->");
   992   generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->program_type_name, symbol, FB_FUNCTION_PARAM"->");
  1003   symbol->function_block_body->accept(generate_c_code);
   993   symbol->function_block_body->accept(generate_c_code);
  1004   print_end_of_block_label();
   994   print_end_of_block_label();
       
   995   s4o.print(s4o.indent_spaces + "return;\n");
  1005   s4o.indent_left();
   996   s4o.indent_left();
  1006   s4o.print(s4o.indent_spaces + "} // ");
   997   s4o.print(s4o.indent_spaces + "} // ");
  1007   symbol->program_type_name->accept(*this);
   998   symbol->program_type_name->accept(*this);
  1008   s4o.print(FB_FUNCTION_SUFFIX);
   999   s4o.print(FB_FUNCTION_SUFFIX);
  1009   s4o.print(s4o.indent_spaces + "() \n\n");
  1000   s4o.print(s4o.indent_spaces + "() \n\n");