00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include "core/control/variable.h"
00025
00026
00027
00028 VARIABLE_DE_ESTADO::VARIABLE_DE_ESTADO(ENTIDAD *e, const char *nom_variable)
00029 {
00030 objeto = e;
00031 _nombre = new char[strlen(nom_variable) + 1];
00032 if ( ! _nombre ) {
00033 fprintf(stderr, "<VARIABLE_DE_ESTADO> ERROR: Intentando crear una "
00034 "pinche cadenita!\n");
00035 fflush(stderr);
00036 ref = NULL;
00037 e = NULL;
00038 return;
00039 }
00040 strcpy(_nombre, nom_variable);
00041
00042 if ( !e ) {
00043 ref = NULL;
00044 fprintf(stderr, "<VARIABLE_DE_ESTADO> ERROR: Intentando acceder una "
00045 "ENTIDAD no valida!\n");
00046 fflush(stderr);
00047 return;
00048 }
00049
00050 if ( !e->consultar_variable(nom_variable, tipo_variable, &ref) ) {
00051 ref = NULL;
00052 fprintf(stderr, "<VARIABLE_DE_ESTADO> ERROR: No se puede accesar la "
00053 "variable \"%s\" dentro del objeto \"%s\"!\n", nom_variable,
00054 e->nombre());
00055 fflush(stderr);
00056 return;
00057 }
00058 }
00059
00060 VARIABLE_DE_ESTADO::~VARIABLE_DE_ESTADO()
00061 {
00062 if ( _nombre ) {
00063 delete _nombre;
00064 }
00065 }
00066
00067 BOOLEAN
00068 VARIABLE_DE_ESTADO::soy_yo(ENTIDAD *e, char *nom_variable)
00069 {
00070 if ( e == objeto && strcmp(nom_variable, _nombre) == 0 ) {
00071 return TRUE;
00072 }
00073 return FALSE;
00074 }
00075
00076 BOOLEAN
00077 VARIABLE_DE_ESTADO::es_valida(void)
00078 {
00079 if ( !ref ) {
00080 fprintf(stderr, "<VARIABLE_DE_ESTADO> No hay referencia.\n");
00081 return FALSE;
00082 }
00083 if ( !objeto ) {
00084 fprintf(stderr, "<VARIABLE_DE_ESTADO> No hay objeto.\n");
00085 return FALSE;
00086 }
00087 return TRUE;
00088 }
00089
00090 double
00091 VARIABLE_DE_ESTADO::evaluar_float(void)
00092 {
00093 void *ref;
00094 int tipo;
00095
00096 if ( objeto->consultar_variable(_nombre, tipo, &ref) &&
00097 tipo == T_FLOAT ) {
00098 return *((double *)ref);
00099 }
00100 else {
00101 fprintf(stderr, "<VARIABLE_DE_ESTADO> - ERROR: "
00102 "No puedo evaluar el flotante \"%s\" del objeto \"%s\".\n",
00103 _nombre, objeto->nombre());
00104 return 0;
00105 }
00106 }
00107
00108 char *
00109 VARIABLE_DE_ESTADO::evaluar_cadena(void)
00110 {
00111
00112 return (char *)ref;
00113 }
00114
00115 VECTOR
00116 VARIABLE_DE_ESTADO::evaluar_vector(void)
00117 {
00118 void *ref;
00119 static VECTOR n(0, 0, 0);
00120 int tipo;
00121
00122 if ( objeto->consultar_variable(_nombre, tipo, &ref) &&
00123 tipo == T_VECTOR ) {
00124 return *((VECTOR *)ref);
00125 }
00126 else {
00127 fprintf(stderr, "<VARIABLE_DE_ESTADO> - ERROR: "
00128 "No puedo evaluar el vector \"%s\" del objeto \"%s\".\n",
00129 _nombre, objeto->nombre());
00130 fprintf(stderr,"El tipo reportado es %d.\n", tipo); fflush(stderr);
00131 return n;
00132 }
00133 }
00134
00135 void
00136 VARIABLE_DE_ESTADO::actualizar_vector(VECTOR new_val)
00137 {
00138
00139
00140
00141 objeto->actualizar_variable(_nombre, T_VECTOR, &new_val);
00142 objeto->propagar_cambios();
00143 }
00144
00145 void
00146 VARIABLE_DE_ESTADO::actualizar_float(double new_val)
00147 {
00148
00149
00150
00151 objeto->actualizar_variable(_nombre, T_FLOAT, &new_val);
00152 objeto->propagar_cambios();
00153 }
00154
00155
00156
00157
00158