stage4/generate_c/generate_c_inlinefcall.cc
author laurent
Sat, 12 Dec 2009 20:41:32 +0100
changeset 233 3d23a68183d3
parent 231 b8527b0abe75
child 234 e4d31cd0e6d8
permissions -rwxr-xr-x
Bug on standard functions called with literals fixed
Checking that number of parameters in function call doesn't exceed the maximum
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     1
/*
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     2
 * (c) 2007 Mario de Sousa and Laurent Bessard
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     3
 *
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     4
 * Offered to the public under the terms of the GNU General Public License
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     5
 * as published by the Free Software Foundation; either version 2 of the
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     6
 * License, or (at your option) any later version.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     7
 *
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     8
 * This program is distributed in the hope that it will be useful, but
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
     9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    11
 * Public License for more details.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    12
 *
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    13
 * This code is made available on the understanding that it will not be
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    14
 * used in safety-critical situations without a full and competent review.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    15
 */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    16
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    17
/*
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    18
 * An IEC 61131-3 IL and ST compiler.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    19
 *
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    20
 * Based on the
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    21
 * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    22
 *
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    23
 */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    24
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    25
/*
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    26
 * This is one of the versions available for the 4th stage.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    27
 *
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    28
 * This 4th stage generates a c++ source program equivalent
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    29
 * to the IL and ST code.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    30
 */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    31
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    32
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    33
#define INLINE_RESULT_TEMP_VAR "__res"
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    34
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    35
class generate_c_inline_c: public generate_c_typedecl_c {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    36
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    37
  public:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    38
    typedef enum {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    39
      expression_vg,
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    40
      assignment_vg,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    41
      complextype_base_vg,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    42
      complextype_suffix_vg
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    43
    } variablegeneration_t;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    44
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    45
  private:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    46
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    47
    /* The name of the IL default variable... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    48
	#define IL_DEFVAR   VAR_LEADER "IL_DEFVAR"
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    49
	/* The name of the variable used to pass the result of a
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    50
	 * parenthesised instruction list to the immediately preceding
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    51
	 * scope ...
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    52
	 */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    53
	il_default_variable_c default_variable_name;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    54
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    55
	symbol_c* current_array_type;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
    56
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    57
	int fcall_number;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    58
	symbol_c *fbname;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    59
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    60
    search_expression_type_c *search_expression_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    61
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    62
    search_varfb_instance_type_c *search_varfb_instance_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    63
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    64
    search_base_type_c search_base_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    65
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    66
    variablegeneration_t wanted_variablegeneration;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    67
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    68
  public:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    69
    generate_c_inline_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    70
    : generate_c_typedecl_c(s4o_ptr),
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    71
      default_variable_name(IL_DEFVAR, NULL)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    72
    {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    73
      search_expression_type = new search_expression_type_c(scope);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    74
      search_varfb_instance_type = new search_varfb_instance_type_c(scope);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    75
      this->set_variable_prefix(variable_prefix);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    76
      fcall_number = 0;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    77
      fbname = name;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
    78
      wanted_variablegeneration = expression_vg;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    79
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    80
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    81
    virtual ~generate_c_inline_c(void) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    82
      delete search_varfb_instance_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    83
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    84
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    85
    void *generate_inline(symbol_c *function_name,
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    86
    		symbol_c *return_data_type,
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    87
    		std::list<FUNCTION_PARAM*> param_list) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    88
      std::list<FUNCTION_PARAM*>::iterator pt;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    89
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    90
      fcall_number++;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    91
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    92
      s4o.print(s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    93
      s4o.print("inline ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    94
      return_data_type->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    95
      s4o.print(" __");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    96
      fbname->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    97
      s4o.print("_");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    98
      function_name->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
    99
      s4o.print_integer(fcall_number);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   100
      s4o.print("(");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   101
      s4o.indent_right();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   102
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   103
      PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   104
        if (PARAM_DIRECTION == function_param_iterator_c::direction_in) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   105
          PARAM_TYPE->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   106
          s4o.print(" ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   107
          PARAM_NAME->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   108
          s4o.print(",\n" + s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   109
        }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   110
      }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   111
      fbname->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   112
	  s4o.print(" *");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   113
	  s4o.print(FB_FUNCTION_PARAM);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   114
	  s4o.indent_left();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   115
	  s4o.print(")\n" + s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   116
	  s4o.print("{\n");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   117
      s4o.indent_right();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   118
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   119
      s4o.print(s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   120
      return_data_type->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   121
      s4o.print(" "),
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   122
      s4o.print(INLINE_RESULT_TEMP_VAR);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   123
      s4o.print(";\n");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   124
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   125
	  PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   126
		if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   127
		     PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   128
		    PARAM_VALUE != NULL) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   129
		  s4o.print(s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   130
		  PARAM_TYPE->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   131
          s4o.print(" ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   132
          s4o.print(TEMP_VAR);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   133
          PARAM_NAME->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   134
          s4o.print(" = ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   135
          print_check_function(PARAM_TYPE, PARAM_VALUE);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   136
          s4o.print(";\n");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   137
		}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   138
	  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   139
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   140
	  s4o.print(s4o.indent_spaces + INLINE_RESULT_TEMP_VAR),
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   141
			  s4o.print(" = ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   142
	  function_name->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   143
	  s4o.print("(");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   144
	  s4o.indent_right();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   145
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   146
	  PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   147
		if (pt != param_list.begin())
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   148
		  s4o.print(",\n" + s4o.indent_spaces);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   149
		if (PARAM_DIRECTION == function_param_iterator_c::direction_in)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   150
		  PARAM_NAME->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   151
		else if (PARAM_VALUE != NULL){
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   152
          s4o.print("&");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   153
          s4o.print(TEMP_VAR);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   154
          PARAM_NAME->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   155
        }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   156
		else {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   157
		  s4o.print("NULL");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   158
		}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   159
	  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   160
	  s4o.print(");\n");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   161
	  s4o.indent_left();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   162
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   163
	  PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   164
        if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   165
        	 PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   166
        	PARAM_VALUE != NULL) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   167
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   168
          s4o.print(s4o.indent_spaces);
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   169
          print_setter(PARAM_VALUE, PARAM_TYPE, PARAM_NAME);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   170
          s4o.print(";\n");
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   171
		}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   172
	  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   173
	  s4o.print(s4o.indent_spaces + "return ");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   174
	  s4o.print(INLINE_RESULT_TEMP_VAR);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   175
	  s4o.print(";\n");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   176
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   177
      s4o.indent_left();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   178
      s4o.print(s4o.indent_spaces + "}\n\n");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   179
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   180
      return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   181
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   182
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   183
  private:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   184
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   185
    void *print_getter(symbol_c *symbol) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   186
      unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   187
      if (vartype == search_var_instance_decl_c::external_vt)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   188
    	s4o.print(GET_EXTERNAL);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   189
      else if (vartype == search_var_instance_decl_c::located_vt)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   190
    	s4o.print(GET_LOCATED);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   191
      else
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   192
    	s4o.print(GET_VAR);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   193
      s4o.print("(");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   194
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   195
      wanted_variablegeneration = complextype_base_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   196
      symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   197
      if (search_varfb_instance_type->type_is_complex())
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   198
    	s4o.print(",");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   199
      wanted_variablegeneration = complextype_suffix_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   200
      symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   201
      s4o.print(")");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   202
      wanted_variablegeneration = expression_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   203
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   204
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   205
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   206
    void *print_setter(symbol_c* symbol,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   207
    		symbol_c* type,
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   208
    		symbol_c* value) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   209
      unsigned int vartype = search_varfb_instance_type->get_vartype(symbol);
231
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   210
      if (vartype == search_var_instance_decl_c::external_vt) {
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   211
        symbolic_variable_c *variable = dynamic_cast<symbolic_variable_c *>(symbol);
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   212
        /* TODO Find a solution for forcing global complex variables */
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   213
        if (variable != NULL) {
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   214
          s4o.print(SET_EXTERNAL);
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   215
          s4o.print("(");
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   216
          variable->var_name->accept(*this);
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   217
          s4o.print(",");
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   218
        }
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   219
        else {
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   220
          s4o.print(SET_COMPLEX_EXTERNAL);
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   221
          s4o.print("(");
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   222
        }
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   223
      }
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   224
      else {
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   225
        if (vartype == search_var_instance_decl_c::located_vt)
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   226
          s4o.print(SET_LOCATED);
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   227
        else
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   228
          s4o.print(SET_VAR);
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   229
        s4o.print("(");
b8527b0abe75 Adding support for forcing global without perturbation from setting external
laurent
parents: 228
diff changeset
   230
      }
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   231
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   232
      wanted_variablegeneration = complextype_base_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   233
      symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   234
      s4o.print(",");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   235
      wanted_variablegeneration = expression_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   236
      print_check_function(type, value, NULL, true);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   237
      if (search_varfb_instance_type->type_is_complex()) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   238
        s4o.print(",");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   239
        wanted_variablegeneration = complextype_suffix_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   240
        symbol->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   241
      }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   242
      s4o.print(")");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   243
      wanted_variablegeneration = expression_vg;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   244
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   245
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   246
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   247
    /*********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   248
    /* B 1.4 - Variables */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   249
    /*********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   250
    void *visit(symbolic_variable_c *symbol) {
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   251
      unsigned int vartype;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   252
      if (wanted_variablegeneration == complextype_base_vg)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   253
        generate_c_base_c::visit(symbol);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   254
      else if (wanted_variablegeneration == complextype_suffix_vg)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   255
        return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   256
      else if (wanted_variablegeneration == expression_vg) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   257
	    vartype = search_varfb_instance_type->get_vartype(symbol);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   258
	    if (vartype == search_var_instance_decl_c::external_vt) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   259
		  s4o.print(GET_EXTERNAL);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   260
		  s4o.print("(");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   261
		  symbol->var_name->accept(*this);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   262
	    }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   263
	    else {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   264
		  if (vartype == search_var_instance_decl_c::located_vt)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   265
		    s4o.print(GET_LOCATED);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   266
		  else
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   267
		    s4o.print(GET_VAR);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   268
		  s4o.print("(");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   269
		  generate_c_base_c::visit(symbol);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   270
	    }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   271
	    s4o.print(")");
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   272
      }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 219
diff changeset
   273
      else
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   274
        generate_c_base_c::visit(symbol);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   275
      return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   276
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   277
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   278
    /********************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   279
    /* B.1.4.1   Directly Represented Variables */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   280
    /********************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   281
    // direct_variable: direct_variable_token   {$$ = new direct_variable_c($1);};
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   282
    void *visit(direct_variable_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   283
      TRACE("direct_variable_c");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   284
      /* Do not use print_token() as it will change everything into uppercase */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   285
      if (strlen(symbol->value) == 0) ERROR;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   286
      s4o.print(GET_LOCATED);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   287
      s4o.print("(");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   288
      this->print_variable_prefix();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   289
      s4o.printlocation(symbol->value + 1);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   290
      s4o.print(")");
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   291
      return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   292
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   293
228
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   294
    /*************************************/
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   295
    /* B.1.4.2   Multi-element Variables */
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   296
    /*************************************/
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   297
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   298
    // SYM_REF2(structured_variable_c, record_variable, field_selector)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   299
    void *visit(structured_variable_c *symbol) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   300
      TRACE("structured_variable_c");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   301
      switch (wanted_variablegeneration) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   302
        case complextype_base_vg:
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   303
          symbol->record_variable->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   304
          break;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   305
        case complextype_suffix_vg:
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   306
          symbol->record_variable->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   307
          s4o.print(".");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   308
          symbol->field_selector->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   309
          break;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   310
        default:
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   311
          if (this->is_variable_prefix_null()) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   312
        	symbol->record_variable->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   313
        	s4o.print(".");
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   314
        	symbol->field_selector->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   315
          }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   316
          else
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   317
        	print_getter(symbol);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   318
          break;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   319
      }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   320
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   321
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   322
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   323
    /*  subscripted_variable '[' subscript_list ']' */
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   324
    //SYM_REF2(array_variable_c, subscripted_variable, subscript_list)
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   325
    void *visit(array_variable_c *symbol) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   326
      switch (wanted_variablegeneration) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   327
        case complextype_base_vg:
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   328
          symbol->subscripted_variable->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   329
          break;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   330
        case complextype_suffix_vg:
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   331
          current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   332
          symbol->subscripted_variable->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   333
          if (current_array_type != NULL) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   334
            symbol->subscript_list->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   335
            current_array_type = NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   336
          }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   337
          break;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   338
        default:
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   339
          if (this->is_variable_prefix_null()) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   340
        	current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   341
        	symbol->subscripted_variable->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   342
        	if (current_array_type != NULL) {
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   343
        	  symbol->subscript_list->accept(*this);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   344
        	  current_array_type = NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   345
        	}
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   346
          }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   347
          else
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   348
        	print_getter(symbol);
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   349
          break;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   350
      }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   351
      return NULL;
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   352
    }
