source: tol/TolJava/TOLJavaJNI/toljavajni.cpp @ 1b5b24e

devel
Last change on this file since 1b5b24e was e946b884, checked in by Humberto Carralero <hacarralero@…>, 15 years ago

Importing TOLJavaJNI

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@3901 be4846ae-f051-483a-831f-b64e7d08527f

  • Property mode set to 100644
File size: 149.8 KB
Line 
1/*
2 * File:   TOLMachine.h
3 * Author: hcarralero
4 *
5 * Created on November 14, 2010, 7:13 PM
6 */
7
8#include <string.h>
9#include <stdlib.h>
10
11#include "toljavajni.h"
12
13/*
14 * Definiciones requeridas para TOL
15 */
16
17#if defined(linux)
18#define UNIX 1
19#endif
20
21#if defined(_MSC_VER)
22#include <win_tolinc.h>
23#endif
24
25#include <vector>
26
27#include <tol/tol_init.h>
28#include <tol/tol_version_def.h>
29
30#include <tol/tol_bout.h>
31#include <tol/tol_bset.h>
32
33#include <tol/tol_bgrammar.h>
34#include <tol/tol_blanguag.h>
35
36#include <tol/tol_btext.h>
37#include <tol/tol_btxtgra.h>
38
39#include <tol/tol_bdat.h>
40#include <tol/tol_bdatgra.h>
41
42#include <tol/tol_bdate.h>
43#include <tol/tol_bdtegra.h>
44
45#include <tol/tol_bcomplex.h>
46#include <tol/tol_bcmpgra.h>
47
48#include <tol/tol_bmatrix.h>
49#include <tol/tol_bmatgra.h>
50
51#include <tol/tol_bvmat.h>
52#include <tol/tol_bvmatgra.h>
53
54#include <tol/tol_bpolyn.h>
55#include <tol/tol_bpolgra.h>
56
57#include <tol/tol_bratio.h>
58#include <tol/tol_bratgra.h>
59
60#include <tol/tol_bcode.h>
61#include <tol/tol_bcodgra.h>
62
63#include <tol/tol_btmset.h>
64#include <tol/tol_bsetgra.h>
65
66#include <tol/tol_btmser.h>
67#include <tol/tol_btsrgra.h>
68
69#include <tol/tol_bset.h>
70#include <tol/tol_bsetgra.h>
71
72#include <tol/tol_bnameblock.h>
73
74//Arreglo de mensajes generados por TOL
75vector<char *> mensajes;
76
77//Función utilitaria para borrar todos los mensajes almacenados
78void borrarMensajes(void) {
79    int t = mensajes.size();
80    for (int i = 0; i < t; ++i) {
81        char *mensaje = mensajes[i];
82        free(mensaje);
83    }
84    mensajes.clear();
85}
86
87//Función utilitaria para obtener mensajes del intérprete de TOL
88void guardarMensaje(const BText &mensaje) {
89    int l = mensaje.Length();
90    char *cmsg = (char *) malloc(l * (sizeof (char) + 1));
91    strcpy(cmsg, mensaje.String());
92    mensajes.push_back(cmsg);
93}
94
95/*
96 * Class:     com_hcarralero_toljava_TOLMachine
97 * Method:    nativeInitTOL
98 * Signature: ()Ljava/lang/String;
99 */
100JNIEXPORT jstring JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeInitTOL(JNIEnv *env, jobject) {
101    //Inicialización del Kernel de TOL
102    int lang = 1;
103    char *vmode = NULL;
104    InitTolKernel(lang, vmode);
105    LoadInitLibrary(0);
106    jstring res = env->NewStringUTF("Ok");
107    return res;
108}
109
110/*
111 * Class:     com_hcarralero_toljava_TOLMachine
112 * Method:    nativeExecute
113 * Signature: (Ljava/lang/String;)Ljava/lang/Object;
114 */
115JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeExecute(JNIEnv *env, jobject, jstring code) {
116    const jchar *jcode = env->GetStringChars(code, NULL);
117    jsize lcode = env->GetStringLength(code);
118    char *ccode = (char *) malloc(sizeof (char) *(lcode + 1));
119    for (int i = 0; i < lcode; ++i) {
120        ccode[i] = jcode[i];
121    }
122    ccode[lcode] = '\0';
123    borrarMensajes();
124    BOut::PutHciWriter(guardarMensaje);
125    BOut::PutLogHciWriter(guardarMensaje);
126    TOLErrorNumber().GetValue() = 0;
127    MultyEvaluate(ccode);
128    int ne = TOLErrorNumber().GetValue();
129    char cres[100] = "0";
130    sprintf(cres, "%d", ne);
131    int nm = mensajes.size();
132    jobjectArray res = env->NewObjectArray(nm + 1, env->FindClass("Ljava/lang/String;"), NULL);
133    jstring msj1 = env->NewStringUTF(cres);
134    env->SetObjectArrayElement(res, 0, msj1);
135    for (int i = 1; i <= nm; ++i) {
136        jstring msj = env->NewStringUTF(mensajes[i - 1]);
137        env->SetObjectArrayElement(res, i, msj);
138    }
139    borrarMensajes();
140    return res;
141}
142
143/*
144 * Class:     com_hcarralero_toljava_TOLMachine
145 * Method:    nativeCallCode
146 * Signature: (Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;
147 */
148JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeCallCode(JNIEnv *env, jobject, jstring codeName, jobjectArray parameters) {
149    const char *ccname = env->GetStringUTFChars(codeName, NULL);
150    BSyntaxObject *bsoc = GraCode()->EvaluateExpr(ccname);
151    if (bsoc == NULL) {
152        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
153        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
154        jstring msg = env->NewStringUTF("Nombre de variable Code NO ENCONTRADA");
155        jobject e = env->NewObject(eclass, einit, 2, msg);
156        return e;
157    } else {
158        BUserCode *bc = UCode(bsoc);
159        if (bc == NULL) {
160            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
161            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
162            jstring msg = env->NewStringUTF("Error Interno de TOL");
163            jobject e = env->NewObject(eclass, einit, 4, msg);
164            return e;
165        } else {
166            BText expr = BText(bc->Name().String());
167            expr += BText("(");
168            int npar = env->GetArrayLength(parameters);
169            char coma = 'N';
170            for (int i = 0; i < npar; ++i) {
171                jobject jopar = env->GetObjectArrayElement(parameters, i);
172                if (jopar == NULL) {
173                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
174                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
175                    jstring msg = env->NewStringUTF("Parámetro NO VÁLIDO (null)");
176                    jobject e = env->NewObject(eclass, einit, 5, msg);
177                    return e;
178                } else {
179                    jclass parclass = env->GetObjectClass(jopar);
180                    jmethodID mtoString = env->GetMethodID(parclass, "toString", "()Ljava/lang/String;");
181                    jstring jspar = (jstring) env->CallObjectMethod(jopar, mtoString);
182                    const char *cpar = env->GetStringUTFChars(jspar, NULL);
183                    if (coma == 'N') {
184                        coma = 'S';
185                    } else {
186                        expr += BText(",");
187                    }
188                    expr += BText(cpar);
189                }
190            }
191            expr += BText(");");
192            BSyntaxObject * bsores = bc->Contens().Grammar()->EvaluateExpr(expr);
193            if (bsores == NULL) {
194                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
195                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
196                jstring msg = env->NewStringUTF("Error Interno de TOL (eval=NULL)");
197                jobject e = env->NewObject(eclass, einit, 4, msg);
198                return e;
199            }
200            BUserText *btxt = UText(bsores);
201            if (btxt != NULL) {
202                jclass ttclass = env->FindClass("Lcom/hcarralero/toljava/TOLText;");
203                jmethodID ttinit = env->GetMethodID(ttclass, "<init>", "(Ljava/lang/String;)V");
204                jstring tttext = env->NewStringUTF(btxt->Contens().String());
205                jobject res = env->NewObject(ttclass, ttinit, tttext);
206                return res;
207            } else {
208                BUserDat *br = UDat(bsores);
209                if (br != NULL) {
210                    jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLReal;");
211                    jmethodID trinit = env->GetMethodID(trclass, "<init>", "(D)V");
212                    double trvalue = br->Contens().GetValue();
213                    jobject res = env->NewObject(trclass, trinit, trvalue);
214                    return res;
215                } else {
216                    BUserDate *bd = UDate(bsores);
217                    if (bd != NULL) {
218                        jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
219                        jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
220                        BDate date = bd->Contens();
221                        int year = date.Year();
222                        int month = date.Month();
223                        int day = date.Day();
224                        int hour = date.Hour();
225                        int minute = date.Minute();
226                        double second = date.Second();
227                        jobject res = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
228                        return res;
229                    } else {
230                        BUserCmp *bc = UCmp(bsores);
231                        if (bc != NULL) {
232                            jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLComplex;");
233                            jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(DD)V");
234                            double x = bc->Contens().X().GetValue();
235                            double y = bc->Contens().Y().GetValue();
236                            jobject res = env->NewObject(tcclass, tcinit, x, y);
237                            return res;
238                        } else {
239                            BUserMat *bmat = UMat(bsores);
240                            if (bmat != NULL) {
241                                jclass tmclass = env->FindClass("Lcom/hcarralero/toljava/TOLMatrix;");
242                                jmethodID tminit = NULL;
243                                BMatrix<BDat> mat = bmat->Contens();
244                                int rows = mat.Rows();
245                                int columns = mat.Columns();
246                                if (rows <= 0 || columns <= 0) {
247                                    tminit = env->GetMethodID(tmclass, "<init>", "()V");
248                                    jobject res = env->NewObject(tmclass, tminit);
249                                    return res;
250                                } else {
251                                    tminit = env->GetMethodID(tmclass, "<init>", "([[D)V");
252                                    BArray<BDat> vals = mat.Data();
253                                    jclass adclass = env->FindClass("[D");
254                                    jobjectArray tmvalues = env->NewObjectArray(rows, adclass, NULL);
255                                    for (int r = 0; r < rows; ++r) {
256                                        jdoubleArray arrayRow = env->NewDoubleArray(columns);
257                                        jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
258                                        for (int c = 0; c < columns; ++c) {
259                                            valuesRow[c] = vals[r * columns + c].Value();
260                                        }
261                                        env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
262                                        env->SetObjectArrayElement(tmvalues, r, arrayRow);
263                                    }
264                                    jobject res = env->NewObject(tmclass, tminit, tmvalues);
265                                    return res;
266                                }
267                            } else {
268                                BUserVMat *bvmat = UVMat(bsores);
269                                if (bvmat != NULL) {
270                                    jclass tvmclass = env->FindClass("Lcom/hcarralero/toljava/TOLVMatrix;");
271                                    jmethodID tvminit = NULL;
272                                    BVMat vmat = bvmat->Contens();
273                                    int rows = vmat.Rows();
274                                    int columns = vmat.Columns();
275                                    if (rows <= 0 || columns <= 0) {
276                                        tvminit = env->GetMethodID(tvmclass, "<init>", "()V");
277                                        jobject res = env->NewObject(tvmclass, tvminit);
278                                        return res;
279                                    } else {
280                                        tvminit = env->GetMethodID(tvmclass, "<init>", "([[D)V");
281                                        BMatrix<double> mat = vmat.GetDMat();
282                                        BArray<double> vals = mat.Data();
283                                        jclass adclass = env->FindClass("[D");
284                                        jobjectArray tvmvalues = env->NewObjectArray(rows, adclass, NULL);
285                                        for (int r = 0; r < rows; ++r) {
286                                            jdoubleArray arrayRow = env->NewDoubleArray(columns);
287                                            jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
288                                            for (int c = 0; c < columns; ++c) {
289                                                valuesRow[c] = vals[r * columns + c];
290                                            }
291                                            env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
292                                            env->SetObjectArrayElement(tvmvalues, r, arrayRow);
293                                        }
294                                        jobject res = env->NewObject(tvmclass, tvminit, tvmvalues);
295                                        return res;
296                                    }
297                                } else {
298                                    BUserPol *bp = UPol(bsores);
299                                    if (bp != NULL) {
300                                        jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
301                                        jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
302                                        BPolyn<BDat> pol = bp->Contens();
303                                        int nt = pol.Size();
304                                        jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
305                                        jobject res = env->NewObject(tpclass, tpinit);
306                                        for (int i = 0; i < nt; ++i) {
307                                            BMonome<BDat> bm = pol[i];
308                                            int var = 0;
309                                            int grade = bm.Degree();
310                                            if (grade < 0) {
311                                                grade = -grade;
312                                                var = 1;
313                                            }
314                                            double coef = bm.Coef().GetValue();
315                                            env->CallVoidMethod(res, maddTerm, var, coef, grade);
316                                        }
317                                        return res;
318                                    } else {
319                                        BUserRat *br = URat(bsores);
320                                        if (br != NULL) {
321                                            BRational<BDat> rat = br->Contens();
322                                            jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLRatio;");
323                                            jmethodID trinit = env->GetMethodID(trclass, "<init>", "(Lcom/hcarralero/toljava/TOLPolyn;Lcom/hcarralero/toljava/TOLPolyn;)V");
324                                            jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
325                                            jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
326                                            BPolyn<BDat> pnum = rat.Numerator();
327                                            int nt = pnum.Size();
328                                            jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
329                                            jobject valueNum = env->NewObject(tpclass, tpinit);
330                                            for (int i = 0; i < nt; ++i) {
331                                                BMonome<BDat> bmnum = pnum[i];
332                                                int var = 0;
333                                                int grade = bmnum.Degree();
334                                                if (grade < 0) {
335                                                    grade = -grade;
336                                                    var = 1;
337                                                }
338                                                double coef = bmnum.Coef().GetValue();
339                                                env->CallVoidMethod(valueNum, maddTerm, var, coef, grade);
340                                            }
341                                            BPolyn<BDat> pden = rat.Denominator();
342                                            nt = pden.Size();
343                                            jobject valueDen = env->NewObject(tpclass, tpinit);
344                                            for (int i = 0; i < nt; ++i) {
345                                                BMonome<BDat> bmden = pden[i];
346                                                int var = 0;
347                                                int grade = bmden.Degree();
348                                                if (grade < 0) {
349                                                    grade = -grade;
350                                                    var = 1;
351                                                }
352                                                double coef = bmden.Coef().GetValue();
353                                                env->CallVoidMethod(valueDen, maddTerm, var, coef, grade);
354                                            }
355                                            jobject res = env->NewObject(trclass, trinit, valueNum, valueDen);
356                                            return res;
357                                        } else {
358                                            BUserCode *bc = UCode(bsores);
359                                            if (bc != NULL) {
360                                                jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLCode;");
361                                                jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
362                                                BCode cod = bc->Contens();
363                                                jstring name = env->NewStringUTF(cod.Name().String());
364                                                jstring info = env->NewStringUTF(cod.Info().String());
365                                                jobject res = env->NewObject(tcclass, tcinit, name, info);
366                                                return res;
367                                            } else {
368                                                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
369                                                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
370                                                jstring msg = env->NewStringUTF("Error Interno de TOL (res=NULL)");
371                                                jobject e = env->NewObject(eclass, einit, 4, msg);
372                                                return e;
373                                            }
374                                        }
375                                    }
376                                }
377                            }
378                        }
379                    }
380                }
381            }
382        }
383    }
384}
385
386/*
387 * Class:     com_hcarralero_toljava_TOLMachine
388 * Method:    nativeGetVariableValue
389 * Signature: (Ljava/lang/String;)Ljava/lang/Object;
390 */
391JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetVariable(JNIEnv *env, jobject tm, jstring varName) {
392    borrarMensajes();
393    const char *cvname = env->GetStringUTFChars(varName, NULL);
394    BSyntaxObject *bso = NULL;
395    jobject varValue = NULL;
396    jstring varDesc = NULL;
397    bso = GraText()->EvaluateExpr(cvname);
398    if (bso != NULL) {
399        BUserText *btxt = UText(bso);
400        if (btxt != NULL) {
401            jclass ttclass = env->FindClass("Lcom/hcarralero/toljava/TOLText;");
402            jmethodID ttinit = env->GetMethodID(ttclass, "<init>", "(Ljava/lang/String;)V");
403            jstring ttvalue = env->NewStringUTF(btxt->Contens().String());
404            varValue = env->NewObject(ttclass, ttinit, ttvalue);
405        }
406    } else {
407        bso = GraReal()->EvaluateExpr(cvname);
408        if (bso != NULL) {
409            BUserDat *br = UDat(bso);
410            if (br != NULL) {
411                jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLReal;");
412                jmethodID trinit = env->GetMethodID(trclass, "<init>", "(D)V");
413                double trvalue = br->Contens().GetValue();
414                varValue = env->NewObject(trclass, trinit, trvalue);
415            }
416        } else {
417            bso = GraDate()->EvaluateExpr(cvname);
418            if (bso != NULL) {
419                BUserDate *bd = UDate(bso);
420                if (bd != NULL) {
421                    jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
422                    jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
423                    BDate date = bd->Contens();
424                    int year = date.Year();
425                    int month = date.Month();
426                    int day = date.Day();
427                    int hour = date.Hour();
428                    int minute = date.Minute();
429                    double second = date.Second();
430                    varValue = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
431                }
432            } else {
433                bso = GraComplex()->EvaluateExpr(cvname);
434                if (bso != NULL) {
435                    BUserCmp *bc = UCmp(bso);
436                    if (bc != NULL) {
437                        jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLComplex;");
438                        jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(DD)V");
439                        double x = bc->Contens().X().GetValue();
440                        double y = bc->Contens().Y().GetValue();
441                        varValue = env->NewObject(tcclass, tcinit, x, y);
442                    }
443                } else {
444                    bso = GraMatrix()->EvaluateExpr(cvname);
445                    if (bso != NULL) {
446                        BUserMat *bmat = UMat(bso);
447                        if (bmat != NULL) {
448                            jclass tmclass = env->FindClass("Lcom/hcarralero/toljava/TOLMatrix;");
449                            jmethodID tminit = NULL;
450                            BMatrix<BDat> mat = bmat->Contens();
451                            int rows = mat.Rows();
452                            int columns = mat.Columns();
453                            if (rows <= 0 || columns <= 0) {
454                                tminit = env->GetMethodID(tmclass, "<init>", "()V");
455                                varValue = env->NewObject(tmclass, tminit);
456                            } else {
457                                tminit = env->GetMethodID(tmclass, "<init>", "([[D)V");
458                                BArray<BDat> vals = mat.Data();
459                                jclass adclass = env->FindClass("[D");
460                                jobjectArray tmvalues = env->NewObjectArray(rows, adclass, NULL);
461                                for (int r = 0; r < rows; ++r) {
462                                    jdoubleArray arrayRow = env->NewDoubleArray(columns);
463                                    jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
464                                    for (int c = 0; c < columns; ++c) {
465                                        valuesRow[c] = vals[r * columns + c].Value();
466                                    }
467                                    env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
468                                    env->SetObjectArrayElement(tmvalues, r, arrayRow);
469                                }
470                                varValue = env->NewObject(tmclass, tminit, tmvalues);
471                            }
472                        }
473                    } else {
474                        bso = GraVMatrix()->EvaluateExpr(cvname);
475                        if (bso != NULL) {
476                            BUserVMat *bvmat = UVMat(bso);
477                            if (bvmat != NULL) {
478                                jclass tvmclass = env->FindClass("Lcom/hcarralero/toljava/TOLVMatrix;");
479                                jmethodID tvminit = NULL;
480                                BVMat vmat = bvmat->Contens();
481                                int rows = vmat.Rows();
482                                int columns = vmat.Columns();
483                                if (rows <= 0 || columns <= 0) {
484                                    tvminit = env->GetMethodID(tvmclass, "<init>", "()V");
485                                    varValue = env->NewObject(tvmclass, tvminit);
486                                } else {
487                                    tvminit = env->GetMethodID(tvmclass, "<init>", "([[D)V");
488                                    BMatrix<double> mat = vmat.GetDMat();
489                                    BArray<double> vals = mat.Data();
490                                    jclass adclass = env->FindClass("[D");
491                                    jobjectArray tvmvalues = env->NewObjectArray(rows, adclass, NULL);
492                                    for (int r = 0; r < rows; ++r) {
493                                        jdoubleArray arrayRow = env->NewDoubleArray(columns);
494                                        jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
495                                        for (int c = 0; c < columns; ++c) {
496                                            valuesRow[c] = vals[r * columns + c];
497                                        }
498                                        env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
499                                        env->SetObjectArrayElement(tvmvalues, r, arrayRow);
500                                    }
501                                    varValue = env->NewObject(tvmclass, tvminit, tvmvalues);
502                                }
503                            }
504                        } else {
505                            bso = GraPolyn()->EvaluateExpr(cvname);
506                            if (bso != NULL) {
507                                BUserPol *bp = UPol(bso);
508                                if (bp != NULL) {
509                                    jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
510                                    jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
511                                    BPolyn<BDat> pol = bp->Contens();
512                                    int nt = pol.Size();
513                                    jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
514                                    varValue = env->NewObject(tpclass, tpinit);
515                                    for (int i = 0; i < nt; ++i) {
516                                        BMonome<BDat> bm = pol[i];
517                                        int var = 0;
518                                        int grade = bm.Degree();
519                                        if (grade < 0) {
520                                            grade = -grade;
521                                            var = 1;
522                                        }
523                                        double coef = bm.Coef().GetValue();
524                                        env->CallVoidMethod(varValue, maddTerm, var, coef, grade);
525                                    }
526                                }
527                            } else {
528                                bso = GraRatio()->EvaluateExpr(cvname);
529                                if (bso != NULL) {
530                                    BUserRat *br = URat(bso);
531                                    if (br != NULL) {
532                                        BRational<BDat> rat = br->Contens();
533                                        jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLRatio;");
534                                        jmethodID trinit = env->GetMethodID(trclass, "<init>", "(Lcom/hcarralero/toljava/TOLPolyn;Lcom/hcarralero/toljava/TOLPolyn;)V");
535                                        jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
536                                        jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
537                                        BPolyn<BDat> pnum = rat.Numerator();
538                                        int nt = pnum.Size();
539                                        jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
540                                        jobject valueNum = env->NewObject(tpclass, tpinit);
541                                        for (int i = 0; i < nt; ++i) {
542                                            BMonome<BDat> bmnum = pnum[i];
543                                            int var = 0;
544                                            int grade = bmnum.Degree();
545                                            if (grade < 0) {
546                                                grade = -grade;
547                                                var = 1;
548                                            }
549                                            double coef = bmnum.Coef().GetValue();
550                                            env->CallVoidMethod(valueNum, maddTerm, var, coef, grade);
551                                        }
552                                        BPolyn<BDat> pden = rat.Denominator();
553                                        nt = pden.Size();
554                                        jobject valueDen = env->NewObject(tpclass, tpinit);
555                                        for (int i = 0; i < nt; ++i) {
556                                            BMonome<BDat> bmden = pden[i];
557                                            int var = 0;
558                                            int grade = bmden.Degree();
559                                            if (grade < 0) {
560                                                grade = -grade;
561                                                var = 1;
562                                            }
563                                            double coef = bmden.Coef().GetValue();
564                                            env->CallVoidMethod(valueDen, maddTerm, var, coef, grade);
565                                        }
566                                        varValue = env->NewObject(trclass, trinit, valueNum, valueDen);
567                                    }
568                                } else {
569                                    bso = GraCode()->EvaluateExpr(cvname);
570                                    if (bso != NULL) {
571                                        BUserCode *bc = UCode(bso);
572                                        if (bc != NULL) {
573                                            jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLCode;");
574                                            jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
575                                            BCode cod = bc->Contens();
576                                            jstring name = env->NewStringUTF(cod.Name().String());
577                                            jstring info = env->NewStringUTF(cod.Info().String());
578                                            varValue = env->NewObject(tcclass, tcinit, name, info);
579                                        }
580                                    } else {
581                                        bso = GraSerie()->EvaluateExpr(cvname);
582                                        if (bso != NULL) {
583                                            BUserTimeSerie *bs = Tsr(bso);
584                                            if (bs != NULL) {
585                                                jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSerie;");
586                                                jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
587                                                jstring vn = env->NewStringUTF(cvname);
588                                                varValue = env->NewObject(tsclass, tsinit, tm, vn);
589                                            }
590                                        } else {
591                                            bso = GraTimeSet()->EvaluateExpr(cvname);
592                                            if (bso != NULL) {
593                                                BUserTimeSet *bt = Tms(bso);
594                                                if (bt != NULL) {
595                                                    jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRTimeSet;");
596                                                    jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
597                                                    jstring vn = env->NewStringUTF(cvname);
598                                                    varValue = env->NewObject(tsclass, tsinit, tm, vn);
599                                                }
600                                            } else {
601                                                bso = GraSet()->EvaluateExpr(cvname);
602                                                if (bso != NULL) {
603                                                    BUserSet *bs = USet(bso);
604                                                    if (bs != NULL) {
605                                                        jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSet;");
606                                                        jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
607                                                        jstring vn = env->NewStringUTF(cvname);
608                                                        varValue = env->NewObject(tsclass, tsinit, tm, vn);
609                                                    }
610                                                }
611                                            }
612                                        }
613                                    }
614                                }
615                            }
616                        }
617                    }
618                }
619            }
620        }
621    }
622    if (varValue == NULL) {
623        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
624        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
625        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
626        jobject e = env->NewObject(eclass, einit, 2, msg);
627        return e;
628    }
629    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
630    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
631    varDesc = env->NewStringUTF(bso->Description().String());
632    jobject var = env->NewObject(varclass, varinit, varName, varValue, varDesc);
633    return var;
634}
635
636/*
637 * Class:     com_hcarralero_toljava_TOLMachine
638 * Method:    nativeSetVariableValue
639 * Signature: (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;
640 */
641JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSetVariableValue(JNIEnv *env, jobject, jstring varName, jobject varValue) {
642    const char *cvname = env->GetStringUTFChars(varName, NULL);
643    jclass valueclass = env->GetObjectClass(varValue);
644    BSyntaxObject *bso = NULL;
645    bso = GraText()->EvaluateExpr(cvname);
646    if (bso != NULL) {
647        BUserText *btxt = UText(bso);
648        if (btxt != NULL) {
649            jmethodID valuem = env->GetMethodID(valueclass, "isText", "()Z");
650            jboolean bs = env->CallBooleanMethod(varValue, valuem);
651            if (!bs) {
652                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
653                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
654                jstring msg = env->NewStringUTF("Se intenta asignar un valor NO TEXTO a una VARIABLE TIPO Text");
655                jobject e = env->NewObject(eclass, einit, 3, msg);
656                return e;
657            } else {
658                jmethodID mgetText = env->GetMethodID(valueclass, "getText", "()Ljava/lang/String;");
659                jstring strvalue = (jstring) env->CallObjectMethod(varValue, mgetText);
660                const jchar *jvalue = env->GetStringChars(strvalue, NULL);
661                jsize lvalue = env->GetStringLength(strvalue);
662                char *cvalue = (char *) malloc(sizeof (char) *(lvalue + 1));
663                for (int i = 0; i < lvalue; ++i) {
664                    cvalue[i] = jvalue[i];
665                }
666                cvalue[lvalue] = '\0';
667                btxt->Contens() = cvalue;
668            }
669        }
670    } else {
671        bso = GraReal()->EvaluateExpr(cvname);
672        if (bso != NULL) {
673            BUserDat *br = UDat(bso);
674            if (br != NULL) {
675                jmethodID valuem = env->GetMethodID(valueclass, "isReal", "()Z");
676                jboolean bs = env->CallBooleanMethod(varValue, valuem);
677                if (!bs) {
678                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
679                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
680                    jstring msg = env->NewStringUTF("Se intenta asignar un valor NO REAL a una VARIABLE TIPO Real");
681                    jobject e = env->NewObject(eclass, einit, 3, msg);
682                    return e;
683                } else {
684                    jmethodID mgetValue = env->GetMethodID(valueclass, "getValue", "()D");
685                    jdouble value = env->CallDoubleMethod(varValue, mgetValue);
686                    br->Contens() = value;
687                }
688            }
689        } else {
690            bso = GraDate()->EvaluateExpr(cvname);
691            if (bso != NULL) {
692                BUserDate *bd = UDate(bso);
693                if (bd != NULL) {
694                    jmethodID valuem = env->GetMethodID(valueclass, "isDate", "()Z");
695                    jboolean bs = env->CallBooleanMethod(varValue, valuem);
696                    if (!bs) {
697                        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
698                        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
699                        jstring msg = env->NewStringUTF("Se intenta asignar un valor NO DATE a una VARIABLE TIPO Date");
700                        jobject e = env->NewObject(eclass, einit, 3, msg);
701                        return e;
702                    } else {
703                        jmethodID mgetYear = env->GetMethodID(valueclass, "getYear", "()I");
704                        int year = env->CallIntMethod(varValue, mgetYear);
705                        bd->Contens().PutYear(year);
706                        jmethodID mgetMonth = env->GetMethodID(valueclass, "getMonth", "()I");
707                        int month = env->CallIntMethod(varValue, mgetMonth);
708                        bd->Contens().PutMonth(month);
709                        jmethodID mgetDay = env->GetMethodID(valueclass, "getDay", "()I");
710                        int day = env->CallIntMethod(varValue, mgetDay);
711                        bd->Contens().PutDay(day);
712                        jmethodID mgetHour = env->GetMethodID(valueclass, "getHour", "()I");
713                        int hour = env->CallIntMethod(varValue, mgetHour);
714                        bd->Contens().PutHour(hour);
715                        jmethodID mgetMinute = env->GetMethodID(valueclass, "getMinute", "()I");
716                        int minute = env->CallIntMethod(varValue, mgetMinute);
717                        bd->Contens().PutMinute(minute);
718                        jmethodID mgetSecond = env->GetMethodID(valueclass, "getSecond", "()D");
719                        double second = env->CallDoubleMethod(varValue, mgetSecond);
720                        bd->Contens().PutSecond(second);
721                    }
722                }
723            } else {
724                bso = GraComplex()->EvaluateExpr(cvname);
725                if (bso != NULL) {
726                    BUserCmp *bc = UCmp(bso);
727                    if (bc != NULL) {
728                        jmethodID valuem = env->GetMethodID(valueclass, "isComplex", "()Z");
729                        jboolean bs = env->CallBooleanMethod(varValue, valuem);
730                        if (!bs) {
731                            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
732                            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
733                            jstring msg = env->NewStringUTF("Se intenta asignar un valor NO COMPLEX a una VARIABLE TIPO Complex");
734                            jobject e = env->NewObject(eclass, einit, 3, msg);
735                            return e;
736                        } else {
737                            jmethodID mgetX = env->GetMethodID(valueclass, "getX", "()D");
738                            double x = env->CallDoubleMethod(varValue, mgetX);
739                            jmethodID mgetY = env->GetMethodID(valueclass, "getY", "()D");
740                            double y = env->CallDoubleMethod(varValue, mgetY);
741                            bc->Contens() = BComplex::XY(BDat(x), BDat(y));
742                        }
743                    }
744                } else {
745                    bso = GraMatrix()->EvaluateExpr(cvname);
746                    if (bso != NULL) {
747                        BUserMat *bm = UMat(bso);
748                        if (bm != NULL) {
749                            jmethodID valuem = env->GetMethodID(valueclass, "isMatrix", "()Z");
750                            jboolean bs = env->CallBooleanMethod(varValue, valuem);
751                            if (!bs) {
752                                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
753                                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
754                                jstring msg = env->NewStringUTF("Se intenta asignar un valor NO MATRIX a una VARIABLE TIPO Matrix");
755                                jobject e = env->NewObject(eclass, einit, 3, msg);
756                                return e;
757                            } else {
758                                jmethodID mgetRows = env->GetMethodID(valueclass, "getRows", "()I");
759                                jint rows = env->CallIntMethod(varValue, mgetRows);
760                                jmethodID mgetColumns = env->GetMethodID(valueclass, "getColumns", "()I");
761                                jint columns = env->CallIntMethod(varValue, mgetColumns);
762                                BDat *values = (BDat *) malloc(sizeof (BDat) * rows * columns);
763                                jmethodID mgetValues = env->GetMethodID(valueclass, "getValues", "()[[D");
764                                jobjectArray matValues = (jobjectArray) env->CallObjectMethod(varValue, mgetValues);
765                                for (int i = 0; i < rows; ++i) {
766                                    jdoubleArray rowArray = (jdoubleArray) env->GetObjectArrayElement(matValues, i);
767                                    jdouble *rowValues = env->GetDoubleArrayElements(rowArray, NULL);
768                                    for (int j = 0; j < columns; ++j) {
769                                        values[i * columns + j] = rowValues[j];
770                                    }
771                                }
772                                bm->Contens() = BMatrix<BDat > (rows, columns, values);
773                            }
774                        }
775                    } else {
776                        bso = GraVMatrix()->EvaluateExpr(cvname);
777                        if (bso != NULL) {
778                            BUserVMat *bvm = UVMat(bso);
779                            if (bvm != NULL) {
780                                jmethodID valuem = env->GetMethodID(valueclass, "isVMatrix", "()Z");
781                                jboolean bs = env->CallBooleanMethod(varValue, valuem);
782                                if (!bs) {
783                                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
784                                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
785                                    jstring msg = env->NewStringUTF("Se intenta asignar un valor NO VMATRIX a una VARIABLE TIPO VMatrix");
786                                    jobject e = env->NewObject(eclass, einit, 3, msg);
787                                    return e;
788                                } else {
789                                    jmethodID mgetRows = env->GetMethodID(valueclass, "getRows", "()I");
790                                    jint rows = env->CallIntMethod(varValue, mgetRows);
791                                    jmethodID mgetColumns = env->GetMethodID(valueclass, "getColumns", "()I");
792                                    jint columns = env->CallIntMethod(varValue, mgetColumns);
793                                    jmethodID mgetValues = env->GetMethodID(valueclass, "getValues", "()[[D");
794                                    jobjectArray matValues = (jobjectArray) env->CallObjectMethod(varValue, mgetValues);
795                                    for (int i = 0; i < rows; ++i) {
796                                        jdoubleArray rowArray = (jdoubleArray) env->GetObjectArrayElement(matValues, i);
797                                        jdouble *rowValues = env->GetDoubleArrayElements(rowArray, NULL);
798                                        for (int j = 0; j < columns; ++j) {
799                                            bvm->Contens().PutCell(i, j, rowValues[j]);
800                                        }
801                                    }
802                                }
803                            }
804                        } else {
805                            bso = GraPolyn()->EvaluateExpr(cvname);
806                            if (bso != NULL) {
807                                BUserPol *bp = UPol(bso);
808                                if (bp != NULL) {
809                                    jmethodID valuem = env->GetMethodID(valueclass, "isPolyn", "()Z");
810                                    jboolean bs = env->CallBooleanMethod(varValue, valuem);
811                                    if (!bs) {
812                                        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
813                                        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
814                                        jstring msg = env->NewStringUTF("Se intenta asignar un valor NO POLYN a una VARIABLE TIPO Polyn");
815                                        jobject e = env->NewObject(eclass, einit, 3, msg);
816                                        return e;
817                                    } else {
818                                        jmethodID mnterms = env->GetMethodID(valueclass, "getNterms", "()I");
819                                        jint size = env->CallIntMethod(varValue, mnterms);
820                                        BMonome<BDat> *terms = (BMonome<BDat> *)malloc(sizeof (BMonome<BDat>) * size);
821                                        jmethodID mgetTerm = env->GetMethodID(valueclass, "getTerm", "()Lcom.hcarralero.toljava.TOLPolynTerm;");
822                                        for (int i = 0; i < size; ++i) {
823                                            jobject term = env->CallObjectMethod(varValue, mgetTerm, i);
824                                            jclass termclass = env->FindClass("Lcom.hcarralero.toljava.TOLPolynTerm;");
825                                            jmethodID mgetCoef = env->GetMethodID(termclass, "getCoef", "()D");
826                                            double coef = env->CallDoubleMethod(term, mgetCoef);
827                                            jmethodID mgetVar = env->GetMethodID(termclass, "getVar", "()I");
828                                            int var = env->CallIntMethod(term, mgetVar);
829                                            jmethodID mgetGrade = env->GetMethodID(termclass, "getGrade", "()I");
830                                            int grade = env->CallIntMethod(term, mgetGrade);
831                                            if (var == 1) {
832                                                grade = -grade;
833                                            }
834                                            terms[i] = BMonome<BDat > (coef, grade);
835                                        }
836                                        bp->Contens() = BPolyn<BDat > (size, terms);
837                                    }
838                                }
839                            } else {
840                                bso = GraRatio()->EvaluateExpr(cvname);
841                                if (bso != NULL) {
842                                    BUserRat *br = URat(bso);
843                                    if (br != NULL) {
844                                        jmethodID valuem = env->GetMethodID(valueclass, "isRatio", "()Z");
845                                        jboolean bs = env->CallBooleanMethod(varValue, valuem);
846                                        if (!bs) {
847                                            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
848                                            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
849                                            jstring msg = env->NewStringUTF("Se intenta asignar un valor NO RATIO a una VARIABLE TIPO Ratio");
850                                            jobject e = env->NewObject(eclass, einit, 3, msg);
851                                            return e;
852                                        } else {
853                                            jmethodID mgetNumerator = env->GetMethodID(valueclass, "getNumerator", "()Lcom/hcarralero/toljava/TOLPolyn;");
854                                            jobject pnum = env->CallObjectMethod(varValue, mgetNumerator);
855                                            jclass pclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
856                                            jmethodID mnterms = env->GetMethodID(pclass, "getNterms", "()I");
857                                            jint size = env->CallIntMethod(pnum, mnterms);
858                                            BMonome<BDat> *pnumterms = (BMonome<BDat> *)malloc(sizeof (BMonome<BDat>) * size);
859                                            jmethodID mgetTerm = env->GetMethodID(pclass, "getTerm", "()Lcom.hcarralero.toljava.TOLPolynTerm;");
860                                            for (int i = 0; i < size; ++i) {
861                                                jobject term = env->CallObjectMethod(pnum, mgetTerm, i);
862                                                jclass termclass = env->FindClass("Lcom.hcarralero.toljava.TOLPolynTerm;");
863                                                jmethodID mgetCoef = env->GetMethodID(termclass, "getCoef", "()D");
864                                                double coef = env->CallDoubleMethod(term, mgetCoef);
865                                                jmethodID mgetVar = env->GetMethodID(termclass, "getVar", "()I");
866                                                int var = env->CallIntMethod(term, mgetVar);
867                                                jmethodID mgetGrade = env->GetMethodID(termclass, "getGrade", "()I");
868                                                int grade = env->CallIntMethod(term, mgetGrade);
869                                                if (var == 1) {
870                                                    grade = -grade;
871                                                }
872                                                pnumterms[i] = BMonome<BDat > (coef, grade);
873                                            }
874                                            BPolyn<BDat> num = BPolyn<BDat > (size, pnumterms);
875                                            br->Contens().PutNumerator(num);
876                                            jmethodID mgetDenominator = env->GetMethodID(valueclass, "getDenominator", "()Lcom/hcarralero/toljava/TOLPolyn;");
877                                            jobject pden = env->CallObjectMethod(varValue, mgetDenominator);
878                                            size = env->CallIntMethod(pden, mnterms);
879                                            BMonome<BDat> *pdenterms = (BMonome<BDat> *)malloc(sizeof (BMonome<BDat>) * size);
880                                            for (int i = 0; i < size; ++i) {
881                                                jobject term = env->CallObjectMethod(pden, mgetTerm, i);
882                                                jclass termclass = env->FindClass("Lcom.hcarralero.toljava.TOLPolynTerm;");
883                                                jmethodID mgetCoef = env->GetMethodID(termclass, "getCoef", "()D");
884                                                double coef = env->CallDoubleMethod(term, mgetCoef);
885                                                jmethodID mgetVar = env->GetMethodID(termclass, "getVar", "()I");
886                                                int var = env->CallIntMethod(term, mgetVar);
887                                                jmethodID mgetGrade = env->GetMethodID(termclass, "getGrade", "()I");
888                                                int grade = env->CallIntMethod(term, mgetGrade);
889                                                if (var == 1) {
890                                                    grade = -grade;
891                                                }
892                                                pdenterms[i] = BMonome<BDat > (coef, grade);
893                                            }
894                                            BPolyn<BDat> den = BPolyn<BDat > (size, pdenterms);
895                                            br->Contens().PutDenominator(den);
896                                        }
897                                    }
898                                } else {
899                                    bso = GraCode()->EvaluateExpr(cvname);
900                                    if (bso != NULL) {
901                                        BUserCode *bc = UCode(bso);
902                                        if (bc != NULL) {
903                                            jmethodID valuem = env->GetMethodID(valueclass, "isCode", "()Z");
904                                            jboolean bs = env->CallBooleanMethod(varValue, valuem);
905                                            if (!bs) {
906                                                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
907                                                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
908                                                jstring msg = env->NewStringUTF("Se intenta asignar un valor NO CODE a una VARIABLE TIPO Code");
909                                                jobject e = env->NewObject(eclass, einit, 3, msg);
910                                                return e;
911                                            } else {
912                                                jmethodID mfunction = env->GetMethodID(valueclass, "getFunction", "()Ljava/lang/String;");
913                                                jstring jsnameNuevo = (jstring) env->CallObjectMethod(varValue, mfunction);
914                                                const jchar *jcnameNuevo = env->GetStringChars(jsnameNuevo, NULL);
915                                                jsize lnameNuevo = env->GetStringLength(jsnameNuevo);
916                                                char *cnameNuevo = (char *) malloc(sizeof (char) *(lnameNuevo + 1));
917                                                for (int i = 0; i < lnameNuevo; ++i) {
918                                                    cnameNuevo[i] = jcnameNuevo[i];
919                                                }
920                                                cnameNuevo[lnameNuevo] = '\0';
921                                                BSyntaxObject *bsoNuevo = GraCode()->EvaluateExpr(cnameNuevo);
922                                                if (bsoNuevo == NULL) {
923                                                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
924                                                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
925                                                    jstring msg = env->NewStringUTF("Nombre de Variable o Función NO ENCONTRADA.");
926                                                    jobject e = env->NewObject(eclass, einit, 2, msg);
927                                                    return e;
928                                                } else {
929                                                    BUserCode *bcNuevo = UCode(bsoNuevo);
930                                                    bc->PutContens(bcNuevo->Contens());
931                                                }
932                                            }
933                                        }
934                                    } else {
935                                        bso = GraTimeSet()->EvaluateExpr(cvname);
936                                        if (bso != NULL) {
937                                            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
938                                            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
939                                            jstring msg = env->NewStringUTF("No se puede cambiar el valor de una variable tipo Set");
940                                            jobject e = env->NewObject(eclass, einit, 3, msg);
941                                            return e;
942                                        } else {
943                                            bso = GraSerie()->EvaluateExpr(cvname);
944                                            if (bso != NULL) {
945                                                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
946                                                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
947                                                jstring msg = env->NewStringUTF("No se puede cambiar el valor de una variable tipo Serie");
948                                                jobject e = env->NewObject(eclass, einit, 3, msg);
949                                                return e;
950                                            } else {
951                                                bso = GraSet()->EvaluateExpr(cvname);
952                                                if (bso != NULL) {
953                                                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
954                                                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
955                                                    jstring msg = env->NewStringUTF("No se puede cambiar el valor de una variable tipo Set");
956                                                    jobject e = env->NewObject(eclass, einit, 3, msg);
957                                                    return e;
958                                                } else {
959                                                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
960                                                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
961                                                    jstring msg = env->NewStringUTF("Variable NO ENCONTRADA: <<varName>>");
962                                                    jobject e = env->NewObject(eclass, einit, 2, msg);
963                                                    return e;
964                                                }
965                                            }
966                                        }
967                                    }
968                                }
969                            }
970                        }
971                    }
972                }
973            }
974        }
975    }
976    return NULL;
977}
978
979/*
980 * Class:     com_hcarralero_toljava_TOLMachine
981 * Method:    nativeGetTextVariables
982 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
983 */
984JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetTextVariables(JNIEnv *env, jobject) {
985    borrarMensajes();
986    BList *lv = GraText()->GetVariables();
987    BSet sv;
988    sv.RobStruct(lv, NIL, BSet::Generic);
989    int nv = sv.Card();
990    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
991    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
992    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
993    for (int i = 0; i < nv; ++i) {
994        BSyntaxObject *bso = sv[i + 1];
995        jstring varname = env->NewStringUTF(bso->Name().String());
996        jobject vardesc = env->NewStringUTF(bso->Description().String());
997        jobject varvalue = NULL;
998        if (bso != NULL) {
999            BUserText *btxt = UText(bso);
1000            if (btxt != NULL) {
1001                jclass ttclass = env->FindClass("Lcom/hcarralero/toljava/TOLText;");
1002                jmethodID ttinit = env->GetMethodID(ttclass, "<init>", "(Ljava/lang/String;)V");
1003                jstring ttvalue = env->NewStringUTF(btxt->Contens().String());
1004                varvalue = env->NewObject(ttclass, ttinit, ttvalue);
1005            }
1006        }
1007        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1008        env->SetObjectArrayElement(vars, i, var);
1009    }
1010    return vars;
1011}
1012
1013/*
1014 * Class:     com_hcarralero_toljava_TOLMachine
1015 * Method:    nativeGetRealVariables
1016 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1017 */
1018JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetRealVariables(JNIEnv *env, jobject) {
1019    borrarMensajes();
1020    BList *lv = GraReal()->GetVariables();
1021    BSet sv;
1022    sv.RobStruct(lv, NIL, BSet::Generic);
1023    int nv = sv.Card();
1024    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1025    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1026    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1027    for (int i = 0; i < nv; ++i) {
1028        BSyntaxObject *bso = sv[i + 1];
1029        jstring varname = env->NewStringUTF(bso->Name().String());
1030        jobject vardesc = env->NewStringUTF(bso->Description().String());
1031        jobject varvalue = NULL;
1032        if (bso != NULL) {
1033            BUserDat *br = UDat(bso);
1034            if (br != NULL) {
1035                jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLReal;");
1036                jmethodID trinit = env->GetMethodID(trclass, "<init>", "(D)V");
1037                double trvalue = br->Contens().GetValue();
1038                varvalue = env->NewObject(trclass, trinit, trvalue);
1039            }
1040        }
1041        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1042        env->SetObjectArrayElement(vars, i, var);
1043    }
1044    return vars;
1045}
1046
1047/*
1048 * Class:     com_hcarralero_toljava_TOLMachine
1049 * Method:    nativeGetDateVariables
1050 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1051 */
1052JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetDateVariables(JNIEnv *env, jobject) {
1053    borrarMensajes();
1054    BList *lv = GraDate()->GetVariables();
1055    BSet sv;
1056    sv.RobStruct(lv, NIL, BSet::Generic);
1057    int nv = sv.Card();
1058    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1059    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1060    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1061    for (int i = 0; i < nv; ++i) {
1062        BSyntaxObject *bso = sv[i + 1];
1063        jstring varname = env->NewStringUTF(bso->Name().String());
1064        jobject vardesc = env->NewStringUTF(bso->Description().String());
1065        jobject varvalue = NULL;
1066        if (bso != NULL) {
1067            BUserDate *bd = UDate(bso);
1068            if (bd != NULL) {
1069                jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1070                jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
1071                BDate date = bd->Contens();
1072                int year = date.Year();
1073                int month = date.Month();
1074                int day = date.Day();
1075                int hour = date.Hour();
1076                int minute = date.Minute();
1077                double second = date.Second();
1078                varvalue = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
1079            }
1080        }
1081        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1082        env->SetObjectArrayElement(vars, i, var);
1083    }
1084    return vars;
1085}
1086
1087/*
1088 * Class:     com_hcarralero_toljava_TOLMachine
1089 * Method:    nativeGetComplexVariables
1090 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1091 */
1092JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetComplexVariables(JNIEnv *env, jobject) {
1093    borrarMensajes();
1094    BList *lv = GraComplex()->GetVariables();
1095    BSet sv;
1096    sv.RobStruct(lv, NIL, BSet::Generic);
1097    int nv = sv.Card();
1098    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1099    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1100    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1101    for (int i = 0; i < nv; ++i) {
1102        BSyntaxObject *bso = sv[i + 1];
1103        jstring varname = env->NewStringUTF(bso->Name().String());
1104        jobject vardesc = env->NewStringUTF(bso->Description().String());
1105        jobject varvalue = NULL;
1106        if (bso != NULL) {
1107            BUserCmp *bc = UCmp(bso);
1108            if (bc != NULL) {
1109                jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLComplex;");
1110                jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(DD)V");
1111                double x = bc->Contens().X().GetValue();
1112                double y = bc->Contens().Y().GetValue();
1113                varvalue = env->NewObject(tcclass, tcinit, x, y);
1114            }
1115        }
1116        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1117        env->SetObjectArrayElement(vars, i, var);
1118    }
1119    return vars;
1120}
1121
1122/*
1123 * Class:     com_hcarralero_toljava_TOLMachine
1124 * Method:    nativeGetMatrixVariables
1125 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1126 */
1127JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetMatrixVariables(JNIEnv *env, jobject) {
1128    borrarMensajes();
1129    BList *lv = GraMatrix()->GetVariables();
1130    BSet sv;
1131    sv.RobStruct(lv, NIL, BSet::Generic);
1132    int nv = sv.Card();
1133    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1134    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1135    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1136    for (int i = 0; i < nv; ++i) {
1137        BSyntaxObject *bso = sv[i + 1];
1138        jstring varname = env->NewStringUTF(bso->Name().String());
1139        jobject vardesc = env->NewStringUTF(bso->Description().String());
1140        jobject varvalue = NULL;
1141        if (bso != NULL) {
1142            BUserMat *bmat = UMat(bso);
1143            if (bmat != NULL) {
1144                jclass tmclass = env->FindClass("Lcom/hcarralero/toljava/TOLMatrix;");
1145                jmethodID tminit = NULL;
1146                BMatrix<BDat> mat = bmat->Contens();
1147                int rows = mat.Rows();
1148                int columns = mat.Columns();
1149                if (rows <= 0 || columns <= 0) {
1150                    tminit = env->GetMethodID(tmclass, "<init>", "()V");
1151                    varvalue = env->NewObject(tmclass, tminit);
1152                } else {
1153                    tminit = env->GetMethodID(tmclass, "<init>", "([[D)V");
1154                    BArray<BDat> vals = mat.Data();
1155                    jclass adclass = env->FindClass("[D");
1156                    jobjectArray tmvalues = env->NewObjectArray(rows, adclass, NULL);
1157                    for (int r = 0; r < rows; ++r) {
1158                        jdoubleArray arrayRow = env->NewDoubleArray(columns);
1159                        jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
1160                        for (int c = 0; c < columns; ++c) {
1161                            valuesRow[c] = vals[r * columns + c].Value();
1162                        }
1163                        env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
1164                        env->SetObjectArrayElement(tmvalues, r, arrayRow);
1165                    }
1166                    varvalue = env->NewObject(tmclass, tminit, tmvalues);
1167                }
1168            }
1169        }
1170        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1171        env->SetObjectArrayElement(vars, i, var);
1172    }
1173    return vars;
1174}
1175
1176/*
1177 * Class:     com_hcarralero_toljava_TOLMachine
1178 * Method:    nativeGetVMatrixVariables
1179 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1180 */
1181JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetVMatrixVariables(JNIEnv *env, jobject) {
1182    borrarMensajes();
1183    BList *lv = GraVMatrix()->GetVariables();
1184    BSet sv;
1185    sv.RobStruct(lv, NIL, BSet::Generic);
1186    int nv = sv.Card();
1187    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1188    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1189    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1190    for (int i = 0; i < nv; ++i) {
1191        BSyntaxObject *bso = sv[i + 1];
1192        jstring varname = env->NewStringUTF(bso->Name().String());
1193        jobject vardesc = env->NewStringUTF(bso->Description().String());
1194        jobject varvalue = NULL;
1195        if (bso != NULL) {
1196            BUserVMat *bvmat = UVMat(bso);
1197            if (bvmat != NULL) {
1198                jclass tvmclass = env->FindClass("Lcom/hcarralero/toljava/TOLVMatrix;");
1199                jmethodID tvminit = NULL;
1200                BVMat vmat = bvmat->Contens();
1201                int rows = vmat.Rows();
1202                int columns = vmat.Columns();
1203                if (rows <= 0 || columns <= 0) {
1204                    tvminit = env->GetMethodID(tvmclass, "<init>", "()V");
1205                    varvalue = env->NewObject(tvmclass, tvminit);
1206                } else {
1207                    tvminit = env->GetMethodID(tvmclass, "<init>", "([[D)V");
1208                    BMatrix<double> mat = vmat.GetDMat();
1209                    BArray<double> vals = mat.Data();
1210                    jclass adclass = env->FindClass("[D");
1211                    jobjectArray tvmvalues = env->NewObjectArray(rows, adclass, NULL);
1212                    for (int r = 0; r < rows; ++r) {
1213                        jdoubleArray arrayRow = env->NewDoubleArray(columns);
1214                        jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
1215                        for (int c = 0; c < columns; ++c) {
1216                            valuesRow[c] = vals[r * columns + c];
1217                        }
1218                        env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
1219                        env->SetObjectArrayElement(tvmvalues, r, arrayRow);
1220                    }
1221                    varvalue = env->NewObject(tvmclass, tvminit, tvmvalues);
1222                }
1223            }
1224        }
1225        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1226        env->SetObjectArrayElement(vars, i, var);
1227    }
1228    return vars;
1229}
1230
1231/*
1232 * Class:     com_hcarralero_toljava_TOLMachine
1233 * Method:    nativeGetPolynVariables
1234 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1235 */
1236JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetPolynVariables(JNIEnv *env, jobject) {
1237    borrarMensajes();
1238    BList *lv = GraPolyn()->GetVariables();
1239    BSet sv;
1240    sv.RobStruct(lv, NIL, BSet::Generic);
1241    int nv = sv.Card();
1242    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1243    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1244    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1245    for (int i = 0; i < nv; ++i) {
1246        BSyntaxObject *bso = sv[i + 1];
1247        jstring varname = env->NewStringUTF(bso->Name().String());
1248        jobject vardesc = env->NewStringUTF(bso->Description().String());
1249        jobject varvalue = NULL;
1250        if (bso != NULL) {
1251            BUserPol *bp = UPol(bso);
1252            if (bp != NULL) {
1253                jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
1254                jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
1255                BPolyn<BDat> pol = bp->Contens();
1256                int nt = pol.Size();
1257                jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
1258                varvalue = env->NewObject(tpclass, tpinit);
1259                for (int i = 0; i < nt; ++i) {
1260                    BMonome<BDat> bm = pol[i];
1261                    int var = 0;
1262                    int grade = bm.Degree();
1263                    if (grade < 0) {
1264                        grade = -grade;
1265                        var = 1;
1266                    }
1267                    double coef = bm.Coef().GetValue();
1268                    env->CallVoidMethod(varvalue, maddTerm, var, coef, grade);
1269                }
1270            }
1271        }
1272        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1273        env->SetObjectArrayElement(vars, i, var);
1274    }
1275    return vars;
1276}
1277
1278/*
1279 * Class:     com_hcarralero_toljava_TOLMachine
1280 * Method:    nativeRatioVariables
1281 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1282 */
1283JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetRatioVariables(JNIEnv *env, jobject) {
1284    borrarMensajes();
1285    BList *lv = GraRatio()->GetVariables();
1286    BSet sv;
1287    sv.RobStruct(lv, NIL, BSet::Generic);
1288    int nv = sv.Card();
1289    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1290    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1291    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1292    for (int i = 0; i < nv; ++i) {
1293        BSyntaxObject *bso = sv[i + 1];
1294        jstring varname = env->NewStringUTF(bso->Name().String());
1295        jobject vardesc = env->NewStringUTF(bso->Description().String());
1296        jobject varvalue = NULL;
1297        if (bso != NULL) {
1298            BUserRat *br = URat(bso);
1299            if (br != NULL) {
1300                BRational<BDat> rat = br->Contens();
1301                jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLRatio;");
1302                jmethodID trinit = env->GetMethodID(trclass, "<init>", "(Lcom/hcarralero/toljava/TOLPolyn;Lcom/hcarralero/toljava/TOLPolyn;)V");
1303                jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
1304                jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
1305                BPolyn<BDat> pnum = rat.Numerator();
1306                int nt = pnum.Size();
1307                jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
1308                jobject valueNum = env->NewObject(tpclass, tpinit);
1309                for (int i = 0; i < nt; ++i) {
1310                    BMonome<BDat> bmnum = pnum[i];
1311                    int var = 0;
1312                    int grade = bmnum.Degree();
1313                    if (grade < 0) {
1314                        grade = -grade;
1315                        var = 1;
1316                    }
1317                    double coef = bmnum.Coef().GetValue();
1318                    env->CallVoidMethod(valueNum, maddTerm, var, coef, grade);
1319                }
1320                BPolyn<BDat> pden = rat.Denominator();
1321                nt = pden.Size();
1322                jobject valueDen = env->NewObject(tpclass, tpinit);
1323                for (int i = 0; i < nt; ++i) {
1324                    BMonome<BDat> bmden = pden[i];
1325                    int var = 0;
1326                    int grade = bmden.Degree();
1327                    if (grade < 0) {
1328                        grade = -grade;
1329                        var = 1;
1330                    }
1331                    double coef = bmden.Coef().GetValue();
1332                    env->CallVoidMethod(valueDen, maddTerm, var, coef, grade);
1333                }
1334                varvalue = env->NewObject(trclass, trinit, valueNum, valueDen);
1335            }
1336        }
1337        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1338        env->SetObjectArrayElement(vars, i, var);
1339    }
1340    return vars;
1341}
1342
1343/*
1344 * Class:     com_hcarralero_toljava_TOLMachine
1345 * Method:    nativeGetCodeVariables
1346 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1347 */
1348JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetCodeVariables(JNIEnv *env, jobject) {
1349    borrarMensajes();
1350    BList *lv = GraCode()->GetVariables();
1351    BSet sv;
1352    sv.RobStruct(lv, NIL, BSet::Generic);
1353    int nv = sv.Card();
1354    //    BList *lft = GraText()->GetOperators();
1355    //    BSet sft;
1356    //    sft.RobStruct(lft, NIL, BSet::Generic);
1357    //    int nft = sft.Card();
1358    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1359    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1360    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1361    int i = 0;
1362    for (int v = 0; v < nv; ++v) {
1363        BSyntaxObject *bso = sv[v + 1];
1364        jstring varname = env->NewStringUTF(bso->Name().String());
1365        jobject vardesc = env->NewStringUTF(bso->Description().String());
1366        jobject varvalue = NULL;
1367        if (bso != NULL) {
1368            BUserCode *bc = UCode(bso);
1369            if (bc != NULL) {
1370                jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLCode;");
1371                jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
1372                BCode cod = bc->Contens();
1373                jstring name = env->NewStringUTF(cod.Name().String());
1374                jstring info = env->NewStringUTF(cod.Info().String());
1375                varvalue = env->NewObject(tcclass, tcinit, name, info);
1376            }
1377        }
1378        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1379        env->SetObjectArrayElement(vars, i, var);
1380        ++i;
1381    }
1382    //    for (int ft = 0; ft < nft; ++ft) {
1383    //        jobject var= NULL;
1384    //        BSyntaxObject *bso = sft[ft + 1];
1385    //        if (bso != NULL) {
1386    //            jstring varname = env->NewStringUTF(bso->Name().String());
1387    //            jobject vardesc = env->NewStringUTF(bso->Description().String());
1388    //            jobject varvalue = NULL;
1389    //            bso= bso->CopyContens();
1390    //            BUserCode *bc = UCode(bso);
1391    //            if (bc != NULL) {
1392    //                jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLCode;");
1393    //                jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
1394    //                BCode cod = bc->Contens();
1395    //                jstring name = env->NewStringUTF(cod.Name().String());
1396    //                jstring info = env->NewStringUTF(cod.Dump().String());
1397    //                varvalue = env->NewObject(tcclass, tcinit, name, info);
1398    //            }
1399    //            var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1400    //        }
1401    //        env->SetObjectArrayElement(vars, i, var);
1402    //        ++i;
1403    //    }
1404    return vars;
1405}
1406
1407/*
1408 * Class:     com_hcarralero_toljava_TOLMachine
1409 * Method:    nativeGetSerieVariables
1410 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1411 */
1412JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetSerieVariables(JNIEnv *env, jobject tm) {
1413    borrarMensajes();
1414    BList *lv = GraSerie()->GetVariables();
1415    BSet sv;
1416    sv.RobStruct(lv, NIL, BSet::Generic);
1417    int nv = sv.Card();
1418    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1419    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1420    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1421    for (int i = 0; i < nv; ++i) {
1422        BSyntaxObject *bso = sv[i + 1];
1423        jstring varname = env->NewStringUTF(bso->Name().String());
1424        jobject vardesc = env->NewStringUTF(bso->Description().String());
1425        jobject varvalue = NULL;
1426        if (bso != NULL) {
1427            BUserTimeSerie *br = Tsr(bso);
1428            if (br != NULL) {
1429                jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSerie;");
1430                jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
1431                varvalue = env->NewObject(tsclass, tsinit, tm, varname);
1432            }
1433        }
1434        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1435        env->SetObjectArrayElement(vars, i, var);
1436    }
1437    return vars;
1438}
1439
1440/*
1441 * Class:     com_hcarralero_toljava_TOLMachine
1442 * Method:    nativeGetTimeSetVariables
1443 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1444 */
1445JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetTimeSetVariables(JNIEnv *env, jobject tm) {
1446    borrarMensajes();
1447    BList *lv = ::GraTimeSet()->GetVariables();
1448    BSet sv;
1449    sv.RobStruct(lv, NIL, BSet::Generic);
1450    int nv = sv.Card();
1451    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1452    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1453    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1454    for (int i = 0; i < nv; ++i) {
1455        BSyntaxObject *bso = sv[i + 1];
1456        jstring varname = env->NewStringUTF(bso->Name().String());
1457        jobject vardesc = env->NewStringUTF(bso->Description().String());
1458        jobject varvalue = NULL;
1459        if (bso != NULL) {
1460            BUserTimeSet *bt = Tms(bso);
1461            if (bt != NULL) {
1462                jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRTimeSet;");
1463                jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
1464                varvalue = env->NewObject(tsclass, tsinit, tm, varname);
1465            }
1466        }
1467        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1468        env->SetObjectArrayElement(vars, i, var);
1469    }
1470    return vars;
1471}
1472
1473/*
1474 * Class:     com_hcarralero_toljava_TOLMachine
1475 * Method:    nativeGetSetVariables
1476 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1477 */
1478JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetRSetVariables(JNIEnv *env, jobject tm){
1479    borrarMensajes();
1480    BList *lv = GraSet()->GetVariables();
1481    BSet sv;
1482    sv.RobStruct(lv, NIL, BSet::Generic);
1483    int nv = sv.Card();
1484    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1485    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1486    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1487    for (int i = 0; i < nv; ++i) {
1488        BSyntaxObject *bso = sv[i + 1];
1489        jstring varname = env->NewStringUTF(bso->Name().String());
1490        jobject vardesc = env->NewStringUTF(bso->Description().String());
1491        jobject varvalue = NULL;
1492        if (bso != NULL) {
1493            BUserSet *bs = USet(bso);
1494            if (bs != NULL) {
1495                jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSet;");
1496                jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
1497                varvalue = env->NewObject(tsclass, tsinit, tm, varname);
1498            }
1499        }
1500        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1501        env->SetObjectArrayElement(vars, i, var);
1502    }
1503    return vars;
1504}
1505
1506/*
1507 * Class:     com_hcarralero_toljava_TOLMachine
1508 * Method:    nativeGetSetVariables
1509 * Signature: ()[Lcom/hcarralero/toljava/TOLVariable;
1510 */
1511JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetSetVariables(JNIEnv *env, jobject tm){
1512    borrarMensajes();
1513    BList *lv = GraSet()->GetVariables();
1514    BSet sv;
1515    sv.RobStruct(lv, NIL, BSet::Generic);
1516    int nv = sv.Card();
1517    jclass varclass = env->FindClass("Lcom/hcarralero/toljava/TOLVariable;");
1518    jobjectArray vars = env->NewObjectArray(nv, varclass, NULL);
1519    jmethodID varinit = env->GetMethodID(varclass, "<init>", "(Ljava/lang/String;Lcom/hcarralero/toljava/TOLObject;Ljava/lang/String;)V");
1520    for (int i = 0; i < nv; ++i) {
1521        BSyntaxObject *bso = sv[i + 1];
1522        jstring varname = env->NewStringUTF(bso->Name().String());
1523        jobject vardesc = env->NewStringUTF(bso->Description().String());
1524        jobject varvalue = NULL;
1525        if (bso != NULL) {
1526            BUserSet *bs = USet(bso);
1527            if (bs != NULL) {
1528                jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLSet;");
1529                jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
1530                varvalue = env->NewObject(tsclass, tsinit, tm, varname);
1531            }
1532        }
1533        jobject var = env->NewObject(varclass, varinit, varname, varvalue, vardesc);
1534        env->SetObjectArrayElement(vars, i, var);
1535    }
1536    return vars;
1537}
1538
1539/*
1540 * Class:     com_hcarralero_toljava_TOLMachine
1541 * Method:    nativeGetNameBlocks
1542 * Signature: ()[Lcom/hcarralero/toljava/TOLNameBlock;
1543 */
1544JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeGetNameBlocks(JNIEnv *env, jobject tm) {
1545    borrarMensajes();
1546    BList *lv = GraNameBlock()->GetVariables();
1547    BSet sv;
1548    sv.RobStruct(lv, NIL, BSet::Generic);
1549    int nv = sv.Card();
1550    jclass nbclass = env->FindClass("Lcom/hcarralero/toljava/TOLNameBlock;");
1551    jobjectArray nbs = env->NewObjectArray(nv, nbclass, NULL);
1552    jmethodID nbinit = env->GetMethodID(nbclass, "<init>", "(Ljava/lang/String;)V");
1553    for (int i = 0; i < nv; ++i) {
1554        BSyntaxObject *bso = sv[i + 1];
1555        if (bso != NULL) {
1556            BUserNameBlock *bn = UNameBlock(bso);
1557            if (bn != NULL) {
1558                jobject nb = env->NewObject(nbclass, nbinit, bn->Contens().Name().String());
1559                env->SetObjectArrayElement(nbs, i, nb);
1560            }
1561        }
1562    }
1563    return nbs;
1564}
1565
1566/*
1567 * Class:     com_hcarralero_toljava_TOLMachine
1568 * Method:    nativeGetSerieValue
1569 * Signature: (Ljava/lang/String;Ljava/util/TOLDate;)Ljava/lang/Object;
1570 */
1571JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSerieGetValue__Ljava_lang_String_2Lcom_hcarralero_toljava_TOLDate_2(JNIEnv *env, jobject, jstring varname, jobject date)
1572{
1573    borrarMensajes();
1574    const char *ccname = env->GetStringUTFChars(varname, NULL);
1575    BSyntaxObject *bso = GraSerie()->EvaluateExpr(ccname);
1576    if (bso != NULL) {
1577        BUserTimeSerie *bs = Tsr(bso);
1578        if (bs == NULL) {
1579            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1580            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1581            jstring msg = env->NewStringUTF("NO SE QUË PINGA PASÓ");
1582            jobject e = env->NewObject(eclass, einit, 2, msg);
1583            return e;
1584        } else {
1585            jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1586            jmethodID mgetYear = env->GetMethodID(tdclass, "getYear", "()I");
1587            int year = env->CallIntMethod(date, mgetYear);
1588            jmethodID mgetMonth = env->GetMethodID(tdclass, "getMonth", "()I");
1589            int month = env->CallIntMethod(date, mgetMonth);
1590            jmethodID mgetDay = env->GetMethodID(tdclass, "getDay", "()I");
1591            int day = env->CallIntMethod(date, mgetDay);
1592            jmethodID mgetHour = env->GetMethodID(tdclass, "getHour", "()I");
1593            int hour = env->CallIntMethod(date, mgetHour);
1594            jmethodID mgetMinute = env->GetMethodID(tdclass, "getMinute", "()I");
1595            int minute = env->CallIntMethod(date, mgetMinute);
1596            jmethodID mgetSecond = env->GetMethodID(tdclass, "getSecond", "()D");
1597            double second = env->CallDoubleMethod(date, mgetSecond);
1598            BDate d;
1599            d.PutDate(year, month, day, hour, minute, second);
1600            int index = bs->GetIndex(d);
1601            if (index < 0) {
1602                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1603                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1604                jstring msg = env->NewStringUTF("Fecha NO VÁLIDA");
1605                jobject e = env->NewObject(eclass, einit, 6, msg);
1606                return e;
1607            } else {
1608                jclass dclass = env->FindClass("Ljava/lang/Double;");
1609                jmethodID dinit = env->GetMethodID(dclass, "<init>", "(D)V");
1610                jobject value = env->NewObject(dclass, dinit, bs->GetDat(d).Value());
1611                return value;
1612            }
1613        }
1614    } else {
1615        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1616        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1617        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA: <<varName>>");
1618        jobject e = env->NewObject(eclass, einit, 2, msg);
1619        return e;
1620    }
1621}
1622
1623/*
1624 * Class:     com_hcarralero_toljava_TOLMachine
1625 * Method:    nativeGetSerieValue
1626 * Signature: (Ljava/lang/String;I)Ljava/lang/Object;
1627 */
1628JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSerieGetValue__Ljava_lang_String_2I(JNIEnv *env, jobject, jstring varname, jint index) {
1629    borrarMensajes();
1630    const char *ccname = env->GetStringUTFChars(varname, NULL);
1631    BSyntaxObject *bso = GraSerie()->EvaluateExpr(ccname);
1632    if (bso != NULL) {
1633        BUserTimeSerie *bs = Tsr(bso);
1634        if (bs == NULL) {
1635            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1636            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1637            jstring msg = env->NewStringUTF("NO SE QUË PINGA PASÓ");
1638            jobject e = env->NewObject(eclass, einit, 2, msg);
1639            return e;
1640        } else {
1641            if (index < 0) {
1642                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1643                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1644                jstring msg = env->NewStringUTF("Índice NO VÁLIDO");
1645                jobject e = env->NewObject(eclass, einit, 7, msg);
1646                return e;
1647            } else {
1648                BDate d = bs->IndexToDate(index);
1649                jclass dclass = env->FindClass("Ljava/lang/Double;");
1650                jmethodID dinit = env->GetMethodID(dclass, "<init>", "(D)V");
1651                jobject value = env->NewObject(dclass, dinit, bs->GetDat(d).Value());
1652                return value;
1653            }
1654        }
1655    } else {
1656        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1657        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1658        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA: <<varName>>");
1659        jobject e = env->NewObject(eclass, einit, 2, msg);
1660        return e;
1661    }
1662}
1663
1664/*
1665 * Class:     com_hcarralero_toljava_TOLMachine
1666 * Method:    nativeGetSerieItems
1667 * Signature: (Ljava/lang/String;Lcom/hcarralero/toljava/TOLDate;I)[Ljava/lang/Object;
1668 */
1669JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSerieGetItems__Ljava_lang_String_2Lcom_hcarralero_toljava_TOLDate_2I(JNIEnv *env, jobject, jstring varname, jobject date, jint size) {
1670    borrarMensajes();
1671    const char *ccname = env->GetStringUTFChars(varname, NULL);
1672    BSyntaxObject *bso = GraSerie()->EvaluateExpr(ccname);
1673    if (bso != NULL) {
1674        BUserTimeSerie *bs = Tsr(bso);
1675        if (bs == NULL) {
1676            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1677            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1678            jstring msg = env->NewStringUTF("NO SE QUË PINGA PASÓ");
1679            jobject e = env->NewObject(eclass, einit, 2, msg);
1680            jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1681            env->SetObjectArrayElement(es, 0, e);
1682            return es;
1683        } else {
1684            jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1685            jmethodID mgetYear = env->GetMethodID(tdclass, "getYear", "()I");
1686            int year = env->CallIntMethod(date, mgetYear);
1687            jmethodID mgetMonth = env->GetMethodID(tdclass, "getMonth", "()I");
1688            int month = env->CallIntMethod(date, mgetMonth);
1689            jmethodID mgetDay = env->GetMethodID(tdclass, "getDay", "()I");
1690            int day = env->CallIntMethod(date, mgetDay);
1691            jmethodID mgetHour = env->GetMethodID(tdclass, "getHour", "()I");
1692            int hour = env->CallIntMethod(date, mgetHour);
1693            jmethodID mgetMinute = env->GetMethodID(tdclass, "getMinute", "()I");
1694            int minute = env->CallIntMethod(date, mgetMinute);
1695            jmethodID mgetSecond = env->GetMethodID(tdclass, "getSecond", "()D");
1696            double second = env->CallDoubleMethod(date, mgetSecond);
1697            BDate d;
1698            d.PutDate(year, month, day, hour, minute, second);
1699            int index = bs->GetIndex(d);
1700            if (index < 0) {
1701                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1702                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1703                jstring msg = env->NewStringUTF("Fecha NO VÁLIDA");
1704                jobject e = env->NewObject(eclass, einit, 5, msg);
1705                jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1706                env->SetObjectArrayElement(es, 0, e);
1707                return es;
1708            } else {
1709                int l = bs->GetLength();
1710                if (index + size < l) {
1711                    l = index + size;
1712                }
1713                jclass tsiclass = env->FindClass("Lcom/hcarralero/toljava/TSItem;");
1714                jobjectArray tsis = env->NewObjectArray(l - index, tsiclass, NULL);
1715                jmethodID tsiinit = env->GetMethodID(tsiclass, "<init>", "(Lcom/hcarralero/toljava/TOLDate;D)V");
1716                for (int i = index; i < l; ++i) {
1717                    BDate date = bs->IndexToDate(i);
1718                    int year = date.Year();
1719                    int month = date.Month();
1720                    int day = date.Day();
1721                    int hour = date.Hour();
1722                    int minute = date.Minute();
1723                    double second = date.Second();
1724                    jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1725                    jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
1726                    jobject tsidate = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
1727                    double tsivalue = bs->GetDat(date).Value();
1728                    jobject tsi = env->NewObject(tsiclass, tsiinit, tsidate, tsivalue);
1729                    env->SetObjectArrayElement(tsis, i - index, tsi);
1730                }
1731                return tsis;
1732            }
1733        }
1734    } else {
1735        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1736        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1737        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
1738        jobject e = env->NewObject(eclass, einit, 2, msg);
1739        jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1740        env->SetObjectArrayElement(es, 0, e);
1741        return es;
1742    }
1743}
1744
1745/*
1746 * Class:     com_hcarralero_toljava_TOLMachine
1747 * Method:    nativeGetSerieItems
1748 * Signature: (Ljava/lang/String;II)[Ljava/lang/Object;
1749 */
1750JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSerieGetItems__Ljava_lang_String_2II(JNIEnv *env, jobject, jstring varname, jint index, jint size) {
1751    borrarMensajes();
1752    const char *ccname = env->GetStringUTFChars(varname, NULL);
1753    BSyntaxObject *bso = GraSerie()->EvaluateExpr(ccname);
1754    if (bso != NULL) {
1755        BUserTimeSerie *bs = Tsr(bso);
1756        if (index < 0) {
1757            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1758            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1759            jstring msg = env->NewStringUTF("Índice NO VÁLIDO");
1760            jobject e = env->NewObject(eclass, einit, 5, msg);
1761            jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1762            env->SetObjectArrayElement(es, 0, e);
1763            return es;
1764        } else {
1765            int l = bs->GetLength();
1766            if (index + size < l) {
1767                l = index + size;
1768            }
1769            jclass tsiclass = env->FindClass("Lcom/hcarralero/toljava/TSItem;");
1770            jobjectArray tsis = env->NewObjectArray(l - index, tsiclass, NULL);
1771            jmethodID tsiinit = env->GetMethodID(tsiclass, "<init>", "(Lcom/hcarralero/toljava/TOLDate;D)V");
1772            for (int i = index; i < l; ++i) {
1773                BDate date = bs->IndexToDate(i);
1774                int year = date.Year();
1775                int month = date.Month();
1776                int day = date.Day();
1777                int hour = date.Hour();
1778                int minute = date.Minute();
1779                double second = date.Second();
1780                jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1781                jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
1782                jobject tsidate = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
1783                double tsivalue = bs->GetDat(date).Value();
1784                jobject tsi = env->NewObject(tsiclass, tsiinit, tsidate, tsivalue);
1785                env->SetObjectArrayElement(tsis, i - index, tsi);
1786            }
1787            return tsis;
1788        }
1789    } else {
1790        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1791        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1792        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
1793        jobject e = env->NewObject(eclass, einit, 2, msg);
1794        jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1795        env->SetObjectArrayElement(es, 0, e);
1796        return es;
1797    }
1798}
1799
1800/*
1801 * Class:     com_hcarralero_toljava_TOLMachine
1802 * Method:    nativeGetFirstDateSerie
1803 * Signature: (Ljava/lang/String;)Ljava/lang/Object;
1804 */
1805JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSerieGetFirstDate(JNIEnv *env, jobject, jstring varname) {
1806    borrarMensajes();
1807    const char *ccname = env->GetStringUTFChars(varname, NULL);
1808    BSyntaxObject *bso = GraSerie()->EvaluateExpr(ccname);
1809    if (bso != NULL) {
1810        BUserTimeSerie *bs = Tsr(bso);
1811        BDate date = bs->FirstDate();
1812        int year = date.Year();
1813        int month = date.Month();
1814        int day = date.Day();
1815        int hour = date.Hour();
1816        int minute = date.Minute();
1817        double second = date.Second();
1818        jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1819        jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
1820        jobject tdate = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
1821        return tdate;
1822    } else {
1823        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1824        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1825        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
1826        jobject e = env->NewObject(eclass, einit, 2, msg);
1827        return e;
1828    }
1829}
1830
1831/*
1832 * Class:     com_hcarralero_toljava_TOLMachine
1833 * Method:    nativeGetLastDateSerie
1834 * Signature: (Ljava/lang/String;)Ljava/lang/Object;
1835 */
1836JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSerieGetLastDate(JNIEnv *env, jobject, jstring varname) {
1837    borrarMensajes();
1838    const char *ccname = env->GetStringUTFChars(varname, NULL);
1839    BSyntaxObject *bso = GraSerie()->EvaluateExpr(ccname);
1840    if (bso != NULL) {
1841        BUserTimeSerie *bs = Tsr(bso);
1842        BDate date = bs->LastDate();
1843        int year = date.Year();
1844        int month = date.Month();
1845        int day = date.Day();
1846        int hour = date.Hour();
1847        int minute = date.Minute();
1848        double second = date.Second();
1849        jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1850        jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
1851        jobject tdate = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
1852        return tdate;
1853    } else {
1854        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1855        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1856        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
1857        jobject e = env->NewObject(eclass, einit, 2, msg);
1858        return e;
1859    }
1860}
1861
1862/*
1863 * Class:     com_hcarralero_toljava_TOLMachine
1864 * Method:    nativeGetTimeSetDates
1865 * Signature: (Ljava/lang/String;Lcom/hcarralero/toljava/TOLDate;I)[Ljava/lang/Object;
1866 */
1867JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeTimeSetGetDates(JNIEnv *env, jobject, jstring varname, jobject date, jint size)
1868{
1869    borrarMensajes();
1870    const char *ccname = env->GetStringUTFChars(varname, NULL);
1871    BSyntaxObject *bso = GraTimeSet()->EvaluateExpr(ccname);
1872    if (bso != NULL) {
1873        BUserTimeSet *bs = Tms(bso);
1874        if (bs == NULL) {
1875            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1876            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1877            jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
1878            jobject e = env->NewObject(eclass, einit, 2, msg);
1879            jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1880            env->SetObjectArrayElement(es, 0, e);
1881            return es;
1882        } else {
1883            jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1884            jmethodID mgetYear = env->GetMethodID(tdclass, "getYear", "()I");
1885            int year = env->CallIntMethod(date, mgetYear);
1886            jmethodID mgetMonth = env->GetMethodID(tdclass, "getMonth", "()I");
1887            int month = env->CallIntMethod(date, mgetMonth);
1888            jmethodID mgetDay = env->GetMethodID(tdclass, "getDay", "()I");
1889            int day = env->CallIntMethod(date, mgetDay);
1890            jmethodID mgetHour = env->GetMethodID(tdclass, "getHour", "()I");
1891            int hour = env->CallIntMethod(date, mgetHour);
1892            jmethodID mgetMinute = env->GetMethodID(tdclass, "getMinute", "()I");
1893            int minute = env->CallIntMethod(date, mgetMinute);
1894            jmethodID mgetSecond = env->GetMethodID(tdclass, "getSecond", "()D");
1895            double second = env->CallDoubleMethod(date, mgetSecond);
1896            BDate date;
1897            date.PutDate(year, month, day, hour, minute, second);
1898            if (!bs->Contain(date)) {
1899                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1900                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1901                jstring msg = env->NewStringUTF("Fecha NO VÁLIDA para el TimeSet");
1902                jobject e = env->NewObject(eclass, einit, 6, msg);
1903                jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1904                env->SetObjectArrayElement(es, 0, e);
1905                return es;
1906            } else {
1907                jobjectArray tds = env->NewObjectArray(size, tdclass, NULL);
1908                jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
1909                int i= 0;
1910                for (; i<size; ++i) {
1911                    int year = date.Year();
1912                    int month = date.Month();
1913                    int day = date.Day();
1914                    int hour = date.Hour();
1915                    int minute = date.Minute();
1916                    double second = date.Second();
1917                    jobject tdate = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
1918                    env->SetObjectArrayElement(tds, i, tdate);
1919                    date= bs->Successor(date);
1920                    if (date==BDate::End()) {
1921                        break;
1922                    }
1923                }
1924                if (i<size) {
1925                    size= i;
1926                    jobjectArray tdsa = env->NewObjectArray(size, tdclass, NULL);
1927                    for (i= 0; i<size; ++i) {
1928                        jobject tdate= env->GetObjectArrayElement(tds, i);
1929                        env->SetObjectArrayElement(tdsa, i, tdate);
1930                    }
1931                    env->DeleteLocalRef(tds);
1932                    return tdsa;
1933                } else {
1934                    return tds;
1935                }
1936            }
1937        }
1938    } else {
1939        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1940        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1941        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
1942        jobject e = env->NewObject(eclass, einit, 2, msg);
1943        jobjectArray es = env->NewObjectArray(1, eclass, NULL);
1944        env->SetObjectArrayElement(es, 0, e);
1945        return es;
1946    }
1947}
1948
1949/*
1950 * Class:     com_hcarralero_toljava_TOLMachine
1951 * Method:    nativeTimeSetGetPrevDate
1952 * Signature: (Ljava/lang/String;Lcom/hcarralero/toljava/TOLDate;)Ljava/lang/Object;
1953 */
1954JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeTimeSetGetPrevDate(JNIEnv *env, jobject, jstring varname, jobject date)
1955{
1956    borrarMensajes();
1957    const char *ccname = env->GetStringUTFChars(varname, NULL);
1958    BSyntaxObject *bso = GraTimeSet()->EvaluateExpr(ccname);
1959    if (bso != NULL) {
1960        BUserTimeSet *bs = Tms(bso);
1961        if (bs == NULL) {
1962            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
1963            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
1964            jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
1965            jobject e = env->NewObject(eclass, einit, 2, msg);
1966            return e;
1967        } else {
1968            jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
1969            jmethodID mgetYear = env->GetMethodID(tdclass, "getYear", "()I");
1970            int year = env->CallIntMethod(date, mgetYear);
1971            jmethodID mgetMonth = env->GetMethodID(tdclass, "getMonth", "()I");
1972            int month = env->CallIntMethod(date, mgetMonth);
1973            jmethodID mgetDay = env->GetMethodID(tdclass, "getDay", "()I");
1974            int day = env->CallIntMethod(date, mgetDay);
1975            jmethodID mgetHour = env->GetMethodID(tdclass, "getHour", "()I");
1976            int hour = env->CallIntMethod(date, mgetHour);
1977            jmethodID mgetMinute = env->GetMethodID(tdclass, "getMinute", "()I");
1978            int minute = env->CallIntMethod(date, mgetMinute);
1979            jmethodID mgetSecond = env->GetMethodID(tdclass, "getSecond", "()D");
1980            double second = env->CallDoubleMethod(date, mgetSecond);
1981            BDate date;
1982            date.PutDate(year, month, day, hour, minute, second);
1983            BDate pdate= bs->Predecessor(date);
1984            if (pdate==BDate::Begin()) {
1985                jfieldID fidBD= env->GetStaticFieldID(tdclass, "BEGIN_DATE", "Lcom/hcarralero/TOLDate;");
1986                jobject tdate= env->GetStaticObjectField(tdclass, fidBD);
1987                return tdate;
1988            } else {
1989                int year = pdate.Year();
1990                int month = pdate.Month();
1991                int day = pdate.Day();
1992                int hour = pdate.Hour();
1993                int minute = pdate.Minute();
1994                double second = pdate.Second();
1995                jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
1996                jobject tdate = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
1997                return tdate;
1998            }
1999        }
2000    } else {
2001        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2002        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2003        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
2004        jobject e = env->NewObject(eclass, einit, 2, msg);
2005        return e;
2006    }
2007}
2008
2009/*
2010 * Class:     com_hcarralero_toljava_TOLMachine
2011 * Method:    nativeTimeSetGetNextDate
2012 * Signature: (Ljava/lang/String;Lcom/hcarralero/toljava/TOLDate;)Ljava/lang/Object;
2013 */
2014JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeTimeSetGetNextDate(JNIEnv *env, jobject, jstring varname, jobject date)
2015{
2016    borrarMensajes();
2017    const char *ccname = env->GetStringUTFChars(varname, NULL);
2018    BSyntaxObject *bso = GraTimeSet()->EvaluateExpr(ccname);
2019    if (bso != NULL) {
2020        BUserTimeSet *bs = Tms(bso);
2021        if (bs == NULL) {
2022            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2023            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2024            jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
2025            jobject e = env->NewObject(eclass, einit, 2, msg);
2026            return e;
2027        } else {
2028            jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
2029            jmethodID mgetYear = env->GetMethodID(tdclass, "getYear", "()I");
2030            int year = env->CallIntMethod(date, mgetYear);
2031            jmethodID mgetMonth = env->GetMethodID(tdclass, "getMonth", "()I");
2032            int month = env->CallIntMethod(date, mgetMonth);
2033            jmethodID mgetDay = env->GetMethodID(tdclass, "getDay", "()I");
2034            int day = env->CallIntMethod(date, mgetDay);
2035            jmethodID mgetHour = env->GetMethodID(tdclass, "getHour", "()I");
2036            int hour = env->CallIntMethod(date, mgetHour);
2037            jmethodID mgetMinute = env->GetMethodID(tdclass, "getMinute", "()I");
2038            int minute = env->CallIntMethod(date, mgetMinute);
2039            jmethodID mgetSecond = env->GetMethodID(tdclass, "getSecond", "()D");
2040            double second = env->CallDoubleMethod(date, mgetSecond);
2041            BDate date;
2042            date.PutDate(year, month, day, hour, minute, second);
2043            BDate pdate= bs->Successor(date);
2044            if (pdate==BDate::End()) {
2045                jfieldID fidBD= env->GetStaticFieldID(tdclass, "END_DATE", "Lcom/hcarralero/TOLDate;");
2046                jobject tdate= env->GetStaticObjectField(tdclass, fidBD);
2047                return tdate;
2048            } else {
2049                int year = pdate.Year();
2050                int month = pdate.Month();
2051                int day = pdate.Day();
2052                int hour = pdate.Hour();
2053                int minute = pdate.Minute();
2054                double second = pdate.Second();
2055                jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
2056                jobject tdate = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
2057                return tdate;
2058            }
2059        }
2060    } else {
2061        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2062        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2063        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
2064        jobject e = env->NewObject(eclass, einit, 2, msg);
2065        return e;
2066    }
2067}
2068
2069/*
2070 * Class:     com_hcarralero_toljava_TOLMachine
2071 * Method:    nativeSetGetSize
2072 * Signature: (Ljava/lang/String;)Ljava/lang/Object;
2073 */
2074JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSetGetSize(JNIEnv *env, jobject, jstring varname)
2075{
2076    borrarMensajes();
2077    const char *ccname = env->GetStringUTFChars(varname, NULL);
2078    BSyntaxObject *bso = GraSet()->EvaluateExpr(ccname);
2079    if (bso != NULL) {
2080        BUserSet *bs = USet(bso);
2081        if (bs == NULL) {
2082            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2083            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2084            jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
2085            jobject e = env->NewObject(eclass, einit, 2, msg);
2086            return e;
2087        } else {
2088            int size= bs->Contens().Card();
2089            jclass iclass = env->FindClass("Ljava/lang/Integer;");
2090            jmethodID iinit = env->GetMethodID(iclass, "<init>", "(I)V");
2091            jobject o= env->NewObject(iclass, iinit, size);
2092            return o;
2093        }
2094    } else {
2095        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2096        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2097        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
2098        jobject e = env->NewObject(eclass, einit, 2, msg);
2099        return e;
2100    }
2101}
2102
2103/*
2104 * Class:     com_hcarralero_toljava_TOLMachine
2105 * Method:    nativeSetGetElement
2106 * Signature: (Ljava/lang/String;I)Ljava/lang/Object;
2107 */
2108JNIEXPORT jobject JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSetGetElement(JNIEnv *env, jobject tm, jstring varname, jint index)
2109{
2110    borrarMensajes();
2111    const char *ccname = env->GetStringUTFChars(varname, NULL);
2112    BSyntaxObject *bso = GraSet()->EvaluateExpr(ccname);
2113    if (bso != NULL) {
2114        BUserSet *bs = USet(bso);
2115        if (bs == NULL) {
2116            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2117            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2118            jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
2119            jobject e = env->NewObject(eclass, einit, 2, msg);
2120            return e;
2121        } else {
2122            int size= bs->Contens().Card();
2123            if (index<1||index>size) {
2124                jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2125                jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2126                jstring msg = env->NewStringUTF("Índice fuera de rango");
2127                jobject e = env->NewObject(eclass, einit, 2, msg);
2128                return e;
2129            } else {
2130                BSyntaxObject *bse= bs->Contens().GetElement(index);
2131                if (bse==NULL) {
2132                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2133                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2134                    jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
2135                    jobject e = env->NewObject(eclass, einit, 2, msg);
2136                    return e;
2137                } else {
2138                    jobject iset= NULL;
2139                    BUserText *btxt = UText(bse);
2140                    if (btxt != NULL) {
2141                        jclass ttclass = env->FindClass("Lcom/hcarralero/toljava/TOLText;");
2142                        jmethodID ttinit = env->GetMethodID(ttclass, "<init>", "(Ljava/lang/String;)V");
2143                        jstring ttvalue = env->NewStringUTF(btxt->Contens().String());
2144                        iset = env->NewObject(ttclass, ttinit, ttvalue);
2145                    } else  {
2146                        BUserDat *br = UDat(bse);
2147                        if (br != NULL) {
2148                            jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLReal;");
2149                            jmethodID trinit = env->GetMethodID(trclass, "<init>", "(D)V");
2150                            double trvalue = br->Contens().GetValue();
2151                            iset = env->NewObject(trclass, trinit, trvalue);
2152                        } else {
2153                            BUserDate *bd = UDate(bse);
2154                            if (bd != NULL) {
2155                                jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
2156                                jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
2157                                BDate date = bd->Contens();
2158                                int year = date.Year();
2159                                int month = date.Month();
2160                                int day = date.Day();
2161                                int hour = date.Hour();
2162                                int minute = date.Minute();
2163                                double second = date.Second();
2164                                iset = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
2165                            } else {
2166                                BUserCmp *bc = UCmp(bse);
2167                                if (bc != NULL) {
2168                                    jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLComplex;");
2169                                    jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(DD)V");
2170                                    double x = bc->Contens().X().GetValue();
2171                                    double y = bc->Contens().Y().GetValue();
2172                                    iset = env->NewObject(tcclass, tcinit, x, y);
2173                                } else {
2174                                    BUserMat *bmat = UMat(bse);
2175                                    if (bmat != NULL) {
2176                                        jclass tmclass = env->FindClass("Lcom/hcarralero/toljava/TOLMatrix;");
2177                                        jmethodID tminit = NULL;
2178                                        BMatrix<BDat> mat = bmat->Contens();
2179                                        int rows = mat.Rows();
2180                                        int columns = mat.Columns();
2181                                        if (rows <= 0 || columns <= 0) {
2182                                            tminit = env->GetMethodID(tmclass, "<init>", "()V");
2183                                            iset = env->NewObject(tmclass, tminit);
2184                                        } else {
2185                                            tminit = env->GetMethodID(tmclass, "<init>", "([[D)V");
2186                                            BArray<BDat> vals = mat.Data();
2187                                            jclass adclass = env->FindClass("[D");
2188                                            jobjectArray tmvalues = env->NewObjectArray(rows, adclass, NULL);
2189                                            for (int r = 0; r < rows; ++r) {
2190                                                jdoubleArray arrayRow = env->NewDoubleArray(columns);
2191                                                jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
2192                                                for (int c = 0; c < columns; ++c) {
2193                                                    valuesRow[c] = vals[r * columns + c].Value();
2194                                                }
2195                                                env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
2196                                                env->SetObjectArrayElement(tmvalues, r, arrayRow);
2197                                            }
2198                                            iset = env->NewObject(tmclass, tminit, tmvalues);
2199                                        }
2200                                    } else {
2201                                        BUserVMat *bvmat = UVMat(bse);
2202                                        if (bvmat != NULL) {
2203                                            jclass tvmclass = env->FindClass("Lcom/hcarralero/toljava/TOLVMatrix;");
2204                                            jmethodID tvminit = NULL;
2205                                            BVMat vmat = bvmat->Contens();
2206                                            int rows = vmat.Rows();
2207                                            int columns = vmat.Columns();
2208                                            if (rows <= 0 || columns <= 0) {
2209                                                tvminit = env->GetMethodID(tvmclass, "<init>", "()V");
2210                                                iset = env->NewObject(tvmclass, tvminit);
2211                                            } else {
2212                                                tvminit = env->GetMethodID(tvmclass, "<init>", "([[D)V");
2213                                                BMatrix<double> mat = vmat.GetDMat();
2214                                                BArray<double> vals = mat.Data();
2215                                                jclass adclass = env->FindClass("[D");
2216                                                jobjectArray tvmvalues = env->NewObjectArray(rows, adclass, NULL);
2217                                                for (int r = 0; r < rows; ++r) {
2218                                                    jdoubleArray arrayRow = env->NewDoubleArray(columns);
2219                                                    jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
2220                                                    for (int c = 0; c < columns; ++c) {
2221                                                        valuesRow[c] = vals[r * columns + c];
2222                                                    }
2223                                                    env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
2224                                                    env->SetObjectArrayElement(tvmvalues, r, arrayRow);
2225                                                }
2226                                                iset = env->NewObject(tvmclass, tvminit, tvmvalues);
2227                                            }
2228                                        } else {
2229                                            BUserPol *bp = UPol(bse);
2230                                            if (bp != NULL) {
2231                                                jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
2232                                                jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
2233                                                BPolyn<BDat> pol = bp->Contens();
2234                                                int nt = pol.Size();
2235                                                jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
2236                                                iset = env->NewObject(tpclass, tpinit);
2237                                                for (int i = 0; i < nt; ++i) {
2238                                                    BMonome<BDat> bm = pol[i];
2239                                                    int var = 0;
2240                                                    int grade = bm.Degree();
2241                                                    if (grade < 0) {
2242                                                        grade = -grade;
2243                                                        var = 1;
2244                                                    }
2245                                                    double coef = bm.Coef().GetValue();
2246                                                    env->CallVoidMethod(iset, maddTerm, var, coef, grade);
2247                                                }
2248                                            } else {
2249                                                BUserRat *br = URat(bse);
2250                                                if (br != NULL) {
2251                                                    BRational<BDat> rat = br->Contens();
2252                                                    jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLRatio;");
2253                                                    jmethodID trinit = env->GetMethodID(trclass, "<init>", "(Lcom/hcarralero/toljava/TOLPolyn;Lcom/hcarralero/toljava/TOLPolyn;)V");
2254                                                    jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
2255                                                    jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
2256                                                    BPolyn<BDat> pnum = rat.Numerator();
2257                                                    int nt = pnum.Size();
2258                                                    jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
2259                                                    jobject valueNum = env->NewObject(tpclass, tpinit);
2260                                                    for (int i = 0; i < nt; ++i) {
2261                                                        BMonome<BDat> bmnum = pnum[i];
2262                                                        int var = 0;
2263                                                        int grade = bmnum.Degree();
2264                                                        if (grade < 0) {
2265                                                            grade = -grade;
2266                                                            var = 1;
2267                                                        }
2268                                                        double coef = bmnum.Coef().GetValue();
2269                                                        env->CallVoidMethod(valueNum, maddTerm, var, coef, grade);
2270                                                    }
2271                                                    BPolyn<BDat> pden = rat.Denominator();
2272                                                    nt = pden.Size();
2273                                                    jobject valueDen = env->NewObject(tpclass, tpinit);
2274                                                    for (int i = 0; i < nt; ++i) {
2275                                                        BMonome<BDat> bmden = pden[i];
2276                                                        int var = 0;
2277                                                        int grade = bmden.Degree();
2278                                                        if (grade < 0) {
2279                                                            grade = -grade;
2280                                                            var = 1;
2281                                                        }
2282                                                        double coef = bmden.Coef().GetValue();
2283                                                        env->CallVoidMethod(valueDen, maddTerm, var, coef, grade);
2284                                                    }
2285                                                    iset = env->NewObject(trclass, trinit, valueNum, valueDen);
2286                                                } else {
2287                                                    BUserCode *bc = UCode(bse);
2288                                                    if (bc != NULL) {
2289                                                        jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLCode;");
2290                                                        jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
2291                                                        BCode cod = bc->Contens();
2292                                                        jstring name = env->NewStringUTF(cod.Name().String());
2293                                                        jstring info = env->NewStringUTF(cod.Info().String());
2294                                                        iset = env->NewObject(tcclass, tcinit, name, info);
2295                                                    } else {
2296                                                        BUserTimeSerie *bs = Tsr(bse);
2297                                                        if (bs != NULL) {
2298                                                            jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSerie;");
2299                                                            jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
2300                                                            char *cvname= (char *)malloc(strlen(ccname)+6);
2301                                                            if (cvname!=NULL) {
2302                                                                sprintf(cvname, "%s[%d]", ccname, index);
2303                                                                jstring vn = env->NewStringUTF(cvname);
2304                                                                iset = env->NewObject(tsclass, tsinit, tm, vn);
2305                                                            }
2306                                                        } else {
2307                                                            BUserTimeSet *bt = Tms(bse);
2308                                                            if (bt != NULL) {
2309                                                                jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRTimeSet;");
2310                                                                jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
2311                                                                char *cvname= (char *)malloc(strlen(ccname)+6);
2312                                                                if (cvname!=NULL) {
2313                                                                    sprintf(cvname, "%s[%d]", ccname, index);
2314                                                                    jstring vn = env->NewStringUTF(cvname);
2315                                                                    iset = env->NewObject(tsclass, tsinit, tm, vn);
2316                                                                }
2317                                                            } else {
2318                                                                BUserSet *bs = USet(bso);
2319                                                                if (bs != NULL) {
2320                                                                    jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSet;");
2321                                                                    jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
2322                                                                    char *cvname= (char *)malloc(strlen(ccname)+6);
2323                                                                    if (cvname!=NULL) {
2324                                                                        sprintf(cvname, "%s[%d]", ccname, index);
2325                                                                        jstring vn = env->NewStringUTF(cvname);
2326                                                                        iset = env->NewObject(tsclass, tsinit, tm, vn);
2327                                                                    }
2328                                                                }
2329                                                            }
2330                                                        }
2331                                                    }
2332                                                }
2333                                            }
2334                                        }
2335                                    }
2336                                }
2337                            }
2338                        }
2339                    }
2340                    if (iset == NULL) {
2341                        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2342                        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2343                        jstring msg = env->NewStringUTF("Error DESCONOCIDO");
2344                        jobject e = env->NewObject(eclass, einit, 4, msg);
2345                        return e;
2346                    } else {
2347                        return iset;
2348                    }
2349                }
2350            }
2351        }
2352    } else {
2353        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2354        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2355        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
2356        jobject e = env->NewObject(eclass, einit, 2, msg);
2357        return e;
2358    }
2359}
2360
2361/*
2362 * Class:     com_hcarralero_toljava_TOLMachine
2363 * Method:    nativeSetGetElements
2364 * Signature: (Ljava/lang/String;)[Ljava/lang/Object;
2365 */
2366JNIEXPORT jobjectArray JNICALL Java_com_hcarralero_toljava_TOLMachine_nativeSetGetElements(JNIEnv *env, jobject tm, jstring varname)
2367{
2368    borrarMensajes();
2369    const char *ccname = env->GetStringUTFChars(varname, NULL);
2370    BSyntaxObject *bso = GraSet()->EvaluateExpr(ccname);
2371    if (bso != NULL) {
2372        BUserSet *bs = USet(bso);
2373        if (bs == NULL) {
2374            jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2375            jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2376            jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
2377            jobject e = env->NewObject(eclass, einit, 2, msg);
2378            jobjectArray es = env->NewObjectArray(1, eclass, NULL);
2379            env->SetObjectArrayElement(es, 0, e);
2380            return es;
2381        } else {
2382            int size= bs->Contens().Card();
2383            jclass toclass = env->FindClass("Lcom/hcarralero/toljava/TOLObject;");
2384            jobjectArray tovalues = env->NewObjectArray(size, toclass, NULL);
2385            for (int i= 0; i<size; ++i) {
2386                BSyntaxObject *bse= bs->Contens().GetElement(i+1);
2387                if (bse==NULL) {
2388                    jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2389                    jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2390                    jstring msg = env->NewStringUTF("ERROR DESCONOCIDO");
2391                    jobject e = env->NewObject(eclass, einit, 2, msg);
2392                    env->SetObjectArrayElement(tovalues, 0, e);
2393                    return tovalues;
2394                } else {
2395                    jobject iset= NULL;
2396                    BUserText *btxt = UText(bse);
2397                    if (btxt != NULL) {
2398                        jclass ttclass = env->FindClass("Lcom/hcarralero/toljava/TOLText;");
2399                        jmethodID ttinit = env->GetMethodID(ttclass, "<init>", "(Ljava/lang/String;)V");
2400                        jstring ttvalue = env->NewStringUTF(btxt->Contens().String());
2401                        iset = env->NewObject(ttclass, ttinit, ttvalue);
2402                    } else  {
2403                        BUserDat *br = UDat(bse);
2404                        if (br != NULL) {
2405                            jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLReal;");
2406                            jmethodID trinit = env->GetMethodID(trclass, "<init>", "(D)V");
2407                            double trvalue = br->Contens().GetValue();
2408                            iset = env->NewObject(trclass, trinit, trvalue);
2409                        } else {
2410                            BUserDate *bd = UDate(bse);
2411                            if (bd != NULL) {
2412                                jclass tdclass = env->FindClass("Lcom/hcarralero/toljava/TOLDate;");
2413                                jmethodID tdinit = env->GetMethodID(tdclass, "<init>", "(IIIIID)V");
2414                                BDate date = bd->Contens();
2415                                int year = date.Year();
2416                                int month = date.Month();
2417                                int day = date.Day();
2418                                int hour = date.Hour();
2419                                int minute = date.Minute();
2420                                double second = date.Second();
2421                                iset = env->NewObject(tdclass, tdinit, year, month, day, hour, minute, second);
2422                            } else {
2423                                BUserCmp *bc = UCmp(bse);
2424                                if (bc != NULL) {
2425                                    jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLComplex;");
2426                                    jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(DD)V");
2427                                    double x = bc->Contens().X().GetValue();
2428                                    double y = bc->Contens().Y().GetValue();
2429                                    iset = env->NewObject(tcclass, tcinit, x, y);
2430                                } else {
2431                                    BUserMat *bmat = UMat(bse);
2432                                    if (bmat != NULL) {
2433                                        jclass tmclass = env->FindClass("Lcom/hcarralero/toljava/TOLMatrix;");
2434                                        jmethodID tminit = NULL;
2435                                        BMatrix<BDat> mat = bmat->Contens();
2436                                        int rows = mat.Rows();
2437                                        int columns = mat.Columns();
2438                                        if (rows <= 0 || columns <= 0) {
2439                                            tminit = env->GetMethodID(tmclass, "<init>", "()V");
2440                                            iset = env->NewObject(tmclass, tminit);
2441                                        } else {
2442                                            tminit = env->GetMethodID(tmclass, "<init>", "([[D)V");
2443                                            BArray<BDat> vals = mat.Data();
2444                                            jclass adclass = env->FindClass("[D");
2445                                            jobjectArray tmvalues = env->NewObjectArray(rows, adclass, NULL);
2446                                            for (int r = 0; r < rows; ++r) {
2447                                                jdoubleArray arrayRow = env->NewDoubleArray(columns);
2448                                                jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
2449                                                for (int c = 0; c < columns; ++c) {
2450                                                    valuesRow[c] = vals[r * columns + c].Value();
2451                                                }
2452                                                env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
2453                                                env->SetObjectArrayElement(tmvalues, r, arrayRow);
2454                                            }
2455                                            iset = env->NewObject(tmclass, tminit, tmvalues);
2456                                        }
2457                                    } else {
2458                                        BUserVMat *bvmat = UVMat(bse);
2459                                        if (bvmat != NULL) {
2460                                            jclass tvmclass = env->FindClass("Lcom/hcarralero/toljava/TOLVMatrix;");
2461                                            jmethodID tvminit = NULL;
2462                                            BVMat vmat = bvmat->Contens();
2463                                            int rows = vmat.Rows();
2464                                            int columns = vmat.Columns();
2465                                            if (rows <= 0 || columns <= 0) {
2466                                                tvminit = env->GetMethodID(tvmclass, "<init>", "()V");
2467                                                iset = env->NewObject(tvmclass, tvminit);
2468                                            } else {
2469                                                tvminit = env->GetMethodID(tvmclass, "<init>", "([[D)V");
2470                                                BMatrix<double> mat = vmat.GetDMat();
2471                                                BArray<double> vals = mat.Data();
2472                                                jclass adclass = env->FindClass("[D");
2473                                                jobjectArray tvmvalues = env->NewObjectArray(rows, adclass, NULL);
2474                                                for (int r = 0; r < rows; ++r) {
2475                                                    jdoubleArray arrayRow = env->NewDoubleArray(columns);
2476                                                    jdouble *valuesRow = env->GetDoubleArrayElements(arrayRow, NULL);
2477                                                    for (int c = 0; c < columns; ++c) {
2478                                                        valuesRow[c] = vals[r * columns + c];
2479                                                    }
2480                                                    env->SetDoubleArrayRegion(arrayRow, 0, columns, valuesRow);
2481                                                    env->SetObjectArrayElement(tvmvalues, r, arrayRow);
2482                                                }
2483                                                iset = env->NewObject(tvmclass, tvminit, tvmvalues);
2484                                            }
2485                                        } else {
2486                                            BUserPol *bp = UPol(bse);
2487                                            if (bp != NULL) {
2488                                                jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
2489                                                jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
2490                                                BPolyn<BDat> pol = bp->Contens();
2491                                                int nt = pol.Size();
2492                                                jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
2493                                                iset = env->NewObject(tpclass, tpinit);
2494                                                for (int j = 0; j < nt; ++j) {
2495                                                    BMonome<BDat> bm = pol[j];
2496                                                    int var = 0;
2497                                                    int grade = bm.Degree();
2498                                                    if (grade < 0) {
2499                                                        grade = -grade;
2500                                                        var = 1;
2501                                                    }
2502                                                    double coef = bm.Coef().GetValue();
2503                                                    env->CallVoidMethod(iset, maddTerm, var, coef, grade);
2504                                                }
2505                                            } else {
2506                                                BUserRat *br = URat(bse);
2507                                                if (br != NULL) {
2508                                                    BRational<BDat> rat = br->Contens();
2509                                                    jclass trclass = env->FindClass("Lcom/hcarralero/toljava/TOLRatio;");
2510                                                    jmethodID trinit = env->GetMethodID(trclass, "<init>", "(Lcom/hcarralero/toljava/TOLPolyn;Lcom/hcarralero/toljava/TOLPolyn;)V");
2511                                                    jclass tpclass = env->FindClass("Lcom/hcarralero/toljava/TOLPolyn;");
2512                                                    jmethodID tpinit = env->GetMethodID(tpclass, "<init>", "()V");
2513                                                    BPolyn<BDat> pnum = rat.Numerator();
2514                                                    int nt = pnum.Size();
2515                                                    jmethodID maddTerm = env->GetMethodID(tpclass, "addTerm", "(IDI)V");
2516                                                    jobject valueNum = env->NewObject(tpclass, tpinit);
2517                                                    for (int j = 0; j < nt; ++j) {
2518                                                        BMonome<BDat> bmnum = pnum[j];
2519                                                        int var = 0;
2520                                                        int grade = bmnum.Degree();
2521                                                        if (grade < 0) {
2522                                                            grade = -grade;
2523                                                            var = 1;
2524                                                        }
2525                                                        double coef = bmnum.Coef().GetValue();
2526                                                        env->CallVoidMethod(valueNum, maddTerm, var, coef, grade);
2527                                                    }
2528                                                    BPolyn<BDat> pden = rat.Denominator();
2529                                                    nt = pden.Size();
2530                                                    jobject valueDen = env->NewObject(tpclass, tpinit);
2531                                                    for (int j = 0; j < nt; ++j) {
2532                                                        BMonome<BDat> bmden = pden[j];
2533                                                        int var = 0;
2534                                                        int grade = bmden.Degree();
2535                                                        if (grade < 0) {
2536                                                            grade = -grade;
2537                                                            var = 1;
2538                                                        }
2539                                                        double coef = bmden.Coef().GetValue();
2540                                                        env->CallVoidMethod(valueDen, maddTerm, var, coef, grade);
2541                                                    }
2542                                                    iset = env->NewObject(trclass, trinit, valueNum, valueDen);
2543                                                } else {
2544                                                    BUserCode *bc = UCode(bse);
2545                                                    if (bc != NULL) {
2546                                                        jclass tcclass = env->FindClass("Lcom/hcarralero/toljava/TOLCode;");
2547                                                        jmethodID tcinit = env->GetMethodID(tcclass, "<init>", "(Ljava/lang/String;Ljava/lang/String;)V");
2548                                                        BCode cod = bc->Contens();
2549                                                        jstring name = env->NewStringUTF(cod.Name().String());
2550                                                        jstring info = env->NewStringUTF(cod.Info().String());
2551                                                        iset = env->NewObject(tcclass, tcinit, name, info);
2552                                                    } else {
2553                                                        BUserTimeSerie *bs = Tsr(bse);
2554                                                        if (bs != NULL) {
2555                                                            jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSerie;");
2556                                                            jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
2557                                                            char *cvname= (char *)malloc(strlen(ccname)+6);
2558                                                            if (cvname!=NULL) {
2559                                                                sprintf(cvname, "%s[%d]", ccname, i+1);
2560                                                                jstring vn = env->NewStringUTF(cvname);
2561                                                                iset = env->NewObject(tsclass, tsinit, tm, vn);
2562                                                            }
2563                                                        } else {
2564                                                            BUserTimeSet *bt = Tms(bse);
2565                                                            if (bt != NULL) {
2566                                                                jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRTimeSet;");
2567                                                                jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
2568                                                                char *cvname= (char *)malloc(strlen(ccname)+6);
2569                                                                if (cvname!=NULL) {
2570                                                                    sprintf(cvname, "%s[%d]", ccname, i+1);
2571                                                                    jstring vn = env->NewStringUTF(cvname);
2572                                                                    iset = env->NewObject(tsclass, tsinit, tm, vn);
2573                                                                }
2574                                                            } else {
2575                                                                BUserSet *bs = USet(bse);
2576                                                                if (bs != NULL) {
2577                                                                    jclass tsclass = env->FindClass("Lcom/hcarralero/toljava/TOLRSet;");
2578                                                                    jmethodID tsinit = env->GetMethodID(tsclass, "<init>", "(Lcom/hcarralero/toljava/TOLMachine;Ljava/lang/String;)V");
2579                                                                    char *cvname= (char *)malloc(strlen(ccname)+6);
2580                                                                    if (cvname!=NULL) {
2581                                                                        sprintf(cvname, "%s[%d]", ccname, i+1);
2582                                                                        jstring vn = env->NewStringUTF(cvname);
2583                                                                        iset = env->NewObject(tsclass, tsinit, tm, vn);
2584                                                                    }
2585                                                                }
2586                                                            }
2587                                                        }
2588                                                    }
2589                                                }
2590                                            }
2591                                        }
2592                                    }
2593                                }
2594                            }
2595                        }
2596                        env->SetObjectArrayElement(tovalues, i, iset);
2597                    }
2598                }
2599            }
2600            return tovalues;
2601        }
2602    } else {
2603        jclass eclass = env->FindClass("Lcom/hcarralero/toljava/TOLMachineException;");
2604        jmethodID einit = env->GetMethodID(eclass, "<init>", "(ILjava/lang/String;)V");
2605        jstring msg = env->NewStringUTF("Variable NO ENCONTRADA");
2606        jobject e = env->NewObject(eclass, einit, 2, msg);
2607        jobjectArray es = env->NewObjectArray(1, eclass, NULL);
2608        env->SetObjectArrayElement(es, 0, e);
2609        return es;
2610    }
2611}
Note: See TracBrowser for help on using the repository browser.