stage4/generate_c/generate_c_base.cc
changeset 217 f5dfadf5de54
parent 202 da1a8186f86f
child 240 f78fa87bb4cb
equal deleted inserted replaced
216:136d6ae70745 217:f5dfadf5de54
    49 
    49 
    50 
    50 
    51 
    51 
    52 typedef struct
    52 typedef struct
    53 {
    53 {
       
    54   symbol_c *param_name;
    54   symbol_c *param_value;
    55   symbol_c *param_value;
    55   symbol_c *param_type;
    56   symbol_c *param_type;
    56   function_param_iterator_c::param_direction_t param_direction;
    57   function_param_iterator_c::param_direction_t param_direction;
    57 } FUNCTION_PARAM;
    58 } FUNCTION_PARAM;
    58 
    59 
    59 #define ADD_PARAM_LIST(value, type, direction)\
    60 #define DECLARE_PARAM_LIST()\
       
    61   std::list<FUNCTION_PARAM*> param_list;\
       
    62   std::list<FUNCTION_PARAM*>::iterator pt;\
       
    63   FUNCTION_PARAM *param;
       
    64 
       
    65 #define ADD_PARAM_LIST(name, value, type, direction)\
    60   param = new FUNCTION_PARAM;\
    66   param = new FUNCTION_PARAM;\
       
    67   param->param_name = name;\
    61   param->param_value = value;\
    68   param->param_value = value;\
    62   param->param_type = type;\
    69   param->param_type = type;\
    63   param->param_direction = direction;\
    70   param->param_direction = direction;\
    64   param_list.push_back(*param);
    71   param_list.push_back(param);
    65 
    72 
       
    73 #define PARAM_LIST_ITERATOR() for(pt = param_list.begin(); pt != param_list.end(); pt++)
       
    74 
       
    75 #define PARAM_NAME (*pt)->param_name
       
    76 #define PARAM_VALUE (*pt)->param_value
       
    77 #define PARAM_TYPE (*pt)->param_type
       
    78 #define PARAM_DIRECTION (*pt)->param_direction
       
    79 
       
    80 #define CLEAR_PARAM_LIST()\
       
    81   PARAM_LIST_ITERATOR()\
       
    82     delete *pt;\
       
    83   param_list.clear();
    66 
    84 
    67 
    85 
    68 class generate_c_base_c: public iterator_visitor_c {
    86 class generate_c_base_c: public iterator_visitor_c {
    69 
    87 
    70   protected:
    88   protected:
    71     stage4out_c &s4o;
    89     stage4out_c &s4o;
    72 
    90 
    73   private:
    91   private:
    74     /* Unlike programs that are mapped onto C++ classes, Function Blocks are mapped onto a data structure type
    92     /* Unlike programs that are mapped onto C++ classes, Function Blocks are mapped onto a data structure type
    75      * and a separate function conatining the code. This function is passed a pointer to an instance of the data
    93      * and a separate function containing the code. This function is passed a pointer to an instance of the data
    76      * structure. This means that the code inside the functions must insert a pointer to the data structure whenever
    94      * structure. This means that the code inside the functions must insert a pointer to the data structure whenever
    77      * it wishes to access a Function Block variable.
    95      * it wishes to access a Function Block variable.
    78      * The variable_prefix_ variable will contain the correct string which needs to be prefixed to all variable accesses.
    96      * The variable_prefix_ variable will contain the correct string which needs to be prefixed to all variable accesses.
    79      * This string is set with the set_variable_prefix() member function.
    97      * This string is set with the set_variable_prefix() member function.
    80      */
    98      */
    81     const char *variable_prefix_;
    99     const char *variable_prefix_;
    82 
   100 
    83 
       
    84 
       
    85   public:
   101   public:
    86     generate_c_base_c(stage4out_c *s4o_ptr): s4o(*s4o_ptr) {variable_prefix_ = NULL;}
   102     generate_c_base_c(stage4out_c *s4o_ptr): s4o(*s4o_ptr) {
       
   103       variable_prefix_ = NULL;
       
   104     }
    87     ~generate_c_base_c(void) {}
   105     ~generate_c_base_c(void) {}
    88 
   106 
    89     void set_variable_prefix(const char *variable_prefix) {variable_prefix_ = variable_prefix;}
   107     void set_variable_prefix(const char *variable_prefix) {variable_prefix_ = variable_prefix;}
    90     const char *get_variable_prefix(void) {return variable_prefix_;}
   108     const char *get_variable_prefix(void) {return variable_prefix_;}
    91     bool is_variable_prefix_null(void) {return variable_prefix_ == NULL;}
   109     bool is_variable_prefix_null(void) {return variable_prefix_ == NULL;}
   214       s4o.print("(__BOOL_LITERAL(TRUE), NULL, 2, ");
   232       s4o.print("(__BOOL_LITERAL(TRUE), NULL, 2, ");
   215       l_exp->accept(*this);
   233       l_exp->accept(*this);
   216       s4o.print(", ");
   234       s4o.print(", ");
   217       r_exp->accept(*this);
   235       r_exp->accept(*this);
   218       s4o.print(")");
   236       s4o.print(")");
       
   237       return NULL;
       
   238     }
       
   239 
       
   240     void *print_check_function(symbol_c *type,
       
   241           symbol_c *value,
       
   242           symbol_c *fb_name = NULL,
       
   243           bool temp = false) {
       
   244       search_base_type_c search_base_type;
       
   245       bool is_subrange = search_base_type.type_is_subrange(type);
       
   246       if (is_subrange) {
       
   247 		s4o.print("__CHECK_");
       
   248 		type->accept(*this);
       
   249 		s4o.print("(");
       
   250       }
       
   251       if (fb_name != NULL) {
       
   252         print_variable_prefix();
       
   253         fb_name->accept(*this);
       
   254         s4o.print(".");
       
   255       }
       
   256       if (temp)
       
   257     	s4o.print(TEMP_VAR);
       
   258       value->accept(*this);
       
   259       if (is_subrange)
       
   260     	  s4o.print(")");
   219       return NULL;
   261       return NULL;
   220     }
   262     }
   221 
   263 
   222 /***************************/
   264 /***************************/
   223 /* 2.1.6 - Pragmas */
   265 /* 2.1.6 - Pragmas */
   332           ERROR;
   374           ERROR;
   333         } /* switch() */
   375         } /* switch() */
   334       } /* for() */
   376       } /* for() */
   335 
   377 
   336       str += '"';
   378       str += '"';
   337       s4o.print("(STRING){");
   379       s4o.print("__STRING_LITERAL(");
   338       s4o.print_integer(count); 
   380       s4o.print_integer(count); 
   339       s4o.print(",");
   381       s4o.print(",");
   340       s4o.print(str);
   382       s4o.print(str);
   341       s4o.print("}");
   383       s4o.print(")");
   342       return NULL;
   384       return NULL;
   343     }
   385     }
   344 
   386 
   345 
   387 
   346 /***************************/
   388 /***************************/