43831b683764 Adding support for setter and getter on complex datatype in IL
berem
parents: 221
diff changeset
   353
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   354
    /****************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   355
    /* B.2 - Language IL (Instruction List) */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   356
    /****************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   357
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   358
    /***********************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   359
    /* B 2.1 Instructions and Operands */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   360
    /***********************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   361
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   362
    void *visit(il_function_call_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   363
	  function_declaration_c *f_decl = function_symtable.find_value(symbol->function_name);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   364
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   365
	  if (f_decl != function_symtable.end_value()) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   366
		DECLARE_PARAM_LIST()
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   367
		bool has_output_params = false;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   368
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   369
		/* determine the base data type returned by the function being called... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   370
		search_base_type_c search_base_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   371
		symbol_c *return_data_type = (symbol_c *)f_decl->type_name->accept(search_base_type);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   372
		if (NULL == return_data_type) ERROR;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   373
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   374
		/* loop through each function parameter, find the value we should pass
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   375
		 * to it, and then output the c equivalent...
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   376
		 */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   377
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   378
		function_param_iterator_c fp_iterator(f_decl);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   379
		identifier_c *param_name;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   380
		function_call_param_iterator_c function_call_param_iterator(symbol);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   381
		for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   382
		  symbol_c *param_type = fp_iterator.param_type();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   383
		  if (param_type == NULL) ERROR;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   384
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   385
		  function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   386
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   387
		  symbol_c *param_value = NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   388
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   389
		  /* if it is the first parameter, semantics specifies that we should
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   390
		   * get the value off the IL default variable!
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   391
		   */
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   392
		  if (1 == i)
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   393
		    param_value = &this->default_variable_name;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   394
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   395
		  /* Get the value from a foo(<param_name> = <param_value>) style call */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   396
		  /* NOTE: the following line of code is not required in this case, but it doesn't
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   397
		   * harm to leave it in, as in the case of a non-formal syntax function call,
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   398
		   * it will always return NULL.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   399
		   * We leave it in in case we later decide to merge this part of the code together
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   400
		   * with the function calling code in generate_c_st_c, which does require
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   401
		   * the following line...
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   402
		   */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   403
		  if (param_value == NULL)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   404
			param_value = function_call_param_iterator.search_f(param_name);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   405
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   406
		  /* Get the value from a foo(<param_value>) style call */
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   407
          if (param_value == NULL) {
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   408
            param_value = function_call_param_iterator.next_nf();
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   409
            if (param_value != NULL && fp_iterator.is_en_eno_param_implicit()) ERROR;
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   410
          }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   411
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   412
		  if (param_value == NULL && param_direction == function_param_iterator_c::direction_in) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   413
			/* No value given for parameter, so we must use the default... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   414
			/* First check whether default value specified in function declaration...*/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   415
			param_value = fp_iterator.default_value();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   416
		  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   417
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   418
		  ADD_PARAM_LIST(param_name, param_value, param_type, fp_iterator.param_direction())
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   419
		} /* for(...) */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   420
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   421
		if (function_call_param_iterator.next_nf() != NULL) ERROR;
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   422
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   423
		PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   424
			if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   425
				 PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   426
				PARAM_VALUE != NULL) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   427
			  has_output_params = true;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   428
			}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   429
		}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   430
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   431
	    if (has_output_params)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   432
	      generate_inline(symbol->function_name, return_data_type, param_list);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   433
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   434
	    CLEAR_PARAM_LIST()
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   435
	  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   436
	  return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   437
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   438
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   439
    void *visit(il_formal_funct_call_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   440
	  function_declaration_c *f_decl = function_symtable.find_value(symbol->function_name);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   441
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   442
	  if (f_decl != function_symtable.end_value()) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   443
		DECLARE_PARAM_LIST()
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   444
		bool has_output_params = false;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   445
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   446
		/* determine the base data type returned by the function being called... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   447
		search_base_type_c search_base_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   448
		symbol_c *return_data_type = (symbol_c *)f_decl->type_name->accept(search_base_type);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   449
		if (NULL == return_data_type) ERROR;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   450
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   451
		/* loop through each function parameter, find the value we should pass
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   452
		 * to it, and then output the c equivalent...
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   453
		 */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   454
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   455
		function_param_iterator_c fp_iterator(f_decl);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   456
		identifier_c *param_name;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   457
		function_call_param_iterator_c function_call_param_iterator(symbol);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   458
		for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   459
		  symbol_c *param_type = fp_iterator.param_type();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   460
		  if (param_type == NULL) ERROR;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   461
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   462
		  function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   463
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   464
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   465
		  symbol_c *param_value = NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   466
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   467
		  /* Get the value from a foo(<param_name> = <param_value>) style call */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   468
		  if (param_value == NULL)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   469
			param_value = function_call_param_iterator.search_f(param_name);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   470
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   471
		  /* Get the value from a foo(<param_value>) style call */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   472
		  /* NOTE: the following line of code is not required in this case, but it doesn't
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   473
		   * harm to leave it in, as in the case of a formal syntax function call,
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   474
		   * it will always return NULL.
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   475
		   * We leave it in in case we later decide to merge this part of the code together
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   476
		   * with the function calling code in generate_c_st_c, which does require
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   477
		   * the following line...
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   478
		   */
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   479
		  if (param_value == NULL) {
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   480
            param_value = function_call_param_iterator.next_nf();
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   481
            if (param_value != NULL && fp_iterator.is_en_eno_param_implicit()) ERROR;
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   482
          }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   483
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   484
		  if (param_value == NULL) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   485
			/* No value given for parameter, so we must use the default... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   486
			/* First check whether default value specified in function declaration...*/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   487
			param_value = fp_iterator.default_value();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   488
		  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   489
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   490
		  ADD_PARAM_LIST(param_name, param_value, param_type, fp_iterator.param_direction())
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   491
		}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   492
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   493
		if (function_call_param_iterator.next_nf() != NULL) ERROR;
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   494
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   495
		PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   496
      	  if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   497
      		   PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   498
      	      PARAM_VALUE != NULL) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   499
      	    has_output_params = true;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   500
      	  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   501
        }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   502
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   503
        if (has_output_params)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   504
	      generate_inline(symbol->function_name, return_data_type, param_list);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   505
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   506
        CLEAR_PARAM_LIST()
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   507
	  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   508
      return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   509
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   510
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   511
    /***************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   512
    /* B.3 - Language ST (Structured Text) */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   513
    /***************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   514
    /***********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   515
    /* B 3.1 - Expressions */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   516
    /***********************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   517
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   518
    void *visit(function_invocation_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   519
      function_declaration_c *f_decl = function_symtable.find_value(symbol->function_name);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   520
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   521
      if (f_decl != function_symtable.end_value()) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   522
    	DECLARE_PARAM_LIST()
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   523
    	bool has_output_params = false;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   524
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   525
    	symbol_c *parameter_assignment_list = NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   526
	    if (NULL != symbol->   formal_param_list) parameter_assignment_list = symbol->   formal_param_list;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   527
	    if (NULL != symbol->nonformal_param_list) parameter_assignment_list = symbol->nonformal_param_list;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   528
	    if (NULL == parameter_assignment_list) ERROR;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   529
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   530
	    /* determine the base data type returned by the function being called... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   531
		search_base_type_c search_base_type;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   532
		symbol_c *return_data_type = (symbol_c *)f_decl->type_name->accept(search_base_type);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   533
		if (NULL == return_data_type) ERROR;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   534
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   535
    	/* loop through each function parameter, find the value we should pass
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   536
         * to it, and then output the c equivalent...
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   537
         */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   538
        function_param_iterator_c fp_iterator(f_decl);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   539
        identifier_c *param_name;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   540
        function_call_param_iterator_c function_call_param_iterator(symbol);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   541
        for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   542
          symbol_c *param_type = fp_iterator.param_type();
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   543
          if (param_type == NULL) ERROR;
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   544
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   545
          function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   546
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   547
          /* Get the value from a foo(<param_name> = <param_value>) style call */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   548
          symbol_c *param_value = function_call_param_iterator.search_f(param_name);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   549
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   550
          /* Get the value from a foo(<param_value>) style call */
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   551
          if (param_value == NULL) {
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   552
            param_value = function_call_param_iterator.next_nf();
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   553
            if (param_value != NULL && fp_iterator.is_en_eno_param_implicit()) ERROR;
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   554
          }
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   555
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   556
          if (param_value == NULL && param_direction == function_param_iterator_c::direction_in) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   557
            /* No value given for parameter, so we must use the default... */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   558
            /* First check whether default value specified in function declaration...*/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   559
            param_value = fp_iterator.default_value();
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   560
          }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   561
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   562
          ADD_PARAM_LIST(param_name, param_value, param_type, param_direction)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   563
        } /* for(...) */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   564
        // symbol->parameter_assignment->accept(*this);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   565
