00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "include/interpreter_variable_data.h"
00037 #include "include/agent.h"
00038
00039 interpreter_variable_data_p
00040 interpreter_variable_data_New(void)
00041 {
00042 interpreter_variable_data_p agent_variable_data;
00043 agent_variable_data = (interpreter_variable_data_p)malloc(sizeof(interpreter_variable_data_t));
00044 CHECK_NULL(agent_variable_data, exit(0););
00045 agent_variable_data->name = NULL;
00046 agent_variable_data->size = 0;
00047 agent_variable_data->data_type = 0;
00048 agent_variable_data->array_dim = 0;
00049 agent_variable_data->array_extent = NULL;
00050 agent_variable_data->data = NULL;
00051 return agent_variable_data;
00052 }
00053
00054 interpreter_variable_data_p
00055 interpreter_variable_data_InitializeFromAgent(agent_p agent)
00056 {
00057 int i;
00058 int size;
00059 int data_type_size;
00060 int progress;
00061 interpreter_variable_data_t *agent_return;
00062 agent_return = (interpreter_variable_data_t*)malloc(sizeof(interpreter_variable_data_t));
00063 agent_return->name = strdup(
00064 agent->datastate->tasks[agent->datastate->task_progress]
00065 ->var_name );
00066
00067
00068 agent_return->data_type = Ch_DataType(
00069 agent->agent_interp,
00070 agent->datastate->tasks[agent->datastate->task_progress]
00071 ->var_name );
00072
00073 agent_return->array_dim = Ch_ArrayDim(
00074 agent->agent_interp,
00075 agent->datastate->tasks[agent->datastate->task_progress]
00076 ->var_name );
00077
00078 agent_return->array_extent = (int*)malloc(
00079 sizeof(int) * agent_return->array_dim );
00080 for (i=0; i<agent_return->array_dim; i++) {
00081 agent_return->array_extent[i] =
00082 Ch_ArrayExtent(
00083 agent->agent_interp,
00084 agent->datastate
00085 ->tasks[agent->datastate->task_progress]
00086 ->var_name,
00087 i );
00088 }
00089
00090 size = 1;
00091 for (i=0; i < agent_return->array_dim; i++) {
00092 size *= agent_return->array_extent[i];
00093 }
00094
00095
00096 CH_DATATYPE_SIZE(agent_return->data_type, data_type_size);
00097
00098 agent_return->data = (void*)malloc(size * data_type_size);
00099 CHECK_NULL(agent_return->data, exit(0));
00100
00101
00102 progress = agent->datastate->task_progress;
00103 i = 0;
00104
00105 if (agent_return->array_dim == 0) {
00106 memcpy(
00107 agent_return->data,
00108 (void*)Ch_GlobalSymbolAddrByName(
00109 agent->agent_interp,
00110 agent->datastate->tasks[progress]->var_name),
00111 size*data_type_size
00112 );
00113
00114 } else {
00115 memcpy(
00116 agent_return->data,
00117 (void*)Ch_GlobalSymbolAddrByName(
00118 agent->agent_interp,
00119 agent->datastate->tasks[progress]->var_name),
00120 size*data_type_size
00121 );
00122 }
00123 agent_return->size = size*data_type_size;
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 return agent_return;
00136 }
00137
00138 interpreter_variable_data_p
00139 interpreter_variable_data_Initialize(agent_p agent, const char* varname)
00140 {
00141 int i;
00142 int size;
00143 int data_type_size;
00144 interpreter_variable_data_t *interp_variable;
00145
00146
00147 MUTEX_LOCK(agent->run_lock);
00148
00149 interp_variable = (interpreter_variable_data_t*)malloc(sizeof(interpreter_variable_data_t));
00150 interp_variable->name = strdup(varname);
00151
00152
00153 interp_variable->data_type = Ch_DataType(
00154 agent->agent_interp,
00155 varname );
00156
00157 interp_variable->array_dim = Ch_ArrayDim(
00158 agent->agent_interp,
00159 varname );
00160
00161 interp_variable->array_extent = (int*)malloc(
00162 sizeof(int) * interp_variable->array_dim );
00163 for (i=0; i<interp_variable->array_dim; i++) {
00164 interp_variable->array_extent[i] =
00165 Ch_ArrayExtent(
00166 agent->agent_interp,
00167 varname,
00168 i );
00169 }
00170
00171 size = 1;
00172 for (i=0; i < interp_variable->array_dim; i++) {
00173 size *= interp_variable->array_extent[i];
00174 }
00175
00176
00177 CH_DATATYPE_SIZE(interp_variable->data_type, data_type_size);
00178
00179 interp_variable->data = (void*)malloc(size * data_type_size);
00180 CHECK_NULL(interp_variable->data, exit(0));
00181
00182
00183 i = 0;
00184
00185 if (interp_variable->array_dim == 0) {
00186 memcpy(
00187 interp_variable->data,
00188 (void*)Ch_GlobalSymbolAddrByName(
00189 agent->agent_interp,
00190 varname),
00191 size*data_type_size
00192 );
00193
00194 } else {
00195 memcpy(
00196 interp_variable->data,
00197 (void*)Ch_GlobalSymbolAddrByName(
00198 agent->agent_interp,
00199 varname),
00200 size*data_type_size
00201 );
00202 }
00203 interp_variable->size = size*data_type_size;
00204
00205 MUTEX_UNLOCK(agent->run_lock);
00206 return interp_variable;
00207 }
00208
00209 int
00210 interpreter_variable_data_Destroy(interpreter_variable_data_p agent_variable_data)
00211 {
00212 if (agent_variable_data == NULL) {
00213 return MC_SUCCESS;
00214 }
00215 if (agent_variable_data->name != NULL) {
00216 free(agent_variable_data->name);
00217 }
00218 if (agent_variable_data->array_extent != NULL) {
00219 free(agent_variable_data->array_extent);
00220 }
00221 if (agent_variable_data->data != NULL) {
00222 free(agent_variable_data->data);
00223 }
00224 free(agent_variable_data);
00225 return MC_SUCCESS;
00226 }
00227
00228 interpreter_variable_data_p
00229 interpreter_variable_data_Copy(interpreter_variable_data_p src)
00230 {
00231 struct interpreter_variable_data_s* tmp;
00232 tmp = interpreter_variable_data_New();
00233 if(src->name != NULL)
00234 tmp->name = strdup(src->name);
00235 tmp->size = src->size;
00236 tmp->data_type = src->data_type;
00237 tmp->array_dim = src->array_dim;
00238 if(src->array_extent != NULL) {
00239 tmp->array_extent = (int*)malloc(sizeof(int)*src->array_dim);
00240 memcpy(tmp->array_extent, src->array_extent, sizeof(int)*src->array_dim);
00241 }
00242 if(src->data != NULL) {
00243 tmp->data = memcpy(tmp->array_extent, src->array_extent, src->size);
00244 }
00245
00246 return tmp;
00247 }