stage4/generate_c/generate_c_vardecl.cc
author Manuele Conti <conti.ma@alice.it>
Mon, 30 Jul 2012 22:59:00 +0200
changeset 622 eaa49b276e17
parent 596 4efb11e44065
child 635 a20a70021d37
child 661 f537c3315f83
permissions -rw-r--r--
Add check bison version in configure.ac file.
To build correctly matiec we need bison greater or equals than 2.4 version.
Now the "configure" script is able to check if system has correctly requirements.
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     1
/*
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     3
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
     4
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     6
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
     7
 *  This program is free software: you can redistribute it and/or modify
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
     8
 *  it under the terms of the GNU General Public License as published by
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
     9
 *  the Free Software Foundation, either version 3 of the License, or
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    10
 *  (at your option) any later version.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    11
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    12
 *  This program is distributed in the hope that it will be useful,
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    15
 *  GNU General Public License for more details.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    16
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    17
 *  You should have received a copy of the GNU General Public License
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    18
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 242
diff changeset
    19
 *
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    20
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    21
 * This code is made available on the understanding that it will not be
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    22
 * used in safety-critical situations without a full and competent review.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    23
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    24
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    25
#include <limits>  // required for std::numeric_limits<XXX>
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    26
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    27
class initialization_analyzer_c: public null_visitor_c {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    28
  public:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    29
	typedef enum {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    30
	  simple_it,
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    31
	  array_it,
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    32
	  struct_it
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    33
	} initialization_type_t;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    34
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    35
  private:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    36
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    37
	initialization_type_t current_type;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    38
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    39
  public:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    40
	initialization_analyzer_c(symbol_c* symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    41
	  current_type = simple_it;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    42
      symbol->accept(*this);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    43
	}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    44
	~initialization_analyzer_c(void) {}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    45
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    46
	initialization_type_t get_initialization_type(void) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    47
	  return current_type;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    48
	}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    49
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    50
	void *visit(array_initial_elements_list_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    51
      current_type = array_it;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    52
      return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    53
	}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    54
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    55
    void *visit(structure_element_initialization_list_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    56
      current_type = struct_it;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    57
      return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    58
    }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
    59
};
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    60
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    61
class generate_c_array_initialization_c: public generate_c_typedecl_c {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    62
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    63
  public:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    64
    typedef enum {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    65
      none_am,
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    66
      arraysize_am,
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    67
      typedecl_am,
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    68
      initializationvalue_am
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    69
    } arrayinitialization_mode_t;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    70
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    71
    arrayinitialization_mode_t current_mode;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    72
    
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    73
    symbol_c* array_base_type;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    74
    symbol_c* array_default_value;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    75
    symbol_c* array_default_initialization;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    76
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    77
  private:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    78
    int current_dimension;
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    79
    unsigned long long int array_size;
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    80
    unsigned long long int defined_values_count;
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
    81
    unsigned long long int current_initialization_count;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    82
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    83
  public:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    84
    generate_c_array_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    85
    ~generate_c_array_initialization_c(void) {}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    86
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    87
    void init_array_size(symbol_c *array_specification) {
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    88
      array_size = 1;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    89
      defined_values_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    90
      current_initialization_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    91
      array_base_type = array_default_value = array_default_initialization = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    92
      
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
    93
      current_mode = arraysize_am;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    94
      array_specification->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    95
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
    96
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    97
    void init_array(symbol_c *var1_list, symbol_c *array_specification, symbol_c *array_initialization) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    98
      int i;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
    99
      
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   100
      init_array_size(array_specification);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   101
      
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   102
      s4o.print("\n");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   103
      s4o.print(s4o.indent_spaces + "{\n");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   104
      s4o.indent_right();
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   105
      s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   106
      s4o.print("static const ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   107
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   108
      current_mode = typedecl_am;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   109
      array_specification->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   110
      s4o.print(" temp = ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   111
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   112
      init_array_values(array_initialization);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   113
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   114
      s4o.print(";\n");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   115
      var1_list->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   116
      s4o.indent_left();
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   117
      s4o.print(s4o.indent_spaces + "}");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   118
    }
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   119
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   120
    void init_array_values(symbol_c *array_initialization) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   121
      s4o.print("{{");
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   122
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   123
      current_mode = initializationvalue_am;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   124
      array_initialization->accept(*this);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   125
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   126
      if (array_default_initialization != NULL && defined_values_count < array_size)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   127
        array_default_initialization->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   128
      if (defined_values_count < array_size) {
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   129
        for (unsigned long long int i = defined_values_count; i < array_size; i++) {
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   130
          if (defined_values_count > 0)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   131
            s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   132
          array_default_value->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   133
          defined_values_count++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   134
        }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   135
      }
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   136
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   137
      s4o.print("}}");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   138
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   139
    
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   140
    void *visit(identifier_c *type_name) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   141
      symbol_c *type_decl;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   142
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   143
        case arraysize_am:
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   144
          /* look up the type declaration... */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   145
          type_decl = type_symtable.find_value(type_name);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   146
          if (type_decl == type_symtable.end_value())
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   147
            /* Type declaration not found!! */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   148
            ERROR;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   149
          type_decl->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   150
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   151
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   152
          print_token(type_name);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   153
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   154
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   155
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   156
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   157
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   158
    void *visit(var1_list_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   159
      int i, j;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   160
      
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   161
      for (i = 0; i < symbol->n; i++) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   162
        s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   163
        s4o.print(SET_VAR);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   164
        s4o.print("(");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   165
        print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   166
        s4o.print(",");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   167
        symbol->elements[i]->accept(*this);
334
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   168
        s4o.print(",temp);\n");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   169
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   170
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   171
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   172
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   173
/********************************/
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   174
/* B 1.3.3 - Derived data types */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   175
/********************************/
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   176
    
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   177
    /* array_specification [ASSIGN array_initialization] */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   178
    /* array_initialization may be NULL ! */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   179
    void *visit(array_spec_init_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   180
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   181
        case arraysize_am:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   182
          array_default_initialization = symbol->array_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   183
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   184
        default:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   185
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   186
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   187
      symbol->array_specification->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   188
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   189
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   190
    
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   191
    /* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   192
    void *visit(array_specification_c *symbol) {
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   193
      identifier_c* type_name;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   194
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   195
        case arraysize_am:
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   196
          symbol->array_subrange_list->accept(*this);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   197
          array_base_type = symbol->non_generic_type_name;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   198
          array_default_value = (symbol_c *)symbol->non_generic_type_name->accept(*type_initial_value_c::instance());;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   199
          if (array_default_value == NULL) ERROR;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   200
          break;
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   201
        case typedecl_am:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   202
          s4o.print("__");
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   203
          symbol->non_generic_type_name->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   204
          symbol->array_subrange_list->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   205
          break;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   206
        default:
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   207
          symbol->array_subrange_list->accept(*this);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   208
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   209
      } 
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   210
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   211
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   212
    
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   213
    /*  signed_integer DOTDOT signed_integer */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   214
    //SYM_REF2(subrange_c, lower_limit, upper_limit)
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   215
    void *visit(subrange_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   216
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   217
        case arraysize_am:
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   218
          /* res = a * b; --->  Check for overflow by pre-condition: If (UINT_MAX / a) < b => overflow! */
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   219
          if ((std::numeric_limits< unsigned long long int >::max() / array_size) < symbol->dimension)
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   220
            STAGE4_ERROR(symbol, symbol, "The array containing this subrange has a total number of elements larger than the maximum currently supported (%llu).", 
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   221
                         std::numeric_limits< unsigned long long int >::max());
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   222
          array_size *= symbol->dimension;
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   223
          break;
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   224
        case typedecl_am:
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
   225
          s4o.print("_");
594
c8092e909886 Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents: 592
diff changeset
   226
          s4o.print(symbol->dimension);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   227
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   228
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   229
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   230
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   231
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   232
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   233
    
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   234
    /* helper symbol for array_initialization */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   235
    /* array_initial_elements_list ',' array_initial_elements */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   236
    void *visit(array_initial_elements_list_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   237
      switch (current_mode) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   238
        case initializationvalue_am:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   239
          current_initialization_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   240
          for (int i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   241
            if (current_initialization_count >= defined_values_count) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   242
              if (defined_values_count >= array_size)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   243
                ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   244
              if (defined_values_count > 0)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   245
                s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   246
              symbol->elements[i]->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   247
              defined_values_count++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   248
            }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   249
            else {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   250
              array_initial_elements_c *array_initial_element = dynamic_cast<array_initial_elements_c *>(symbol->elements[i]);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   251
            
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   252
              if (array_initial_element != NULL) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   253
            	  symbol->elements[i]->accept(*this);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   254
              }
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   255
            }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   256
            current_initialization_count++;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   257
          }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   258
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   259
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   260
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   261
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   262
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   263
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   264
    
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   265
    /* integer '(' [array_initial_element] ')' */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   266
    /* array_initial_element may be NULL ! */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   267
    void *visit(array_initial_elements_c *symbol) {
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   268
      unsigned long long int initial_element_count;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   269
 
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   270
      /* This code assumes that unsigned long long int is >= uint64_t */
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   271
      if (std::numeric_limits< uint64_t >::max() > std::numeric_limits< unsigned long long int >::max()) 
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   272
	ERROR_MSG("Assertion (sizeof(uint64_t) > sizeof(unsigned long long int)) failed! Compiler cannot execute correctly on the current platform!");
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   273
      
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   274
      switch (current_mode) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   275
        case initializationvalue_am:
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   276
          if      (VALID_CVALUE( int64, symbol->integer) && (GET_CVALUE( int64, symbol->integer) >= 0))
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   277
            initial_element_count = GET_CVALUE( int64, symbol->integer);
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   278
          else if (VALID_CVALUE(uint64, symbol->integer))
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   279
            initial_element_count = GET_CVALUE(uint64, symbol->integer);
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   280
          else ERROR;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   281
     
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   282
          if (current_initialization_count < defined_values_count) {
592
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   283
            unsigned long long int temp_element_number = 0;
99a284cec1f2 Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents: 587
diff changeset
   284
            unsigned long long int diff = defined_values_count - current_initialization_count;
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   285
            if (diff <= initial_element_count)
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   286
              temp_element_number = initial_element_count - diff;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   287
            current_initialization_count += initial_element_count - 1;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   288
            initial_element_count = temp_element_number;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   289
            if (initial_element_count > 0) {
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   290
              defined_values_count++;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   291
              s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   292
            }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   293
          }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   294
          else
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   295
            current_initialization_count += initial_element_count - 1;
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   296
          if (defined_values_count + initial_element_count > array_size)
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   297
            ERROR;
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   298
          for (unsigned long long int i = 0; i < initial_element_count; i++) {
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   299
            if (i > 0)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   300
              s4o.print(",");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   301
            if (symbol->array_initial_element != NULL) {
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   302
              symbol->array_initial_element->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   303
            }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   304
            else {
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   305
              array_default_value->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   306
            }
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   307
          }
596
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   308
          if (initial_element_count > 1)
4efb11e44065 Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents: 594
diff changeset
   309
            defined_values_count += initial_element_count - 1;
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   310
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   311
        default:
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   312
          break;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   313
      }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   314
      return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   315
    }
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   316
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   317
    void *visit(structure_element_initialization_list_c *symbol);
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
   318
};
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   319
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   320
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   321
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   322
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   323
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   324
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   325
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   326
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   327
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   328
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   329
/* given a structure_element_declaration_list_c, iterate 
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   330
 * through each element, returning the name
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   331
 * of each element...structure_element_iterator_c
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   332
 */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   333
