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 #include "include/agent_return_data.h"
00033 #include "include/agent.h"
00034
00035 agent_return_data_p
00036 agent_return_data_New(void)
00037 {
00038 agent_return_data_p agent_return_data;
00039 agent_return_data = (agent_return_data_p)malloc(sizeof(agent_return_data_t));
00040 CHECK_NULL(agent_return_data, exit(0););
00041 agent_return_data->data_type = 0;
00042 agent_return_data->array_dim = 0;
00043 agent_return_data->array_extent = NULL;
00044 agent_return_data->return_data = NULL;
00045 return agent_return_data;
00046 }
00047
00048 agent_return_data_p
00049 agent_return_data_InitializeFromAgent(agent_p agent)
00050 {
00051 int i;
00052 int size;
00053 int data_type_size;
00054 int progress;
00055 agent_return_data_t *agent_return;
00056 agent_return = (agent_return_data_t*)malloc(sizeof(agent_return_data_t));
00057
00058 agent_return->data_type = Ch_DataType(
00059 agent->agent_interp,
00060 agent->datastate->tasks[agent->datastate->task_progress]
00061 ->var_name );
00062
00063 agent_return->array_dim = Ch_ArrayDim(
00064 agent->agent_interp,
00065 agent->datastate->tasks[agent->datastate->task_progress]
00066 ->var_name );
00067
00068 agent_return->array_extent = (int*)malloc(
00069 sizeof(int) * agent_return->array_dim );
00070 for (i=0; i<agent_return->array_dim; i++) {
00071 agent_return->array_extent[i] =
00072 Ch_ArrayExtent(
00073 agent->agent_interp,
00074 agent->datastate
00075 ->tasks[agent->datastate->task_progress]
00076 ->var_name,
00077 i );
00078 }
00079
00080 size = 1;
00081 for (i=0; i < agent_return->array_dim; i++) {
00082 size *= agent_return->array_extent[i];
00083 }
00084
00085
00086 CH_DATATYPE_SIZE(agent_return->data_type, data_type_size);
00087
00088 agent_return->return_data = (void*)malloc(size * data_type_size);
00089 CHECK_NULL(agent_return->return_data, exit(0));
00090
00091
00092 progress = agent->datastate->task_progress;
00093 i = 0;
00094
00095 if (agent_return->array_dim == 0) {
00096 memcpy(
00097 agent_return->return_data,
00098 (void*)Ch_GlobalSymbolAddrByName(
00099 agent->agent_interp,
00100 agent->datastate->tasks[progress]->var_name),
00101 size*data_type_size
00102 );
00103
00104 } else {
00105 memcpy(
00106 agent_return->return_data,
00107 (void*)Ch_GlobalSymbolAddrByName(
00108 agent->agent_interp,
00109 agent->datastate->tasks[progress]->var_name),
00110 size*data_type_size
00111 );
00112 }
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 return agent_return;
00125 }
00126
00127 int
00128 agent_return_data_Destroy(agent_return_data_p agent_return_data)
00129 {
00130 if (agent_return_data == NULL) {
00131 return MC_SUCCESS;
00132 }
00133 if (agent_return_data->array_extent != NULL) {
00134 free(agent_return_data->array_extent);
00135 }
00136 if (agent_return_data->return_data != NULL) {
00137 free(agent_return_data->return_data);
00138 }
00139 free(agent_return_data);
00140 return MC_SUCCESS;
00141 }
00142