233
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   566
        if (function_call_param_iterator.next_nf() != NULL) ERROR;
3d23a68183d3 Bug on standard functions called with literals fixed
laurent
parents: 231
diff changeset
   567
219
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   568
        PARAM_LIST_ITERATOR() {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   569
      	  if ((PARAM_DIRECTION == function_param_iterator_c::direction_out ||
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   570
      			PARAM_DIRECTION == function_param_iterator_c::direction_inout) &&
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   571
              PARAM_VALUE != NULL) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   572
      	    has_output_params = true;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   573
      	  }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   574
        }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   575
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   576
        if (has_output_params)
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   577
	      generate_inline(symbol->function_name, return_data_type, param_list);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   578
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   579
        CLEAR_PARAM_LIST()
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   580
      }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   581
	  return NULL;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   582
    }
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   583
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   584
};  /* generate_c_inline_c */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   585
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   586
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   587
/***********************************************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   588
/***********************************************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   589
/***********************************************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   590
/***********************************************************************/
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   591
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   592
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   593
class generate_c_inlinefcall_c: public iterator_visitor_c {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   594
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   595
  private:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   596
	generate_c_inline_c *generate_c_inline;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   597
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   598
  public:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   599
	generate_c_inlinefcall_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   600
	  generate_c_inline = new generate_c_inline_c(s4o_ptr, name, scope, variable_prefix);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   601
	}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   602
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   603
	virtual ~generate_c_inlinefcall_c(void) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   604
	  delete generate_c_inline;
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   605
	}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   606
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   607
  private:
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   608
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   609
	void *visit(function_invocation_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   610
	  return symbol->accept(*generate_c_inline);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   611
	}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   612
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   613
	void *visit(il_function_call_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   614
	  return symbol->accept(*generate_c_inline);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   615
	}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   616
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   617
	void *visit(il_formal_funct_call_c *symbol) {
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   618
	  return symbol->accept(*generate_c_inline);
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   619
	}
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   620
}; /* generate_c_inlinefcall_c */
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   621
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   622
9bb38736f126 Adding support for declare, init, get and set macros
laurent
parents:
diff changeset
   623