class structure_element_iterator_c : public null_visitor_c {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   334
  
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   335
  private:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   336
    /* a pointer to the structure_element_declaration_list_c
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   337
     * currently being analysed.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   338
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   339
    symbol_c *type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   340
    int next_element, element_count;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   341
    identifier_c *current_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   342
    symbol_c *current_element_type;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   343
    symbol_c *current_element_default_value;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   344
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   345
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   346
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   347
    /* start off at the first parameter once again... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   348
    void reset(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   349
      next_element = element_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   350
      current_element_name = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   351
      current_element_type = current_element_default_value = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   352
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   353
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   354
    /* initialise the iterator object.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   355
     * We must be given a reference to the function declaration
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   356
     * that will be analysed...
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   357
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   358
    structure_element_iterator_c(symbol_c *type_decl) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   359
      this->type_decl = type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   360
      reset();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   361
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   362
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   363
    /* Skip to the next element. After object creation,
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   364
     * the object references on 
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   365
     * element _before_ the first, so
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   366
     * this function must be called once to get the object to
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   367
     * reference the first element...
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   368
     *
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   369
     * Returns the element's name!
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   370
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   371
    identifier_c *next(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   372
      void *res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   373
      identifier_c *identifier;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   374
      element_count = 0;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   375
      next_element++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   376
      res = type_decl->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   377
      if (res != NULL) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   378
        symbol_c *sym = (symbol_c *)res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   379
        identifier = dynamic_cast<identifier_c *>(sym);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   380
        if (identifier == NULL)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   381
          ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   382
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   383
      else
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   384
        return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   385
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   386
      current_element_name = identifier;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   387
      return current_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   388
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   389
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   390
    /* Returns the currently referenced element's default value,
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   391
     * or NULL if none is specified in the structure declaration itself.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   392
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   393
    symbol_c *default_value(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   394
      return current_element_default_value;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   395
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   396
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   397
    /* Returns the currently referenced element's type name. */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   398
    symbol_c *element_type(void) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   399
      return current_element_type;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   400
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   401
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   402
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   403
/* B 1.3.3 - Derived data types */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   404
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   405
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   406
    /* helper symbol for structure_declaration */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   407
    /* structure_element_declaration_list structure_element_declaration ';' */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   408
    void *visit(structure_element_declaration_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   409
      void *res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   410
      for (int i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   411
        res = symbol->elements[i]->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   412
        if (res != NULL)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   413
          return res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   414
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   415
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   416
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   417
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   418
    /*  structure_element_name ':' *_spec_init */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   419
    void *visit(structure_element_declaration_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   420
      element_count++;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   421
      if (next_element == element_count) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   422
        current_element_default_value = spec_init_sperator_c::get_init(symbol->spec_init);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   423
        current_element_type = spec_init_sperator_c::get_spec(symbol->spec_init);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   424
        return symbol->structure_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   425
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   426
      /* not yet the desired element... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   427
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   428
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   429
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   430
};
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   431
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   432
/*
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   433
 * Structure init element iterator.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   434
 * It will search through the elements of a structure initialization
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   435
 */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   436
class structure_init_element_iterator_c : public null_visitor_c {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   437
  private:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   438
    /* a pointer to the structure initialization
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   439
     * currently being analysed.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   440
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   441
    symbol_c *structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   442
    identifier_c *search_element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   443
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   444
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   445
    /* initialise the iterator object.
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   446
     * We must be given a reference to the structure initialization
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   447
     * that will be analysed...
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   448
     */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   449
    structure_init_element_iterator_c(symbol_c *structure_initialization) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   450
      this->structure_initialization = structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   451
      search_element_name = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   452
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   453
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   454
    /* Search for the value passed to the element named <element_name>...  */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   455
    symbol_c *search(symbol_c *element_name) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   456
      if (NULL == element_name) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   457
      search_element_name = dynamic_cast<identifier_c *>(element_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   458
      if (NULL == search_element_name) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   459
      void *res = structure_initialization->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   460
      return (symbol_c *)res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   461
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   462
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   463
    /* helper symbol for structure_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   464
    /* structure_element_initialization_list ',' structure_element_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   465
    void *visit(structure_element_initialization_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   466
      void *res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   467
      for (int i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   468
        res = symbol->elements[i]->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   469
        if (res != NULL)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   470
          return res;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   471
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   472
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   473
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   474
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   475
    /*  structure_element_name ASSIGN value */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   476
    void *visit(structure_element_initialization_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   477
      identifier_c *element_name = dynamic_cast<identifier_c *>(symbol->structure_element_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   478
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   479
      if (element_name == NULL) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   480
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   481
      if (strcasecmp(search_element_name->value, element_name->value) == 0)
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   482
        /* FOUND! This is the same element!! */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   483
        return (void *)symbol->value;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   484
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   485
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   486
};
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   487
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   488
class generate_c_structure_initialization_c: public generate_c_typedecl_c {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   489
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   490
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   491
    typedef enum {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   492
      none_sm,
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   493
      initdefault_sm,
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   494
      typedecl_sm,
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   495
      initializationvalue_sm
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   496
    } structureinitialization_mode_t;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   497
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   498
    structureinitialization_mode_t current_mode;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   499
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   500
  private:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   501
    symbol_c* structure_type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   502
    symbol_c* current_element_type;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   503
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   504
  public:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   505
    generate_c_structure_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {}
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   506
    ~generate_c_structure_initialization_c(void) {}
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   507
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   508
    void init_structure_default(symbol_c *structure_type_name) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   509
      structure_type_decl = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   510
      current_element_type = NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   511
      
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   512
      current_mode = initdefault_sm;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   513
      structure_type_name->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   514
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   515
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   516
    void init_structure(symbol_c *var1_list, symbol_c *structure_type_name, symbol_c *structure_initialization) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   517
      int i;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   518
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   519
      init_structure_default(structure_type_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   520
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   521
      s4o.print("\n");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   522
      s4o.print(s4o.indent_spaces + "{\n");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   523
      s4o.indent_right();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   524
      s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   525
      s4o.print("static const ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   526
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   527
      current_mode = typedecl_sm;
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   528
      structure_type_name->accept(*this);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   529
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   530
      s4o.print(" temp = ");
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   531
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   532
      init_structure_values(structure_initialization);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   533
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   534
      s4o.print(";\n");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   535
      var1_list->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   536
      s4o.indent_left();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   537
      s4o.print(s4o.indent_spaces + "}");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   538
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   539
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   540
    void init_structure_values(symbol_c *structure_initialization) {
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   541
      current_mode = initializationvalue_sm;
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   542
      structure_initialization->accept(*this);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   543
    }
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   544
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   545
    void *visit(identifier_c *type_name) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   546
      symbol_c *type_decl;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   547
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   548
        case initdefault_sm:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   549
          /* look up the type declaration... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   550
          type_decl = type_symtable.find_value(type_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   551
          if (type_decl == type_symtable.end_value())
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   552
            /* Type declaration not found!! */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   553
            ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   554
          type_decl->accept(*this);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   555
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   556
        default:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   557
          print_token(type_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   558
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   559
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   560
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   561
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   562
    
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   563
    void *visit(var1_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   564
      int i, j;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   565
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   566
      for (i = 0; i < symbol->n; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   567
        s4o.print(s4o.indent_spaces);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   568
        s4o.print(SET_VAR);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   569
        s4o.print("(");
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
   570
        print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   571
        s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   572
        symbol->elements[i]->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   573
        s4o.print(",temp);\n");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   574
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   575
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   576
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   577
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   578
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   579
/* B 1.3.3 - Derived data types */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   580
/********************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   581
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   582
    /* helper symbol for structure_declaration */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   583
    /* structure_element_declaration_list structure_element_declaration ';' */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   584
    void *visit(structure_element_declaration_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   585
      switch (current_mode) {
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   586
        case initdefault_sm:
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   587
          structure_type_decl = (symbol_c *)symbol;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   588
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   589
        default:
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   590
          break;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   591
      } 
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   592
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   593
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   594
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   595
    /* helper symbol for structure_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   596
    /* structure_element_initialization_list ',' structure_element_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   597
    void *visit(structure_element_initialization_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   598
      s4o.print("{");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   599
      structure_element_iterator_c structure_iterator(structure_type_decl);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   600
      
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   601
      identifier_c *element_name;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   602
      structure_init_element_iterator_c structure_init_element_iterator(symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   603
      for(int i = 1; (element_name = structure_iterator.next()) != NULL; i++) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   604
        if (i > 1)
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   605
          s4o.print(",");
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   606
        
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   607
        /* Get the value from an initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   608
        symbol_c *element_value = structure_init_element_iterator.search(element_name);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   609
        
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   610
        if (element_value == NULL) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   611
          /* No value given for parameter, so we must use the default... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   612
          /* First check whether default value specified in function declaration...*/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   613
          element_value = structure_iterator.default_value();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   614
          current_element_type = structure_iterator.element_type();
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   615
        }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   616
        
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   617
        if (element_value == NULL) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   618
          if (current_element_type == NULL) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   619
          
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   620
          /* If not, get the default value of this variable's type */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   621
          element_value = (symbol_c *)current_element_type->accept(*type_initial_value_c::instance());
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   622
        }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   623
        
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   624
        if (element_value == NULL) ERROR;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   625
        
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   626
        initialization_analyzer_c initialization_analyzer(element_value);
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   627
            
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   628
        if (initialization_analyzer.get_initialization_type() == initialization_analyzer_c::struct_it) {
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   629
          generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   630
          structure_initialization->init_structure_default(current_element_type);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   631
          structure_initialization->init_structure_values(element_value);
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   632
          delete structure_initialization;
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   633
        }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   634
        else {
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   635
          element_value->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   636
        }
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   637
      }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   638
      s4o.print("}");
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   639
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   640
    }
164
a0679c78143a Bug with structure of structure fixed
lbessard
parents: 160
diff changeset
   641
    
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   642
    /* helper symbol for array_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   643
    /* array_initial_elements_list ',' array_initial_elements */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   644
    void *visit(array_initial_elements_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   645
      generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   646
      array_initialization->init_array_size(current_element_type);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   647
      array_initialization->init_array_values(symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   648
      delete array_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   649
      return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   650
    }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   651
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   652
};
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   653
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   654
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   655
/* helper symbol for array_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   656
/* structure_element_initialization_list ',' structure_element_initialization */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   657
void *generate_c_array_initialization_c::visit(structure_element_initialization_list_c *symbol) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   658
  generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   659
  structure_initialization->init_structure_default(array_base_type);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
   660
  structure_initialization->init_structure_values(symbol);
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   661
  delete structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   662
  return NULL;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   663
}
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   664
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   665
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   666
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   667
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   668
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   669
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   670
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   671
/***********************************************************************/
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
   672
/***********************************************************************/
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   673
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   674
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   675
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   676
class generate_c_vardecl_c: protected generate_c_typedecl_c {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   677
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   678
  /* A Helper class to the main class... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   679
  /* print a string, except the first time it is called */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   680
  /* used to print the separator "," before each variable
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   681
   * declaration, except the first...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   682
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   683
   * Needs to be done in a seperate class because this is called
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   684
   * from within various locations within the code.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   685
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   686
  class next_var_c {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   687
    private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   688
      bool print_flag;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   689
      std::string str1, str2;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   690
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   691
      next_var_c *embedded_scope;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   692
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   693
    public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   694
      next_var_c(std::string s1, std::string s2) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   695
        str1 = s1;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   696
        str2 = s2;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   697
        print_flag = false;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   698
        embedded_scope = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   699
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   700
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   701
      std::string get(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   702
        if (NULL != embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   703
          return embedded_scope->get();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   704
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   705
        bool old_print_flag = print_flag;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   706
        print_flag = true;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   707
        if (!old_print_flag)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   708
          return str1;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   709
        else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   710
          return str2;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   711
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   712
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   713
      /* Create a new next_var_c for an embedded scope.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   714
       * From now on, every call to get() will return the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   715
       * inner-most scope...!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   716
       */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   717
      void push(std::string s1, std::string s2) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   718
        if (NULL != embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   719
          return embedded_scope->push(s1, s2);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   720
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   721
        embedded_scope = new next_var_c(s1, s2);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   722
        if (NULL == embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   723
          ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   724
        return;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   725
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   726
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   727
      /* Remove the inner-most scope... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   728
      void pop(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   729
        if (NULL != embedded_scope)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   730
          return embedded_scope->pop();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   731
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   732
        delete embedded_scope;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   733
        embedded_scope = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   734
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   735
  };
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   736
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   737
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   738
    /* used to generate the ',' separating the parameters in a function call */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   739
    next_var_c *nv;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   740
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   741
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   742
  public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   743
    /* the types of variables that need to be processed... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   744
    static const unsigned int none_vt	  = 0x0000;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   745
    static const unsigned int input_vt	  = 0x0001;  // VAR_INPUT
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   746
    static const unsigned int output_vt	  = 0x0002;  // VAR_OUTPUT
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   747
    static const unsigned int inoutput_vt = 0x0004;  // VAR_IN_OUT
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   748
    static const unsigned int private_vt  = 0x0008;  // VAR
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   749
    static const unsigned int temp_vt	  = 0x0010;  // VAR_TEMP
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   750
    static const unsigned int external_vt = 0x0020;  // VAR_EXTERNAL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   751
    static const unsigned int global_vt   = 0x0040;  // VAR_GLOBAL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   752
						     //    Globals declared inside a resource will not be declared
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   753
						     //    unless global_vt is acompanied by resource_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   754
    static const unsigned int located_vt  = 0x0080;  // VAR <var_name> AT <location>
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   755
    static const unsigned int program_vt  = 0x0100;  // PROGRAM (inside a configuration!)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   756
						     //    Programs declared inside a resource will not be declared
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   757
						     //    unless program_vt is acompanied by resource_vt
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   758
    static const unsigned int en_vt       = 0x0200;  // EN  declaration
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   759
    static const unsigned int eno_vt      = 0x0400;  // ENO declaration
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   760
    static const unsigned int resource_vt = 0x8000;  // RESOURCE (inside a configuration!)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   761
                                                     //    This, just of itself, will not print out any declarations!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   762
						     //    It must be acompanied by either program_vt and/or global_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   763
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   764
    /* the qualifier of variables that need to be processed... */
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   765
    static const unsigned int none_vq        = 0x0000;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   766
    static const unsigned int constant_vq    = 0x0001;  // CONSTANT
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   767
    static const unsigned int retain_vq      = 0x0002;  // RETAIN
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   768
    static const unsigned int non_retain_vq  = 0x0004;  // NON_RETAIN
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   769
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   770
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   771
    /* How variables should be declared: as local variables or
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   772
     * variables within a function call interface.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   773
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   774
     * This will define the format of the output generated
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   775
     * by this class.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   776
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   777
     * finterface_vf: function interface parameters
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   778
     *               e.g.  f(  int a, long b, real c );
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   779
     *                         ---------------------
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   780
     *               This class/function will produce the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   781
     *               underlined code of the above examples,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   782
     *               and no more!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   783
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   784
     * localinit_vf: local declaration. Will include variable
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   785
     *           initialisation if it is not a located variable.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   786
     *           e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   787
     *                int a = 9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   788
     *                long b = 99;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   789
     *                real c = 99.9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   790
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   791
     * local_vf: local declaration. Will NOT include variable
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   792
     *           initialisation.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   793
     *           e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   794
     *                int a;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   795
     *                long b;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   796
     *                real c;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   797
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   798
     * init_vf: local initialisation without declaration.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   799
     *           e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   800
     *                a = 9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   801
     *                b = 99;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   802
     *                c = 99.9;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   803
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   804
     * constructorinit_vf: initialising of member variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   805
     *                e.g. for a constructor...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   806
     *                class_name_c(void)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   807
     *                : a(9), b(99), c(99.9)  { // code... }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   808
     *                  --------------------
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   809
     *               This class/function will produce the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   810
     *               underlined code of the above examples,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   811
     *               and no more!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   812
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   813
     * globalinit_vf: initialising of static c++ variables. These
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   814
     *                variables may have been declared as static inside
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   815
     *                a class, in which case the scope within which they were
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   816
     *                previously delcared must be passed as the second parameter
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   817
     *                to the print() function.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   818
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   819
     *                e.g.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   820
     *                __plc_pt_c<INT, 8*sizeof(INT)> START_P::loc = __plc_pt_c<INT, 8*sizeof(INT)>("I2");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   821
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   822
    typedef enum {finterface_vf,
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
   823
                  foutputassign_vf,
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
   824
                  local_vf,
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   825
                  localinit_vf,
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   826
                  init_vf,
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   827
                  constructorinit_vf,
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
   828
                  globalinit_vf,
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
   829
                  globalprototype_vf,
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   830
                 } varformat_t;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   831
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   832
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   833
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   834
    /* variable used to store the types of variables that need to be processed... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   835
    /* Only set in the constructor...! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   836
    /* Will contain a set of values of generate_c_vardecl_c::XXXX_vt */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   837
    unsigned int wanted_vartype;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   838
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   839
    /* variable used to store the type of variable currently being processed... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   840
    /* Will contain a single value of generate_c_vardecl_c::XXXX_vt */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   841
    unsigned int current_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   842
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   843
    /* variable used to store the qualifier of variable currently being processed... */
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   844
    /* Will contain a single value of generate_c_vardecl_c::XXXX_vq */
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   845
    unsigned int current_varqualifier;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   846
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   847
    /* How variables should be declared: as local variables or
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   848
     * variables within a function interface...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   849
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   850
    /* Only set in the constructor...! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   851
    varformat_t wanted_varformat;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   852
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   853
    /* The number of variables already declared. */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   854
    /* Used to declare 'void' in case no variables are declared in a function interface... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   855
    int finterface_var_count;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   856
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
   857
    /* Current parsed resource name, for resource 
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
   858
     * specific global variable declaration (with #define...)*/
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
   859
    symbol_c *resource_name;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   860
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   861
    /* Holds the references to the type and initial value
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   862
     * of the variables currently being declared.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   863
     * Please read the comment under var1_init_decl_c for further
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   864
     * details...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   865
     *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   866
     * We make an effort to keep these pointers pointing to NULL
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   867
     * whenever we are outside the scope of variable declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   868
     * (i.e. when we are traversing a part of the parse tree which
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   869
     * is not part of variable declaration) in order tio try to catch
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   870
     * any bugs as soon as possible.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   871
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   872
    symbol_c *current_var_type_symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   873
    symbol_c *current_var_init_symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   874
    void update_type_init(symbol_c *symbol /* a spec_init_c, subrange_spec_init_c, etc... */ ) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   875
      this->current_var_type_symbol = spec_init_sperator_c::get_spec(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   876
      this->current_var_init_symbol = spec_init_sperator_c::get_init(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   877
      if (NULL == this->current_var_type_symbol)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   878
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   879
      if (NULL == this->current_var_init_symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   880
        /* We try to find the data type's default value... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   881
        this->current_var_init_symbol = (symbol_c *)this->current_var_type_symbol->accept(*type_initial_value_c::instance());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   882
      /* Note that Function Block 'data types' do not have a default value, so we cannot abort if no default value is found! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   883
      /*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   884
      if (NULL == this->current_var_init_symbol)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   885
        ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   886
      */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   887
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   888
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   889
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   890
    void void_type_init(void) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   891
      this->current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   892
      this->current_var_init_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   893
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   894
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   895
    /* Only used when wanted_varformat == globalinit_vf
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   896
     * Holds a pointer to an identifier_c, which in turns contains
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   897
     * the identifier of the scope within which the static member was
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   898
     * declared.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   899
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   900
    symbol_c *globalnamespace;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   901
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   902
    void *print_retain(void) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   903
	  s4o.print(",");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   904
      switch (current_varqualifier) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   905
		case retain_vq:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   906
          s4o.print("1");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   907
          break;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   908
        case non_retain_vq:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   909
          s4o.print("0");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   910
          break;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   911
		default:
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   912
		  s4o.print("retain");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   913
		  break;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   914
      }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   915
      return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   916
    }
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   917
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   918
    /* Actually produce the output where variables are declared... */
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   919
    /* Note that located variables and EN/ENO are the exception, they
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   920
     * being declared in the located_var_decl_c,
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
   921
     * en_param_declaration_c and eno_param_declaration_c visitors...
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   922
     */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   923
    void *declare_variables(symbol_c *symbol, bool is_fb = false) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   924
      list_c *list = dynamic_cast<list_c *>(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   925
      /* should NEVER EVER occur!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   926
      if (list == NULL) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   927
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   928
      /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   929
      if ((wanted_varformat == local_vf) ||
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   930
          (wanted_varformat == init_vf) ||
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   931
          (wanted_varformat == localinit_vf)) {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   932
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   933
          s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   934
          if (wanted_varformat == local_vf) {
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   935
        	if (!is_fb) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   936
        	  s4o.print(DECLARE_VAR);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   937
        	  s4o.print("(");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   938
        	}
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   939
        	this->current_var_type_symbol->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   940
        	if (is_fb)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   941
        	  s4o.print(" ");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   942
        	else
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   943
        	  s4o.print(",");
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   944
        	print_variable_prefix();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   945
          }
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   946
          else if (wanted_varformat == localinit_vf) {
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
   947
        	this->current_var_type_symbol->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   948
            s4o.print(" ");
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   949
            print_variable_prefix();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   950
          }
334
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   951
          else if (wanted_varformat == init_vf) {
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   952
        	s4o.print(SET_VAR);
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   953
        	s4o.print("(");
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   954
        	print_variable_prefix();
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 377
diff changeset
   955
        	s4o.print(",");
334
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   956
          }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   957
          list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   958
          if (wanted_varformat != local_vf) {
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   959
        	if (wanted_varformat == localinit_vf &&
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   960
        		(current_vartype & inoutput_vt) != 0) {
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   961
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   962
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   963
              s4o.print("if (__");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   964
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   965
              s4o.print(" != NULL) {\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   966
              s4o.indent_right();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   967
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   968
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   969
              s4o.print(" = *__");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   970
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   971
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   972
              s4o.indent_left();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   973
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   974
              s4o.print("}\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   975
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   976
              s4o.print("else {\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   977
              s4o.indent_right();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   978
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   979
              s4o.print("static const ");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   980
              this->current_var_type_symbol->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   981
              s4o.print(" temp = ");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   982
              this->current_var_init_symbol->accept(*this);
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   983
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   984
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   985
              list->elements[i]->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   986
              s4o.print(" = temp;\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   987
              s4o.indent_left();
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   988
              s4o.print(s4o.indent_spaces);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   989
              s4o.print("}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   990
            }
334
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   991
        	else if (wanted_varformat == init_vf) {
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   992
        	  s4o.print(",");
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   993
        	  this->current_var_init_symbol->accept(*this);
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   994
        	  s4o.print(");\n");
63b52a8a12f3 Fix bug on initialization of temp variables not using setter
laurent
parents: 279
diff changeset
   995
        	}
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   996
        	else {
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   997
        	  if (this->current_var_init_symbol != NULL) {
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   998
                s4o.print(" = ");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
   999
                this->current_var_init_symbol->accept(*this);
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1000
              }
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1001
              s4o.print(";\n");
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1002
            }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1003
          }
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1004
          else if (is_fb)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1005
        	s4o.print(";\n");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1006
          else
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1007
            s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1008
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1009
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1010
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1011
      if (wanted_varformat == finterface_vf) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1012
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1013
          finterface_var_count++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1014
          s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1015
          s4o.print("\n" + s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1016
          this->current_var_type_symbol->accept(*this);
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1017
          if ((current_vartype & (output_vt | inoutput_vt)) != 0)
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1018
            s4o.print(" *__");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1019
          else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1020
            s4o.print(" ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1021
          list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1022
          /* We do not print the initial value at function declaration!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1023
           * It is up to the caller to pass the correct default value
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1024
           * if none is specified in the ST source code
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1025
           */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1026
          /* if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1027
               s4o.print(" = "); this->current_var_init_symbol->accept(*this);}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1028
           */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1029
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1030
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1031
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1032
      if (wanted_varformat == foutputassign_vf) {
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1033
        for(int i = 0; i < list->n; i++) {
236
c55b02ca2342 Using InOut variables in functions fixed
laurent
parents: 235
diff changeset
  1034
          if ((current_vartype & (output_vt | inoutput_vt)) != 0) {
145
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1035
            s4o.print(s4o.indent_spaces + "if (__");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1036
            list->elements[i]->accept(*this);
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1037
            s4o.print(" != NULL) {\n");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1038
            s4o.indent_right();
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1039
            s4o.print(s4o.indent_spaces + "*__");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1040
            list->elements[i]->accept(*this);
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1041
            s4o.print(" = ");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1042
            list->elements[i]->accept(*this);
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1043
            s4o.print(";\n");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1044
            s4o.indent_left();
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1045
            s4o.print(s4o.indent_spaces + "}\n");
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1046
          }
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1047
        }
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1048
      }
72ae82e65dbc Adding support for ouput variables in functions
lbessard
parents: 138
diff changeset
  1049
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1050
      if (wanted_varformat == constructorinit_vf) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1051
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1052
          if (is_fb) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1053
            s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1054
            this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1055
            s4o.print(FB_INIT_SUFFIX);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1056
            s4o.print("(&");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1057
            this->print_variable_prefix();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1058
            list->elements[i]->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1059
            print_retain();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1060
            s4o.print(");");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1061
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1062
          else if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1063
            s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1064
            s4o.print(INIT_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1065
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1066
            this->print_variable_prefix();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1067
            list->elements[i]->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1068
            s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1069
            this->current_var_init_symbol->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1070
            print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1071
            s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1072
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1073
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1074
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1075
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1076
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1077
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1078
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1079
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1080
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1081
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1082
  public:
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1083
    generate_c_vardecl_c(stage4out_c *s4o_ptr, varformat_t varformat, unsigned int vartype, symbol_c* res_name = NULL)
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1084
    : generate_c_typedecl_c(s4o_ptr) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1085
      wanted_varformat = varformat;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1086
      wanted_vartype   = vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1087
      current_vartype  = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1088
      current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1089
      current_var_type_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1090
      current_var_init_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1091
      globalnamespace         = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1092
      nv = NULL;
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1093
      resource_name = res_name;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1094
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1095
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1096
    ~generate_c_vardecl_c(void) {}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1097
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1098
    void print(symbol_c *symbol, symbol_c *scope = NULL, const char *variable_prefix = NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1099
      this->set_variable_prefix(variable_prefix);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1100
      if (globalinit_vf == wanted_varformat)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1101
        globalnamespace = scope;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1102
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1103
      finterface_var_count = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1104
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1105
      switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1106
        case constructorinit_vf: nv = new next_var_c("", "\n"+s4o.indent_spaces); break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1107
        case finterface_vf:      /* fall through... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1108
        case localinit_vf:       /* fall through... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1109
        case local_vf:           nv = new next_var_c("", ", "); break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1110
        default:                 nv = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1111
      } /* switch() */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1112
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1113
      symbol->accept(*this);
189
7ca02034c4f6 Bug on function without input parameters fixed
lbessard
parents: 164
diff changeset
  1114
      
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1115
      delete nv;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1116
      nv = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1117
      globalnamespace = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1118
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1119
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1120
  protected:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1121
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1122
/* B 0 - Programming Model */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1123
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1124
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1125
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1126
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1127
/* B.1 - Common elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1128
/*************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1129
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1130
/* B 1.1 - Letters, digits and identifiers */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1131
/*******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1132
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1133
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1134
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1135
/* B 1.2 - Constants */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1136
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1137
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1138
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1139
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1140
/* B 1.2.1 - Numeric Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1141
/******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1142
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1143
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1144
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1145
/* B.1.2.2   Character Strings */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1146
/*******************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1147
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1148
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1149
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1150
/* B 1.2.3 - Time Literals */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1151
/***************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1152
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1153
/* B 1.2.3.1 - Duration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1154
/************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1155
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1156
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1157
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1158
/* B 1.2.3.2 - Time of day and Date */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1159
/************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1160
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1161
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1162
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1163
/* B.1.3 - Data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1164
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1165
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1166
/* B 1.3.1 - Elementary Data Types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1167
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1168
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1169
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1170
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1171
/* B.1.3.2 - Generic data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1172
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1173
  /* originally empty... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1174
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1175
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1176
/* B 1.3.3 - Derived data types */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1177
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1178
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1179
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1180
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1181
/* B 1.4 - Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1182
/*********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1183
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1184
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1185
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1186
/* B.1.4.1   Directly Represented Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1187
/********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1188
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1189
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1190
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1191
/* B.1.4.2   Multi-element Variables */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1192
/*************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1193
  /* done in base class(es) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1194
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1195
/******************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1196
/* B 1.4.3 - Declaration & Initialisation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1197
/******************************************/
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1198
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1199
void *visit(constant_option_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1200
  current_varqualifier = constant_vq;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1201
  return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1202
}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1203
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1204
void *visit(retain_option_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1205
  current_varqualifier = retain_vq;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1206
  return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1207
}
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1208
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1209
void *visit(non_retain_option_c *symbol) {
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1210
  current_varqualifier = non_retain_vq;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1211
  return NULL;
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1212
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1213
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1214
void *visit(input_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1215
  TRACE("input_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1216
  if ((wanted_vartype & input_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1217
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1218
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1219
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1220
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1221
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1222
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1223
    current_vartype = input_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1224
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1225
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1226
    symbol->input_declaration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1227
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1228
    current_varqualifier = none_vt;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1229
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1230
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1231
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1232
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1233
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1234
/* helper symbol for input_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1235
void *visit(input_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1236
  TRACE("input_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1237
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1238
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1239
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1240
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1241
void *visit(edge_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1242
  TRACE("edge_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1243
  // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1244
  symbol->var1_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1245
  s4o.print(" : BOOL ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1246
  symbol->edge->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1247
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1248
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1249
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1250
void *visit(en_param_declaration_c *symbol) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1251
  TRACE("en_declaration_c");
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1252
  if (wanted_varformat == finterface_vf) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1253
    finterface_var_count++;
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1254
  }  
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1255
  if ((wanted_vartype & en_vt) != 0) {
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1256
    if (wanted_varformat == finterface_vf) {
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1257
      s4o.print(nv->get());
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1258
      s4o.print("\n" + s4o.indent_spaces);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1259
      symbol->type->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1260
      s4o.print(" ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1261
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1262
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1263
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1264
    if ((wanted_varformat == local_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1265
        (wanted_varformat == init_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1266
        (wanted_varformat == localinit_vf)) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1267
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1268
      if (wanted_varformat == local_vf) {
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1269
    	s4o.print(DECLARE_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1270
    	s4o.print("(");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1271
    	symbol->type->accept(*this);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1272
        s4o.print(",");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1273
      }
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1274
      else if (wanted_varformat == localinit_vf) {
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1275
        symbol->type->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1276
        s4o.print(" ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1277
      }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1278
      print_variable_prefix();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1279
      symbol->name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1280
      if (wanted_varformat == local_vf)
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1281
    	s4o.print(")\n");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1282
      else {
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1283
        s4o.print(" = ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1284
        symbol->value->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1285
        s4o.print(";\n");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1286
      }
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1287
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1288
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1289
    if (wanted_varformat == constructorinit_vf) {
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1290
      /* NOTE: I (Mario) think this is dead code - never gets executed. Must confirm it before deleting it... */
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1291
      s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1292
      s4o.print(INIT_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1293
      s4o.print("(");
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1294
      this->print_variable_prefix();
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1295
      // s4o.print("EN = __BOOL_LITERAL(TRUE);");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1296
      symbol->name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1297
      s4o.print(",");
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1298
      symbol->value->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1299
      print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1300
      s4o.print(")");
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1301
    }
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1302
  }
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1303
  return NULL;
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1304
}
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1305
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1306
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1307
void *visit(eno_param_declaration_c *symbol) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1308
  TRACE("eno_declaration_c");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1309
  if (wanted_varformat == finterface_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1310
    finterface_var_count++;
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1311
  }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1312
  if ((wanted_vartype & eno_vt) != 0) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1313
    if (wanted_varformat == finterface_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1314
      s4o.print(nv->get());
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1315
      // s4o.print("\n" + s4o.indent_spaces + "BOOL *ENO");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1316
      s4o.print("\n" + s4o.indent_spaces);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1317
      symbol->type->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1318
      s4o.print(" *__");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1319
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1320
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1321
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1322
    if ((wanted_varformat == local_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1323
        (wanted_varformat == init_vf) ||
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1324
        (wanted_varformat == localinit_vf)) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1325
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1326
      if (wanted_varformat == local_vf) {
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1327
    	s4o.print(DECLARE_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1328
    	s4o.print("(");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1329
        symbol->type->accept(*this);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1330
        s4o.print(",");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1331
      }
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1332
      else if (wanted_varformat == localinit_vf) {
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1333
        symbol->type->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1334
        s4o.print(" ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1335
      }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1336
      print_variable_prefix();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1337
      symbol->name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1338
      if (wanted_varformat == local_vf)
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1339
    	s4o.print(")\n");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1340
      else
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1341
    	s4o.print(" = __BOOL_LITERAL(TRUE);\n");
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1342
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1343
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1344
    if (wanted_varformat == foutputassign_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1345
      s4o.print(s4o.indent_spaces + "if (__");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1346
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1347
      s4o.print(" != NULL) {\n");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1348
      s4o.indent_right();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1349
      s4o.print(s4o.indent_spaces + "*__");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1350
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1351
      s4o.print(" = ");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1352
      symbol->name->accept(*this);
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1353
      s4o.print(";\n");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1354
      s4o.indent_left();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1355
      s4o.print(s4o.indent_spaces + "}\n");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1356
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1357
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1358
    if (wanted_varformat == constructorinit_vf) {
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1359
      /* NOTE: I (Mario) think this is dead code - never gets executed. Must confirm it before deleting it... */
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1360
      s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1361
      s4o.print(INIT_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1362
      s4o.print("(");
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1363
      this->print_variable_prefix();
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1364
      // s4o.print("ENO = __BOOL_LITERAL(TRUE);");
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1365
      symbol->name->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1366
      s4o.print(",__BOOL_LITERAL(TRUE)");
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1367
      print_retain();
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1368
      s4o.print(")");
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1369
    }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1370
  }
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1371
  return NULL;
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1372
}
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  1373
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1374
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1375
void *visit(raising_edge_option_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1376
  // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1377
  s4o.print("R_EDGE");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1378
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1379
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1380
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1381
/*  var1_list ':' array_spec_init */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1382
// SYM_REF2(array_var_init_decl_c, var1_list, array_spec_init)
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1383
void *visit(array_var_init_decl_c *symbol) {
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1384
  TRACE("array_var_init_decl_c");
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1385
  /* Please read the comments inside the var1_init_decl_c
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1386
   * visitor, as they apply here too.
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1387
   */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1388
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1389
  /* Start off by setting the current_var_type_symbol and
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1390
   * current_var_init_symbol private variables...
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1391
   */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1392
  update_type_init(symbol->array_spec_init);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1393
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1394
  /* now to produce the c equivalent... */
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1395
  if (wanted_varformat == constructorinit_vf) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1396
    generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1397
    array_initialization->set_variable_prefix(get_variable_prefix());
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1398
    array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1399
    delete array_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1400
  }
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1401
  else
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1402
    symbol->var1_list->accept(*this);
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1403
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1404
  /* Values no longer in scope, and therefore no longer used.
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1405
   * Make an effort to keep them set to NULL when not in use
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1406
   * in order to catch bugs as soon as possible...
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1407
   */
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1408
  void_type_init();
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1409
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1410
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1411
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1412
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1413
/* ARRAY '[' array_subrange_list ']' OF non_generic_type_name */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1414
void *visit(array_specification_c *symbol) {
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1415
  s4o.print("__");
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1416
  symbol->non_generic_type_name->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1417
  symbol->array_subrange_list->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1418
  return NULL;
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1419
}
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1420
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1421
/*  signed_integer DOTDOT signed_integer */
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1422
//SYM_REF2(subrange_c, lower_limit, upper_limit)
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1423
void *visit(subrange_c *symbol) {
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1424
  s4o.print("_");
594
c8092e909886 Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents: 592
diff changeset
  1425
  s4o.print(symbol->dimension);
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1426
  return NULL;
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1427
}
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1428
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1429
/*  var1_list ':' initialized_structure */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1430
// SYM_REF2(structured_var_init_decl_c, var1_list, initialized_structure)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1431
void *visit(structured_var_init_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1432
  TRACE("structured_var_init_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1433
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1434
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1435
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1436
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1437
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1438
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1439
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1440
  update_type_init(symbol->initialized_structure);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1441
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1442
  /* now to produce the c equivalent... */
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1443
  if (wanted_varformat == constructorinit_vf) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1444
    generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1445
    structure_initialization->set_variable_prefix(get_variable_prefix());
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1446
    structure_initialization->init_structure(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1447
    delete structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1448
  }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1449
  else
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1450
    symbol->var1_list->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1451
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1452
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1453
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1454
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1455
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1456
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1457
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1458
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1459
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1460
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1461
/* fb_name_list ':' function_block_type_name ASSIGN structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1462
/* structure_initialization -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1463
void *visit(fb_name_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1464
  TRACE("fb_name_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1465
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1466
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1467
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1468
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1469
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1470
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1471
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1472
  update_type_init(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1473
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1474
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1475
  symbol->fb_name_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1476
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1477
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1478
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1479
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1480
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1481
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1482
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1483
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1484
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1485
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1486
/* fb_name_list ',' fb_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1487
void *visit(fb_name_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1488
  TRACE("fb_name_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1489
  declare_variables(symbol, true);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1490
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1491
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1492
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1493
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1494
/* VAR_OUTPUT [RETAIN | NON_RETAIN] var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1495
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1496
void *visit(output_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1497
  TRACE("output_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1498
  if ((wanted_vartype & output_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1499
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1500
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1501
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1502
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1503
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1504
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1505
    current_vartype = output_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1506
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1507
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1508
    symbol->var_init_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1509
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1510
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1511
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1512
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1513
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1514
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1515
146
eef5e62048c7 Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents: 145
diff changeset
  1516
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1517
/*  VAR_IN_OUT var_declaration_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1518
void *visit(input_output_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1519
  TRACE("input_output_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1520
  if ((wanted_vartype & inoutput_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1521
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1522
    current_vartype = inoutput_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1523
    symbol->var_declaration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1524
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1525
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1526
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1527
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1528
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1529
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1530
/* helper symbol for input_output_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1531
/* var_declaration_list var_declaration ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1532
void *visit(var_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1533
  TRACE("var_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1534
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1535
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1536
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1537
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1538
/*  var1_list ':' array_specification */
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1539
//SYM_REF2(array_var_declaration_c, var1_list, array_specification)
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1540
void *visit(array_var_declaration_c *symbol) {
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1541
  TRACE("array_var_declaration_c");
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1542
  /* Please read the comments inside the var1_init_decl_c
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1543
   * visitor, as they apply here too.
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1544
   */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1545
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1546
  /* Start off by setting the current_var_type_symbol and
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1547
   * current_var_init_symbol private variables...
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1548
   */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1549
  update_type_init(symbol->array_specification);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1550
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1551
  /* now to produce the c equivalent... */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1552
  if (wanted_varformat == constructorinit_vf) {
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1553
    generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1554
    array_initialization->set_variable_prefix(get_variable_prefix());
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1555
    array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1556
    delete array_initialization;
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1557
  }
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1558
  else
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1559
    symbol->var1_list->accept(*this);
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1560
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1561
  /* Values no longer in scope, and therefore no longer used.
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1562
   * Make an effort to keep them set to NULL when not in use
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1563
   * in order to catch bugs as soon as possible...
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1564
   */
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1565
  void_type_init();
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1566
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1567
  return NULL;
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1568
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1569
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1570
void *visit(array_initial_elements_list_c *symbol) {
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  1571
  if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) {
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1572
	generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1573
	array_initialization->init_array_size(this->current_var_type_symbol);
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1574
	array_initialization->init_array_values(this->current_var_init_symbol);
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1575
	delete array_initialization;
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1576
  }
98
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1577
  return NULL;
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1578
}
d0cdf1d00b74 Adding support for derived data types.
lbessard
parents: 70
diff changeset
  1579
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1580
/*  var1_list ':' structure_type_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1581
//SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1582
void *visit(structured_var_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1583
  TRACE("structured_var_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1584
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1585
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1586
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1587
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1588
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1589
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1590
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1591
  update_type_init(symbol->structure_type_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1592
160
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1593
  if (wanted_varformat == constructorinit_vf) {
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1594
    generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1595
    structure_initialization->set_variable_prefix(get_variable_prefix());
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1596
    structure_initialization->init_structure(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol);
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1597
    delete structure_initialization;
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1598
  }
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1599
  else
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1600
    /* now to produce the c equivalent... */
59d58f5e6caa Adding support for compiling struct data types
lbessard
parents: 152
diff changeset
  1601
    symbol->var1_list->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1602
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1603
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1604
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1605
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1606
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1607
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1608
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1609
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1610
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1611
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1612
void *visit(structure_element_initialization_list_c *symbol) {
582
8495119e7271 Fix structure initialize.
Manuele conti <conti.ma@alice.it>
parents: 547
diff changeset
  1613
  if (wanted_varformat == localinit_vf || wanted_varformat == constructorinit_vf) {
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1614
    generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o);
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1615
    structure_initialization->init_structure_default(this->current_var_type_symbol);
237
cece842c7417 Adding support for using arrays in POU interface
laurent
parents: 236
diff changeset
  1616
    structure_initialization->init_structure_values(this->current_var_init_symbol);
226
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1617
	delete structure_initialization;
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1618
  }
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1619
  return NULL;
29f8ffc203c1 Adding support for setter and getter on complex datatype in ST
laurent
parents: 221
diff changeset
  1620
}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1621
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1622
/* VAR [CONSTANT] var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1623
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1624
/* helper symbol for input_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1625
void *visit(var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1626
  TRACE("var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1627
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1628
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1629
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1630
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1631
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1632
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1633
    current_vartype = private_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1634
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1635
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1636
    symbol->var_init_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1637
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1638
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1639
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1640
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1641
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1642
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1643
/*  VAR RETAIN var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1644
void *visit(retentive_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1645
  TRACE("retentive_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1646
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1647
    current_vartype = private_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1648
    current_varqualifier = retain_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1649
    symbol->var_init_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1650
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1651
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1652
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1653
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1654
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1655
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1656
/*  VAR [CONSTANT|RETAIN|NON_RETAIN] located_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1657
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1658
//SYM_REF2(located_var_declarations_c, option, located_var_decl_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1659
void *visit(located_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1660
  TRACE("located_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1661
  if ((wanted_vartype & located_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1662
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1663
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1664
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1665
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1666
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1667
    current_vartype = located_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1668
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1669
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1670
    symbol->located_var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1671
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1672
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1673
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1674
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1675
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1676
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1677
/* helper symbol for located_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1678
/* located_var_decl_list located_var_decl ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1679
//SYM_LIST(located_var_decl_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1680
void *visit(located_var_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1681
  TRACE("located_var_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1682
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1683
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1684
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1685
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1686
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1687
/*  [variable_name] location ':' located_var_spec_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1688
/* variable_name -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1689
//SYM_REF4(located_var_decl_c, variable_name, location, located_var_spec_init, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1690
void *visit(located_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1691
  TRACE("located_var_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1692
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1693
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1694
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1695
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1696
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1697
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1698
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1699
  update_type_init(symbol->located_var_spec_init);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1700
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1701
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1702
  switch(wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1703
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1704
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1705
      s4o.print(DECLARE_LOCATED);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1706
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1707
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1708
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1709
      if (symbol->variable_name != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1710
        symbol->variable_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1711
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1712
        symbol->location->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1713
      s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1714
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1715
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1716
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1717
      s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1718
      s4o.print(INIT_LOCATED);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1719
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1720
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1721
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1722
      symbol->location->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1723
      s4o.print(",");
230
816846a8d66b Bug in located variable initialization code fixed
laurent
parents: 226
diff changeset
  1724
      print_variable_prefix();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1725
      if (symbol->variable_name != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1726
        symbol->variable_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1727
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1728
        symbol->location->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1729
      print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1730
      s4o.print(")\n");
152
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1731
      if (this->current_var_init_symbol != NULL) {
230
816846a8d66b Bug in located variable initialization code fixed
laurent
parents: 226
diff changeset
  1732
    	s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1733
    	s4o.print(INIT_LOCATED_VALUE);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1734
    	s4o.print("(");
230
816846a8d66b Bug in located variable initialization code fixed
laurent
parents: 226
diff changeset
  1735
    	print_variable_prefix();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1736
    	if (symbol->variable_name != NULL)
152
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1737
          symbol->variable_name->accept(*this);
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1738
        else
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1739
          symbol->location->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1740
    	s4o.print(",");
152
efc510145ab2 Adding support for direct variable type search
greg
parents: 146
diff changeset
  1741
        this->current_var_init_symbol->accept(*this);
230
816846a8d66b Bug in located variable initialization code fixed
laurent
parents: 226
diff changeset
  1742
        s4o.print(")");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1743
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1744
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1745
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1746
    case globalinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1747
      s4o.print(s4o.indent_spaces + "__plc_pt_c<");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1748
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1749
      s4o.print(", 8*sizeof(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1750
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1751
      s4o.print(")> ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1752
      if (this->globalnamespace != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1753
        this->globalnamespace->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1754
        s4o.print("::");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1755
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1756
      if (symbol->variable_name != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1757
        symbol->variable_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1758
      else
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1759
        symbol->location->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1760
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1761
      s4o.print(" = ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1762
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1763
      s4o.print(s4o.indent_spaces + "__plc_pt_c<");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1764
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1765
      s4o.print(", 8*sizeof(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1766
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1767
      s4o.print(")>(\"");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1768
      symbol->location->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1769
      s4o.print("\"");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1770
      if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1771
        s4o.print(", ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1772
        this->current_var_init_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1773
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1774
      s4o.print(");\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1775
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1776
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1777
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1778
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1779
  } /* switch() */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1780
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1781
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1782
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1783
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1784
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1785
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1786
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1787
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1788
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1789
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1790
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1791
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1792
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1793
/*| VAR_EXTERNAL [CONSTANT] external_declaration_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1794
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1795
//SYM_REF2(external_var_declarations_c, option, external_declaration_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1796
void *visit(external_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1797
  TRACE("external_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1798
  if ((wanted_vartype & external_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1799
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1800
    // TODO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1801
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1802
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1803
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1804
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1805
    current_vartype = external_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1806
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1807
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1808
    symbol->external_declaration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1809
    current_vartype = none_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1810
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1811
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1812
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1813
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1814
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1815
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1816
/* helper symbol for external_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1817
/*| external_declaration_list external_declaration';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1818
//SYM_LIST(external_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1819
/* helper symbol for input_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1820
void *visit(external_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1821
  TRACE("external_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1822
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1823
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1824
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1825
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1826
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1827
/*  global_var_name ':' (simple_specification|subrange_specification|enumerated_specification|array_specification|prev_declared_structure_type_name|function_block_type_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1828
//SYM_REF2(external_declaration_c, global_var_name, specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1829
void *visit(external_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1830
  TRACE("external_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1831
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1832
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1833
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1834
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1835
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1836
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1837
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1838
  this->current_var_type_symbol = symbol->specification;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1839
  this->current_var_init_symbol = NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1840
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1841
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1842
  switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1843
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1844
    case localinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1845
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1846
      s4o.print(DECLARE_EXTERNAL);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1847
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1848
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1849
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1850
      symbol->global_var_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1851
      s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1852
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1853
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1854
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1855
      s4o.print(nv->get());
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1856
      s4o.print(INIT_EXTERNAL);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1857
      s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1858
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1859
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1860
      symbol->global_var_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1861
      s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1862
      print_variable_prefix();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1863
      symbol->global_var_name->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1864
      print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1865
      s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1866
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1867
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1868
    case finterface_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1869
      finterface_var_count++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1870
      s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1871
      this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1872
      s4o.print(" *");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1873
      symbol->global_var_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1874
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1875
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1876
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1877
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1878
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1879
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1880
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1881
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1882
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1883
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1884
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1885
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1886
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1887
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1888
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1889
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1890
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1891
/*| VAR_GLOBAL [CONSTANT|RETAIN] global_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1892
/* option -> may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1893
// SYM_REF2(global_var_declarations_c, option, global_var_decl_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1894
void *visit(global_var_declarations_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1895
  TRACE("global_var_declarations_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1896
  if ((wanted_vartype & global_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1897
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1898
    // TODO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1899
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1900
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1901
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1902
    //s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1903
    unsigned int previous_vartype = current_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1904
      // previous_vartype will be either none_vt, or resource_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1905
    current_vartype = global_vt;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1906
    if (symbol->option != NULL)
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1907
      symbol->option->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1908
    symbol->global_var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1909
    current_vartype = previous_vartype;
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1910
    current_varqualifier = none_vq;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1911
    //s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1912
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1913
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1914
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1915
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1916
/* helper symbol for global_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1917
/*| global_var_decl_list global_var_decl ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1918
//SYM_LIST(global_var_decl_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1919
void *visit(global_var_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1920
  TRACE("global_var_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1921
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1922
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1923
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1924
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1925
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1926
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1927
/*| global_var_spec ':' [located_var_spec_init|function_block_type_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1928
/* type_specification ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1929
// SYM_REF2(global_var_decl_c, global_var_spec, type_specification)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1930
void *visit(global_var_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1931
  TRACE("global_var_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1932
  /* Please read the comments inside the var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1933
   * visitor, as they apply here too.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1934
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1935
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1936
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1937
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1938
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1939
  update_type_init(symbol->type_specification);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1940
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1941
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1942
  symbol->global_var_spec->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1943
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1944
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1945
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1946
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1947
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1948
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1949
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1950
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1951
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1952
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1953
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1954
/*| global_var_name location */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1955
// SYM_REF2(global_var_spec_c, global_var_name, location)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1956
void *visit(global_var_spec_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1957
  TRACE("global_var_spec_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1958
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1959
  switch(wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1960
    case local_vf:
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1961
      s4o.print(s4o.indent_spaces);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1962
      s4o.print(DECLARE_GLOBAL_LOCATION);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1963
      s4o.print("(");
195
66d501d7b67d Fix segmentation fault when define global with location but no name (reported by brendan)
lbessard
parents: 189
diff changeset
  1964
      this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1965
      s4o.print(",");
195
66d501d7b67d Fix segmentation fault when define global with location but no name (reported by brendan)
lbessard
parents: 189
diff changeset
  1966
      symbol->location->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1967
      s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1968
      if (symbol->global_var_name != NULL) {
195
66d501d7b67d Fix segmentation fault when define global with location but no name (reported by brendan)
lbessard
parents: 189
diff changeset
  1969
        s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1970
        s4o.print(DECLARE_GLOBAL_LOCATED);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1971
        s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1972
        this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1973
        s4o.print(",");
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1974
        if (this->resource_name != NULL) {
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1975
            this->resource_name->accept(*this);
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  1976
        }
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1977
        s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1978
        symbol->global_var_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1979
        s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1980
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1981
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1982
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1983
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1984
      if (symbol->global_var_name != NULL) {
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1985
    	s4o.print(nv->get());
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1986
    	s4o.print(INIT_GLOBAL_LOCATED);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1987
    	s4o.print("(");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1988
    	if (this->resource_name != NULL) {
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1989
    	  this->resource_name->accept(*this);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1990
    	}
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1991
        s4o.print(",");
128
fd5760f30682 Changed located global variable declaration and init to reflec recent change on located vars (pointers)
etisserant
parents: 122
diff changeset
  1992
        symbol->global_var_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1993
      	s4o.print(",");
128
fd5760f30682 Changed located global variable declaration and init to reflec recent change on located vars (pointers)
etisserant
parents: 122
diff changeset
  1994
      	symbol->location->accept(*this);
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  1995
        print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1996
      	s4o.print(")");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1997
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1998
      if (this->current_var_init_symbol != NULL) {
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  1999
	    s4o.print(nv->get());
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2000
	    s4o.print(INIT_GLOBAL);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2001
	    s4o.print("(");
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2002
	    this->current_var_type_symbol->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2003
	    s4o.print(",");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2004
	    if (symbol->global_var_name != NULL)
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2005
		  symbol->global_var_name->accept(*this);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2006
	    else
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2007
		  symbol->location->accept(*this);
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2008
	    s4o.print(",");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2009
	    s4o.print(INITIAL_VALUE);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2010
	    s4o.print("(");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2011
	    this->current_var_init_symbol->accept(*this);
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2012
	    s4o.print(")");
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  2013
	    print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2014
	    s4o.print(")");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2015
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2016
      break;
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2017
    
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2018
    case globalprototype_vf:
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2019
      s4o.print(s4o.indent_spaces);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2020
      s4o.print(DECLARE_GLOBAL_PROTOTYPE);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2021
	  s4o.print("(");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2022
	  this->current_var_type_symbol->accept(*this);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2023
	  s4o.print(",");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2024
	  if (symbol->global_var_name != NULL)
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2025
		symbol->global_var_name->accept(*this);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2026
	  else
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2027
		symbol->location->accept(*this);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2028
	  s4o.print(")\n");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2029
      break;
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2030
    
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2031
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2032
      ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2033
  } /* switch() */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2034
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2035
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2036
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2037
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2038
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2039
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2040
/*  AT direct_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2041
// SYM_REF2(location_c, direct_variable, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2042
void *visit(location_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2043
  TRACE("location_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2044
  return symbol->direct_variable->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2045
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2046
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2047
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2048
/*| global_var_list ',' global_var_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2049
//SYM_LIST(global_var_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2050
void *visit(global_var_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2051
  TRACE("global_var_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2052
  list_c *list = dynamic_cast<list_c *>(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2053
  /* should NEVER EVER occur!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2054
  if (list == NULL) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2055
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2056
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2057
  switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2058
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2059
    case localinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2060
      for(int i = 0; i < list->n; i++) {
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2061
    	s4o.print(s4o.indent_spaces);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2062
    	s4o.print(DECLARE_GLOBAL);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2063
    	s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2064
        this->current_var_type_symbol->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2065
        s4o.print(",");
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2066
        if(this->resource_name != NULL)
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2067
            this->resource_name->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2068
        s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2069
        list->elements[i]->accept(*this);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2070
        s4o.print(")\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2071
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2072
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2073
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2074
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2075
      if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2076
        for(int i = 0; i < list->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2077
          s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2078
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2079
          s4o.print(INIT_GLOBAL);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2080
          s4o.print("(");
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2081
          this->current_var_type_symbol->accept(*this);
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2082
          s4o.print(",");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2083
          list->elements[i]->accept(*this);
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2084
          s4o.print(",");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2085
          s4o.print(INITIAL_VALUE);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2086
          s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2087
          this->current_var_init_symbol->accept(*this);
377
60b012b7793f Adding support for compiling direct array specification inside variable declaration
laurent
parents: 334
diff changeset
  2088
          s4o.print(")");
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
  2089
          print_retain();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 202
diff changeset
  2090
          s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2091
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2092
 	  /* The following code would be for globalinit_vf !!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2093
	   * But it is not currently required...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2094
	   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2095
	  s4o.print(s4o.indent_spaces + "__ext_element_c<");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2096
          this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2097
          s4o.print("> ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2098
          if (this->globalnamespace != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2099
            this->globalnamespace->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2100
            s4o.print("::");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2101
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2102
          list->elements[i]->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2103
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2104
          if (this->current_var_init_symbol != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2105
            s4o.print(" = ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2106
            s4o.print("__ext_element_c<");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2107
            this->current_var_type_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2108
            s4o.print(">(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2109
            this->current_var_init_symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2110
            s4o.print(")");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2111
	  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2112
          s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2113
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2114
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2115
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2116
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2117
396
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2118
    case globalprototype_vf:
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2119
      for(int i = 0; i < list->n; i++) {
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2120
        s4o.print(s4o.indent_spaces);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2121
        s4o.print(DECLARE_GLOBAL_PROTOTYPE);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2122
        s4o.print("(");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2123
        this->current_var_type_symbol->accept(*this);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2124
        s4o.print(",");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2125
        list->elements[i]->accept(*this);
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2126
        s4o.print(")\n");
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2127
      }
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2128
      break;
155560bfe837 Fixing bug with external variables refering to global variables defined in configurations
laurent
parents: 392
diff changeset
  2129
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2130
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2131
      ERROR; /* not supported, and not needed either... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2132
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2133
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2134
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2135
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2136
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2137
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2138
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2139
/*  var1_list ':' single_byte_string_spec */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2140
SYM_REF2(single_byte_string_var_declaration_c, var1_list, single_byte_string_spec)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2141
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2142
/*  STRING ['[' integer ']'] [ASSIGN single_byte_character_string] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2143
/* integer ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2144
/* single_byte_character_string ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2145
SYM_REF2(single_byte_string_spec_c, integer, single_byte_character_string)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2146
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2147
/*  var1_list ':' double_byte_string_spec */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2148
SYM_REF2(double_byte_string_var_declaration_c, var1_list, double_byte_string_spec)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2149
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2150
/*  WSTRING ['[' integer ']'] [ASSIGN double_byte_character_string] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2151
/* integer ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2152
/* double_byte_character_string ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2153
SYM_REF2(double_byte_string_spec_c, integer, double_byte_character_string)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2154
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2155
/*| VAR [RETAIN|NON_RETAIN] incompl_located_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2156
/* option ->may be NULL ! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2157
SYM_REF2(incompl_located_var_declarations_c, option, incompl_located_var_decl_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2158
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2159
/* helper symbol for incompl_located_var_declarations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2160
/*| incompl_located_var_decl_list incompl_located_var_decl ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2161
SYM_LIST(incompl_located_var_decl_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2162
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2163
/*  variable_name incompl_location ':' var_spec */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2164
SYM_REF4(incompl_located_var_decl_c, variable_name, incompl_location, var_spec, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2165
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2166
/*  AT incompl_location_token */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2167
SYM_TOKEN(incompl_location_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2168
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2169
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2170
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2171
void *visit(falling_edge_option_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2172
  // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2173
  s4o.print("F_EDGE");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2174
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2175
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2176
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2177
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2178
void *visit(var1_init_decl_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2179
  TRACE("var1_init_decl_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2180
  /* We have several implementation alternatives here...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2181
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2182
   * The issue is that generation of c code
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2183
   * based on the abstract syntax tree requires the reversal
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2184
   * of the symbol order compared to st. For e.g.:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2185
   * (ST) a, b, c: INT := 98;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2186
   * (C ) int a=98, b=98, c=98;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2187
   * The spec_init contains the references to 'INT' and '98'.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2188
   * The var1_list contains the references to 'a', 'b', and 'c'.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2189
   * The var1_init_decl_c contains the references to spec_init and var1_list.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2190
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2191
   * For c code generation, the var1_init_decl_c visitor
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2192
   * would need to access the internals of other classes
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2193
   * (e.g. the simple_spec_init_c).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2194
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2195
   * We can do this using one of three methods:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2196
   *   1) Create the abstract syntax tree differently;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2197
   *   2) Access other classes from within the var1_init_decl_c;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2198
   *   3) Pass info between the visitors using global variables
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2199
   *       only acessible by this class (private vars)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2200
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2201
   * In 1), the abstract syntax tree would be built so that
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2202
   * var1_init_decl_c would contain direct references to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2203
   * var1_list_c, to the var type 'INT' and to the initialiser '98'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2204
   * (as per the example above).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2205
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2206
   * 2) would have several sub-options to obtain the references
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2207
   * to 'INT' and '98' from within var1_init_decl_c.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2208
   *  In 2a), the var1_init_decl_c would use dynamic casts to determine
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2209
   * the class of spec_init (simple_spec_init_c, subrange_spec_init_c or
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2210
   * enumerated_spec_init_c), and from there obtain the 'INT' and '98'
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2211
   *  In 2b) var1_init_decl_c would have one reference for each
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2212
   * simple_spec_init_c, subrange_spec_init_c and enumerated_spec_init_c,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2213
   * the apropriate one being initialised by the var1_init_decl_c constructor.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2214
   * Note that the constructor would use dynamic casts. In essence, we
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2215
   * would merely be changing the location of the code with the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2216
   * dynamic casts.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2217
   *  In 2c) we would use three overloaded constructors for var1_init_decl_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2218
   * one each for simple_spec_init_c, etc... This implies
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2219
   * use type specific pointers to each symbol in the bison
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2220
   * parser, instead of simply using a symbol_c * for all symbols;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2221
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2222
   * In 3), we use two global but private variables with references to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2223
   * 'INT' and '98', that would be initiliased by the visitors to
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2224
   * simple_spec_init_c, subrange_spec_init_c and enumerated_spec_init_c.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2225
   * The visitor to var1_list_c would then use the references in the global
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2226
   * variables.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2227
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2228
   * I (Mario) have chosen to use 3).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2229
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2230
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2231
  /* Start off by setting the current_var_type_symbol and
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2232
   * current_var_init_symbol private variables...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2233
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2234
  update_type_init(symbol->spec_init);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2235
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2236
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2237
  symbol->var1_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2238
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2239
  /* Values no longer in scope, and therefore no longer used.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2240
   * Make an effort to keep them set to NULL when not in use
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2241
   * in order to catch bugs as soon as possible...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2242
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2243
  void_type_init();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2244
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2245
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2246
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2247
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2248
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2249
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2250
void *visit(var1_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2251
  TRACE("var1_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2252
  declare_variables(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2253
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2254
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2255
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2256
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2257
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2258
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2259
/* intermediate helper symbol for:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2260
 *  - non_retentive_var_decls
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2261
 *  - output_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2262
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2263
void *visit(var_init_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2264
  TRACE("var_init_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2265
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2266
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2267
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2268
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2269
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2270
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2271
/* B.1.5 - Program organization units */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2272
/**************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2273
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2274
/* B 1.5.1 - Functions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2275
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2276
/* The missing function_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2277
 * is handled in derived classes
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2278
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2279
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2280
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2281
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2282
/* intermediate helper symbol for function_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2283
void *visit(var_declarations_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2284
  TRACE("var_declarations_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2285
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2286
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2287
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2288
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2289
void *visit(function_var_decls_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2290
  TRACE("function_var_decls_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2291
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2292
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2293
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2294
    // TO DO ...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2295
    if (symbol->option != NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2296
      symbol->option->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2297
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2298
    current_vartype = private_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2299
    symbol->decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2300
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2301
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2302
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2303
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2304
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2305
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2306
/* intermediate helper symbol for function_var_decls */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2307
void *visit(var2_init_decl_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2308
  TRACE("var2_init_decl_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2309
  print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2310
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2311
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2312
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2313
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2314
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2315
/* B 1.5.2 - Function Blocks */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2316
/*****************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2317
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2318
/* The missing function_block_declaration_c
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2319
 * is handled in derived classes
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2320
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2321
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2322
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2323
/*  VAR_TEMP temp_var_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2324
void *visit(temp_var_decls_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2325
  TRACE("temp_var_decls_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2326
  if ((wanted_vartype & temp_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2327
    current_vartype = temp_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2328
    symbol->var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2329
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2330
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2331
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2332
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2333
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2334
/* intermediate helper symbol for temp_var_decls */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2335
void *visit(temp_var_decls_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2336
  TRACE("temp_var_decls_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2337
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2338
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2339
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2340
/*  VAR NON_RETAIN var_init_decl_list END_VAR */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2341
void *visit(non_retentive_var_decls_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2342
  TRACE("non_retentive_var_decls_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2343
  // TODO ... guarantee the non-retain semantics!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2344
  if ((wanted_vartype & private_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2345
    current_vartype = private_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2346
    symbol->var_decl_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2347
    current_vartype = none_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2348
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2349
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2350
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2351
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2352
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2353
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2354
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2355
/* B 1.5.3 - Programs */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2356
/**********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2357
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2358
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2359
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2360
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2361
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2362
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2363
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2364
/* B 1.7 Configuration elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2365
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2366
  /* Programs instantiated inside configurations are declared as variables!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2367
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2368
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2369
CONFIGURATION configuration_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2370
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2371
   (resource_declaration_list | single_resource_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2372
   optional_access_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2373
   optional_instance_specific_initializations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2374
END_CONFIGURATION
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2375
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2376
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2377
SYM_REF6(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2378
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2379
void *visit(configuration_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2380
  TRACE("configuration_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2381
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2382
  if(symbol->global_var_declarations)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2383
    symbol->global_var_declarations->accept(*this); // will contain VAR_GLOBAL declarations!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2384
  symbol->resource_declarations->accept(*this);   // will contain PROGRAM declarations!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2385
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2386
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2387
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2388
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2389
/* helper symbol for configuration_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2390
// SYM_LIST(resource_declaration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2391
void *visit(resource_declaration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2392
  TRACE("resource_declaration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2393
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2394
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2395
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2396
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2397
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2398
RESOURCE resource_name ON resource_type_name
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2399
   optional_global_var_declarations
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2400
   single_resource_declaration
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2401
END_RESOURCE
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2402
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2403
// SYM_REF4(resource_declaration_c, resource_name, resource_type_name, global_var_declarations, resource_declaration)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2404
void *visit(resource_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2405
  TRACE("resource_declaration_c");
138
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2406
//// Not used anymore. Even resource list are processed as single resource
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2407
//  if ((wanted_vartype & resource_vt) != 0) {
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2408
//    s4o.print(s4o.indent_spaces + "struct {\n");
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2409
//    s4o.indent_right();
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2410
//
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2411
//    current_vartype = resource_vt;
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2412
//    if (NULL != symbol->global_var_declarations)
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2413
//      symbol->global_var_declarations->accept(*this); // will contain VAR_GLOBAL declarations!!
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2414
//    if (NULL != symbol->resource_declaration)
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2415
//      symbol->resource_declaration->accept(*this);    // will contain PROGRAM declarations!!
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2416
//    current_vartype = none_vt;
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2417
//
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2418
//    s4o.indent_left();
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2419
//    s4o.print(s4o.indent_spaces + "} ");
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2420
//    symbol->resource_name->accept(*this);
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2421
//    s4o.print(";\n");
8b32fd4d0194 Some miscelanous static, extern and pointer status variable changes in C generated code for configuration and resources
etisserant
parents: 128
diff changeset
  2422
//  }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2423
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2424
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2425
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2426
/* task_configuration_list program_configuration_list */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2427
// SYM_REF2(single_resource_declaration_c, task_configuration_list, program_configuration_list)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2428
void *visit(single_resource_declaration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2429
  TRACE("single_resource_declaration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2430
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2431
  if ((wanted_vartype & program_vt) != 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2432
    unsigned int previous_vartype = current_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2433
      // previous_vartype will be resource_vt
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2434
    current_vartype = program_vt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2435
    symbol->program_configuration_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2436
    current_vartype = previous_vartype;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2437
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2438
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2439
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2440
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2441
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2442
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2443
// SYM_LIST(task_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2444
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2445
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2446
/* helper symbol for single_resource_declaration */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2447
/* | program_configuration_list program_configuration ';' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2448
// SYM_LIST(program_configuration_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2449
void *visit(program_configuration_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2450
  TRACE("program_configuration_list_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2451
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2452
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2453
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2454
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2455
/* helper symbol for
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2456
 *  - access_path
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2457
 *  - instance_specific_init
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2458
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2459
// SYM_LIST(any_fb_name_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2460
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2461
/*  [resource_name '.'] global_var_name ['.' structure_element_name] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2462
// SYM_REF4(global_var_reference_c, resource_name, global_var_name, structure_element_name, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2463
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2464
/*  prev_declared_program_name '.' symbolic_variable */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2465
// SYM_REF2(program_output_reference_c, program_name, symbolic_variable)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2466
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2467
/*  TASK task_name task_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2468
// SYM_REF2(task_configuration_c, task_name, task_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2469
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2470
/*  '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2471
// SYM_REF4(task_initialization_c, single_data_source, interval_data_source, priority_data_source, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2472
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2473
/*  PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2474
// SYM_REF6(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2475
private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2476
  /* a helper function to the program_configuration_c visitor... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2477
  void program_constructor_call(program_configuration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2478
  program_declaration_c *p_decl = program_type_symtable.find_value(symbol->program_type_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2479
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2480
  if (p_decl == program_type_symtable.end_value())
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2481
    /* should never occur. The program being called MUST be in the symtable... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2482
    ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2483
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2484
  symbol->program_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2485
  s4o.print("(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2486
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2487
  /* loop through each function parameter, find the value we should pass
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2488
   * to it, and then output the c equivalent...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2489
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2490
  function_param_iterator_c fp_iterator(p_decl);
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  2491
#if 0
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2492
  function_call_param_iterator_c function_call_param_iterator(symbol);
202
da1a8186f86f Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents: 195
diff changeset
  2493
#endif
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2494
  identifier_c *param_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2495
  nv->push("", ", ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2496
  for(int i = 1; (param_name = fp_iterator.next()) != NULL; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2497
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2498
    symbol_c *param_type = fp_iterator.param_type();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2499
    if (param_type == NULL) ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2500
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2501
    function_param_iterator_c::param_direction_t param_direction = fp_iterator.param_direction();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2502
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2503
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2504
    /* Get the value from a foo(<param_name> = <param_value>) style call */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2505
    symbol_c *param_value = function_call_param_iterator.search(param_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2506
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2507
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2508
    switch (param_direction) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2509
      case function_param_iterator_c::direction_in:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2510
      case function_param_iterator_c::direction_out:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2511
      case function_param_iterator_c::direction_inout:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2512
        /* ignore them all!! */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2513
        break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2514
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2515
      case function_param_iterator_c::direction_extref:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2516
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2517
        if (param_value == NULL)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2518
	  /* This is illegal in ST and IL languages.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2519
	   * All variables declared in a VAR_EXTERNAL __must__
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2520
	   * be initialised to reference a specific VAR_GLOBAL variable!!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2521
	   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2522
	   * The semantic checker should have caught this, we check again just the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2523
	   * same (especially since the semantic checker has not yet been written!).
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2524
	   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2525
	  ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2526
        s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2527
        s4o.print("&");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2528
        param_value->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2529
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2530
	break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2531
    } /* switch */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2532
  } /* for(...) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2533
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2534
  // symbol->parameter_assignment->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2535
  s4o.print(")");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2536
  nv->pop();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2537
  return;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2538
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2539
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2540
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2541
public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2542
void *visit(program_configuration_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2543
  TRACE("program_configuration_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2544
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2545
  /* now to produce the c equivalent... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2546
  switch (wanted_varformat) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2547
    case local_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2548
    case localinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2549
      s4o.print(s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2550
      symbol->program_type_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2551
      s4o.print(" ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2552
      symbol->program_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2553
      if (wanted_varformat == localinit_vf) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2554
        // TODO...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2555
        // program_call(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2556
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2557
      s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2558
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2559
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2560
    case constructorinit_vf:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2561
      s4o.print(nv->get());
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2562
      program_constructor_call(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2563
/*
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2564
      symbol->program_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2565
      s4o.print("(");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2566
      symbol->prog_conf_elements->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2567
      nv->pop();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2568
      s4o.print(")");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2569
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2570
      break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2571
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2572
    default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2573
      ERROR; /* not supported, and not needed either... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2574
  }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2575
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2576
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2577
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2578
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2579
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2580
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2581
/* prog_conf_elements ',' prog_conf_element */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2582
//SYM_LIST(prog_conf_elements_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2583
void *visit(prog_conf_elements_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2584
  TRACE("prog_conf_elements_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2585
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2586
  return print_list(symbol);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2587
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2588
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2589
/*  fb_name WITH task_name */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2590
//SYM_REF2(fb_task_c, fb_name, task_name)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2591
void *visit(fb_task_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2592
  TRACE("fb_task_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2593
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2594
  /* TODO...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2595
   *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2596
   * NOTE: Not yet supported...
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2597
   *       We do not support allocating specific function blocks declared
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2598
   *       inside a program to be executed by a different task from the one
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2599
   *       already executing the program itself.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2600
   *       This is mostly because I (Mario) simply do not understand the
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2601
   *       semantics the standard expects us to implement in this case. It is all
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2602
   *       very confusing, and very poorly defined in the standard!
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2603
   */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2604
  ERROR;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2605
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2606
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2607
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2608
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2609
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2610
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2611
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2612
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2613
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2614
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2615
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2616
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2617
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2618
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2619
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2620
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2621
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2622
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2623
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2624
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2625
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2626
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2627
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2628
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2629
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2630
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2631
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2632
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2633
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2634
/*  any_symbolic_variable ASSIGN prog_data_source */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2635
// SYM_REF2(prog_cnxn_assign_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2636
void *visit(prog_cnxn_assign_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2637
  TRACE("prog_cnxn_assign_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2638
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2639
  /* TODO... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2640
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2641
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2642
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2643
/* any_symbolic_variable SENDTO data_sink */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2644
// SYM_REF2(prog_cnxn_sendto_c, symbolic_variable, prog_data_source)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2645
void *visit(prog_cnxn_sendto_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2646
  TRACE("prog_cnxn_sendto_c");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2647
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2648
  /* TODO... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2649
  return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2650
}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2651
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2652
#if 0
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2653
/* VAR_CONFIG instance_specific_init_list END_VAR_BOGUS */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2654
SYM_REF2(instance_specific_initializations_c, instance_specific_init_list, unused)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2655
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2656
/* helper symbol for instance_specific_initializations */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2657
SYM_LIST(instance_specific_init_list_c)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2658
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2659
/* resource_name '.' program_name '.' {fb_name '.'}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2660
    ((variable_name [location] ':' located_var_spec_init) | (fb_name ':' fb_initialization))
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2661
*/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2662
SYM_REF6(instance_specific_init_c, resource_name, program_name, any_fb_name_list, variable_name, location, initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2663
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2664
/* helper symbol for instance_specific_init */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2665
/* function_block_type_name ':=' structure_initialization */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2666
SYM_REF2(fb_initialization_c, function_block_type_name, structure_initialization)
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2667
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2668
#endif
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2669
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2670
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2671
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2672
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2673
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2674
/* B.2 - Language IL (Instruction List) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2675
/****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2676
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2677
/* B 2.1 Instructions and Operands */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2678
/***********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2679
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2680
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2681
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2682
/* B 2.2 Operators */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2683
/*******************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2684
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2685
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2686
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2687
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2688
/* B.3 - Language ST (Structured Text) */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2689
/***************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2690
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2691
/* B 3.1 - Expressions */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2692
/***********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2693
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2694
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2695
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2696
/* B 3.2 Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2697
/********************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2698
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2699
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2700
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2701
/* B 3.2.1 Assignment Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2702
/*********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2703
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2704
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2705
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2706
/* B 3.2.2 Subprogram Control Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2707
/*****************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2708
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2709
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2710
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2711
/* B 3.2.3 Selection Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2712
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2713
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2714
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2715
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2716
/* B 3.2.4 Iteration Statements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2717
/********************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2718
  /* leave for derived classes... */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2719
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2720
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2721
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2722
}; /* generate_c_vardecl_c */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2723
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2724
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  2725