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