From b55b34f78a602964d0e4d106a7e8982c4c4273b1 Mon Sep 17 00:00:00 2001 From: Orion Poplawski Date: Jun 03 2010 15:10:46 +0000 Subject: - Update to today's cvs - Drop GLDLexer and python patches - BR antlr-C++ on Fedora 14+ --- diff --git a/gdl-0.9rc4-GDLLexer.patch b/gdl-0.9rc4-GDLLexer.patch deleted file mode 100644 index be0cb25..0000000 --- a/gdl-0.9rc4-GDLLexer.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- gdl-0.9rc4/src/widget.cpp.GDLLexer 2010-02-02 11:13:51.000000000 -0700 -+++ gdl-0.9rc4/src/widget.cpp 2010-02-04 08:41:11.835418064 -0700 -@@ -589,7 +589,7 @@ - - RefDNode theAST; - -- GDLLexer lexer(istr, ""); -+ GDLLexer lexer(istr, "", GDLParser::NONE); - GDLParser& parser = lexer.Parser(); - parser.interactive(); - diff --git a/gdl-0.9rc4-cvs.patch b/gdl-0.9rc4-cvs.patch new file mode 100644 index 0000000..c2af6d0 --- /dev/null +++ b/gdl-0.9rc4-cvs.patch @@ -0,0 +1,52158 @@ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/config.h.in cvs/gdl/config.h.in +--- gdl-0.9rc4/config.h.in 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/config.h.in 2010-05-21 10:23:52.639905982 -0600 +@@ -12,6 +12,9 @@ + /* Define to 1 if you have the header file. */ + #undef HAVE_DLFCN_H + ++/* Define to 1 if you have the header file. */ ++#undef HAVE_GSHHS_H ++ + /* Define to 1 if you have the header file. */ + #undef HAVE_INTTYPES_H + +@@ -136,6 +139,9 @@ + /* Define if you want to use GRIB */ + #undef USE_GRIB + ++/* Define if you want to use GSHHS */ ++#undef USE_GSHHS ++ + /* Define if you want to use HDF */ + #undef USE_HDF + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/configure cvs/gdl/configure +--- gdl-0.9rc4/configure 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/configure 2010-04-16 11:22:42.000000000 -0600 +@@ -1,6 +1,6 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.65 for gdl 0.9rc4. ++# Generated by GNU Autoconf 2.65 for gdl 0.9rc4 CVS. + # + # + # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +@@ -698,8 +698,8 @@ + # Identity of this package. + PACKAGE_NAME='gdl' + PACKAGE_TARNAME='gdl' +-PACKAGE_VERSION='0.9rc4' +-PACKAGE_STRING='gdl 0.9rc4' ++PACKAGE_VERSION='0.9rc4 CVS' ++PACKAGE_STRING='gdl 0.9rc4 CVS' + PACKAGE_BUGREPORT='' + PACKAGE_URL='' + +@@ -1455,7 +1455,7 @@ + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures gdl 0.9rc4 to adapt to many kinds of systems. ++\`configure' configures gdl 0.9rc4 CVS to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -1529,7 +1529,7 @@ + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of gdl 0.9rc4:";; ++ short | recursive ) echo "Configuration of gdl 0.9rc4 CVS:";; + esac + cat <<\_ACEOF + +@@ -1653,7 +1653,7 @@ + test -n "$ac_init_help" && exit $ac_status + if $ac_init_version; then + cat <<\_ACEOF +-gdl configure 0.9rc4 ++gdl configure 0.9rc4 CVS + generated by GNU Autoconf 2.65 + + Copyright (C) 2009 Free Software Foundation, Inc. +@@ -2237,7 +2237,7 @@ + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by gdl $as_me 0.9rc4, which was ++It was created by gdl $as_me 0.9rc4 CVS, which was + generated by GNU Autoconf 2.65. Invocation command line was + + $ $0 $@ +@@ -2597,7 +2597,7 @@ + if test "x$with_netcdf" = "x"; then with_netcdf=yes; fi + if test "x$with_hdf" = "x"; then with_hdf=yes; fi + if test "x$with_hdf5" = "x"; then with_hdf5=yes; fi +-if test "x$with_fftw" = "x"; then with_fftw=no; fi ++if test "x$with_fftw" = "x"; then with_fftw=auto; fi + if test "x$with_libproj4" = "x"; then with_libproj4=no; fi + if test "x$with_mpich" = "x"; then with_mpich=no; fi + if test "x$with_python" = "x"; then with_python=yes; fi +@@ -3068,7 +3068,7 @@ + + # Define the identity of the package. + PACKAGE='gdl' +- VERSION='0.9rc4' ++ VERSION='0.9rc4 CVS' + + + cat >>confdefs.h <<_ACEOF +@@ -14579,6 +14579,66 @@ + ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 ++$as_echo_n "checking for library containing dlopen... " >&6; } ++if test "${ac_cv_search_dlopen+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_func_search_save_LIBS=$LIBS ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char dlopen (); ++int ++main () ++{ ++return dlopen (); ++ ; ++ return 0; ++} ++_ACEOF ++for ac_lib in '' dl; do ++ if test -z "$ac_lib"; then ++ ac_res="none required" ++ else ++ ac_res=-l$ac_lib ++ LIBS="-l$ac_lib $ac_func_search_save_LIBS" ++ fi ++ if ac_fn_cxx_try_link "$LINENO"; then : ++ ac_cv_search_dlopen=$ac_res ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext ++ if test "${ac_cv_search_dlopen+set}" = set; then : ++ break ++fi ++done ++if test "${ac_cv_search_dlopen+set}" = set; then : ++ ++else ++ ac_cv_search_dlopen=no ++fi ++rm conftest.$ac_ext ++LIBS=$ac_func_search_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 ++$as_echo "$ac_cv_search_dlopen" >&6; } ++ac_res=$ac_cv_search_dlopen ++if test "$ac_res" != no; then : ++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" ++ ++fi ++ ++if test x"$ac_cv_search_dlopen" = x-ldl; then ++LIBS="$LIBS -ldl" ++fi ++ + + # Check whether --enable-python_module was given. + if test "${enable_python_module+set}" = set; then : +@@ -14962,6 +15022,7 @@ + fi + + ++openmp_autodetected=no + if test "x$with_openmp" = "x"; then + for ac_header in "omp.h" + do : +@@ -14974,11 +15035,10 @@ + _ACEOF + + with_openmp=yes ++ openmp_autodetected=yes + echo "" + echo "OpenMP enabled (omp.h file was found)." + echo "Try --with-openmp=no if your compiler does not support it (e.g. GCC < 4.2)" +- echo "The warnings about unsigned iteration variable can be ignored." +- echo "See the README for details." + echo "" + + else +@@ -15170,6 +15230,7 @@ + LIBS="$LIBS -lplplotd -lplplotcxxd" + fi + ++ + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for plsexit in -lplplotcxxd" >&5 + $as_echo_n "checking for plsexit in -lplplotcxxd... " >&6; } + if test "${ac_cv_lib_plplotcxxd_plsexit+set}" = set; then : +@@ -15824,7 +15885,7 @@ + echo " Use --with-Magick=DIR to specify the ImageMagick directory tree" + echo " Use --with-Magick=no to not use it" + echo " Check the README or use configure --help for other libraries needed" +- echo " (--with-xxxdir = obligatory, --with-xxx = optional (--with-xxx=no to disable))" ++ echo " (--with-xxxdir = mandatory, --with-xxx = optional (--with-xxx=no to disable))" + exit -1 + + fi +@@ -16422,6 +16483,99 @@ + fi + + ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftw_malloc in -lfftw3" >&5 ++$as_echo_n "checking for fftw_malloc in -lfftw3... " >&6; } ++if test "${ac_cv_lib_fftw3_fftw_malloc+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lfftw3 $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char fftw_malloc (); ++int ++main () ++{ ++return fftw_malloc (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_cxx_try_link "$LINENO"; then : ++ ac_cv_lib_fftw3_fftw_malloc=yes ++else ++ ac_cv_lib_fftw3_fftw_malloc=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fftw3_fftw_malloc" >&5 ++$as_echo "$ac_cv_lib_fftw3_fftw_malloc" >&6; } ++if test "x$ac_cv_lib_fftw3_fftw_malloc" = x""yes; then : ++ ++ ++else ++ ++if test "x$with_fftw" = "xauto"; then with_fftw=no; fi ++ ++fi ++ ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fftwf_malloc in -lfftw3f" >&5 ++$as_echo_n "checking for fftwf_malloc in -lfftw3f... " >&6; } ++if test "${ac_cv_lib_fftw3f_fftwf_malloc+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lfftw3f $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char fftwf_malloc (); ++int ++main () ++{ ++return fftwf_malloc (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_cxx_try_link "$LINENO"; then : ++ ac_cv_lib_fftw3f_fftwf_malloc=yes ++else ++ ac_cv_lib_fftw3f_fftwf_malloc=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fftw3f_fftwf_malloc" >&5 ++$as_echo "$ac_cv_lib_fftw3f_fftwf_malloc" >&6; } ++if test "x$ac_cv_lib_fftw3f_fftwf_malloc" = x""yes; then : ++ ++if test "x$with_fftw" = "xauto"; then with_fftw=yes; fi ++ ++else ++ ++if test "x$with_fftw" = "xauto"; then with_fftw=no; fi ++ ++fi ++ ++ + + # Check whether --with-fftw was given. + if test "${with_fftw+set}" = set; then : +@@ -17174,6 +17328,10 @@ + LIBS="$LIBS -lsocket -lnsl" + ;; + ++ *cygwin* ) ++ LIBS="$LIBS -lrpc" ++ ;; ++ + esac + + case "${host}" in +@@ -17794,7 +17952,7 @@ + # report actual input values of CONFIG_FILES etc. instead of their + # values after options handling. + ac_log=" +-This file was extended by gdl $as_me 0.9rc4, which was ++This file was extended by gdl $as_me 0.9rc4 CVS, which was + generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES +@@ -17860,7 +18018,7 @@ + cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" + ac_cs_version="\\ +-gdl config.status 0.9rc4 ++gdl config.status 0.9rc4 CVS + configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +@@ -19872,7 +20030,9 @@ + Installation prefix: $prefix + C++ compiler: $CXX $CXXFLAGS + OpenMP support: `if test "x$with_openmp" = "xno"; +- then echo 'no'; else echo 'yes (use --with-openmp=no if your compiler does not support it)'; fi` ++ then echo 'no'; else echo 'yes'; fi` ++ Build type: `if test "x$PYTHON_MODULE" = "xyes"; ++ then echo 'library (Python module)'; else echo 'standalone (other: Python module)'; fi` + ----- optional libraries (consult README/INSTALL): --- + wxWidgets: `if test no = $with_wxWidgets; + then echo 'no (needs explicit enabling)'; else echo yes; fi` +@@ -19902,6 +20062,12 @@ + - SAVE and RESTORE procedures require *.pro files from + the CMSVLIB package (see README for details) + ------------------------------------------------------ ++`if test yes = $openmp_autodetected; then ++ echo '----- note on OpenMP support -------------------------' ++ echo ' OpenMP was autodetected, use --with-openmp=no if your' ++ echo ' compiler does not support it (e.g. GCC < 4.2)' ++ echo '------------------------------------------------------'; fi` + use 'make' to build and 'make install' to install GDL ++ (optional 'make check' tests the build - experimental) + " + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/configure.in cvs/gdl/configure.in +--- gdl-0.9rc4/configure.in 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/configure.in 2010-04-22 09:50:39.000000000 -0600 +@@ -1,4 +1,4 @@ +-AC_INIT(gdl, 0.9rc4) ++AC_INIT(gdl, 0.9rc4 CVS) + AC_CONFIG_MACRO_DIR([m4]) + + dnl == Configuration (of the configure script) ============ +@@ -18,10 +18,11 @@ + if test "x$with_netcdf" = "x"; then with_netcdf=yes; fi + if test "x$with_hdf" = "x"; then with_hdf=yes; fi + if test "x$with_hdf5" = "x"; then with_hdf5=yes; fi +-if test "x$with_fftw" = "x"; then with_fftw=no; fi ++if test "x$with_fftw" = "x"; then with_fftw=auto; fi + if test "x$with_libproj4" = "x"; then with_libproj4=no; fi + if test "x$with_mpich" = "x"; then with_mpich=no; fi + if test "x$with_python" = "x"; then with_python=yes; fi ++if test "x$with_gshhs" = "x"; then with_gshhs=no; fi + + dnl default DATADIR subdirectory + datasubdir="gnudatalanguage" +@@ -52,6 +53,11 @@ + AC_SUBST(HAVE_64BIT_OS) + AC_LANG_RESTORE + ++AC_SEARCH_LIBS([dlopen], [dl]) ++if test x"$ac_cv_search_dlopen" = x-ldl; then ++LIBS="$LIBS -ldl" ++fi ++ + dnl == Python module (calling GDL from Python) ============= + dnl ======================================================== + +@@ -183,14 +189,14 @@ + [with_openmp="$withval" ]) + + dnl default yes if omp.h found ++openmp_autodetected=no + if test "x$with_openmp" = "x"; then + AC_CHECK_HEADERS("omp.h", [ + with_openmp=yes ++ openmp_autodetected=yes + echo "" + echo "OpenMP enabled (omp.h file was found)." + echo "Try --with-openmp=no if your compiler does not support it (e.g. GCC < 4.2)" +- echo "The warnings about unsigned iteration variable can be ignored." +- echo "See the README for details." + echo "" + ], [ + with_openmp=no +@@ -288,6 +294,8 @@ + LIBS="$LIBS -lplplotd -lplplotcxxd" + fi + ++dnl LIBS="$LIBS /usr/local/lib/libplplotd.a /usr/local/lib/libplplotcxxd.a" ++ + AC_CHECK_LIB(plplotcxxd, plsexit, [AC_DEFINE([HAVE_LIBPLPLOTCXXD], [1], [plplot library])], + [ + echo "" +@@ -296,6 +304,20 @@ + exit -1 + ]) + ++if test "x$with_Magick" != "xno"; then ++ # https://sourceforge.net/tracker/index.php?func=detail&aid=2974380&group_id=97659&atid=618683 ++ AC_CHECK_LIB(plplotd, plGetDrvDir, [ ++ echo "" ++ echo "Warning! Dynamic drivers have to be disabled in plplot" ++ echo " to make plplot work with ImageMagic:" ++ echo " - use the -DENABLE_DYNDRIVERS=OFF cmake option when" ++ echo " compiling plplot to disable dynamic drivers in plplot, or" ++ echo " - use --with-Magick=no here to not use ImageMagick in GDL." ++ echo "" ++ ]) ++fi ++ ++ + dnl == wxWidgets =========================================== + dnl ======================================================== + +@@ -380,7 +402,7 @@ + echo " Use --with-Magick=DIR to specify the ImageMagick directory tree" + echo " Use --with-Magick=no to not use it" + echo " Check the README or use configure --help for other libraries needed" +- echo " (--with-xxxdir = obligatory, --with-xxx = optional (--with-xxx=no to disable))" ++ echo " (--with-xxxdir = mandatory, --with-xxx = optional (--with-xxx=no to disable))" + exit -1 + ]) + ] +@@ -547,6 +569,18 @@ + dnl == FFTW ================================================ + dnl ======================================================== + ++AC_CHECK_LIB(fftw3, fftw_malloc, [ ++dnl do nothing ++], [ ++if test "x$with_fftw" = "xauto"; then with_fftw=no; fi ++]) ++ ++AC_CHECK_LIB(fftw3f, fftwf_malloc, [ ++if test "x$with_fftw" = "xauto"; then with_fftw=yes; fi ++], [ ++if test "x$with_fftw" = "xauto"; then with_fftw=no; fi ++]) ++ + AC_ARG_WITH(fftw, + [ --with-fftw[=DIR] use FFTW package (with optional path DIR) ], + [with_fftw="$withval" ]) +@@ -832,6 +866,32 @@ + + fi + ++dnl == GSHHS =============================================== ++dnl ======================================================== ++ ++AC_ARG_WITH(gshhs, ++ [ --with-gshhs[=DIR] use GSHHS package (with optional path DIR) ], ++ [with_gshhs="$withval" ]) ++ ++if test "x$with_gshhs" != "xno"; then ++ if test "x$with_gshhs" != "xyes"; then ++ INCLUDES="$INCLUDES -I$with_gshhs/include" ++ fi ++ ++ AC_CHECK_HEADERS(gshhs.h, [ ++ AC_DEFINE([USE_GSHHS], [1], [Define if you want to use GSHHS]) ++ ], [ ++ echo "" ++ echo "Error! GSHHS is required but gshhs.h was not found" ++ echo " Use --with-gshhs=DIR to specify the GSHHS directory tree" ++ echo " Use --with-gshhs=no to not use it" ++ echo " Check the README or use configure --help for other libraries needed" ++ echo " (--with-xxxdir = obligatory, --with-xxx = optional (--with-xxx=no to disable))" ++ exit -1 ++ ]) ++ ++fi ++ + dnl == installation paths ================================== + dnl ======================================================== + +@@ -884,6 +944,10 @@ + LIBS="$LIBS -lsocket -lnsl" + ;; + ++ *cygwin* ) ++ LIBS="$LIBS -lrpc" ++ ;; ++ + dnl *) + dnl AC_MSG_ERROR(unknown system type ${host}.) + dnl ;; +@@ -1002,7 +1066,9 @@ + Installation prefix: $prefix + C++ compiler: $CXX $CXXFLAGS + OpenMP support: `if test "x$with_openmp" = "xno"; +- then echo 'no'; else echo 'yes (use --with-openmp=no if your compiler does not support it)'; fi` ++ then echo 'no'; else echo 'yes'; fi` ++ Build type: `if test "x$PYTHON_MODULE" = "xyes"; ++ then echo 'library (Python module)'; else echo 'standalone (other: Python module)'; fi` + ----- optional libraries (consult README/INSTALL): --- + wxWidgets: `if test no = $with_wxWidgets; + then echo 'no (needs explicit enabling)'; else echo yes; fi` +@@ -1026,13 +1092,21 @@ + then echo 'no (needs explicit enabling)'; else echo yes; fi` + GRIB: `if test no = $with_grib; + then echo 'no (needs explicit enabling)'; else echo yes; fi` ++ GSHHS: `if test no = $with_gshhs; ++ then echo 'no (see also MAP_INSTALL)'; else echo yes; fi` + ----- notes on auxiliary files: ---------------------- + - consult MAP_INSTALL for details concerning auxiliary + files needed for mapping support + - SAVE and RESTORE procedures require *.pro files from + the CMSVLIB package (see README for details) + ------------------------------------------------------ ++`if test yes = $openmp_autodetected; then ++ echo ' ----- note on OpenMP support -------------------------' ++ echo ' OpenMP was autodetected, use --with-openmp=no if your' ++ echo ' compiler does not support it (e.g. GCC < 4.2)' ++ echo ' ------------------------------------------------------'; fi` + use 'make' to build and 'make install' to install GDL ++ (optional 'make check' tests the build - experimental) + " + + dnl == EOF ================================================= +Only in gdl-0.9rc4/doc: Makefile +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/contribute.html cvs/gdl/doc/www/contribute.html +--- gdl-0.9rc4/doc/www/contribute.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/contribute.html 2010-01-20 15:20:40.000000000 -0700 +@@ -0,0 +1,30 @@ ++ ++GDL Contribute ++ ++ ++ ++ ++ ++

Contributions to GDL

++ ++

GDL is actively developed and has already a lot of functionality. ++But it is still in beta state as of November 2009. ++Even though it can already be used for many tasks, there are many ++things left to be done.
++Any contributions are very welcome. Currently contributions can be made in C/C++, GDL and python. ++See the files HACKING and PYHTON.txt in the GDL root directory.

++ ++

Urgent things to do are:

++
    ++
  • Library functions and procedures
  • ++
  • Porting GDL to other platforms
  • ++
  • Implementing GUI library functions
  • ++
  • Completing the graphical output system
  • ++
  • Testing and test routines written in GDL
  • ++
++ ++

++Please send your contributions using the trackers. ++

++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/credits.html cvs/gdl/doc/www/credits.html +--- gdl-0.9rc4/doc/www/credits.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/credits.html 2010-04-16 11:22:42.000000000 -0600 +@@ -0,0 +1,55 @@ ++ ++ ++ ++GDL credits ++ ++ ++ ++ ++ ++

Credits

++ ++

++Among many good folks who provided patches and valuable feedback: ++

++ ++

++Sylwester Arabas ++
++Library routines, testing, documentation, installation/portability issues ++

++ ++

++Alain Coulais ++
++Library routines, testing, documentation, presentations ++

++ ++

++Joel Gales ++
++Library routines (TV, FFT, HISTOGRAM, HDF support...) ++

++ ++

++Christopher Lee ++
++Library routines (ImageMagick, PLOTS, XYOUTS, netCDF support...) ++

++ ++

++Peter Messmer ++
++Library routines (STREGEXP, GET/SETENV, HDF5 file support...) ++

++ ++

++Marc Schellens ++(Project founder) ++
++Compiler, Interpreter, Library routines... ++

++ ++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/download.html cvs/gdl/doc/www/download.html +--- gdl-0.9rc4/doc/www/download.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/download.html 2010-04-16 11:22:42.000000000 -0600 +@@ -0,0 +1,69 @@ ++ ++ ++ ++Download GDL ++ ++ ++ ++ ++ ++

Download GDL

++ ++

++ GDL compiles "out of the box" on Linux, Mac OS X (since Panther) and several other UNIX systems ++ (see requirements for details). ++

++ ++

++ The source code distribution is available from the ++ SF.net project summary page. ++

++ ++

++ The latest development version of GDL can be obtained via CVS - consult the ++ SF.net project development page ++ for details. It is also possible to ++ ++ browse the CVS repository using a web-based interface. ++

++ ++

++ There are numerous packaged versions of GDL available for various OSes, including: ++

++

++

++ Please do check the version number of the package you intend to use against ++ the current GDL source-code release. ++ GDL is still in beta stage of development and thus it is highly recommended to ++ use a resonably recent version. ++

++

++ Please note as well that several features of GDL depend on compile-time configuration, ++ and might not be available in pre-built or pre-configured packages. ++

++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/feedback.html cvs/gdl/doc/www/feedback.html +--- gdl-0.9rc4/doc/www/feedback.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/feedback.html 2010-01-20 15:20:40.000000000 -0700 +@@ -0,0 +1,23 @@ ++ ++ ++ ++GDL Feedback ++ ++ ++ ++ ++ ++

GDL Feedback

++ ++

Your comments are welcome! Let us know what you use GDL for. Or if you don't, ++why not. Which functionality are you missing/would appreciate most for ++comming versions.

++ ++

Please send your bug reports, complaints, suggestions and comments using the ++trackers ++or ++forums. ++ ++

++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/gdl.css cvs/gdl/doc/www/gdl.css +--- gdl-0.9rc4/doc/www/gdl.css 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/gdl.css 2010-01-20 15:20:40.000000000 -0700 +@@ -0,0 +1,25 @@ ++body{ ++ background-color: #ffffff; ++ font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; ++ font-size: 18px; ++ line-height: 20px; ++ color: #000000; ++ width: 540px ++} ++ ++a{ ++ color: #5555aa; ++ text-decoration:none; ++ cursor: crosshair ++} ++a:hover{ color: #ee3322} ++a:active{ color: #eecc00} ++a:visited{ color: #5566ee} ++ ++p{ margin: 12px} ++ ++h2{ line-height: 32px} ++ ++.g{ color: #ee3322} ++.d{ color: #eecc00} ++.l{ color: #5566ee} +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/home.html cvs/gdl/doc/www/home.html +--- gdl-0.9rc4/doc/www/home.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/home.html 2010-04-16 11:22:42.000000000 -0600 +@@ -0,0 +1,70 @@ ++ ++ ++ ++GDL ::. Home ++ ++ ++ ++ ++ ++

GDL - GNU Data Language

++ ++

A free IDL (Interactive Data Language) compatible incremental ++compiler (i. e. runs IDL programs). ++IDL is a registered trademark of ITT Visual Information Solutions.

++ ++
++ ++

Features

++ ++

Full syntax compatibility with IDL 6.0 and later

++ ++

ALL IDL language elements are supported, including:

++ ++
    ++
  • objects, pointers, structs and arrays,
  • ++
  • system, common block and assoc variables,
  • ++
  • all operators and datatypes,
  • ++
  • _EXTRA, _STRICT_EXTRA and _REF_EXTRA keywords...
  • ++
++ ++

The file input output system is fully implemented
++(Exception: For formatted I/O the C() sub-codes are not supported yet)

++ ++

netCDF files are fully supported.

++

HDF files are partially supported.

++

Basic support for HDF5 files.

++ ++

Overall more than 380 library routines are implemented. ++For a sorted list enter HELP,/LIB at the command prompt and look for ++library routines written in GDL in the src/pro subdirectory.

++ ++

++Alain Coulais maintains a list ++of subroutines available in GDL. ++

++ ++

++SAVE and RESTORE are supported through Craig Markwardt's CMSVLIB library. ++

++ ++

++Graphical output is partially implemented. The PLOT, OPLOT, PLOTS, ++ XYOUTS, SURFACE, TVRD and TV commands ++(along with WINDOW, WDELETE, SET_PLOT, WSET, TVLCT) work ++(important keywords, some !P ++system variable tags and multi-plots are supported) ++for X windows, z-buffer and postscript output. ++

++ ++

GDL has an interface to python (python routines can be called from GDL).

++

GDL can be build as a pyhton module (GDL subroutines can be called from python).

++ ++

No GUI support (widgets) is implemented so far.

++ ++ ++

GDL is free software licensed under the GPL.

++ ++ ++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/index.html cvs/gdl/doc/www/index.html +--- gdl-0.9rc4/doc/www/index.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/index.html 2010-01-20 15:20:40.000000000 -0700 +@@ -0,0 +1,12 @@ ++ ++ ++ ++ ++GDL - GNU Data Language ++ ++ ++ ++ ++ ++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/menu.html cvs/gdl/doc/www/menu.html +--- gdl-0.9rc4/doc/www/menu.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/menu.html 2010-01-27 04:56:10.000000000 -0700 +@@ -0,0 +1,32 @@ ++ ++ ++ ++GDL ::. menu ++ ++ ++ ++ ++ ++ ++ ++

GDL

++ ++

home

++

screenshots

++

requirements

++

support

++

contribute

++

feedback

++

download

++

resources

++

credits

++

TDL?

++


++hosted by ++SourceForge.net Logo ++ ++ ++ ++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/require.html cvs/gdl/doc/www/require.html +--- gdl-0.9rc4/doc/www/require.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/require.html 2010-01-20 15:20:40.000000000 -0700 +@@ -0,0 +1,122 @@ ++ ++ ++ ++GDL requirements ++ ++ ++ ++ ++ ++

GDL Requirements

++ ++

Obligatory libraries:

++ ++ ++

Optional libraries:

++ ++ ++

At least g++ 3.2 (or a similar C++ standard conforming ++compiler) is needed for compiling GDL. ++Note that due to problems with static casts g++ 3.3.1 ++does not compile GDL, but 3.3.2 works fine again, so does 4.0 . ++GDL compiles under Mac OS X (10.2, 10.3 and 10.4) with g++ 3.3 (build 1671 - ++for build 1666 problems were reported) and with g++ 4.0. ++

++ ++

The GNU readline ++library 4.3 or later is needed (GDL should compile ++without it, but it's very inconvenient to use that way, furthermore, ++proper event handling for graphic windows requires readline).
++OS X 10.4: Note that the the readline library which comes with OS X is ++not GNU readline. You need to install GNU readline and set the --with-readlinedir= DIR option to configure. ++

++ ++

GDL uses the plplot ++ library version 5.3 or later for graphics.
++

++ ++

Furthermore you need the GNU Scientific Library. ++

++ ++

For reading and writing images in several formats, GDL uses ++ImageMagick. ++It is required by default. If you don't want to use it, use ++'--with-Magick=no' as a command line option to 'configure'. ++

++ ++

The HDF format is supported (version 4). ++If you want to use it, you need the ++HDF library. ++It is required by default. If you don't want to use it, use ++'--with-hdf=no' as a command line option to 'configure'. ++Note that HDF in turn needs other libraries. Check out the ++HDF homepage for ++more information. ++

++ ++

Basic support for HDF5 is provided. ++If you want to use it, you need the ++HDF5 library. ++It is required by default. If you don't want to use it, use ++'--with-hdf5=no'. Note that HDF5 in turn needs other libraries. Check out the ++HDF homepage ++for more information. ++

++ ++ ++

The netCDF format is fully supported since version 0.8 . If you ++ want to use it, you need the ++netCDF library. ++It is required by default. If you don't want to use it, use ++'--with-netcdf=no' as a command line option to 'configure'. ++

++ ++

GDL has an interface to python (GDL can be build and used as a python module as well). ++As so far there are only two example GDL extensions written in python its use optional for now but required by default. ++If you don't want to use it, use '--with-python=no' ++as a command line option to 'configure'. ++If you want to use it you need python 2.3 or later and the python package ++numarray 0.9 (or later). ++For nice graphical output the python package matplotlib 0.52 (or later) ++is used in one of the examples. ++The GDL configure script will determine the installed python version ++automatically. For this the python executable must be installed. ++The python version can be explictely set with ++--enable-pyhton_version=VERSION# (eg. --enable-pyhton_version=2.3). ++Note: For embedding python as done by GDL, the python dynamic ++library is needed which is not build by default. You need to run ++'configure' for python with the '--enable-shared' option. Please see ++the python README file for details. ++See the file PYTHON.txt in the GDL home directory for more details. ++ ++

GDL was developed using ANTLR ++but unless you want to change the grammar (*.g files) you don't need ++ANTLR. All relevant ANTLR files are included in the package.
++

++ ++

GDL is currently developed using KDevelop 3.3.6 under Fedora Core 7 GNU/Linux. The KDevelop project file is included in the tarball, so if you ++have KDevelop you should be able to use it with GDL seamlessly.

++ ++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/resources.html cvs/gdl/doc/www/resources.html +--- gdl-0.9rc4/doc/www/resources.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/resources.html 2010-01-20 15:20:40.000000000 -0700 +@@ -0,0 +1,38 @@ ++ ++ ++ ++GDL Resources ++ ++ ++ ++ ++ ++

GDL resources

++ ++

As GDL is almost 100% compatible to IDL (although not complete as many ++subroutines are waiting to be implemented), resources for IDL can also ++be utilized for GDL.

++ ++

++Many IDL resources can be found on the page run by IDL guru ++David Fanning. ++

++

++Lots of routines written for IDL can be found with the ++IDL Libraries Browser many of them should also ++work with GDL. ++

++

++An IDL online tutorial is available at the Scientific Computing and ++Visualization website. ++

++

++For writing programs in GDL using Emacs the Emacs addon (mode) ++IDLWAVE, maintained ++by J.D. Smith is highly appreciated. ++

++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/screenshot.html cvs/gdl/doc/www/screenshot.html +--- gdl-0.9rc4/doc/www/screenshot.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/screenshot.html 2010-04-22 09:50:40.000000000 -0600 +@@ -0,0 +1,124 @@ ++ ++ ++ ++GDL ::. Screenshots ++ ++ ++ ++ ++ ++

GDL Screenshots

++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++
++ ++ GDL drawing fractals ++ ++
++ GDL rendering the Mandelbrot set. Screenshot generated using the APPLEMAN procedure ++ (included in GDL distribution, file: src/pro/appleman.pro) ++
++ ++ GDL compressing weather-radar data using wavelet transform ++ ++
++ GDL compressing weather-radar images using truncated wavelet approximation. ++
++ ++ GDL run via a web interface ++ ++
++ GDL used as a part of a web-interface for controlling 2D fluid flow simulation and ++ visualizing the output (reading netCDF files and outputting SVG plots). ++
++ ++ GDL plotting data from a MODIS HDF file ++ ++
++ GDL plotting data from a HDF file with MODIS satellite image. ++
++ ++ GDL used for demonstrating Kalman filtering ++ ++
++ GDL used for demonstrating Kalman filtering. ++
++ ++ GDL-generated PostScript plot of a Fourier tranform in a LaTeX-generated PDF file ++ ++ GDL-generated PostScript plot of a Fourier spectrum in a LaTeX-generated PDF file. ++
++ ++ GDL plotting weather-forecast map from a GRIB file with the GFS model output ++ ++
++ GDL plotting weather-forecast map from a GRIB file with NOAA GFS model output. ++
++ ++ GDL plotting Daubechies wavelet to an SVG file under OpenSolaris ++ ++
++ GDL plotting Daubechies wavelet to an SVG file under OpenSolaris. ++
++ ++ GDL writing a surface plot to a PNG file under Cygwin on Windows ++ ++
++ GDL writing a surface plot to a PNG file under Cygwin on Windows (by Mateusz Turcza). ++
++ ++ GDL rendering the Madnelbrot set in an X window under coLinux on Windows ++ ++
++ GDL rendering the Madelbrot set in an X window under coLinux on Windows (by Merrick Berg). ++
++ ++ GDL rendering two HST images of Saturn (FITS files read with
++							   Astron Lib) on Mandriva Linux 2009 ++ ++
++ GDL rendering two HST images of Polar Aurorae on Saturn in UV ++ taken with STIS camera (by Palier and Prange, 1999) (FITS files read with ++ Astron Lib) on Mandriva Linux 2009. ++
++ ++ ++ ++
++ GDL used for analyzing LIDAR data (reading them from netCDF files, producing PostScript plots) on Linux, using the IDLWAVE mode for Emacs. (by Michał Piądłowski) ++
++ ++ ++ ++ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot01.png and cvs/gdl/doc/www/screenshots/screenshot01.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot01_thumb.png and cvs/gdl/doc/www/screenshots/screenshot01_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot02.png and cvs/gdl/doc/www/screenshots/screenshot02.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot02_thumb.png and cvs/gdl/doc/www/screenshots/screenshot02_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot03.png and cvs/gdl/doc/www/screenshots/screenshot03.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot03_thumb.png and cvs/gdl/doc/www/screenshots/screenshot03_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot04.png and cvs/gdl/doc/www/screenshots/screenshot04.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot04_thumb.png and cvs/gdl/doc/www/screenshots/screenshot04_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot05.png and cvs/gdl/doc/www/screenshots/screenshot05.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot05_thumb.png and cvs/gdl/doc/www/screenshots/screenshot05_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot06.png and cvs/gdl/doc/www/screenshots/screenshot06.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot06_thumb.png and cvs/gdl/doc/www/screenshots/screenshot06_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot07.png and cvs/gdl/doc/www/screenshots/screenshot07.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot07_thumb.png and cvs/gdl/doc/www/screenshots/screenshot07_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot08.png and cvs/gdl/doc/www/screenshots/screenshot08.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot08_thumb.png and cvs/gdl/doc/www/screenshots/screenshot08_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot09.png and cvs/gdl/doc/www/screenshots/screenshot09.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot09_thumb.png and cvs/gdl/doc/www/screenshots/screenshot09_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot10.png and cvs/gdl/doc/www/screenshots/screenshot10.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot10_thumb.png and cvs/gdl/doc/www/screenshots/screenshot10_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot11.png and cvs/gdl/doc/www/screenshots/screenshot11.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot11_thumb.png and cvs/gdl/doc/www/screenshots/screenshot11_thumb.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot12.png and cvs/gdl/doc/www/screenshots/screenshot12.png differ +Binary files gdl-0.9rc4/doc/www/screenshots/screenshot12_thumb.png and cvs/gdl/doc/www/screenshots/screenshot12_thumb.png differ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/support.html cvs/gdl/doc/www/support.html +--- gdl-0.9rc4/doc/www/support.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/support.html 2010-01-20 15:20:41.000000000 -0700 +@@ -0,0 +1,20 @@ ++ ++ ++ ++GDL Support ++ ++ ++ ++ ++ ++

GDL Support

++ ++

Please read the files in the GDL root directory carefully. Especially README and INSTALL.

++ ++

++If you still have any questions you might use one of these trackers ++or ++forums. ++

++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/doc/www/tdl.html cvs/gdl/doc/www/tdl.html +--- gdl-0.9rc4/doc/www/tdl.html 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/doc/www/tdl.html 2010-01-20 15:20:41.000000000 -0700 +@@ -0,0 +1,19 @@ ++ ++ ++ ++GDL -TDL ++ ++ ++ ++ ++ ++

GDL - TDL

++ ++

++The good folks at freshmeat had ++a problem with the name GDL - GNU Data Language, but kindly agreed to ++list it as TDL - The Data Language. Therefore its listed there as TDL. ++

++ ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/gdl.kdevelop cvs/gdl/gdl.kdevelop +--- gdl-0.9rc4/gdl.kdevelop 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/gdl.kdevelop 2010-04-16 11:22:42.000000000 -0600 +@@ -32,13 +32,13 @@ + false + executable + / +- ++ + true + + + + +- ++ + /home/marc/gdl/debug/src + true + false +@@ -63,7 +63,7 @@ + + + +- --with-readlinedir=yes --with-python=yes --with-hdf=yes --with-hdf5=no --with-plplotdir=/usr --with-python=yes --disable-python_module --with-netcdf=no --enable-oldplplot --with-openmp=yes --with-libproj4=no --with-wxWidgets=no --with-Magick=no ++ --with-readlinedir=yes --with-hdf=yes --with-hdf5=yes --with-plplotdir=/usr/local --with-python=yes --disable-python_module --with-netcdf=no --disable-oldplplot --with-openmp=no --with-libproj4=no --with-mpich=/usr/lib/mpich --with-wxWidgets=yes --with-Magick=yes + debug + kdevgccoptions + kdevgppoptions +@@ -279,6 +279,7 @@ + + + +- ++ /home/marc/gdl/tags ++ + + +Only in gdl-0.9rc4: gdl.kdevses +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/INSTALL cvs/gdl/INSTALL +--- gdl-0.9rc4/INSTALL 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/INSTALL 2010-04-22 09:50:39.000000000 -0600 +@@ -4,15 +4,18 @@ + (If you encounter any problems, please read on further, also have a + look at the REQUIREMENTS section in the README file.) + +-Unpack the tarball under any directory (tar xfvz gdl-0.9.tar.gz) +-change to the new subdirectory gdl-0.9 +-type ./configure (use './configure --help' for a list of options) +-type make (use 'make -j N' to run N parallel processes) +-The executable (named 'gdl') should then be in the src subdirectory +-(gdl-0.9/src/gdl). ++* unpack the tarball under any directory (tar xfvz gdl-0.9.tar.gz) ++* change to the new subdirectory gdl-0.9 ++* type "./configure" (use './configure --help' for a list of options) ++* type "make" (use 'make -j N' to run N parallel processes) ++* optionally type "make check" to test the build ++* type "make install" to deploy GDL binary (gdl), libraries, manpage, etc + + If you know IDL, you should feel very familiar with GDL. +-Some GDL test files are in the gdl/pro subdirectory (test_*.pro) ++A list of command-line options is available both in the manpage and ++after typing "gdl --help". ++ ++Some GDL test files are in the gdl/testsuite subdirectory (test_*.pro) + + Note: + When compiling you might get some warnings: +@@ -71,42 +74,31 @@ + determine which python version is actually + used. With this option the version can be + expicitely set +- (e.g. --enable-python_version=2.3). ++ (e.g. --enable-python_version=2.6). ++--with-ncursesdir=DIR to specify the ncurses (or curses) directory tree ++--with-readlinedir=DIR to specify the GNU readline directory tree ++--with-libzdir=DIR to specify the Zlib directory tree ++--with-openmp=no to disable the OpenMP support (e.g. for GCC <4.2) ++--with-gsldir=DIR to specify the GSL directory tree + --with-plplotdir=DIR to specify the plplot directory tree + --enable-oldplplot to specify that you have an older than 5.9.0 plplot lib. + +---with-ncursesdir=DIR to specify the ncurses directory tree +---with-readlinedir=DIR to specify the readline directory tree +---with-gsldir=DIR to specify the GSL directory tree +---with-libzdir=DIR to specify the Zlib directory tree ++--with-Magick=DIR to specify the ImageMagick directory tree ++--with-Magick=no to not use ImageMagick + + --with-netcdf=DIR to specify the netcdf directory tree + --with-netcdf=no to not use netcdf + +---with-hdf=DIR to specify the HDF4 directory tree +---with-hdf=no to not use HDF4 +- +---with-hdf5=DIR to specify the HDF5 directory tree +---with-hdf5=no to not use HDF5 +- +---with-python=DIR to specify the python directory tree +---with-python=no to not use python +- +---with-Magick=DIR to specify the ImageMagick directory tree +---with-Magick=no to not use ImageMagick +- + --with-fftw=DIR to specify the FFTW directory tree +---with-fftw=no to not use FFTW (this is the default) +- +---with-libproj4=DIR to specify the libproj4 directory tree +---with-libproj4=no to not use libproj4 (this is the default) ++--with-fftw=no to not use FFTW + ++... and so on for: wxWidgets, hdf, hdf5, fftw, libproj4, python, udunits, ++grib, GSHHS, and others - see README file for details (REQUIREMENTS section). + + For example, if you have python installed in /usr/local, use + + ./configure --with-python=/usr/local + +- + Basic Installation Instructions + =============================== + +Only in gdl-0.9rc4: m4 +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/Makefile.cvs cvs/gdl/Makefile.cvs +--- gdl-0.9rc4/Makefile.cvs 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/Makefile.cvs 2004-12-09 08:10:02.000000000 -0700 +@@ -0,0 +1,8 @@ ++default: all ++ ++all: ++ aclocal ++ autoheader ++ automake ++ autoconf ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/MAP_INSTALL cvs/gdl/MAP_INSTALL +--- gdl-0.9rc4/MAP_INSTALL 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/MAP_INSTALL 2010-05-21 10:23:52.346969024 -0600 +@@ -1,12 +1,10 @@ ++=========================================================================== + + To provide map projections support your first need to make sure the libproj4 + library is installed. The source code for this can be found at: + +-http://members.verizon.net/~vze2hc4d/proj4/libproj4.3_20081120.tar.bz2 +-(or http://home.comcast.net/~gevenden56/) +- +-(Older version: http://members.verizon.net/~vze2hc4d/proj4/lbp4_050319S.tar.gz) +- ++http://home.comcast.net/~gevenden56/proj/ ++(http://home.comcast.net/~gevenden56/proj/libproj4.3_20081120.tar.bz2) + + The "--with-libproj4=DIR" switch in configure can be used give the location + of this library. +@@ -15,7 +13,6 @@ + The following additional PRO files must be acquired and placed in the + appropriate directories: + +-map_continents.pro + map_grid.pro + map_horizon.pro + map_image.pro +@@ -38,29 +35,33 @@ + + They can be placed in any directory within you GDL path. + ++=========================================================================== ++ ++MAP_CONTINENTS is implemented in GDL using the GSHHS (Global ++Self-consistent, Hierarchical, High-resolution Shoreline Database) ++available under the GNU GPL. To provide support for MAP_CONTINENTS the ++database files and one header file (gshhs.h) need to be downloaded e.g. from: ++ ++ftp://ftp.soest.hawaii.edu/pwessel/gshhs ++ ++The header file for the 2.0 dataset is in the gshhs_1.12_src.zip file. ++The datafiles (*.b) are in the gshhs_2.0.tbz file. ++ ++When compiling GDL, the --with-gshhs option must be given (not enabled ++by default), optionally with an argument pointing to the GSHHS installation ++prefix: + +-To provide support for MAP_CONTINENTS the database files must be +-downloaded: ++--with-gshhs : searches gshhs.h in the default include path of the compiler ++--with-gshhs=/usr/local : searches for /usr/local/include/gshhs.h + +-blow.dat +-blow.ndx +-clow.dat +-clow.ndx +-plow.dat +-plow.ndx +-rlow.dat +-rlow.ndx +- +-These files can be found at: +- +-http://comm.nsdl.org/viewcvs/viewcvs.cgi/ddtoolkitnfndry/ETA_Viewer/Development/resource/maps/low/ +- +-These files should be placed in the "resource/maps/low" subdirectory +-of the !DIR directory which can be found by starting GDL and printing +-the !DIR system variable. ++GDL searches for the GSHHS datafiles (gshhs_f.b, gshhs_l.b, etc...) in the ++$GDLDATADIR/../gshhs/ directory (we need a better solution - FIXME!) + +-Note: Only low-resolution boundaries are currently supported. ++Reference: ++Wessel, P. and Smith, W.H.F., 1996. A global, self-consistent, hierarchical, ++ high-resolution shoreline database. J. Geophys. Res., 101(B4): 8741--8743. + ++=========================================================================== + + The following projections are at least partially supported + (numbers defined in the map_sep.pro file itself): +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/NEWS cvs/gdl/NEWS +--- gdl-0.9rc4/NEWS 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/NEWS 2010-06-03 09:06:33.827800868 -0600 +@@ -478,3 +478,22 @@ + - making the initial "DECOMPOSED" setting of the X device dependtant on the colour + depth reported by the X-server + ++0.9rc5: ++ - FOREACH statement, syntax: FOREACH loopVar OF array DO ++ - member function and procedure calls with '.' e. g.: object.aProcedure ++ - support of negative index ranges. -1 is the last element, -2 the one before ++ the last and so on. E.g.: array[-7:-5] ++ - new widget features incl. WIDGET_DROPLIST ++ - automatic garbage collection ++ - numerous bugfixes (incl. SAVE/RESTORE) ++ - new routines: ++ - HIST_2D ++ - MAP_CONTINENTS ++ - POLYFILL ++ - RESOLVE_ROUTINE ++ - SPHER_HARM ++ - new keywords/calling sequences handled: ++ - DEVICE, /INCHES, GET_SCREEN_SIZE ++ - PRODUCT, /PRESERVE_TYPE, /INTEGER ++ - REBIN: support for specifying new dimensions as an array ++ - TOTAL, /PRESERVE_TYPE +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/README cvs/gdl/README +--- gdl-0.9rc4/README 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/README 2010-04-22 09:50:39.000000000 -0600 +@@ -37,7 +37,7 @@ + DICOM files are supported via the GDLffDICOM object + (src/pro/dicom subdirectory). + +-Overall more than 300 library routines are implemented. ++Overall more than 380 library routines are implemented. + For a list enter HELP,/LIB at the command prompt and look for + library routines written in GDL in the src/pro subdirectory. + +@@ -77,8 +77,10 @@ + HDF5 ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/current + FFTW http://www.fftw.org/download.html + python http://www.python.org +-libproj4 http://members.verizon.net/~vze2hc4d/proj4/ ++libproj4 (consult the MAP_INSTALL file) + UDUNITS-2 http://www.unidata.ucar.edu/software/udunits/ ++GRIB API http://www.ecmwf.int/products/data/software/grib_api.html ++GSHHS (consult the MAP_INSTALL file) + + Only with python: + numarray http://www.stsci.edu/resources/software_hardware/numarray +@@ -119,6 +121,14 @@ + If you have plplot older than 5.9.0 use the configure + option --enable-oldplplot + With this option, plplot down to 5.3 should work. ++A possible problem was reported: ++On opening more than one window, plplot causes a segmentation fault ++if GDL is compiled with ImageMagick. This happens if plplot uses ++dynamic drivers . ++The current solution is to disable dynamic drivers for plplot ++(-DENABLE_DYNDRIVERS=OFF option for cmake). ++Current ubuntu/debian distributions are using dynamic drivers, so plplot ++needs to be compiled from source there. + + Furthermore you need the GNU Scientific Library. + (Minimal version is 1.7, which is now checked via "gsl.m4". +@@ -231,6 +241,10 @@ + library (http://www.unidata.ucar.edu/software/udunits/) + If you want to use it, use --with-udunits=DIR + ++GDL supports the GRIB file format - see README_GRIB ++ ++GDL uses GSHHS to implement MAP_CONTINENTS - see MAP_INSTALL ++ + GDL 0.9 was developed using ANTLR 2.7.6, + but unless you want to change the grammar (*.g files) you don't need + ANTLR. All relevant ANTLR files are included in the package. +@@ -258,7 +272,7 @@ + ============== + + GDL 0.9 is actively developed, but due to the vast amount of subroutines +-to implement still in beta state as of November 2009. ++to implement still in beta state as of February 2010. + Even though it can already be used for several tasks, there are many + things to be done. + Bug reports, feedback in general and interested people who would +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/accessdesc.hpp cvs/gdl/src/accessdesc.hpp +--- gdl-0.9rc4/src/accessdesc.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/accessdesc.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -337,9 +337,13 @@ + BaseGDL* Resolve() + { + SetupDim(); +- +- // no zeroing, here the new variable is created +- BaseGDL* newData=top->New( dim, BaseGDL::NOZERO); ++ ++ BaseGDL* newData; ++ // no zeroing, here the new variable is created TODO: zero only for PTR and OBJECT ++ if( top->Type() == PTR || top->Type() == OBJECT) ++ newData=top->New( dim);//, BaseGDL::NOZERO); ++ else ++ newData=top->New( dim, BaseGDL::NOZERO); + + rOffset=0; // crucial line, only with rOffset == 0 var is set + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/antlr/LLkParser.cpp cvs/gdl/src/antlr/LLkParser.cpp +--- gdl-0.9rc4/src/antlr/LLkParser.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/antlr/LLkParser.cpp 2010-04-16 11:22:54.000000000 -0600 +@@ -2,7 +2,7 @@ + * Project led by Terence Parr at http://www.jGuru.com + * Software rights: http://www.antlr.org/license.html + * +- * $Id: LLkParser.cpp,v 1.1.1.1 2004/12/09 15:10:20 m_schellens Exp $ ++ * $Id: LLkParser.cpp,v 1.3 2010/04/07 14:59:09 m_schellens Exp $ + */ + + #include "antlr/LLkParser.hpp" +@@ -40,11 +40,13 @@ + + void LLkParser::trace(const char* ee, const char* rname) + { ++ if(inputState->guessing>0) return; ++ + traceIndent(); + +- cout << ee << rname << ((inputState->guessing>0)?"; [guessing]":"; "); ++ cout << ee << rname << ((inputState->guessing>0)?"; [guessing]":"; <<<"); + +- for (int i = 1; i <= k; i++) ++ for (int i = 1; i <= k+3; i++) + { + if (i != 1) { + cout << ", "; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/antlr/Makefile.am cvs/gdl/src/antlr/Makefile.am +--- gdl-0.9rc4/src/antlr/Makefile.am 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/antlr/Makefile.am 2010-04-16 11:22:54.000000000 -0600 +@@ -3,14 +3,14 @@ + antlr_sources = ANTLRException.hpp ANTLRUtil.cpp ANTLRUtil.hpp ASTArray.hpp ASTFactory.cpp ASTFactory.hpp AST.hpp ASTNULLType.cpp ASTNULLType.hpp ASTPair.hpp ASTRefCount.cpp ASTRefCount.hpp BaseAST.cpp BaseAST.hpp BitSet.cpp BitSet.hpp CharBuffer.cpp CharBuffer.hpp CharInputBuffer.hpp CharScanner.cpp CharScanner.hpp CharStreamException.hpp CharStreamIOException.hpp CircularQueue.hpp CommonAST.cpp CommonAST.hpp CommonASTWithHiddenTokens.cpp CommonASTWithHiddenTokens.hpp CommonHiddenStreamToken.cpp CommonHiddenStreamToken.hpp CommonToken.cpp CommonToken.hpp config.hpp InputBuffer.cpp InputBuffer.hpp IOException.hpp LexerSharedInputState.hpp LLkParser.cpp LLkParser.hpp Makefile.am Makefile.in MismatchedCharException.cpp MismatchedCharException.hpp MismatchedTokenException.cpp MismatchedTokenException.hpp NoViableAltException.cpp NoViableAltException.hpp NoViableAltForCharException.cpp NoViableAltForCharException.hpp Parser.cpp Parser.hpp ParserSharedInputState.hpp RecognitionException.cpp RecognitionException.hpp RefCount.hpp SemanticException.hpp String.cpp String.hpp TokenBuffer.cpp TokenBuffer.hpp Token.cpp Token.hpp TokenStreamBasicFilter.cpp TokenStreamBasicFilter.hpp TokenStreamException.hpp TokenStreamHiddenTokenFilter.cpp TokenStreamHiddenTokenFilter.hpp TokenStream.hpp TokenStreamIOException.hpp TokenStreamRecognitionException.hpp TokenStreamRetryException.hpp TokenStreamSelector.cpp TokenStreamSelector.hpp TreeParser.cpp TreeParser.hpp TreeParserSharedInputState.hpp + + if !BUILDASLIBRARY +-lib_LIBRARIES = libantlr.a ++noinst_LIBRARIES = libantlr.a + libantlr_a_SOURCES = $(antlr_sources) + # trigger basename generation + libantlr_a_CXXFLAGS = $(AM_CXXFLAGS) + endif + +-# if we build a shared library, antlr stuff has to build +-# as shared library also ++# if we build a shared library, antlr stuff has to be build ++# as a shared library also + if BUILDASLIBRARY + noinst_LTLIBRARIES = libantlr.la + libantlr_la_SOURCES = $(antlr_sources) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/antlr/Makefile.in cvs/gdl/src/antlr/Makefile.in +--- gdl-0.9rc4/src/antlr/Makefile.in 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/antlr/Makefile.in 2010-04-16 11:22:54.000000000 -0600 +@@ -45,29 +45,7 @@ + CONFIG_HEADER = $(top_builddir)/config.h + CONFIG_CLEAN_FILES = + CONFIG_CLEAN_VPATH_FILES = +-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +-am__vpath_adj = case $$p in \ +- $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ +- *) f=$$p;; \ +- esac; +-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +-am__install_max = 40 +-am__nobase_strip_setup = \ +- srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +-am__nobase_strip = \ +- for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +-am__nobase_list = $(am__nobase_strip_setup); \ +- for p in $$list; do echo "$$p $$p"; done | \ +- sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ +- $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ +- if (++n[$$2] == $(am__install_max)) \ +- { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ +- END { for (dir in files) print dir, files[dir] }' +-am__base_list = \ +- sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ +- sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +-am__installdirs = "$(DESTDIR)$(libdir)" +-LIBRARIES = $(lib_LIBRARIES) ++LIBRARIES = $(noinst_LIBRARIES) + ARFLAGS = cru + libantlr_a_AR = $(AR) $(ARFLAGS) + libantlr_a_LIBADD = +@@ -352,13 +330,13 @@ + TokenStreamRetryException.hpp TokenStreamSelector.cpp \ + TokenStreamSelector.hpp TreeParser.cpp TreeParser.hpp \ + TreeParserSharedInputState.hpp +-@BUILDASLIBRARY_FALSE@lib_LIBRARIES = libantlr.a ++@BUILDASLIBRARY_FALSE@noinst_LIBRARIES = libantlr.a + @BUILDASLIBRARY_FALSE@libantlr_a_SOURCES = $(antlr_sources) + # trigger basename generation + @BUILDASLIBRARY_FALSE@libantlr_a_CXXFLAGS = $(AM_CXXFLAGS) + +-# if we build a shared library, antlr stuff has to build +-# as shared library also ++# if we build a shared library, antlr stuff has to be build ++# as a shared library also + @BUILDASLIBRARY_TRUE@noinst_LTLIBRARIES = libantlr.la + @BUILDASLIBRARY_TRUE@libantlr_la_SOURCES = $(antlr_sources) + all: all-am +@@ -395,38 +373,9 @@ + $(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + $(am__aclocal_m4_deps): +-install-libLIBRARIES: $(lib_LIBRARIES) +- @$(NORMAL_INSTALL) +- test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" +- @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ +- list2=; for p in $$list; do \ +- if test -f $$p; then \ +- list2="$$list2 $$p"; \ +- else :; fi; \ +- done; \ +- test -z "$$list2" || { \ +- echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ +- $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } +- @$(POST_INSTALL) +- @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ +- for p in $$list; do \ +- if test -f $$p; then \ +- $(am__strip_dir) \ +- echo " ( cd '$(DESTDIR)$(libdir)' && $(RANLIB) $$f )"; \ +- ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \ +- else :; fi; \ +- done + +-uninstall-libLIBRARIES: +- @$(NORMAL_UNINSTALL) +- @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ +- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ +- test -n "$$files" || exit 0; \ +- echo " ( cd '$(DESTDIR)$(libdir)' && rm -f "$$files" )"; \ +- cd "$(DESTDIR)$(libdir)" && rm -f $$files +- +-clean-libLIBRARIES: +- -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) ++clean-noinstLIBRARIES: ++ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) + libantlr.a: $(libantlr_a_OBJECTS) $(libantlr_a_DEPENDENCIES) + -rm -f libantlr.a + $(libantlr_a_AR) libantlr.a $(libantlr_a_OBJECTS) $(libantlr_a_LIBADD) +@@ -995,9 +944,6 @@ + check: check-am + all-am: Makefile $(LIBRARIES) $(LTLIBRARIES) + installdirs: +- for dir in "$(DESTDIR)$(libdir)"; do \ +- test -z "$$dir" || $(MKDIR_P) "$$dir"; \ +- done + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -1025,7 +971,7 @@ + @echo "it deletes files that may require special tools to rebuild." + clean: clean-am + +-clean-am: clean-generic clean-libLIBRARIES clean-libtool \ ++clean-am: clean-generic clean-libtool clean-noinstLIBRARIES \ + clean-noinstLTLIBRARIES mostlyclean-am + + distclean: distclean-am +@@ -1052,7 +998,7 @@ + + install-dvi-am: + +-install-exec-am: install-libLIBRARIES ++install-exec-am: + + install-html: install-html-am + +@@ -1092,23 +1038,23 @@ + + ps-am: + +-uninstall-am: uninstall-libLIBRARIES ++uninstall-am: + + .MAKE: install-am install-strip + + .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ +- clean-libLIBRARIES clean-libtool clean-noinstLTLIBRARIES ctags \ +- distclean distclean-compile distclean-generic \ ++ clean-libtool clean-noinstLIBRARIES clean-noinstLTLIBRARIES \ ++ ctags distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ +- install-info-am install-libLIBRARIES install-man install-pdf \ +- install-pdf-am install-ps install-ps-am install-strip \ +- installcheck installcheck-am installdirs maintainer-clean \ ++ install-info-am install-man install-pdf install-pdf-am \ ++ install-ps install-ps-am install-strip installcheck \ ++ installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ +- tags uninstall uninstall-am uninstall-libLIBRARIES ++ tags uninstall uninstall-am + + + # Tell versions [3.59,3.63) of GNU make to not export all variables. +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/antlr/Parser.cpp cvs/gdl/src/antlr/Parser.cpp +--- gdl-0.9rc4/src/antlr/Parser.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/antlr/Parser.cpp 2010-04-16 11:22:54.000000000 -0600 +@@ -2,11 +2,12 @@ + * Project led by Terence Parr at http://www.jGuru.com + * Software rights: http://www.antlr.org/license.html + * +- * $Id: Parser.cpp,v 1.2 2008/11/16 13:51:49 m_schellens Exp $ ++ * $Id: Parser.cpp,v 1.4 2010/04/07 14:59:09 m_schellens Exp $ + */ + + // g++-4.3 needs this + #include ++#include + + #include "antlr/Parser.hpp" + +@@ -187,13 +188,16 @@ + void Parser::traceIndent() + { + for( int i = 0; i < traceDepth; i++ ) +- ANTLR_USE_NAMESPACE(std)cout << " "; ++ ANTLR_USE_NAMESPACE(std)cout << " "; ++ ANTLR_USE_NAMESPACE(std)cout << ANTLR_USE_NAMESPACE(std)setw(3) << traceDepth << " "; + } + + void Parser::traceIn(const char* rname) + { + traceDepth++; + ++if(inputState->guessing>0) return; ++ + for( int i = 0; i < traceDepth; i++ ) + ANTLR_USE_NAMESPACE(std)cout << " "; + +@@ -205,6 +209,7 @@ + + void Parser::traceOut(const char* rname) + { ++if(inputState->guessing<=0) { + for( int i = 0; i < traceDepth; i++ ) + ANTLR_USE_NAMESPACE(std)cout << " "; + +@@ -212,7 +217,7 @@ + << "; LA(1)==" << LT(1)->getText().c_str() + << ((inputState->guessing>0)?" [guessing]":"") + << ANTLR_USE_NAMESPACE(std)endl; +- ++} + traceDepth--; + } + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/antlr/RefCount.hpp cvs/gdl/src/antlr/RefCount.hpp +--- gdl-0.9rc4/src/antlr/RefCount.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/antlr/RefCount.hpp 2010-04-16 11:22:54.000000000 -0600 +@@ -4,7 +4,7 @@ + * Project led by Terence Parr at http://www.jGuru.com + * Software rights: http://www.antlr.org/license.html + * +- * $Id: RefCount.hpp,v 1.1.1.1 2004/12/09 15:10:20 m_schellens Exp $ ++ * $Id: RefCount.hpp,v 1.2 2010/03/09 23:54:39 m_schellens Exp $ + */ + + #include +@@ -62,7 +62,7 @@ + return ref ? ref->ptr : 0; + } + +- T* get() const ++ T* get() const + { + return ref ? ref->ptr : 0; + } +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/antlr/TreeParser.cpp cvs/gdl/src/antlr/TreeParser.cpp +--- gdl-0.9rc4/src/antlr/TreeParser.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/antlr/TreeParser.cpp 2010-04-16 11:22:54.000000000 -0600 +@@ -2,11 +2,12 @@ + * Project led by Terence Parr at http://www.jGuru.com + * Software rights: http://www.antlr.org/license.html + * +- * $Id: TreeParser.cpp,v 1.2 2008/11/16 13:51:49 m_schellens Exp $ ++ * $Id: TreeParser.cpp,v 1.3 2010/04/05 01:22:05 m_schellens Exp $ + */ + + // g++-4.3 needs this + #include ++#include + + #include "antlr/TreeParser.hpp" + #include "antlr/ASTNULLType.hpp" +@@ -98,7 +99,8 @@ + void TreeParser::traceIndent() + { + for( int i = 0; i < traceDepth; i++ ) +- ANTLR_USE_NAMESPACE(std)cout << " "; ++ ANTLR_USE_NAMESPACE(std)cout << " "; ++ ANTLR_USE_NAMESPACE(std)cout << ANTLR_USE_NAMESPACE(std)setw(3) << traceDepth << ": "; + } + + void TreeParser::traceIn(const char* rname, RefAST t) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/arrayindex.cpp cvs/gdl/src/arrayindex.cpp +--- gdl-0.9rc4/src/arrayindex.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/arrayindex.cpp 2010-05-21 10:23:54.851967986 -0600 +@@ -197,13 +197,13 @@ + + if( ixList->size() == 1) + { +- if( dynamic_cast< CArrayIndexScalar*>((*ixList)[0])) ++ if( CArrayIndexScalarID == (*ixList)[0]->Type()) + return new ArrayIndexListOneConstScalarT( ixList); + +- if( dynamic_cast< ArrayIndexScalar*>((*ixList)[0])) ++ if( ArrayIndexScalarID == (*ixList)[0]->Type()) + return new ArrayIndexListOneScalarT( ixList); + +- if( dynamic_cast< ArrayIndexScalarVP*>((*ixList)[0])) ++ if( ArrayIndexScalarVPID == (*ixList)[0]->Type()) + return new ArrayIndexListOneScalarVPT( ixList); + + return new ArrayIndexListOneT( ixList); +@@ -212,9 +212,9 @@ + SizeT nScalar = 0; + for( SizeT i=0; isize(); ++i) + { +- if( dynamic_cast< ArrayIndexScalar*>((*ixList)[i]) || +- dynamic_cast< ArrayIndexScalarVP*>((*ixList)[i]) || +- dynamic_cast< CArrayIndexScalar*>((*ixList)[i])) ++nScalar; ++ if( ArrayIndexScalarID == (*ixList)[i]->Type() || ++ ArrayIndexScalarVPID == (*ixList)[i]->Type() || ++ CArrayIndexScalarID == (*ixList)[i]->Type() ) ++nScalar; + } + if( nScalar == ixList->size()) + return new ArrayIndexListScalarT( ixList); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/arrayindex.hpp cvs/gdl/src/arrayindex.hpp +--- gdl-0.9rc4/src/arrayindex.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/arrayindex.hpp 2010-05-21 10:23:54.881967727 -0600 +@@ -27,9 +27,30 @@ + //typedef std::valarray AllIxT; // now in typedefs.hpp + typedef std::vector IxExprListT; + ++enum IndexType ++{ ++ArrayIndexTID, ++ArrayIndexScalarID, ++ArrayIndexScalarVPID, ++CArrayIndexScalarID, ++ArrayIndexIndexedID, ++CArrayIndexIndexedID, ++ArrayIndexAllID, ++ArrayIndexORangeID, ++CArrayIndexORangeID, ++ArrayIndexRangeID, ++CArrayIndexRangeID, ++ArrayIndexORangeSID, ++CArrayIndexORangeSID, ++ArrayIndexRangeSID, ++CArrayIndexRangeSID ++}; ++ + class ArrayIndexT + { + public: ++ virtual IndexType Type() { return ArrayIndexTID;} ++ + // this may be called from ArrayIndexListT::ToAssocIndex + virtual void Init() {} + +@@ -41,8 +62,8 @@ + virtual void Clear() {} + virtual ~ArrayIndexT() {} + +- virtual SizeT GetIx0()=0; +- virtual SizeT GetS() { return 0;} ++ virtual RangeT GetIx0()=0; ++ virtual RangeT GetS() { return 0;} + virtual SizeT GetStride() { return 0;} + + virtual bool Scalar() { return false;} +@@ -68,11 +89,13 @@ + SizeT s; + + public: ++ IndexType Type() { return ArrayIndexScalarID;} ++ + SizeT GetVarIx() const { return varIx;} + + SizeT NParam() { return 0;} // number of parameter to Init(...) + +- SizeT GetS() { return s;} ++ RangeT GetS() { return s;} + + bool Scalar() { return true;} + bool Scalar( SizeT& s_) +@@ -81,7 +104,7 @@ + return true; + } + +- SizeT GetIx0() ++ RangeT GetIx0() + { + return s; + } +@@ -123,11 +146,13 @@ + SizeT s; + + public: ++ IndexType Type() { return ArrayIndexScalarVPID;} ++ + DVar* GetVarPtr() const { return varPtr;} + + SizeT NParam() { return 0;} // number of parameter to Init(...) + +- SizeT GetS() { return s;} ++ RangeT GetS() { return s;} + + bool Scalar() { return true;} + bool Scalar( SizeT& s_) +@@ -144,7 +169,7 @@ + void Clear() + {} + +- SizeT GetIx0() ++ RangeT GetIx0() + { + return s; + } +@@ -180,6 +205,8 @@ + SizeT s; + + public: ++ IndexType Type() { return CArrayIndexScalarID;} ++ + SizeT NParam() { return 0;} // number of parameter to Init(...) + + bool Scalar() { return true;} +@@ -189,12 +216,12 @@ + return true; + } + +- SizeT GetIx0() ++ RangeT GetIx0() + { + return s; + } + +- SizeT GetS() { return s;} ++ RangeT GetS() { return s;} + + ~CArrayIndexScalar() + {} +@@ -238,6 +265,8 @@ + } + }; + ++ ++ + // INDEXED or ONE [v] (must handle both) + class ArrayIndexIndexed: public ArrayIndexT + { +@@ -254,9 +283,11 @@ + ArrayIndexIndexed( const ArrayIndexT& r) {} + + public: ++ IndexType Type() { return ArrayIndexIndexedID;} ++ + SizeT NParam() { return 1;} // number of parameter to Init(...) + +- SizeT GetS() { return s;} ++ RangeT GetS() { return s;} + + bool Scalar() { return (ix == NULL);} + bool Scalar( SizeT& s_) +@@ -274,7 +305,7 @@ + + dimension GetDim() { return *ixDim;} + +- SizeT GetIx0() ++ RangeT GetIx0() + { + if( ix != NULL) return (*ix)[0]; // from array + return s; +@@ -744,6 +775,8 @@ + + }; + ++ ++ + // constant version + class CArrayIndexIndexed: public ArrayIndexIndexed + { +@@ -752,6 +785,8 @@ + SizeT maxIx; + + public: ++ IndexType Type() { return CArrayIndexIndexedID;} ++ + ~CArrayIndexIndexed() { delete ixOri;} + + CArrayIndexIndexed( BaseGDL* c, bool strictArrSubs_ = false): +@@ -874,15 +909,22 @@ + } + }; + ++ ++ ++ ++ ++ + // [*] + class ArrayIndexAll: public ArrayIndexT + { + public: ++ IndexType Type() { return ArrayIndexAllID;} ++ + SizeT NParam() { return 0;} // number of parameter to Init(...) + + void Init() {}; + +- SizeT GetIx0() { return 0;} ++ RangeT GetIx0() { return 0;} + + ArrayIndexT* Dup() const + { +@@ -905,17 +947,21 @@ + } + }; + ++ ++ + // [s:*] + class ArrayIndexORange: public ArrayIndexT + { + protected: +- SizeT s; ++ RangeT s; + + public: ++ IndexType Type() { return ArrayIndexORangeID;} ++ + SizeT NParam() { return 1;} // number of parameter to Init(...) + +- SizeT GetS() { return s;} +- SizeT GetIx0() { return s;} ++ RangeT GetS() { return s;} ++ RangeT GetIx0() { return s;} + + ArrayIndexT* Dup() const + { +@@ -924,34 +970,47 @@ + return d; + } + ++ // s is always scalar here + void Init( BaseGDL* s_) + { +- int retMsg=s_->Scalar2index(s); ++ int retMsg=s_->Scalar2RangeT(s); + if( retMsg == 0) // index empty or array + { + if( s_->N_Elements() == 0) + throw +- GDLException(NULL,"Internal error: Scalar2index:" ++ GDLException(NULL,"Internal error: Scalar2RangeT:" + " 1st index empty",true,false); + else + throw + GDLException(NULL,"Expression must be a scalar" + " in this context.",true,false); + } +- if( retMsg == -1) // index < 0 +- { +- throw +- GDLException(NULL,"Subscript range values of the" +- " form low:high must be >= 0, < size, " +- "with low <= high.",true,false); +- } ++// not with Scalar2RangeT(): ++// if( retMsg == -1) // index < 0 ++// { ++// throw ++// GDLException(NULL,"Subscript range values of the" ++// " form low:high must be >= 0, < size, " ++// "with low <= high.",true,false); ++// } + } + + BaseGDL* Index( BaseGDL* var, IxExprListT& ix) + { + Init( ix[0]); ++ ++ SizeT varSize = var->Size(); + +- if( s >= var->Size()) ++ if( s < 0) ++ { ++ RangeT i = s + varSize; ++ if( i < 0) ++ throw GDLException(NULL,"Subscript out of range [-s:*].",true,false); ++ ++ return var->NewIxFrom( i); ++ } ++ ++ if( s >= varSize) + throw GDLException(NULL,"Subscript out of range [s:*].",true,false); + + return var->NewIxFrom( s); +@@ -961,13 +1020,25 @@ + { + if( s >= varDim) + throw GDLException(NULL,"Subscript out of range [s:*].",true,false); ++ if( s < 0) ++ { ++ RangeT i = s + varDim; ++ if( i < 0) ++ throw GDLException(NULL,"Subscript out of range [-s:*].",true,false); ++ ++ return (varDim - i); ++ } + return (varDim - s); + } + }; + ++ ++ + class CArrayIndexORange: public ArrayIndexORange + { + public: ++ IndexType Type() { return CArrayIndexORangeID;} ++ + SizeT NParam() { return 0;} // number of parameter to Init(...) + + CArrayIndexORange( BaseGDL* c): ArrayIndexORange() +@@ -986,36 +1057,74 @@ + + BaseGDL* Index( BaseGDL* var, IxExprListT& ix) + { +- if( s >= var->Size()) ++ SizeT varSize = var->Size(); ++ ++ if( s < 0) ++ { ++ RangeT i = s + varSize; ++ if( i < 0) ++ throw GDLException(NULL,"Subscript out of range [-s:*].",true,false); ++ ++ return var->NewIxFrom( i); ++ } ++ ++ if( s >= varSize) + throw GDLException(NULL,"Subscript out of range [s:*].",true,false); + + return var->NewIxFrom( s); + } + }; + ++ ++ + // [s:e] + class ArrayIndexRange: public ArrayIndexT + { + protected: +- SizeT s,e; ++ RangeT s,e; + + public: ++ IndexType Type() { return ArrayIndexRangeID;} ++ + SizeT NParam() { return 2;} // number of parameter to Init(...) + +- SizeT GetS() { return s;} +- SizeT GetIx0() { return s;} ++ RangeT GetS() { return s;} ++ RangeT GetIx0() { return s;} + + BaseGDL* Index( BaseGDL* var, IxExprListT& ix) + { + Init( ix[0], ix[1]); + +- if( e >= var->Size()) ++ SizeT varSize = var->Size(); ++ ++ RangeT sl,el; ++ if( s < 0) ++ { ++ sl = s + varSize; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:e].",true,false); ++ } ++ else ++ sl = s; ++ if( e < 0) ++ { ++ el = e + varSize; ++ if( el < 0) ++ throw GDLException(NULL,"Subscript out of range [s:-E].",true,false); ++ } ++ else ++ el = e; ++ ++ if( sl > el) ++ throw ++ GDLException(NULL,"Subscript range values of the form low:high " ++ "must be < size, with low <= high",true,false); ++ if( el >= var->Size()) + throw GDLException(NULL,"Subscript out of range [s:e].",true,false); + +- return var->NewIxFrom( s, e); ++ return var->NewIxFrom( sl, el); + } + +- + ArrayIndexT* Dup() const + { + ArrayIndexRange* d = new ArrayIndexRange(); +@@ -1024,65 +1133,90 @@ + return d; + } + +- + void Init( BaseGDL* s_, BaseGDL* e_) + { +- int retMsg=s_->Scalar2index(s); ++// SizeT varSize = var->Size(); ++ ++ int retMsg=s_->Scalar2RangeT(s); + if( retMsg == 0) // index empty or array + { + if( s_->N_Elements() == 0) + throw +- GDLException(NULL,"Internal error: Scalar2index: 1st index empty.",true,false); ++ GDLException(NULL,"Internal error: Scalar2RangeT: 1st index empty.",true,false); + else + throw + GDLException(NULL,"Expression must be a scalar in this context.",true,false); + } +- if( retMsg == -1) // index < 0 +- { +- throw +- GDLException(NULL,"Subscript range values of the form low:high " +- "must be >= 0, < size, with low <= high.",true,false); +- } +- +- retMsg=e_->Scalar2index(e); ++// if( retMsg == -1) // index < 0 ++// { ++// throw ++// GDLException(NULL,"Subscript range values of the form low:high " ++// "must be >= 0, < size, with low <= high.",true,false); ++// } ++ ++ retMsg=e_->Scalar2RangeT(e); + if( retMsg == 0) // index empty or array + { + if( e_->N_Elements() == 0) + throw +- GDLException(NULL,"Internal error: Scalar2index: 2nd index empty.",true,false); ++ GDLException(NULL,"Internal error: Scalar2RangeT: 2nd index empty.",true,false); + else + throw + GDLException(NULL,"Expression must be a scalar in this context.",true,false); + } +- if( retMsg == -1) // index < 0 +- { +- throw +- GDLException(NULL,"Subscript range values of the form low:high " +- "must be >= 0, < size, with low <= high.",true,false); +- } ++// if( retMsg == -1) // index < 0 ++// { ++// throw ++// GDLException(NULL,"Subscript range values of the form low:high " ++// "must be >= 0, < size, with low <= high.",true,false); ++// } + +- if( e < s) ++ if( e>=0 && s>=0 && e < s) + { + throw +- GDLException(NULL," Subscript range values of the form low:high " ++ GDLException(NULL,"Subscript range values of the form low:high " + "must be >= 0, < size, with low <= high",true,false); + } + } + +- + // number of iterations + // also checks/adjusts range + SizeT NIter( SizeT varDim) + { +- if( e >= varDim) +- throw GDLException(NULL,"Subscript out of range [s:e].",true,false); +- return (e - s + 1); ++ RangeT sl,el; ++ if( s < 0) ++ { ++ sl = s + varDim; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [S:e].",true,false); ++ } ++ else ++ sl = s; ++ if( e < 0) ++ { ++ el = e + varDim; ++ if( el < 0) ++ throw GDLException(NULL,"Subscript out of range [s:E].",true,false); ++ } ++ else ++ el = e; ++ if( sl > el) ++ throw ++ GDLException(NULL,"Subscript range values of the form low:high " ++ "must be < size, with low <= high",true,false); ++ if( el >= varDim) ++ throw GDLException(NULL,"Subscript out of range [s:e].",true,false); ++ return (el - sl + 1); + } + }; + ++ ++ + class CArrayIndexRange: public ArrayIndexRange + { + public: ++ IndexType Type() { return CArrayIndexRangeID;} ++ + SizeT NParam() { return 0;} // number of parameter to Init(...) + + CArrayIndexRange( BaseGDL* c1, BaseGDL* c2): ArrayIndexRange() +@@ -1100,27 +1234,56 @@ + return d; + } + +- BaseGDL* Index( BaseGDL* var, IxExprListT& ix) +- { +- if( e >= var->Size()) ++ BaseGDL* Index( BaseGDL* var, IxExprListT& ix) ++ { ++ SizeT varSize = var->Size(); ++ ++ RangeT sl,el; ++ if( s < 0) ++ { ++ sl = s + varSize; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:e].",true,false); ++ } ++ else ++ sl = s; ++ if( e < 0) ++ { ++ el = e + varSize; ++ if( el < 0) ++ throw GDLException(NULL,"Subscript out of range [s:-E].",true,false); ++ } ++ else ++ el = e; ++ ++ if( sl > el) ++ throw ++ GDLException(NULL,"Subscript range values of the form low:high " ++ "must be < size, with low <= high",true,false); ++ if( el >= var->Size()) + throw GDLException(NULL,"Subscript out of range [s:e].",true,false); + +- return var->NewIxFrom( s, e); +- } ++ return var->NewIxFrom( sl, el); ++ } + }; + ++ ++ + // [s:*:st] + class ArrayIndexORangeS: public ArrayIndexT + { + protected: +- SizeT s,stride; ++ RangeT s; ++ SizeT stride; + + public: ++ IndexType Type() { return ArrayIndexORangeSID;} ++ + SizeT NParam() { return 2;} // number of parameter to Init(...) + +- SizeT GetS() { return s;} ++ RangeT GetS() { return s;} + SizeT GetStride() { return stride;} +- SizeT GetIx0() { return s;} ++ RangeT GetIx0() { return s;} + + ArrayIndexT* Dup() const + { +@@ -1132,47 +1295,58 @@ + + void Init( BaseGDL* s_, BaseGDL* stride_) + { +- int retMsg=s_->Scalar2index( s); ++ int retMsg=s_->Scalar2RangeT( s); + if( retMsg == 0) // index empty or array + { +- if( s_->N_Elements() == 0) +- throw +- GDLException( "Internal error: Scalar2index:" +- " 1st index empty",true,false); +- else +- throw +- GDLException( "Expression must be a scalar" +- " in this context.",true,false); +- } +- if( retMsg == -1) // index < 0 +- { +- throw +- GDLException( "Subscript range values of the" +- " form low:high must be >= 0, < size, with low <= high.",true,false); +- } ++ if( s_->N_Elements() == 0) ++ throw ++ GDLException( "Internal error: Scalar2RangeT:" ++ " 1st index empty",true,false); ++ else ++ throw ++ GDLException( "Expression must be a scalar" ++ " in this context.",true,false); ++ } ++// if( retMsg == -1) // index < 0 ++// { ++// throw ++// GDLException( "Subscript range values of the" ++// " form low:high must be >= 0, < size, with low <= high.",true,false); ++// } + // stride + retMsg=stride_->Scalar2index( stride); + if( retMsg == 0) // index empty or array + { +- if( stride_->N_Elements() == 0) +- throw +- GDLException( "Internal error: Scalar2index:" +- " stride index empty",true,false); +- else +- throw +- GDLException( "Expression must be a scalar" +- " in this context.",true,false); ++ if( stride_->N_Elements() == 0) ++ throw ++ GDLException( "Internal error: Scalar2index:" ++ " stride index empty",true,false); ++ else ++ throw ++ GDLException( "Expression must be a scalar" ++ " in this context.",true,false); + } + if( retMsg == -1 || stride == 0) // stride <= 0 + { +- throw +- GDLException( "Range subscript stride must be >= 1.",true,false); ++ throw ++ GDLException( "Range subscript stride must be >= 1.",true,false); + } + } + + BaseGDL* Index( BaseGDL* var, IxExprListT& ix) + { + Init( ix[0], ix[1]); ++ ++ SizeT varSize = var->Size(); ++ ++ if( s < 0) ++ { ++ RangeT sl = s + varSize; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:*:stride].",true,false); ++ ++ return var->NewIxFromStride( sl, stride); ++ } + + if( s >= var->Size()) + throw GDLException(NULL,"Subscript out of range [s:*:stride].",true,false); +@@ -1184,6 +1358,14 @@ + // also checks/adjusts range + SizeT NIter( SizeT varDim) + { ++ if( s < 0) ++ { ++ RangeT sl = s + varDim; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:*:stride].",true,false); ++ return (varDim - sl + stride - 1)/stride; ++ } ++ + if( s >= varDim) + throw GDLException(NULL,"Subscript out of range [s:*:stride].",true,false); + return (varDim - s + stride - 1)/stride; +@@ -1193,6 +1375,8 @@ + class CArrayIndexORangeS: public ArrayIndexORangeS + { + public: ++ IndexType Type() { return CArrayIndexORangeSID;} ++ + SizeT NParam() { return 0;} // number of parameter to Init(...) + + CArrayIndexORangeS( BaseGDL* c1, BaseGDL* c2): ArrayIndexORangeS() +@@ -1212,6 +1396,17 @@ + + BaseGDL* Index( BaseGDL* var, IxExprListT& ix) + { ++ SizeT varSize = var->Size(); ++ ++ if( s < 0) ++ { ++ RangeT sl = s + varSize; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:*:stride].",true,false); ++ ++ return var->NewIxFromStride( sl, stride); ++ } ++ + if( s >= var->Size()) + throw GDLException(NULL,"Subscript out of range [s:*:stride].",true,false); + +@@ -1223,14 +1418,17 @@ + class ArrayIndexRangeS: public ArrayIndexT + { + protected: +- SizeT s,e,stride; ++ RangeT s,e; ++ SizeT stride; + + public: ++ IndexType Type() { return ArrayIndexRangeSID;} ++ + SizeT NParam() { return 3;} // number of parameter to Init(...) + +- SizeT GetS() { return s;} ++ RangeT GetS() { return s;} + SizeT GetStride() { return stride;} +- SizeT GetIx0() { return s;} ++ RangeT GetIx0() { return s;} + + ArrayIndexT* Dup() const + { +@@ -1243,45 +1441,45 @@ + + void Init( BaseGDL* s_, BaseGDL* e_, BaseGDL* stride_) + { +- int retMsg=s_->Scalar2index(s); ++ int retMsg=s_->Scalar2RangeT(s); + if( retMsg == 0) // index empty or array + { + if( s_->N_Elements() == 0) + throw +- GDLException( "Internal error: Scalar2index: 1st index empty.",true,false); ++ GDLException( "Internal error: Scalar2RangeT: 1st index empty.",true,false); + else + throw + GDLException( "Expression must be a scalar in this context.",true,false); + } +- if( retMsg == -1) // index < 0 +- { +- throw +- GDLException( "Subscript range values of the form low:high " +- "must be >= 0, < size, with low <= high.",true,false); +- } ++// if( retMsg == -1) // index < 0 ++// { ++// throw ++// GDLException( "Subscript range values of the form low:high " ++// "must be >= 0, < size, with low <= high.",true,false); ++// } + +- retMsg=e_->Scalar2index(e); ++ retMsg=e_->Scalar2RangeT(e); + if( retMsg == 0) // index empty or array + { + if( e_->N_Elements() == 0) + throw +- GDLException( "Internal error: Scalar2index: 2nd index empty.",true,false); ++ GDLException( "Internal error: Scalar2RangeT: 2nd index empty.",true,false); + else + throw + GDLException( "Expression must be a scalar in this context.",true,false); + } +- if( retMsg == -1) // index < 0 +- { +- throw +- GDLException( "Subscript range values of the form low:high " +- "must be >= 0, < size, with low <= high.",true,false); +- } ++// if( retMsg == -1) // index < 0 ++// { ++// throw ++// GDLException( "Subscript range values of the form low:high " ++// "must be >= 0, < size, with low <= high.",true,false); ++// } + +- if( e < s) ++ if( e >= 0 && s >= 0 && e < s) + { +- throw +- GDLException( "Subscript range values of the form low:high " +- "must be >= 0, < size, with low <= high",true,false); ++ throw ++ GDLException( "Subscript range values of the form low:high " ++ "must be < size, with low <= high",true,false); + } + + // stride +@@ -1308,29 +1506,79 @@ + { + Init( ix[0], ix[1], ix[2]); + +- if( e >= var->Size()) ++ SizeT varSize = var->Size(); ++ ++ RangeT sl,el; ++ if( s < 0) ++ { ++ sl = s + varSize; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:e:stride].",true,false); ++ } ++ else ++ sl = s; ++ if( e < 0) ++ { ++ el = e + varSize; ++ if( el < 0) ++ throw GDLException(NULL,"Subscript out of range [s:-E:stride].",true,false); ++ } ++ else ++ el = e; ++ ++ if( sl > el) ++ throw ++ GDLException(NULL,"Subscript range values of the form low:high " ++ "must be < size, with low <= high",true,false); ++ ++ if( el >= var->Size()) + { + throw GDLException(NULL,"Subscript out of range [s:e:st].",true,false); + } + +- return var->NewIxFromStride( s, e, stride); ++ return var->NewIxFromStride( sl, el, stride); + } + + // number of iterations + // also checks/adjusts range + SizeT NIter( SizeT varDim) + { +- if( e >= varDim) ++ RangeT sl,el; ++ if( s < 0) ++ { ++ sl = s + varDim; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:e:stride].",true,false); ++ } ++ else ++ sl = s; ++ if( e < 0) ++ { ++ el = e + varDim; ++ if( el < 0) ++ throw GDLException(NULL,"Subscript out of range [s:-E:stride].",true,false); ++ } ++ else ++ el = e; ++ ++ if( sl > el) ++ throw ++ GDLException(NULL,"Subscript range values of the form low:high " ++ "must be < size, with low <= high",true,false); ++ ++ if( el >= varDim) + { +- throw GDLException(NULL,"Subscript out of range [s:e:st].",true,false); ++ throw GDLException(NULL,"Subscript out of range [s:e:st].",true,false); + } +- return (e - s + stride)/stride; ++ return (el - sl + stride)/stride; + } + }; + + class CArrayIndexRangeS: public ArrayIndexRangeS + { + public: ++ IndexType Type() { return CArrayIndexRangeSID;} ++ + SizeT NParam() { return 0;} // number of parameter to Init(...) + + CArrayIndexRangeS( BaseGDL* c1, BaseGDL* c2, BaseGDL* c3): +@@ -1352,12 +1600,37 @@ + + BaseGDL* Index( BaseGDL* var, IxExprListT& ix) + { +- if( e >= var->Size()) ++ SizeT varSize = var->Size(); ++ ++ RangeT sl,el; ++ if( s < 0) ++ { ++ sl = s + varSize; ++ if( sl < 0) ++ throw GDLException(NULL,"Subscript out of range [-S:e:stride].",true,false); ++ } ++ else ++ sl = s; ++ if( e < 0) ++ { ++ el = e + varSize; ++ if( el < 0) ++ throw GDLException(NULL,"Subscript out of range [s:-E:stride].",true,false); ++ } ++ else ++ el = e; ++ ++ if( sl > el) ++ throw ++ GDLException(NULL,"Subscript range values of the form low:high " ++ "must be < size, with low <= high",true,false); ++ ++ if( el >= var->Size()) + { +- throw GDLException(NULL,"Subscript out of range [s:e:st].",true,false); ++ throw GDLException(NULL,"Subscript out of range [s:e:st].",true,false); + } + +- return var->NewIxFromStride( s, e, stride); ++ return var->NewIxFromStride( sl, el, stride); + } + }; + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/arrayindexlistt.hpp cvs/gdl/src/arrayindexlistt.hpp +--- gdl-0.9rc4/src/arrayindexlistt.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/arrayindexlistt.hpp 2010-05-21 10:23:54.885967465 -0600 +@@ -1014,11 +1014,11 @@ + SizeT nScalar = 0; + for( SizeT i=0; (i+1)(ixList[i]) || +- dynamic_cast< CArrayIndexScalar*>(ixList[i])) nScalar++; +- if( dynamic_cast< ArrayIndexIndexed*>(ixList[i]) || +- dynamic_cast< CArrayIndexIndexed*>(ixList[i])) nIndexed++; ++ // note: here we examine the actual type ++ if( ArrayIndexScalarID == ixList[i]->Type() || ++ CArrayIndexScalarID == ixList[i]->Type() ) nScalar++; ++ if( ArrayIndexIndexedID == ixList[i]->Type() || ++ CArrayIndexIndexedID == ixList[i]->Type()) nIndexed++; + } + if( nScalar == ixList.size()-1) + accessTypeAssocInit = ALLONE; +@@ -1029,10 +1029,14 @@ + else + accessTypeAssocInit = INDEXED_ONE; + +- if( dynamic_cast< ArrayIndexScalar*>(ixList[ixList.size()-1]) || ++ if( ArrayIndexScalarID == ixList[ixList.size()-1]->Type() || ++ CArrayIndexScalarID == ixList[ixList.size()-1]->Type()) nScalar++; ++ if( ArrayIndexIndexedID == ixList[ixList.size()-1]->Type() || ++ CArrayIndexIndexedID == ixList[ixList.size()-1]->Type()) nIndexed++; ++/* if( dynamic_cast< ArrayIndexScalar*>(ixList[ixList.size()-1]) || + dynamic_cast< CArrayIndexScalar*>(ixList[ixList.size()-1])) nScalar++; + if( dynamic_cast(ixList[ixList.size()-1]) || +- dynamic_cast(ixList[ixList.size()-1]) ) nIndexed++; ++ dynamic_cast(ixList[ixList.size()-1]) ) nIndexed++;*/ + + if( nScalar == ixList.size()) + accessTypeInit = ALLONE; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/assocdata.hpp cvs/gdl/src/assocdata.hpp +--- gdl-0.9rc4/src/assocdata.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/assocdata.hpp 2010-05-21 10:23:54.895969758 -0600 +@@ -44,13 +44,13 @@ + ~Assoc_() {} + + // c-i +- Assoc_( const Assoc_& cp): Parent_( cp), ++ Assoc_( const Assoc_& cp): Parent_(cp), + lun(cp.lun), + fileOffset( cp.fileOffset), + sliceSize( cp.sliceSize) + {} + +- Parent_* Dup() { return new Assoc_(*this);} ++ Parent_* Dup() { return new Assoc_(*this);} + + void AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList, SizeT offset); + void AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList); +@@ -170,11 +170,22 @@ + throw GDLException("File expression not allowed in this context."); + } + ++ bool EqualNoDelete( const BaseGDL*) ++ { ++ throw GDLException("File expression not allowed in this context."); ++ } ++ + void ForCheck( BaseGDL**, BaseGDL** = NULL) + { + throw GDLException("File expression not allowed in this context."); + } + ++ bool ForAddCondUp( BaseGDL* loopInfo) ++// bool ForAddCondUp( ForLoopInfoT& loopInfo) ++ { ++ throw GDLException("File expression not allowed in this context."); ++ } ++ + bool ForCondUp( BaseGDL*) + { + throw GDLException("File expression not allowed in this context."); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basegdl.cpp cvs/gdl/src/basegdl.cpp +--- gdl-0.9rc4/src/basegdl.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basegdl.cpp 2010-05-21 10:23:54.899967552 -0600 +@@ -191,6 +191,10 @@ + { + throw GDLException("Operation not defined for UNDEF 1."); + } ++int BaseGDL::Scalar2RangeT(RangeT& ret) const ++{ ++ throw GDLException("Operation not defined for UNDEF 1a."); ++} + + bool BaseGDL::BaseGDL::True() + { +@@ -227,16 +231,21 @@ + throw GDLException("Operation not defined for UNDEF 5."); + } + +-bool BaseGDL::Equal( BaseGDL*) ++bool BaseGDL::Equal( BaseGDL*) const + { + throw GDLException("Operation not defined for UNDEF 6."); + } + +-bool BaseGDL::ArrayEqual( BaseGDL*) ++bool BaseGDL::EqualNoDelete( const BaseGDL*) const + { + throw GDLException("Operation not defined for UNDEF 6a."); + } + ++bool BaseGDL::ArrayEqual( BaseGDL*) ++{ ++ throw GDLException("Operation not defined for UNDEF 6b."); ++} ++ + // for statement compliance (int types , float types scalar only) + void BaseGDL::ForCheck( BaseGDL**, BaseGDL**) + { +@@ -248,6 +257,12 @@ + throw GDLException("Operation not defined for UNDEF 8."); + } + ++bool BaseGDL::ForAddCondUp( BaseGDL* loopInfo) ++// bool BaseGDL::ForAddCondUp( ForLoopInfoT& loopInfo) ++{ ++ throw GDLException("Operation not defined for UNDEF 8a."); ++} ++ + bool BaseGDL::ForCondDown( BaseGDL*) + { + throw GDLException("Operation not defined for UNDEF 9."); +@@ -414,7 +429,7 @@ + throw GDLException("Operation not defined for UNDEF 171."); + } + +-BaseGDL* BaseGDL::MatrixOp( BaseGDL* r) ++BaseGDL* BaseGDL::MatrixOp( BaseGDL* r, bool rtranspose, bool transposeResult, bool strassen) + { + throw GDLException("Operation not defined for UNDEF 18."); + } +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basegdl.hpp cvs/gdl/src/basegdl.hpp +--- gdl-0.9rc4/src/basegdl.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basegdl.hpp 2010-05-21 10:23:54.924905189 -0600 +@@ -157,8 +157,8 @@ + true, //STRING, + true, //STRUCT, + true, //COMPLEXDBL, +- false, //PTR, +- false, //OBJECT, ++ true, //PTR, nonPOD due to reference counting ++ true, //OBJECT, nonPOD due to reference counting + false, //UINT, + false, //ULONG, + false, //LONG64, +@@ -210,6 +210,8 @@ + struct SpDULong; + template class Data_; + ++struct ForLoopInfoT; ++ + void breakpoint(); + + // --- SA: MemStats stuff +@@ -364,7 +366,7 @@ + return i; + } + +- virtual BaseGDL& operator=(const BaseGDL& right); ++ virtual BaseGDL& operator=(const BaseGDL& right); + + // virtual functions + virtual bool IsAssoc() const; +@@ -420,6 +422,7 @@ + virtual BaseGDL* SetBuffer( const void* b); + virtual void SetBufferSize( SizeT s); + virtual int Scalar2index(SizeT& ret) const; ++ virtual int Scalar2RangeT(RangeT& ret) const; + virtual SizeT LoopIndex() const; + virtual bool True(); + virtual bool False(); +@@ -428,12 +431,16 @@ + virtual DLong* Where( bool comp, SizeT& count); + virtual BaseGDL* LogNeg(); + virtual int Sgn(); // -1,0,1 +- virtual bool Equal( BaseGDL*); ++ virtual bool Equal( BaseGDL*) const; ++ virtual bool EqualNoDelete( const BaseGDL*) const; + virtual bool ArrayEqual( BaseGDL*); + // for statement compliance (int types , float types scalar only) + virtual void ForCheck( BaseGDL**, BaseGDL** = NULL); + virtual bool ForCondUp( BaseGDL*); + virtual bool ForCondDown( BaseGDL*); ++ virtual bool ForAddCondUp( BaseGDL* loopInfo); ++// virtual bool ForAddCondUp( ForLoopInfoT& loopInfo); ++// virtual bool ForAddCondDown( ForLoopInfoT& loopInfo); + // virtual bool ForCondUpDown( BaseGDL*); + virtual void ForAdd( BaseGDL* add=NULL); + virtual BaseGDL* CatArray( ExprListT& exprList, +@@ -530,7 +537,7 @@ + // virtual BaseGDL* ModInvNew( BaseGDL* r); + virtual BaseGDL* PowNew( BaseGDL* r); + // virtual BaseGDL* PowInvNew( BaseGDL* r); +- virtual BaseGDL* MatrixOp( BaseGDL* r); ++ virtual BaseGDL* MatrixOp( BaseGDL* r, bool rtranspose = false, bool transposeResult =false, bool strassen = false); + virtual void AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList, SizeT offset); + virtual void AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList); + virtual void AssignAt( BaseGDL* srcIn); +@@ -578,7 +585,29 @@ + } + }; + ++ ++ + typedef ExprListT::iterator ExprListIterT; + ++ ++ ++struct ForLoopInfoT ++{ ++ BaseGDL* endLoopVar; // the source for foreach as well ++ BaseGDL* loopStepVar; ++ DLong foreachIx; ++ ++ ForLoopInfoT() ++ : endLoopVar(NULL) ++ , loopStepVar(NULL) ++ , foreachIx(-1) ++ {} ++ ~ForLoopInfoT() ++ { ++ delete endLoopVar; ++ delete loopStepVar; ++ } ++}; ++ + #endif + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basic_fun_cl.cpp cvs/gdl/src/basic_fun_cl.cpp +--- gdl-0.9rc4/src/basic_fun_cl.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basic_fun_cl.cpp 2010-05-21 10:23:55.098906081 -0600 +@@ -128,7 +128,7 @@ + DIntGDL* v = static_cast(e->GetParDefined(0)->Convert2(INT,BaseGDL::COPY)); + v_guard.reset( v); // e->Guard(v); + +- if (v->Equal(new DIntGDL(1))) ++ if ( (*v)[0] == 1) //->EqualNoDelete( static_cDIntGDL(1))) + ret_seconds=true; + } else if (nParam == 2) { + if (e->KeywordSet("JULIAN")) e->Throw("Conflicting keywords."); +@@ -140,7 +140,7 @@ + v_guard.reset( v1); // e->Guard(v1); + DDoubleGDL* v2 = static_cast(e->GetParDefined(1)->Convert2(DOUBLE,BaseGDL::COPY)); + +- if(v1->Equal(new DIntGDL(0))) { //0, read the second argument as time_t; ++ if( (*v1)[0] == 0) { //v1->EqualNoDelete( DIntGDL(0))) { //0, read the second argument as time_t; + tval.tv_sec = static_cast((*v2)[0]); + tval.tv_usec = static_cast(((*v2)[0]-tval.tv_sec)*1e+6); + delete v2; // we delete v2 here as it is not guarded. Avoids a "new" in the following "else" +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basic_fun.cpp cvs/gdl/src/basic_fun.cpp +--- gdl-0.9rc4/src/basic_fun.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basic_fun.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -322,21 +322,26 @@ + + DPtrGDL* ret; + +- if( e->KeywordSet(0) || e->KeywordSet(1)) ++// if( e->KeywordSet(0)) ++// ret= new DPtrGDL(dim);//, BaseGDL::NOZERO); ++// else ++// if( e->KeywordSet(1)) ++// ret= new DPtrGDL(dim, BaseGDL::NOZERO); ++// else ++// return new DPtrGDL(dim); ++ if( !e->KeywordSet(1)) ++ return new DPtrGDL(dim); ++ + ret= new DPtrGDL(dim, BaseGDL::NOZERO); +- else +- return new DPtrGDL(dim); + +- if( e->KeywordSet(1)) +- { + SizeT nEl=ret->N_Elements(); + SizeT sIx=e->NewHeap(nEl); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for +- for( SizeT i=0; iKeywordSet(0)) return new DObjGDL(dim, BaseGDL::NOZERO); ++// reference counting if( e->KeywordSet(0)) return new DObjGDL(dim, BaseGDL::NOZERO); + return new DObjGDL(dim); + /* } + catch( GDLException& ex) +@@ -492,7 +497,7 @@ + auto_ptr pL_guard; + if( pL == NULL) + { +- pL = static_cast(p->Convert2(LONG,BaseGDL::COPY)); ++ pL = static_cast(p->Convert2(LONG,BaseGDL::COPY)); + pL_guard.reset( pL); + // e->Guard( pL); + } +@@ -1239,6 +1244,8 @@ + return e->Interpreter()->call_fun( method->GetTree()); + } + ++ ++ + BaseGDL* execute( EnvT* e) + { + int nParam=e->NParam( 1); +@@ -1259,7 +1266,8 @@ + e->AssureScalarPar( 0, line); + + // remove current environment (own one) +- EnvBaseT* caller = e->Caller(); ++ assert( dynamic_cast(e->Caller()) != NULL); ++ EnvUDT* caller = static_cast(e->Caller()); + e->Interpreter()->CallStack().pop_back(); + delete e; + +@@ -1312,30 +1320,42 @@ + + if( trAST == NULL) return new DIntGDL( 1); + ++ int nForLoopsIn = caller->NForLoops(); + try + { +- ProgNodeP progAST = ProgNode::NewProgNode( trAST); +- auto_ptr< ProgNode> progAST_guard( progAST); ++ ProgNodeP progAST = ProgNode::NewProgNode( trAST); ++ auto_ptr< ProgNode> progAST_guard( progAST); + +- GDLInterpreter::RetCode retCode = +- caller->Interpreter()->execute( progAST); ++ int nForLoops = ProgNode::NumberForLoops( progAST, nForLoopsIn); ++ caller->ResizeForLoops( nForLoops); + +- if( retCode == GDLInterpreter::RC_OK) +- return new DIntGDL( 1); +- else +- return new DIntGDL( 0); ++ progAST->setLine( e->GetLineNumber()); ++ ++ RetCode retCode = caller->Interpreter()->execute( progAST); ++ ++ caller->ResizeForLoops( nForLoopsIn); ++ ++ if( retCode == RC_OK) ++ return new DIntGDL( 1); ++ else ++ return new DIntGDL( 0); + } + catch( GDLException& ex) + { +- if( !quietCompile) cerr << "EXECUTE: Unhandled GDL exception: " << +- ex.getMessage() << endl; +- return new DIntGDL( 0); ++ caller->ResizeForLoops( nForLoopsIn); ++ // are we throwing to target environment? ++// if( ex.GetTargetEnv() == NULL) ++ if( !quietCompile) cerr << "EXECUTE: " << ++ ex.getMessage() << endl; ++ return new DIntGDL( 0); + } + catch( ANTLRException ex) + { +- if( !quietCompile) cerr << "EXECUTE: Interpreter exception: " << +- ex.getMessage() << endl; +- return new DIntGDL( 0); ++ caller->ResizeForLoops( nForLoopsIn); ++ ++ if( !quietCompile) cerr << "EXECUTE: Interpreter exception: " << ++ ex.getMessage() << endl; ++ return new DIntGDL( 0); + } + + return new DIntGDL( 0); // control flow cannot reach here - compiler shut up +@@ -1751,7 +1771,7 @@ + DLong scVal1; + bool sc1 = p1L->Scalar( scVal1); + +- long scVal2 = numeric_limits::max(); ++ DLong scVal2 = numeric_limits::max(); + bool sc2 = true; + if( p2L != NULL) + { +@@ -1766,7 +1786,7 @@ + stride = p1L->Dim( 0); + if( stride != p2L->Dim( 0)) + e->Throw( +- "Starting offset and Length arguments " ++ "Starting offset and length arguments " + "have incompatible first dimension."); + } + else +@@ -1790,21 +1810,21 @@ + SizeT nEl2 = (sc2)? 1 : p2L->N_Elements(); + + SizeT nSrcStr = p0S->N_Elements(); +-#pragma omp parallel if ((nSrcStr*10) >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= (nSrcStr*10))) ++#pragma omp parallel if ((nSrcStr*10) >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= (nSrcStr*10))) default( shared) + { + #pragma omp for + for( long i=0; iKeywordIx("INTEGER"); + static int doubleIx = e->KeywordIx( "DOUBLE"); + static int nanIx = e->KeywordIx( "NAN"); ++ static int preserveIx = e->KeywordIx( "PRESERVE_TYPE"); + + bool cumulative = e->KeywordSet( cumIx); + bool intRes = e->KeywordSet( intIx); + bool doubleRes = e->KeywordSet( doubleIx); + bool nan = e->KeywordSet( nanIx); ++ bool preserve = e->KeywordSet( preserveIx); + + DLong sumDim = 0; + if( nParam == 2) +@@ -2160,6 +2182,24 @@ + { + if( !cumulative) + { ++ if (preserve) ++ { ++ switch (p0->Type()) ++ { ++ case BYTE: return total_template(static_cast(p0), false); ++ case INT: return total_template(static_cast(p0), false); ++ case UINT: return total_template(static_cast(p0), false); ++ case LONG: return total_template(static_cast(p0), false); ++ case ULONG: return total_template(static_cast(p0), false); ++ case LONG64: return total_template(static_cast(p0), false); ++ case ULONG64: return total_template(static_cast(p0), false); ++ case FLOAT: return total_template(static_cast(p0), nan); ++ case DOUBLE: return total_template(static_cast(p0), nan); ++ case COMPLEX: return total_template(static_cast(p0), nan); ++ case COMPLEXDBL: return total_template(static_cast(p0), nan); ++ default: assert(false); ++ } ++ } + + // Integer parts by Erin Sheldon + // In IDL total(), the INTEGER keyword takes precedence +@@ -2229,6 +2269,24 @@ + } + else // cumulative + { ++ if (preserve) ++ { ++ switch (p0->Type()) ++ { ++ case BYTE: return total_cu_template(static_cast(p0)->Dup(), false); ++ case INT: return total_cu_template(static_cast(p0)->Dup(), false); ++ case UINT: return total_cu_template(static_cast(p0)->Dup(), false); ++ case LONG: return total_cu_template(static_cast(p0)->Dup(), false); ++ case ULONG: return total_cu_template(static_cast(p0)->Dup(), false); ++ case LONG64: return total_cu_template(static_cast(p0)->Dup(), false); ++ case ULONG64: return total_cu_template(static_cast(p0)->Dup(), false); ++ case FLOAT: return total_cu_template(static_cast(p0)->Dup(), nan); ++ case DOUBLE: return total_cu_template(static_cast(p0)->Dup(), nan); ++ case COMPLEX: return total_cu_template(static_cast(p0)->Dup(), nan); ++ case COMPLEXDBL: return total_cu_template(static_cast(p0)->Dup(), nan); ++ default: assert(false); ++ } ++ } + + // INTEGER keyword takes precedence + if( intRes ) +@@ -2302,6 +2360,24 @@ + + if( !cumulative) + { ++ if (preserve) ++ { ++ switch (p0->Type()) ++ { ++ case BYTE: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, false); ++ case INT: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, false); ++ case UINT: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, false); ++ case LONG: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, false); ++ case ULONG: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, false); ++ case LONG64: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, false); ++ case ULONG64: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, false); ++ case FLOAT: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, nan); ++ case DOUBLE: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, nan); ++ case COMPLEX: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, nan); ++ case COMPLEXDBL: return total_over_dim_template(static_cast(p0), srcDim, sumDim-1, nan); ++ default: assert(false); ++ } ++ } + + // INTEGER keyword takes precedence + if( intRes ) +@@ -2377,6 +2453,24 @@ + } + else // cumulative + { ++ if (preserve) ++ { ++ switch (p0->Type()) ++ { ++ case BYTE: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, false); ++ case INT: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, false); ++ case UINT: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, false); ++ case LONG: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, false); ++ case ULONG: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, false); ++ case LONG64: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, false); ++ case ULONG64: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, false); ++ case FLOAT: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nan); ++ case DOUBLE: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nan); ++ case COMPLEX: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nan); ++ case COMPLEXDBL: return total_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nan); ++ default: assert(false); ++ } ++ } + + // INTEGER keyword takes precedence + if( intRes ) +@@ -2502,6 +2596,28 @@ + } + + template<> ++ BaseGDL* product_template( DComplexGDL* src, bool omitNaN) ++ { ++ DComplexGDL::Ty sum = 1; ++ SizeT nEl = src->N_Elements(); ++ if( !omitNaN) ++ { ++ for ( SizeT i=0; i + BaseGDL* product_template( DComplexDblGDL* src, bool omitNaN) + { + DComplexDblGDL::Ty sum = 1; +@@ -2606,138 +2722,324 @@ + BaseGDL* product( EnvT* e) + { + SizeT nParam = e->NParam( 1); +- ++ + BaseGDL* p0 = e->GetParDefined( 0); +- ++ + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( "Variable is undefined: "+e->GetParString(0)); +- ++ + if( p0->Type() == STRING) + e->Throw( "String expression not allowed " + "in this context: "+e->GetParString(0)); + + static int cumIx = e->KeywordIx( "CUMULATIVE"); + static int nanIx = e->KeywordIx( "NAN"); +- bool cumulative = e->KeywordSet( cumIx); +- bool nan = e->KeywordSet( nanIx); +- ++ static int intIx = e->KeywordIx("INTEGER"); ++ static int preIx = e->KeywordIx("PRESERVE_TYPE"); ++ bool KwCumul = e->KeywordSet( cumIx); ++ bool KwNaN = e->KeywordSet( nanIx); ++ bool KwInt = e->KeywordSet( intIx); ++ bool KwPre = e->KeywordSet( preIx); ++ bool nanInt=false; ++ + DLong sumDim = 0; + if( nParam == 2) + e->AssureLongScalarPar( 1, sumDim); ++ ++ if( sumDim == 0) { ++ if( !KwCumul) { ++ if (KwPre) ++ { ++ switch (p0->Type()) ++ { ++ case BYTE: return product_template(static_cast(p0), nanInt); ++ case INT: return product_template(static_cast(p0), nanInt); ++ case UINT: return product_template(static_cast(p0), nanInt); ++ case LONG: return product_template(static_cast(p0), nanInt); ++ case ULONG: return product_template(static_cast(p0), nanInt); ++ case LONG64: return product_template(static_cast(p0), nanInt); ++ case ULONG64: return product_template(static_cast(p0), nanInt); ++ case FLOAT: return product_template(static_cast(p0), KwNaN); ++ case DOUBLE: return product_template(static_cast(p0), KwNaN); ++ case COMPLEX: return product_template(static_cast(p0), KwNaN); ++ case COMPLEXDBL: return product_template(static_cast(p0), KwNaN); ++ default: assert(false); ++ } ++ } + +- if( sumDim == 0) +- { +- if( !cumulative) +- { +- if( p0->Type() == DOUBLE) +- { +- return product_template +- ( static_cast(p0), nan); +- } +- if( p0->Type() == COMPLEXDBL) +- { +- return product_template +- ( static_cast(p0), nan); +- } +- if( p0->Type() == COMPLEX) +- { +- DComplexDblGDL* p0D = static_cast +- (p0->Convert2( COMPLEXDBL,BaseGDL::COPY)); +- auto_ptr p0D_guard( p0D); +- //p0D_guard.reset( p0D); +- return product_template( p0D, nan); +- } ++ // Integer parts derivated from Total code by Erin Sheldon ++ // In IDL PRODUCT(), the INTEGER keyword takes precedence ++ if (KwInt) { ++ // We use LONG64 unless the input is ULONG64 ++ if ((p0->Type() == LONG64) && (!KwNaN)) { ++ return product_template ++ ( static_cast(p0), nanInt ); ++ } ++ if ((p0->Type() == ULONG64) && (!KwNaN)) { ++ return product_template ++ (static_cast(p0), nanInt ); ++ } + +- DDoubleGDL* p0D = static_cast +- (p0->Convert2( DOUBLE, BaseGDL::COPY)); +- auto_ptr p0D_guard( p0D); +- // p0D_guard.reset( p0D); +- return product_template( p0D, nan); +- } +- else // cumulative +- { +- // special case as DOUBLE type overrides /DOUBLE +- if( p0->Type() == DOUBLE) +- { +- return product_cu_template< DDoubleGDL> +- ( static_cast(p0)->Dup(), nan); +- } +- if( p0->Type() == COMPLEXDBL) +- { +- return product_cu_template< DComplexDblGDL> +- ( static_cast(p0)->Dup(), nan); +- } +- if( p0->Type() == COMPLEX) +- { +- return product_cu_template< DComplexDblGDL> +- ( static_cast(p0->Convert2( COMPLEXDBL, +- BaseGDL::COPY)), nan); ++ // Convert to Long64 ++ DLong64GDL* p0L64 = static_cast ++ (p0->Convert2( LONG64, BaseGDL::COPY)); ++ auto_ptr guard( p0L64); ++ if (KwNaN) { ++ DFloatGDL* p0f = static_cast ++ (p0->Convert2( FLOAT, BaseGDL::COPY)); ++ auto_ptr guard( p0f); ++ for( SizeT i=0; i +- ( static_cast(p0->Convert2( DOUBLE, +- BaseGDL::COPY)), nan); ++ } ++ return product_template( p0L64, nanInt); ++ } // integer results ++ ++ if( p0->Type() == DOUBLE) { ++ return product_template ++ ( static_cast(p0), KwNaN); ++ } ++ if( p0->Type() == COMPLEXDBL) { ++ return product_template ++ ( static_cast(p0), KwNaN); + } +- } ++ if( p0->Type() == COMPLEX) { ++ DComplexDblGDL* p0D = static_cast ++ (p0->Convert2( COMPLEXDBL,BaseGDL::COPY)); ++ auto_ptr p0D_guard( p0D); ++ //p0D_guard.reset( p0D); ++ return product_template( p0D, KwNaN); ++ } ++ ++ DDoubleGDL* p0D = static_cast ++ (p0->Convert2( DOUBLE, BaseGDL::COPY)); ++ auto_ptr p0D_guard( p0D); ++ // p0D_guard.reset( p0D); ++ return product_template( p0D, KwNaN); ++ } ++ else ++ { // KwCumul + ++ if (KwPre) ++ { ++ switch (p0->Type()) ++ { ++ case BYTE: return product_cu_template(static_cast(p0)->Dup(), nanInt); ++ case INT: return product_cu_template(static_cast(p0)->Dup(), nanInt); ++ case UINT: return product_cu_template(static_cast(p0)->Dup(), nanInt); ++ case LONG: return product_cu_template(static_cast(p0)->Dup(), nanInt); ++ case ULONG: return product_cu_template(static_cast(p0)->Dup(), nanInt); ++ case LONG64: return product_cu_template(static_cast(p0)->Dup(), nanInt); ++ case ULONG64: return product_cu_template(static_cast(p0)->Dup(), nanInt); ++ case FLOAT: return product_cu_template(static_cast(p0)->Dup(), KwNaN); ++ case DOUBLE: return product_cu_template(static_cast(p0)->Dup(), KwNaN); ++ case COMPLEX: return product_cu_template(static_cast(p0)->Dup(), KwNaN); ++ case COMPLEXDBL: return product_cu_template(static_cast(p0)->Dup(), KwNaN); ++ default: assert(false); ++ } ++ } ++ ++ // Integer parts derivated from Total code by Erin Sheldon ++ // In IDL PRODUCT(), the INTEGER keyword takes precedence ++ if (KwInt) { ++ // We use LONG64 unless the input is ULONG64 ++ if ((p0->Type() == LONG64) && (!KwNaN)) { ++ return product_cu_template ++ ( static_cast(p0)->Dup(), nanInt); ++ } ++ if ((p0->Type() == ULONG64) && (!KwNaN)) { ++ return product_cu_template ++ ( static_cast(p0)->Dup(), nanInt); ++ } ++ // Convert to Long64 ++ DLong64GDL* p0L64 = static_cast ++ (p0->Convert2( LONG64, BaseGDL::COPY)); ++ auto_ptr guard( p0L64); ++ if (KwNaN) { ++ DFloatGDL* p0f = static_cast ++ (p0->Convert2( FLOAT, BaseGDL::COPY)); ++ auto_ptr guard( p0f); ++ for( SizeT i=0; i ++ ((p0L64)->Dup(), nanInt); ++ } // integer results ++ ++ // special case as DOUBLE type overrides /DOUBLE ++ if (p0->Type() == DOUBLE) { ++ return product_cu_template< DDoubleGDL> ++ ( static_cast(p0)->Dup(), KwNaN); ++ } ++ if (p0->Type() == COMPLEXDBL) { ++ return product_cu_template< DComplexDblGDL> ++ ( static_cast(p0)->Dup(), KwNaN); ++ } ++ if (p0->Type() == COMPLEX) { ++ return product_cu_template< DComplexDblGDL> ++ ( static_cast ++ (p0->Convert2( COMPLEXDBL, BaseGDL::COPY)), KwNaN); ++ } ++ return product_cu_template< DDoubleGDL> ++ ( static_cast ++ (p0->Convert2( DOUBLE, BaseGDL::COPY)), KwNaN); ++ } ++ } ++ + // product over sumDim + dimension srcDim = p0->Dim(); + SizeT srcRank = srcDim.Rank(); +- ++ + if( sumDim < 1 || sumDim > srcRank) + e->Throw( "Array must have "+i2s(sumDim)+ + " dimensions: "+e->GetParString(0)); ++ ++ if (!KwCumul) { + +- if( !cumulative) ++ if (KwPre) + { +- if( p0->Type() == DOUBLE) +- { +- return product_over_dim_template< DDoubleGDL> +- ( static_cast(p0), srcDim, sumDim-1, nan); +- } +- if( p0->Type() == COMPLEXDBL) +- { +- return product_over_dim_template< DComplexDblGDL> +- ( static_cast(p0), srcDim, sumDim-1, nan); +- } +- if( p0->Type() == COMPLEX) +- { +- DComplexDblGDL* p0D = static_cast +- (p0->Convert2( COMPLEXDBL,BaseGDL::COPY)); +- auto_ptr p0D_guard( p0D); +- // p0D_guard.reset( p0D); +- return product_over_dim_template< DComplexDblGDL> +- ( p0D, srcDim, sumDim-1, nan); +- } +- +- DDoubleGDL* p0D = static_cast +- (p0->Convert2( DOUBLE,BaseGDL::COPY)); +- auto_ptr p0D_guard( p0D); +- //p0D_guard.reset( p0D); +- return product_over_dim_template< DDoubleGDL>( p0D, srcDim, sumDim-1,nan); ++ switch (p0->Type()) ++ { ++ case BYTE: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, nanInt); ++ case INT: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, nanInt); ++ case UINT: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, nanInt); ++ case LONG: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, nanInt); ++ case ULONG: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, nanInt); ++ case LONG64: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, nanInt); ++ case ULONG64: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, nanInt); ++ case FLOAT: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, KwNaN); ++ case DOUBLE: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, KwNaN); ++ case COMPLEX: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, KwNaN); ++ case COMPLEXDBL: return product_over_dim_template(static_cast(p0), srcDim, sumDim-1, KwNaN); ++ default: assert(false); ++ } + } +- else // cumulative +- { +- if( p0->Type() == DOUBLE) +- { +- return product_over_dim_cu_template< DDoubleGDL> +- ( static_cast(p0)->Dup(), sumDim-1, nan); +- } +- if( p0->Type() == COMPLEXDBL) +- { +- return product_over_dim_cu_template< DComplexDblGDL> +- ( static_cast(p0)->Dup(), sumDim-1, nan); +- } +- if( p0->Type() == COMPLEX) +- { +- return product_over_dim_cu_template< DComplexDblGDL> +- ( static_cast(p0->Convert2( COMPLEXDBL, +- BaseGDL::COPY)), sumDim-1, nan); ++ ++ // Integer parts derivated from Total code by Erin Sheldon ++ // In IDL PRODUCT(), the INTEGER keyword takes precedence ++ if (KwInt) { ++ // We use LONG64 unless the input is ULONG64 ++ if ((p0->Type() == LONG64 ) && (!KwNaN)) { ++ return product_over_dim_template ++ ( static_cast(p0), srcDim, sumDim-1, nanInt); ++ } ++ if ((p0->Type() == ULONG64) && (!KwNaN)) { ++ return product_over_dim_template ++ ( static_cast(p0), srcDim, sumDim-1, nanInt); ++ } ++ ++ // Conver to Long64 ++ DLong64GDL* p0L64 = static_cast ++ (p0->Convert2( LONG64, BaseGDL::COPY)); ++ auto_ptr guard( p0L64); ++ if (KwNaN) { ++ DFloatGDL* p0f = static_cast ++ (p0->Convert2( FLOAT, BaseGDL::COPY)); ++ auto_ptr guard( p0f); ++ for( SizeT i=0; i ++ ( p0L64, srcDim, sumDim-1, nanInt); ++ } // integer results ++ ++ if( p0->Type() == DOUBLE) { ++ return product_over_dim_template< DDoubleGDL> ++ ( static_cast(p0), srcDim, sumDim-1, KwNaN); ++ } ++ if( p0->Type() == COMPLEXDBL) { ++ return product_over_dim_template< DComplexDblGDL> ++ ( static_cast(p0), srcDim, sumDim-1, KwNaN); ++ } ++ if( p0->Type() == COMPLEX) { ++ DComplexDblGDL* p0D = static_cast ++ (p0->Convert2( COMPLEXDBL,BaseGDL::COPY)); ++ auto_ptr p0D_guard( p0D); ++ // p0D_guard.reset( p0D); ++ return product_over_dim_template< DComplexDblGDL> ++ ( p0D, srcDim, sumDim-1, KwNaN); ++ } ++ ++ DDoubleGDL* p0D = static_cast ++ (p0->Convert2( DOUBLE,BaseGDL::COPY)); ++ auto_ptr p0D_guard( p0D); ++ //p0D_guard.reset( p0D); ++ return product_over_dim_template< DDoubleGDL> ++ ( p0D, srcDim, sumDim-1,KwNaN); ++ } ++ else ++ { // KwCumul + ++ if (KwPre) ++ { ++ switch (p0->Type()) ++ { ++ case BYTE: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nanInt); ++ case INT: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nanInt); ++ case UINT: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nanInt); ++ case LONG: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nanInt); ++ case ULONG: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nanInt); ++ case LONG64: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nanInt); ++ case ULONG64: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, nanInt); ++ case FLOAT: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, KwNaN); ++ case DOUBLE: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, KwNaN); ++ case COMPLEX: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, KwNaN); ++ case COMPLEXDBL: return product_over_dim_cu_template(static_cast(p0)->Dup(), sumDim-1, KwNaN); ++ default: assert(false); ++ } ++ } ++ ++ // Integer parts derivated from Total code by Erin Sheldon ++ // In IDL PRODUCT(), the INTEGER keyword takes precedence ++ if (KwInt) { ++ // We use LONG64 unless the input is ULONG64 ++ if ((p0->Type() == LONG64) && (!KwNaN)) { ++ return product_over_dim_cu_template ++ ( static_cast(p0)->Dup(), sumDim-1, nanInt); ++ } ++ if ((p0->Type() == ULONG64 ) && (!KwNaN)) { ++ return product_over_dim_cu_template ++ ( static_cast(p0)->Dup(), sumDim-1, nanInt); ++ } ++ ++ // Convert to Long64 ++ if (KwNaN) { ++ DFloatGDL* p0f = static_cast ++ (p0->Convert2( FLOAT, BaseGDL::COPY)); ++ auto_ptr guard( p0f); ++ for( SizeT i=0; i ++ ( static_cast ++ (p0f->Convert2( LONG64, BaseGDL::COPY)), sumDim-1, nanInt); ++ } else { ++ return product_over_dim_cu_template ++ ( static_cast ++ (p0->Convert2( LONG64, BaseGDL::COPY)), sumDim-1, nanInt); ++ } ++ } // integer results ++ ++ if( p0->Type() == DOUBLE) { ++ return product_over_dim_cu_template< DDoubleGDL> ++ ( static_cast(p0)->Dup(), sumDim-1, KwNaN); ++ } ++ if( p0->Type() == COMPLEXDBL) { ++ return product_over_dim_cu_template< DComplexDblGDL> ++ ( static_cast(p0)->Dup(), sumDim-1, KwNaN); ++ } ++ if( p0->Type() == COMPLEX) { ++ return product_over_dim_cu_template< DComplexDblGDL> ++ ( static_cast ++ (p0->Convert2( COMPLEXDBL, BaseGDL::COPY)), sumDim-1, KwNaN); ++ } ++ + return product_over_dim_cu_template< DDoubleGDL> +- ( static_cast(p0->Convert2( DOUBLE, +- BaseGDL::COPY)), sumDim-1, nan); ++ ( static_cast ++ (p0->Convert2( DOUBLE, BaseGDL::COPY)), sumDim-1, KwNaN); + } + } + +@@ -3000,7 +3302,7 @@ + } + } + +- BaseGDL* transpose( EnvT* e) ++BaseGDL* transpose( EnvT* e) + { + SizeT nParam=e->NParam( 1); + +@@ -3043,7 +3345,47 @@ + return p0->Transpose( NULL); + } + +- ++ ++// BaseGDL* matrix_multiply( EnvT* e) ++// { ++// SizeT nParam=e->NParam( 2); ++// ++// BaseGDL* a = e->GetNumericArrayParDefined( 0); ++// BaseGDL* b = e->GetNumericArrayParDefined( 1); ++// ++// static int aTIx = e->KeywordIx("ATRANSPOSE"); ++// bool aT = e->KeywordPresent(aTIx); ++// static int bTIx = e->KeywordIx("BTRANSPOSE"); ++// bool bT = e->KeywordPresent(bTIx); ++// ++// static int strassenIx = e->KeywordIx("STRASSEN_ALGORITHM"); ++// bool strassen = e->KeywordPresent(strassenIx); ++// ++// ++// if( p1->N_Elements() != rank) ++// e->Throw("Incorrect number of elements in permutation."); ++// ++// DUInt* perm = new DUInt[rank]; ++// auto_ptr perm_guard( perm); ++// ++// DUIntGDL* p1L = static_cast ++// (p1->Convert2( UINT, BaseGDL::COPY)); ++// for( SizeT i=0; iThrow( "Incorrect permutation vector."); ++// } ++// return p0->Transpose( perm); ++// } ++// ++// return a->Transpose( NULL); ++// } + + // helper function for sort_fun, recursive + // optimized version +@@ -3134,6 +3476,79 @@ + // helper arrays + DLongGDL* res = new DLongGDL( dimension( nEl), BaseGDL::INDGEN); + ++ DLong nanIx = nEl; ++ if( p0->Type() == FLOAT) ++ { ++ DFloatGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i]) )//|| !isfinite((*p0F)[ i])) ++ { ++ --nanIx; ++ (*res)[i] = (*res)[nanIx]; ++ (*res)[ nanIx] = i; ++ ++// cout << "swap " << i << " with " << nanIx << endl; ++// cout << "now: "; ++// for( DLong ii=0; ii < nEl; ++ii) ++// { ++// cout << (*res)[ii] << " "; ++// } ++// cout << endl; ++ } ++ } ++ } ++ else if( p0->Type() == DOUBLE) ++ { ++ DDoubleGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i]))// || !isfinite((*p0F)[ i])) ++ { ++ --nanIx; ++ (*res)[i] = (*res)[nanIx]; ++ (*res)[ nanIx] = i; ++ } ++ } ++ } ++ else if( p0->Type() == COMPLEX) ++ { ++ DComplexGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i].real()) || //!isfinite((*p0F)[ i].real()) || ++ isnan((*p0F)[ i].imag()))// || !isfinite((*p0F)[ i].imag()) ) ++ { ++ --nanIx; ++ (*res)[i] = (*res)[nanIx]; ++ (*res)[ nanIx] = i; ++ } ++ } ++ } ++ else if( p0->Type() == COMPLEXDBL) ++ { ++ DComplexDblGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i].real()) || //!isfinite((*p0F)[ i].real()) || ++ isnan((*p0F)[ i].imag()))// || !isfinite((*p0F)[ i].imag()) ) ++ { ++ --nanIx; ++ (*res)[i] = (*res)[nanIx]; ++ (*res)[ nanIx] = i; ++ } ++ } ++ } ++ ++// cout << "nEl " << nEl << " nanIx " << nanIx << endl; ++ nEl = nanIx; ++// cout << "sorting: "; ++// for( DLong ii=0; ii < nEl; ++ii) ++// { ++// cout << (*res)[ii] << " "; ++// } ++// cout << endl; ++ + DLong *hh = static_cast(res->DataAddr()); + + DLong* h1 = new DLong[ nEl/2]; +@@ -3163,6 +3578,12 @@ + { + BaseGDL* p0 = e->GetParDefined( 0); + ++ if( p0->Type() == PTR) ++ e->Throw( "Pointer expression not allowed in this context: "+ ++ e->GetParString(0)); ++ if( p0->Type() == OBJECT) ++ e->Throw( "Object expression not allowed in this context: "+ ++ e->GetParString(0)); + if( p0->Type() == STRUCT) + e->Throw( "Struct expression not allowed in this context: "+ + e->GetParString(0)); +@@ -3178,8 +3599,8 @@ + p0->Type() == DOUBLE || + p0->Type() == COMPLEXDBL || + e->KeywordSet(e->KeywordIx("DOUBLE")); +- DType type = dbl ? DOUBLE : FLOAT; +- bool noconv = (dbl && p0->Type() == DOUBLE) || (!dbl && p0->Type() == FLOAT); ++ DType type = dbl ? DOUBLE : FLOAT; ++ bool noconv = (dbl && p0->Type() == DOUBLE) || (!dbl && p0->Type() == FLOAT); + + // DIMENSION keyword + DLong dim = 0; +@@ -3214,7 +3635,7 @@ + DLong *hh = new DLong[ nEl]; + DLong* h1 = new DLong[ nEl/2]; + DLong* h2 = new DLong[ (nEl+1)/2]; +- ++ + DLong accumStride = 1; + if (nmed > 1) + for( DLong i=0; iDim(i); +@@ -3228,13 +3649,81 @@ + + if (nmed == 1) { + for( DLong i=0; iType() == FLOAT) ++ { ++ DFloatGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i]) )//|| !isfinite((*p0F)[ i])) ++ { ++ --nanIx; ++ hh[i] = hh[nanIx]; ++ hh[ nanIx] = i; ++ ++ // cout << "swap " << i << " with " << nanIx << endl; ++ // cout << "now: "; ++ // for( DLong ii=0; ii < nEl; ++ii) ++ // { ++ // cout << hh[ii] << " "; ++ // } ++ // cout << endl; ++ } ++ } ++ } ++ else if( p0->Type() == DOUBLE) ++ { ++ DDoubleGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i]))// || !isfinite((*p0F)[ i])) ++ { ++ --nanIx; ++ hh[i] = hh[nanIx]; ++ hh[ nanIx] = i; ++ } ++ } ++ } ++ else if( p0->Type() == COMPLEX) ++ { ++ DComplexGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i].real()) || //!isfinite((*p0F)[ i].real()) || ++ isnan((*p0F)[ i].imag()))// || !isfinite((*p0F)[ i].imag()) ) ++ { ++ --nanIx; ++ hh[i] = hh[nanIx]; ++ hh[ nanIx] = i; ++ } ++ } ++ } ++ else if( p0->Type() == COMPLEXDBL) ++ { ++ DComplexDblGDL* p0F = static_cast(p0); ++ for( DLong i=nEl-1; i >= 0; --i) ++ { ++ if( isnan((*p0F)[ i].real()) || //!isfinite((*p0F)[ i].real()) || ++ isnan((*p0F)[ i].imag()))// || !isfinite((*p0F)[ i].imag()) ) ++ { ++ --nanIx; ++ hh[i] = hh[nanIx]; ++ hh[ nanIx] = i; ++ } ++ } ++ } ++ ++ // cout << "nEl " << nEl << " nanIx " << nanIx << endl; ++ nEl = nanIx; ++ + } else { + // Starting Element + DLong start = accumStride * p0->Dim(dim-1) * (k / accumStride) + + (k % accumStride); + for( DLong i=0; i( p0, hh, h1, h2, nEl); + DLong medEl = hh[ nEl/2]; +@@ -3242,7 +3731,7 @@ + + if( (nEl % 2) == 1 || !e->KeywordSet( evenIx)) { + if (nmed == 1) +- res = p0->NewIx(medEl)->Convert2(type, BaseGDL::CONVERT); // TODO: leak with res? ++ res = p0->NewIx(medEl)->Convert2(type, BaseGDL::CONVERT); + else { + if (noconv) + { +@@ -3294,7 +3783,7 @@ + return res; + } + else +- // with parameter Width : median filtering with no optmisation, ++ // with parameter Width : median filtering with no optimisation, + // such as histogram algorithms. + // Copyright: (C) 2008 by Nicolas Galmiche + { +@@ -3320,7 +3809,7 @@ + MaxAllowedWidth=p0->Dim(0); + if (p0->Dim(1) < MaxAllowedWidth) MaxAllowedWidth=p0->Dim(1); + } +- int debug =0; ++ const int debug =0; + if (debug == 1) { + cout << "X dim " << p0->Dim(0) <Dim(1) <KeywordIx( "EVEN"); +- static int doubleIx = e->KeywordIx( "DOUBLE"); ++ static int doubleIx = e->KeywordIx( "DOUBLE"); + static DStructGDL *Values = SysVar::Values(); +- DDouble d_nan=(*static_cast(Values->GetTag(Values->Desc()->TagIndex("D_NAN"), 0)))[0]; ++ DDouble d_nan=(*static_cast(Values->GetTag(Values->Desc()->TagIndex("D_NAN"), 0)))[0]; + DDouble d_infinity= (*static_cast(Values->GetTag(Values->Desc()->TagIndex("D_INFINITY"), 0)))[0]; + + //------------------------------ Init variables and allocation --------------------------------------- +@@ -3575,23 +4064,23 @@ + if(ctl_NaN==width)(*tamp)[col]= d_nan; + else + { +- DLong* hhbis = new DLong[ width-ctl_NaN]; +- DLong* h1bis = new DLong[ width-ctl_NaN/2]; +- DLong* h2bis= new DLong[(width-ctl_NaN+1)/2]; +- DDoubleGDL *Mask1Dbis = new DDoubleGDL(width-ctl_NaN,BaseGDL::NOZERO); +- for( DLong t=0; t(Mask1Dbis); +- MergeSortOpt( besort, hhbis, h1bis, h2bis,(width - ctl_NaN)); +- if (e->KeywordSet( evenIx)&& (width - ctl_NaN) % 2 == 0) +- (*tamp)[col]=((*Mask1Dbis)[hhbis[ (width-ctl_NaN)/2]]+(*Mask1Dbis +- )[hhbis [ (width - ctl_NaN-1)/2]])/2; +- else +- (*tamp)[col]=(*Mask1Dbis)[hhbis[ (width- ctl_NaN)/2]]; +- delete[]hhbis; +- delete[]h2bis; +- delete[]h1bis; +- } ++ DLong* hhbis = new DLong[ width-ctl_NaN]; ++ DLong* h1bis = new DLong[ width-ctl_NaN/2]; ++ DLong* h2bis= new DLong[(width-ctl_NaN+1)/2]; ++ DDoubleGDL *Mask1Dbis = new DDoubleGDL(width-ctl_NaN,BaseGDL::NOZERO); ++ for( DLong t=0; t(Mask1Dbis); ++ MergeSortOpt( besort, hhbis, h1bis, h2bis,(width - ctl_NaN)); ++ if (e->KeywordSet( evenIx)&& (width - ctl_NaN) % 2 == 0) ++ (*tamp)[col]=((*Mask1Dbis)[hhbis[ (width-ctl_NaN)/2]]+(*Mask1Dbis ++ )[hhbis [ (width - ctl_NaN-1)/2]])/2; ++ else ++ (*tamp)[col]=(*Mask1Dbis)[hhbis[ (width- ctl_NaN)/2]]; ++ delete[]hhbis; ++ delete[]h2bis; ++ delete[]h1bis; ++ } + } + else + { +@@ -3762,26 +4251,26 @@ + + if (ctl_NaN!=0) + { +- if(ctl_NaN==N_MaskElem)(*tamp)[j]= d_nan; +- else { +- +- DLong* hhb = new DLong[ N_MaskElem-ctl_NaN]; +- DLong* h1b = new DLong[ (N_MaskElem-ctl_NaN)/2]; +- DLong* h2b= new DLong[(N_MaskElem-ctl_NaN+1)/2]; +- DDoubleGDL*Maskb = new DDoubleGDL(N_MaskElem-ctl_NaN,BaseGDL::NOZERO); +- for( DLong t=0; t(Maskb); +- MergeSortOpt( besort, hhb, h1b, h2b,(N_MaskElem - ctl_NaN)); +- if ((N_MaskElem - ctl_NaN) % 2 == 0 && e->KeywordSet( evenIx)) +- (*tamp)[j]=((*Maskb)[hhb[ (N_MaskElem-ctl_NaN)/2]]+(*Maskb)[hhb +- [ (N_MaskElem - +- ctl_NaN-1)/2]])/2; +- else(*tamp)[j]=(*Maskb)[hhb[(N_MaskElem- ctl_NaN)/2]]; +- delete[]hhb; +- delete[]h2b; +- delete[]h1b; +- } ++ if(ctl_NaN==N_MaskElem) ++ (*tamp)[j]= d_nan; ++ else { ++ DLong* hhb = new DLong[ N_MaskElem-ctl_NaN]; ++ DLong* h1b = new DLong[ (N_MaskElem-ctl_NaN)/2]; ++ DLong* h2b= new DLong[(N_MaskElem-ctl_NaN+1)/2]; ++ DDoubleGDL*Maskb = new DDoubleGDL(N_MaskElem-ctl_NaN,BaseGDL::NOZERO); ++ for( DLong t=0; t(Maskb); ++ MergeSortOpt( besort, hhb, h1b, h2b,(N_MaskElem - ctl_NaN)); ++ if ((N_MaskElem - ctl_NaN) % 2 == 0 && e->KeywordSet( evenIx)) ++ (*tamp)[j]=((*Maskb)[hhb[ (N_MaskElem-ctl_NaN)/2]]+(*Maskb)[hhb ++ [ (N_MaskElem - ++ ctl_NaN-1)/2]])/2; ++ else(*tamp)[j]=(*Maskb)[hhb[(N_MaskElem- ctl_NaN)/2]]; ++ delete[]hhb; ++ delete[]h2b; ++ delete[]h1b; ++ } + } + else + { +@@ -3989,10 +4478,17 @@ + e->GetParString(0)); + + SizeT resDimInit[ MAXRANK]; +- for( SizeT p=1; pGetParAs(1); ++ if (p1->Rank() > 0 && nParam > 2) ++ e->Throw("The new dimensions must either be specified as an array or as a set of scalars."); ++ SizeT np = p1->Rank() == 0 ? nParam : p1->N_Elements() + 1; ++ ++ for( SizeT p=1; pAssureLongScalarPar( p, newDim); ++ if (p1->Rank() == 0) e->AssureLongScalarPar( p, newDim); ++ else newDim = (*p1)[p - 1]; + + if( newDim <= 0) + e->Throw( "Array dimensions must be greater than 0."); +@@ -4018,7 +4514,7 @@ + resDimInit[ p-1] = newDim; + } + +- dimension resDim( resDimInit, nParam-1); ++ dimension resDim( resDimInit, np-1); + + static int sampleIx = e->KeywordIx( "SAMPLE"); + bool sample = e->KeywordSet( sampleIx); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basic_fun_jmg.cpp cvs/gdl/src/basic_fun_jmg.cpp +--- gdl-0.9rc4/src/basic_fun_jmg.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basic_fun_jmg.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -640,7 +640,6 @@ + return res; + } + +- + if (e->KeywordSet( "S_PROCEDURES")) { + deque subList; + +@@ -720,19 +719,20 @@ + } else if (fetch) { // FETCH + + e->AssureScalarPar( 0, varName); +- int xI = pro->FindVar(StrUpCase( varName)); ++ varName = StrUpCase( varName); ++ int xI = pro->FindVar( varName); + // cout << xI << endl; + if (xI != -1) { + BaseGDL*& par = ((EnvT*)(callStack[desiredlevnum-1]))->GetPar( xI); + + if( par == NULL) +-// e->Throw( "Variable is undefined: " + varName); +- return NULL; ++ e->Throw( "Variable is undefined: " + varName); ++// return NULL; + // char* addr = static_cast(par->DataAddr()); + return par->Dup(); + } + +-// e->Throw( "Variable not found: " + varName); ++ e->Throw( "Variable not found: " + varName); + return NULL; + } else if (arg) { // ARG_NAME + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basic_op.cpp cvs/gdl/src/basic_op.cpp +--- gdl-0.9rc4/src/basic_op.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basic_op.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -43,7 +43,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -57,7 +57,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -70,7 +70,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -122,7 +122,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -167,7 +167,7 @@ + // if( nEl == 0) throw GDLException("Variable is undefined."); + + DByteGDL* res = new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -182,7 +182,7 @@ + // if( nEl == 0) throw GDLException("Variable is undefined."); + + DByteGDL* res = new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -197,7 +197,7 @@ + // if( nEl == 0) throw GDLException("Variable is undefined."); + + DByteGDL* res = new Data_( dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -211,7 +211,7 @@ + assert( nEl); + // if( nEl == 0) throw GDLException("Variable is undefined."); + DByteGDL* res = new Data_( dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -225,7 +225,7 @@ + assert( nEl); + // if( nEl == 0) throw GDLException("Variable is undefined."); + DByteGDL* res = new Data_( dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -239,7 +239,7 @@ + assert( nEl); + // if( nEl == 0) throw GDLException("Variable is undefined."); + DByteGDL* res = new Data_( dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -255,7 +255,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -267,7 +267,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -281,7 +281,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -294,7 +294,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -308,7 +308,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -321,7 +321,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -335,7 +335,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -348,7 +348,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -361,7 +361,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -374,7 +374,7 @@ + ULong nEl=N_Elements(); + assert( nEl != 0); + // if( !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -437,7 +437,7 @@ + if( right->StrictScalar(s)) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -464,7 +464,7 @@ + else // ( rEl >= nEl) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -512,7 +512,7 @@ + if( right->StrictScalar(s)) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -539,7 +539,7 @@ + else // ( rEl >= nEl) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -587,7 +587,7 @@ + if( right->StrictScalar(s)) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -614,7 +614,7 @@ + else // ( rEl >= nEl) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -674,7 +674,7 @@ + if( right->StrictScalar(s)) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -701,7 +701,7 @@ + else // ( rEl >= nEl) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -761,7 +761,7 @@ + if( right->StrictScalar(s)) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -788,7 +788,7 @@ + else // ( rEl >= nEl) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -848,7 +848,7 @@ + if( right->StrictScalar(s)) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -875,7 +875,7 @@ + else // ( rEl >= nEl) + { + res= new Data_( this->dim, BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -918,7 +918,7 @@ + // MatrixOp + // returns *this # *r, //C deletes itself and right + template +-Data_* Data_::MatrixOp( BaseGDL* r) ++Data_* Data_::MatrixOp( BaseGDL* r, bool transpose, bool transposeResult, bool strassen) + { + Data_* right=static_cast(r); + +@@ -962,11 +962,11 @@ + // [n] # [n,m] -> [1,m] ([n] -> [1,n]) + + // right op 1st +- SizeT nRow=right->dim[1]; ++ SizeT nRow=transpose ? right->dim[0] : right->dim[1]; + if( nRow == 0) nRow=1; + + // loop dim +- SizeT nRowEl=right->dim[0]; ++ SizeT nRowEl=transpose ? right->dim[1] : right->dim[0]; + if( nRowEl == 0) nRowEl=1; + + // result dim +@@ -1005,15 +1005,27 @@ + throw GDLException("Operands of matrix multiply have" + " incompatible dimensions.",true,false); + ++ if( transposeResult) ++ { ++ if( nCol > 1) ++ res=New(dimension( nRow, nCol),BaseGDL::NOZERO); ++ else ++ res=New(dimension(nRow),BaseGDL::NOZERO); ++ } ++ else ++ { + if( nRow > 1) + res=New(dimension(nCol,nRow),BaseGDL::NOZERO); + else + res=New(dimension(nCol),BaseGDL::NOZERO); ++ } + + SizeT rIxEnd = nRow * nColEl; + //#ifdef _OPENMP + SizeT nOp = rIxEnd * nCol; ++ + #ifdef USE_STRASSEN_MATRIXMULTIPLICATION ++ if( !transpose && !transposeResult && strassen) + //if( nOp > 1000000) + { + SizeT maxDim; +@@ -1051,11 +1063,16 @@ + + + //#endif ++ ++if( !transposeResult) // normal ++{ ++if( !transpose) // normal ++{ + #pragma omp parallel if (nOp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nOp)) default(shared) + { +-#pragma omp for ++#pragma omp for + for( SizeT colA=0; colA < nCol; ++colA) // res dim 0 +- for( SizeT rIx=0, rowBnCol=0; rIx < rIxEnd; ++ for( SizeT rIx=0, rowBnCol=0; rIx < rIxEnd; + rIx += nColEl, rowBnCol += nCol) // res dim 1 + { + Ty& resEl = (*res)[ rowBnCol + colA]; +@@ -1065,6 +1082,59 @@ + } + } + } ++else // transpose r ++{ ++#pragma omp parallel if (nOp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nOp)) default(shared) ++{ ++#pragma omp for ++ for( SizeT colA=0; colA < nCol; ++colA) // res dim 0 ++ for( SizeT rIx=0, rowBnCol=0; rIx < nRow; ++rIx, rowBnCol += nCol) // res dim 1 ++ { ++ Ty& resEl = (*res)[ rowBnCol + colA]; ++ resEl = 0;//(*this)[ colA] * (*right)[ rIx]; // initialization ++ for( SizeT i=0; i < nColEl; ++i) ++ resEl += (*this)[ i*nCol+colA] * (*right)[ rIx + i * nRow]; ++ } ++ } ++} ++} ++else // transposeResult ++{ ++if( !transpose) // normal ++{ ++#pragma omp parallel if (nOp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nOp)) default(shared) ++{ ++#pragma omp for ++ for( SizeT colA=0; colA < nCol; ++colA) // res dim 0 ++ for( SizeT rIx=0, rowBnCol=0; rIx < rIxEnd; ++ rIx += nColEl, ++rowBnCol) // res dim 1 ++ { ++ Ty& resEl = (*res)[ rowBnCol + colA * nRow]; ++ resEl = 0;//(*this)[ colA] * (*right)[ rIx]; // initialization ++ for( SizeT i=0; i < nColEl; ++i) ++ resEl += (*this)[ i*nCol+colA] * (*right)[ rIx+i]; ++ } ++ } ++} ++else // transpose r ++{ ++#pragma omp parallel if (nOp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nOp)) default(shared) ++{ ++#pragma omp for ++ for( SizeT colA=0; colA < nCol; ++colA) // res dim 0 ++ for( SizeT rIx=0; rIx < nRow; ++rIx) // res dim 1 ++ { ++ Ty& resEl = (*res)[ rIx + colA * nRow]; ++ resEl = 0;//(*this)[ colA] * (*right)[ rIx]; // initialization ++ for( SizeT i=0; i < nColEl; ++i) ++ resEl += (*this)[ i*nCol+colA] * (*right)[ rIx + i * nRow]; ++ } ++ } ++} ++} ++ ++ ++} + //C delete right; + //C delete this; + return res; +@@ -1075,25 +1145,25 @@ + + + // invalid types +-DStructGDL* DStructGDL::MatrixOp( BaseGDL* r) ++DStructGDL* DStructGDL::MatrixOp( BaseGDL* r, bool t, bool tr, bool s) + { + throw GDLException("Cannot apply operation to datatype STRUCT.",true,false); + return NULL; + } + template<> +-Data_* Data_::MatrixOp( BaseGDL* r) ++Data_* Data_::MatrixOp( BaseGDL* r, bool t, bool tr, bool s) + { + throw GDLException("Cannot apply operation to datatype STRING.",true,false); + return this; + } + template<> +-Data_* Data_::MatrixOp( BaseGDL* r) ++Data_* Data_::MatrixOp( BaseGDL* r, bool t, bool tr, bool s) + { + throw GDLException("Cannot apply operation to datatype PTR.",true,false); + return NULL; + } + template<> +-Data_* Data_::MatrixOp( BaseGDL* r) ++Data_* Data_::MatrixOp( BaseGDL* r, bool t, bool tr, bool s) + { + throw GDLException("Cannot apply operation to datatype OBJECT.",true,false); + return NULL; +@@ -1116,7 +1186,7 @@ + assert( nEl); + // note: we can't use valarray operation here as right->dd + // might be larger than this->dd +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1140,7 +1210,7 @@ + ULong nEl=N_Elements(); + // assert( rEl); + assert( nEl); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1157,7 +1227,7 @@ + ULong nEl=N_Elements(); + // assert( rEl); + assert( nEl); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1175,7 +1245,7 @@ + ULong nEl=N_Elements(); + // assert( rEl); + assert( nEl); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1192,7 +1262,7 @@ + ULong nEl=N_Elements(); + // assert( rEl); + assert( nEl); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1278,7 +1348,7 @@ + + // s &= Ty(1); + // dd &= s; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) shared(s) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) shared(s) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1305,7 +1375,7 @@ + if( s == zero) + // dd = zero; + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1327,7 +1397,7 @@ + if( s == zero) + // dd = zero; + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1335,7 +1405,7 @@ + }} + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1357,7 +1427,7 @@ + // right->Scalar(s); + if( s == zero) + // dd = zero; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1377,7 +1447,7 @@ + if( s == zero) + // dd = zero; + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1385,7 +1455,7 @@ + }} + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1462,7 +1532,7 @@ + // assert( rEl); + assert( nEl); + //if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1488,7 +1558,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1506,7 +1576,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1525,7 +1595,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1543,7 +1613,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1607,7 +1677,7 @@ + // right->Scalar(s); + //s &= Ty(1); + // dd |= s; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1634,7 +1704,7 @@ + // right->Scalar(s); + if( s != zero) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1668,7 +1738,7 @@ + // right->Scalar(s); + if( s != zero) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1688,7 +1758,7 @@ + if( s != zero) + // dd = s; + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1696,7 +1766,7 @@ + }} + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1766,7 +1836,7 @@ + if( s != Sp::zero) + // dd ^= s; + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1775,7 +1845,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1841,7 +1911,7 @@ + assert( nEl); + Ty s = (*right)[0]; + // dd ^= s; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1913,7 +1983,7 @@ + ULong nEl=N_Elements(); + // assert( rEl); + assert( nEl); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1936,7 +2006,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -1978,7 +2048,7 @@ + Ty s = (*right)[0]; + // right->Scalar(s); + // dd += s; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2001,7 +2071,7 @@ + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2050,7 +2120,7 @@ + dd -= right->dd; + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2072,7 +2142,7 @@ + /* if( nEl == rEl) + dd = right->dd - dd; + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2137,7 +2207,7 @@ + Ty s = (*right)[0]; + // right->Scalar(s); + // dd -= s; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2156,7 +2226,7 @@ + Ty s = (*right)[0]; + // right->Scalar(s); + // dd = s - dd; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2225,7 +2295,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2278,7 +2348,7 @@ + assert( nEl); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2335,7 +2405,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2388,7 +2458,7 @@ + assert( nEl); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2446,7 +2516,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2488,7 +2558,7 @@ + Ty s = (*right)[0]; + // right->Scalar(s); + // dd *= s; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2547,7 +2617,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + // bool zeroEncountered = false; // until zero operation is already done. + #pragma omp for +@@ -2586,7 +2656,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + // bool zeroEncountered = false; // until zero operation is already done. + #pragma omp for +@@ -2667,7 +2737,7 @@ + { + // right->Scalar(s); + // dd /= s; +-/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for*/ + for( SizeT i=0; i < nEl; ++i) +@@ -2701,7 +2771,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + // bool zeroEncountered = false; + #pragma omp for +@@ -2795,7 +2865,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + // bool zeroEncountered = false; + #pragma omp for +@@ -2839,7 +2909,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + // bool zeroEncountered = false; + #pragma omp for +@@ -2878,7 +2948,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2897,7 +2967,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2922,7 +2992,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -2941,7 +3011,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3046,7 +3116,7 @@ + + // right->Scalar(s); + assert( s == this->zero); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT ix=i; ix < nEl; ++ix) +@@ -3080,7 +3150,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + // bool zeroEncountered = false; +@@ -3113,7 +3183,7 @@ + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3132,7 +3202,7 @@ + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3149,7 +3219,7 @@ + assert( nEl); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3167,7 +3237,7 @@ + assert( nEl); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3286,7 +3356,7 @@ + // assert( rEl); + assert( nEl); + // if( !rEl || !nEl) throw GDLException("Variable is undefined."); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3308,7 +3378,7 @@ + // right->dd.resize(nEl); + // dd = pow( right->Resize(nEl), dd); // valarray + +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3333,7 +3403,7 @@ + } + else*/ + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3378,7 +3448,7 @@ + if( r->StrictScalar()) + { + DLong r0 = (*right)[0]; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3398,7 +3468,7 @@ + } + if( nEl <= rEl) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3429,7 +3499,7 @@ + { + Data_* res = new Data_( Dim(), BaseGDL::NOZERO); + DLong r0 = (*right)[0]; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3450,7 +3520,7 @@ + if( nEl <= rEl) + { + Data_* res = new Data_( Dim(), BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3480,7 +3550,7 @@ + if( r->StrictScalar()) + { + DLong r0 = (*right)[0]; +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3500,7 +3570,7 @@ + } + if( nEl <= rEl) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3531,7 +3601,7 @@ + { + Data_* res = new Data_( Dim(), BaseGDL::NOZERO); + DLong r0 = (*right)[0]; +- #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++ #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3552,7 +3622,7 @@ + if( nEl <= rEl) + { + Data_* res = new Data_( Dim(), BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3586,7 +3656,7 @@ + /* if( rEl == nEl) + dd = pow( right->dd, dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3610,7 +3680,7 @@ + /* if( rEl == nEl) + dd = pow( dd, right->dd); // valarray + else*/ +- #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++ #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3634,7 +3704,7 @@ + /* if( rEl == nEl) + dd = pow( right->dd, dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3662,7 +3732,7 @@ + // (must also be consistent with ComplexDbl) + if( right->StrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iStrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iN_Elements() == nEl) + dd = pow( dd, right->dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3818,7 +3888,7 @@ + /* if( rEl == nEl) + dd = pow( right->dd, dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -3847,7 +3917,7 @@ + // (concerning when a new variable is created vs. using this) + if( right->StrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iStrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iN_Elements() == nEl) + dd = pow( dd, right->dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -4005,7 +4075,7 @@ + /* if( rEl == nEl) + dd = pow( right->dd, dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -4073,7 +4143,7 @@ + Ty s = (*right)[0]; + // right->Scalar(s); + +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -4094,7 +4164,7 @@ + Ty s = (*right)[0]; + // right->Scalar(s); + // dd = pow( s, d); // valarray +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -4112,7 +4182,7 @@ + assert( nEl); + Ty s = (*right)[0]; + // right->Scalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iScalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iScalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iScalar(s); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iStrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iStrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iScalar(s); + //#if (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2) +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iScalar(s); + //#if (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2) +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iStrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iStrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iScalar(s); + //#if (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2) +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iScalar(s); + //#if (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2) +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iStrictScalar(s)) + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -4611,7 +4681,7 @@ + } + else + { +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -4660,7 +4730,7 @@ + { + DComplexGDL* res = new DComplexGDL( this->Dim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); + //#if (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2) +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iN_Elements() == nEl) + res->dd = pow( dd, right->dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +@@ -4844,7 +4914,7 @@ + { + DComplexDblGDL* res = new DComplexDblGDL( this->Dim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iDim(), + BaseGDL::NOZERO); + //#if (__GNUC__ == 3) && (__GNUC_MINOR__ <= 2) +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; iN_Elements() == nEl) + res->dd = pow( dd, right->dd); // valarray + else*/ +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basic_pro.cpp cvs/gdl/src/basic_pro.cpp +--- gdl-0.9rc4/src/basic_pro.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basic_pro.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -688,47 +688,50 @@ + void exitgdl( EnvT* e) + { + +-#ifdef HAVE_LIBWXWIDGETS +- wxTheApp->OnExit(); // Defined in GDLApp::OnExit() in gdlwidget.cpp +- wxUninitialize(); +-#endif +- + #ifdef HAVE_LIBREADLINE + + // we manage the ASCII "history" file (located in ~/.gdl/) + // we do not manage NOW the number of lines we save, + // this should be limited by "history/readline" itself +- +- // Create eventually the ".gdl" path in user $HOME +- int result, debug=0; +- char *homeDir = getenv( "HOME"); +- if (homeDir != NULL) ++ ++ if( historyIntialized) + { +- string pathToGDL_history = homeDir; +- AppendIfNeeded(pathToGDL_history, "/"); +- pathToGDL_history += ".gdl"; +- // Create eventially the ".gdl" path in Home +- result = mkdir(pathToGDL_history.c_str(), 0700); +- if (debug) +- { +- if (result == 0) cout << "Creation of ~/.gdl PATH "<< endl; +- else cout << "~/.gdl PATH was still here "<< endl; +- } +- +- // (over)write the history file in ~/.gdl PATH +- +- AppendIfNeeded(pathToGDL_history, "/"); +- string history_filename = pathToGDL_history + "history"; +- if (debug) cout << "History file name: " << history_filename << endl; +- result = write_history(history_filename.c_str()); +- if (debug) +- { +- if (result == 0) cout<<"Successfull writing of ~/.gdl/history"<OnExit(); // Defined in GDLApp::OnExit() in gdlwidget.cpp ++// wxUninitialize(); ++#endif ++ + BaseGDL* status=e->GetKW( 1); + if( status == NULL) exit( EXIT_SUCCESS); + +@@ -913,8 +916,8 @@ + e->AssureScalarPar( 1, name); + + // Change leading "~" to home directory +- if (name.substr(0,2) == "~/") +- name = getenv("HOME") + name.substr(1,name.size()-1); ++// if (name.substr(0,2) == "~/") ++// name = getenv("HOME") + name.substr(1,name.size()-1); + + // endian + bool swapEndian=false; +@@ -2171,11 +2174,61 @@ + } + } + +- void resolve_routine( EnvT* e) { ++ void resolve_routine( EnvT* e) ++ { ++ SizeT nParam=e->NParam(1); ++ ++// static int eitherIx = e->KeywordIx( "EITHER"); ++// static int is_functionIx = e->KeywordIx( "IS_FUNCTION"); ++// static int no_recompileIx = e->KeywordIx( "NO_RECOMPILE"); ++ ++ BaseGDL* p0 = e->GetParDefined( 0); ++ DStringGDL* p0S = dynamic_cast( p0); ++ if( p0S == NULL) ++ e->Throw( "Expression must be a string in this context: "+ ++ e->GetParString(0)); + ++ static StrArr openFiles; ++ ++ SizeT nEl = p0S->N_Elements(); ++ for( int i=0; iThrow("Not found: " + proFile); ++ ++ // file already opened? ++ bool open = false; ++ for( StrArr::iterator i=openFiles.begin(); i != openFiles.end(); i++) ++ { ++ if( proFile == *i) ++ { ++ open = true; ++ break; ++ } ++ } ++ if( open) ++ continue; ++ ++ StackSizeGuard guard( openFiles); ++ ++ // append file to list ++ openFiles.push_back(proFile); ++ ++ bool success = GDLInterpreter::CompileFile( proFile, ""); // this might trigger recursion ++ ++ if( success) ++ Message("RESOLVE_ROUTINE: Compiled file: " + proFile); ++ else ++ e->Throw("Failed to compiled file: " + proFile); ++ } ++ } ++ + void caldat(EnvT* e) { + /* + * SA: based on the following codes: +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basic_pro_jmg.cpp cvs/gdl/src/basic_pro_jmg.cpp +--- gdl-0.9rc4/src/basic_pro_jmg.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basic_pro_jmg.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -45,17 +45,22 @@ + e->AssureLongScalarPar( 0, lun); + + if( lun == 0 || abs(lun) > maxLun) +- e->Throw( "File unit is not within allowed range."); ++ throw GDLException( e->CallingNode(), ++ "POINT_LUN: File unit is not within allowed range."); + + GDLStream& actUnit = fileUnits[ abs(lun)-1]; + + if( !actUnit.IsOpen()) +- e->Throw( "File unit is not open: " +i2s(abs(lun))); ++ throw GDLException( e->CallingNode(), ++ "POINT_LUN: File unit is not open: " +i2s(abs(lun))); + + if (lun < 0) { +- e->AssureGlobalPar(1); +- // TODO: 64-bit long if needed +- e->SetPar(1, new DLongGDL( actUnit.Tell())); ++ BaseGDL** retPos = &e->GetPar( 1); ++ ++ delete *retPos; ++ *retPos = new DLongGDL( actUnit.Tell()); ++ return; ++ + } else { + DLong pos; + e->AssureLongScalarPar( 1, pos); +@@ -160,27 +165,46 @@ + double t_current=0.0; + + double diff=0.0; +- while (diff < waittime ) { +- +- if( sigControlC) return; +- +- struct timespec delay; +- delay.tv_sec=0; +- if( (waittime - diff) > 0.1) +- { +- delay.tv_nsec = 100000000; // 100ms +- nanosleep(&delay,NULL); +- } +- else +- { +- delay.tv_nsec = (long int)(waittime - diff) * 1000000000; // 1s +- nanosleep(&delay,NULL); +- } +- ++ while (diff < waittime ) { + gettimeofday(&tval,&tzone); + t_current= tval.tv_sec+tval.tv_usec/1e+6; +- diff=t_current - t_start; ++ diff=t_current - t_start; + } + } + ++ void kwtest( EnvT* e) ++ { ++ StackGuard guard( e->Interpreter()->CallStack()); ++ ++ // here first parameter is the function name ++ // set callF to the function you want to call ++ int nParam=e->NParam(); ++ if( nParam == 0) ++ e->Throw( "No function specified."); ++ DString callF; ++ e->AssureScalarPar( 0, callF); ++ ++ // this is a function name -> convert to UPPERCASE ++ callF = StrUpCase( callF); ++ ++ SizeT funIx = GDLInterpreter::GetFunIx( callF); ++ ++ EnvUDT* newEnv= new EnvUDT( e, funList[ funIx], NULL); ++ ++ // add parameter ++ SizeT widgetID = 999; ++ ++ newEnv->SetNextPar( new DLongGDL(widgetID)); // pass as local ++ ++ e->Interpreter()->CallStack().push_back( newEnv); ++ ++ // make the call ++ BaseGDL* res = e->Interpreter()-> ++ call_fun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ // set the keyword to the function's return value ++ static int testIx = e->KeywordIx( "TEST"); ++ e->SetKW( testIx, res); ++ } ++ + } // namespace +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/basic_pro_jmg.hpp cvs/gdl/src/basic_pro_jmg.hpp +--- gdl-0.9rc4/src/basic_pro_jmg.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/basic_pro_jmg.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -27,6 +27,8 @@ + void linkimage( EnvT* e); + void wait( EnvT* e); + ++ void kwtest( EnvT* e); ++ + } // namespace + + #endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/convert2.cpp cvs/gdl/src/convert2.cpp +--- gdl-0.9rc4/src/convert2.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/convert2.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -572,6 +572,8 @@ + } // UINT + + ++ ++ + template<> BaseGDL* Data_::Convert2( DType destTy, BaseGDL::Convert2Mode mode) + { + if( destTy == t) return (((mode & BaseGDL::COPY) != 0)?Dup():this); +@@ -688,7 +690,7 @@ + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +- (*dest)[i]=i2s((*this)[i],8); ++ (*dest)[i]=i2s((*this)[i],12); + } + if( (mode & BaseGDL::CONVERT) != 0) delete this; + return dest; +@@ -730,6 +732,9 @@ + return NULL; + } // LONG + ++ ++ ++ + template<> BaseGDL* Data_::Convert2( DType destTy, BaseGDL::Convert2Mode mode) + { + if( destTy == t) return (((mode & BaseGDL::COPY) != 0)?Dup():this); +@@ -846,7 +851,7 @@ + { + #pragma omp for + for( SizeT i=0; i < nEl; ++i) +- (*dest)[i]=i2s((*this)[i],8); ++ (*dest)[i]=i2s((*this)[i],12); + } + if( (mode & BaseGDL::CONVERT) != 0) delete this; + return dest; +@@ -888,6 +893,9 @@ + return NULL; + } // ULONG + ++ ++ ++ + template<> BaseGDL* Data_::Convert2( DType destTy, BaseGDL::Convert2Mode mode) + { + if( destTy == t) return (((mode & BaseGDL::COPY) != 0)?Dup():this); +@@ -1041,6 +1049,9 @@ + return NULL; + } + ++ ++ ++ + template<> BaseGDL* Data_::Convert2( DType destTy, BaseGDL::Convert2Mode mode) + { + if( destTy == t) return (((mode & BaseGDL::COPY) != 0)?Dup():this); +@@ -1196,6 +1207,10 @@ + return NULL; + } + ++ ++ ++ ++ + inline void StringConversionError( bool& errorFlag, BaseGDL::Convert2Mode mode, const string& msg) + { + if( (mode & BaseGDL::THROWIOERROR) != 0) +@@ -1537,6 +1552,9 @@ + return NULL; + } + ++ ++ ++ + template<> BaseGDL* Data_::Convert2( DType destTy, BaseGDL::Convert2Mode mode) + { + if( destTy == t) return (((mode & BaseGDL::COPY) != 0)?Dup():this); +@@ -1690,6 +1708,9 @@ + return NULL; // get rid of warning + } + ++ ++ ++ + template<> BaseGDL* Data_::Convert2( DType destTy, BaseGDL::Convert2Mode mode) + { + if( destTy == t) return (((mode & BaseGDL::COPY) != 0)?Dup():this); +@@ -1843,6 +1864,9 @@ + return NULL; // get rid of warning + } + ++ ++ ++ + // 64 bit integers + template<> BaseGDL* Data_::Convert2( DType destTy, BaseGDL::Convert2Mode mode) + { +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/datalistt.hpp cvs/gdl/src/datalistt.hpp +--- gdl-0.9rc4/src/datalistt.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/datalistt.hpp 2010-05-21 10:23:55.471906250 -0600 +@@ -84,7 +84,7 @@ + env.pop_back(); + } + +- SizeT size() { return env.size();} ++ SizeT size() const { return env.size();} + void reserve( SizeT s) + { + env.reserve( s); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/datatypes.cpp cvs/gdl/src/datatypes.cpp +--- gdl-0.9rc4/src/datatypes.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/datatypes.cpp 2010-05-21 10:23:55.497968057 -0600 +@@ -56,7 +56,6 @@ + + using namespace std; + +- + // this (ugly) including of other sourcefiles has to be done, because + // on Mac OS X a template instantiation request (see bottom of file) + // can only be done once +@@ -72,6 +71,9 @@ + #define INCLUDE_OFMT_CPP 1 + #include "ofmt.cpp" + ++#define INCLUDE_DATATYPESREF_CPP 1 ++#include "datatypesref.cpp" ++ + #if defined(USE_PYTHON) || defined(PYTHON_MODULE) + + #define INCLUDE_TOPYTHON_CPP 1 +@@ -86,13 +88,15 @@ + #endif + #endif + +-template ++template + deque< void*> Data_::freeList; + + template void* Data_::operator new( size_t bytes) + { + assert( bytes == sizeof( Data_)); + ++// cout << "Alloc: " << bytes << " " << Sp::str << endl; ++ + if( freeList.size() > 0) + { + void* res = freeList.back(); +@@ -100,8 +104,6 @@ + return res; + } + +-// cout << "Alloc: " << bytes << " " << Sp::str << endl; +- + const size_t newSize = multiAlloc - 1; + freeList.resize( newSize); + char* res = static_cast< char*>( malloc( sizeof( Data_) * multiAlloc)); // one more than newSize +@@ -116,13 +118,25 @@ + + template void Data_::operator delete( void *ptr) + { ++// cout << "Delete: " << ptr << endl; ++ + freeList.push_back( ptr); + } + + + + // destructor +-template Data_::~Data_() {}; ++template Data_::~Data_() {} ++template<> Data_::~Data_() ++{ ++ if( this->dd.GetBuffer() != NULL) ++ GDLInterpreter::DecRef( this); ++} ++template<> Data_::~Data_() ++{ ++ if( this->dd.GetBuffer() != NULL) ++ GDLInterpreter::DecRefObj( this); ++} + + // default + template Data_::Data_(): Sp(), dd() {} +@@ -130,6 +144,10 @@ + // scalar + template Data_::Data_(const Ty& d_): Sp(), dd(d_) + {} ++// template<> Data_::Data_(const Ty& d_): SpDPtr(), dd(d_) ++// {GDLInterpreter::IncRef(d_);} ++// template<> Data_::Data_(const Ty& d_): SpDObj(), dd(d_) ++// {GDLInterpreter::IncRefObj(d_);} + + // new array, zero fields + template Data_::Data_(const dimension& dim_): +@@ -142,13 +160,18 @@ + template Data_::Data_( const Ty* p, const SizeT nEl): + Sp( dimension( nEl)), dd( p, nEl) + {} ++template<> Data_::Data_( const Ty* p, const SizeT nEl): ++ SpDPtr( dimension( nEl)), dd( p, nEl) ++{GDLInterpreter::IncRef(this);} ++template<> Data_::Data_( const Ty* p, const SizeT nEl): ++ SpDObj( dimension( nEl)), dd( p, nEl) ++{GDLInterpreter::IncRefObj(this);} + + // c-i + // template Data_::Data_(const Data_& d_): + // Sp(d_.dim), dd(d_.dd) {} + +-template Data_::Data_(const dimension& dim_, +- BaseGDL::InitType iT): ++template Data_::Data_(const dimension& dim_, BaseGDL::InitType iT): + Sp( dim_), dd( (iT == BaseGDL::NOALLOC) ? 0 : this->dim.N_Elements(), false) + { + this->dim.Purge(); +@@ -157,13 +180,13 @@ + { + SizeT sz=dd.size(); + // Ty val=Sp::zero; +-#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS)// && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { + #pragma omp for + for( SizeT i=0; i Data_::Data_(const dimension& dim_, +- BaseGDL::InitType iT): ++template<> Data_::Data_(const dimension& dim_, BaseGDL::InitType iT): + SpDString(dim_), dd( (iT == BaseGDL::NOALLOC) ? 0 : this->dim.N_Elements(), false) + { + dim.Purge(); +@@ -245,25 +267,84 @@ + if( iT == BaseGDL::INDGEN) + throw GDLException("DStringGDL(dim,InitType=INDGEN) called."); + } +-template<> Data_::Data_(const dimension& dim_, +- BaseGDL::InitType iT): ++template<> Data_::Data_(const dimension& dim_, BaseGDL::InitType iT): + SpDPtr(dim_), dd( (iT == BaseGDL::NOALLOC) ? 0 : this->dim.N_Elements(), false) + { + dim.Purge(); + + if( iT == BaseGDL::INDGEN) + throw GDLException("DPtrGDL(dim,InitType=INDGEN) called."); ++ ++ if( iT != BaseGDL::NOALLOC && iT != BaseGDL::NOZERO) ++ { ++ SizeT sz = dd.size(); ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++{ ++#pragma omp for*/ ++ for( SizeT i=0; i Data_::Data_(const dimension& dim_, +- BaseGDL::InitType iT): ++template<> Data_::Data_(const dimension& dim_, BaseGDL::InitType iT): + SpDObj(dim_), dd( (iT == BaseGDL::NOALLOC) ? 0 : this->dim.N_Elements(), false) + { + dim.Purge(); + + if( iT == BaseGDL::INDGEN) + throw GDLException("DObjGDL(dim,InitType=INDGEN) called."); ++ ++ if( iT != BaseGDL::NOALLOC && iT != BaseGDL::NOZERO) ++ { ++ SizeT sz = dd.size(); ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++{ ++#pragma omp for*/ ++ for( SizeT i=0; i ++ Data_::Data_(const Data_& d_): Sp(d_.dim), dd(d_.dd) {} ++template<> ++ Data_::Data_(const Data_& d_): SpDPtr(d_.dim), dd(d_.dd) ++ { ++ GDLInterpreter::IncRef( this); ++ } ++template<> ++ Data_::Data_(const Data_& d_): SpDObj(d_.dim), dd(d_.dd) ++ { ++ GDLInterpreter::IncRefObj( this); ++ } ++ ++ ++template ++Data_* Data_::Dup() const { return new Data_(*this);} ++ ++// template<> ++// Data_* Data_::Dup() const ++// { ++// Data_* p =new Data_(*this); ++// GDLInterpreter::IncRef( p); ++// return p; ++// } ++// template<> ++// Data_* Data_::Dup() const ++// { ++// Data_* p =new Data_(*this); ++// GDLInterpreter::IncRefObj( p); ++// return p; ++// } ++ + + template + Data_* Data_::Log() +@@ -584,10 +665,11 @@ + + srcIx[ aSp] = 0; + if( s[ aSp] >= 0) +- dstIx[ aSp] = s[ aSp] % this_dim[ aSp]; ++ dstIx[ aSp] = s[ aSp] % this_dim[ aSp]; + else +- dstIx[ aSp] = -(-s[aSp] % this_dim[ aSp]); +- if( dstIx[ aSp] < 0) dstIx[ aSp] += this_dim[ aSp]; ++ dstIx[ aSp] = -(-s[aSp] % this_dim[ aSp]); ++ if( dstIx[ aSp] < 0) ++ dstIx[ aSp] += this_dim[ aSp]; + + dim_stride[ aSp] = this_dim[ aSp] * stride[ aSp]; + } +@@ -599,7 +681,44 @@ + + Ty* ddP = &(*this)[0]; + Ty* shP = &(*sh)[0]; +- ++ ++ if( nDim == 2) ++ { ++ for( SizeT a=0; a= this_dim[ 0]) ++ { ++ // dstIx[ aSp] -= dim[ aSp]; ++ dstIx[ 0] = 0; ++ dstLonIx -= dim_stride[ 0]; ++ } ++ if( srcIx[ 0] >= this_dim[ 0]) ++ { ++ srcIx[ 0] = 0; ++ ++srcIx[ 1]; ++ ++dstIx[ 1]; ++ dstLonIx += stride[ 1]; ++ ++ if( dstIx[ 1] >= this_dim[ 1]) ++ { ++ // dstIx[ aSp] -= dim[ aSp]; ++ dstIx[ 1] = 0; ++ dstLonIx -= dim_stride[ 1]; ++ } ++ ++ assert( srcIx[ 1] < this_dim[ 1]); ++/* if( srcIx[ 1] >= this_dim[ 1]) ++ { ++ srcIx[ 1] = 0; ++ }*/ ++ } ++ ++ shP[ dstLonIx++] = ddP[ a++]; ++ } ++ ++ return sh; ++ } ++ + for( SizeT a=0; a= nDim) break; // ?? ++ ++ ++srcIx[ aSp]; + ++dstIx[ aSp]; + dstLonIx += stride[ aSp]; + } +@@ -798,6 +919,62 @@ + } + return res_guard.release(); + } ++template<> ++BaseGDL* Data_::DupReverse( DLong dim) ++{ ++ // SA: based on total_over_dim_template() ++ Data_* res = new Data_(this->dim, BaseGDL::NOZERO); ++ auto_ptr res_guard(res); ++ SizeT nEl = N_Elements(); ++ SizeT revStride = this->dim.Stride(dim); ++ SizeT outerStride = this->dim.Stride(dim + 1); ++ SizeT revLimit = this->dim[dim] * revStride; ++ for (SizeT o = 0; o < nEl; o += outerStride) ++ { ++ for (SizeT i = 0; i < revStride; ++i) ++ { ++ SizeT oi = o + i; ++ SizeT last_plus_oi = revLimit + oi - revStride + oi; ++ SizeT half = ((revLimit / revStride) / 2) * revStride + oi; ++ for (SizeT s = oi; s < half; s += revStride) ++ { ++ SizeT opp = last_plus_oi - s; ++ (*res)[s] = (*this)[opp]; ++ (*res)[opp] = (*this)[s]; ++ } ++ } ++ } ++ GDLInterpreter::IncRef( res); ++ return res_guard.release(); ++} ++template<> ++BaseGDL* Data_::DupReverse( DLong dim) ++{ ++ // SA: based on total_over_dim_template() ++ Data_* res = new Data_(this->dim, BaseGDL::NOZERO); ++ auto_ptr res_guard(res); ++ SizeT nEl = N_Elements(); ++ SizeT revStride = this->dim.Stride(dim); ++ SizeT outerStride = this->dim.Stride(dim + 1); ++ SizeT revLimit = this->dim[dim] * revStride; ++ for (SizeT o = 0; o < nEl; o += outerStride) ++ { ++ for (SizeT i = 0; i < revStride; ++i) ++ { ++ SizeT oi = o + i; ++ SizeT last_plus_oi = revLimit + oi - revStride + oi; ++ SizeT half = ((revLimit / revStride) / 2) * revStride + oi; ++ for (SizeT s = oi; s < half; s += revStride) ++ { ++ SizeT opp = last_plus_oi - s; ++ (*res)[s] = (*this)[opp]; ++ (*res)[opp] = (*this)[s]; ++ } ++ } ++ } ++ GDLInterpreter::IncRefObj( res); ++ return res_guard.release(); ++} + + // rank must be 1 or 2 (already checked) + template +@@ -968,6 +1145,32 @@ + dd = right.dd; + return *this; + } ++template<> ++Data_& Data_::operator=(const BaseGDL& r) ++{ ++ assert( r.Type() == this->Type()); ++ const Data_& right = static_cast( r); ++ assert( &right != this); ++ if( &right == this) return *this; // self assignment ++ this->dim = right.dim; ++ GDLInterpreter::DecRef( this); ++ dd = right.dd; ++ GDLInterpreter::IncRef( this); ++ return *this; ++} ++template<> ++Data_& Data_::operator=(const BaseGDL& r) ++{ ++ assert( r.Type() == this->Type()); ++ const Data_& right = static_cast( r); ++ assert( &right != this); ++ if( &right == this) return *this; // self assignment ++ this->dim = right.dim; ++ GDLInterpreter::DecRefObj( this); ++ dd = right.dd; ++ GDLInterpreter::IncRefObj( this); ++ return *this; ++} + + template< class Sp> + bool Data_::EqType( const BaseGDL* r) const +@@ -1010,84 +1213,104 @@ + void Data_::Clear() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_::Construct() + {} ++template<> ++void Data_::Construct() ++{ ++SizeT nEl = dd.size(); ++// for( SizeT i = 0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++{ ++#pragma omp for*/ ++ for( SizeT i = 0; i ++void Data_::Construct() ++{ ++SizeT nEl = dd.size(); ++// for( SizeT i = 0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++{ ++#pragma omp for*/ ++ for( SizeT i = 0; i + void Data_< SpDString>::Construct() + { + SizeT nEl = dd.size(); + // for( SizeT i = 0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_< SpDComplex>::Construct() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_< SpDComplexDbl>::Construct() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_::ConstructTo0() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_< SpDString>::ConstructTo0() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_< SpDComplex>::ConstructTo0() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_< SpDComplexDbl>::ConstructTo0() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_::Destruct() +@@ -1095,35 +1318,45 @@ + // no destruction for POD + } + template<> ++void Data_< SpDPtr>::Destruct() ++{ ++ GDLInterpreter::DecRef( this); ++} ++template<> ++void Data_< SpDObj>::Destruct() ++{ ++ GDLInterpreter::DecRefObj( this); ++} ++template<> + void Data_< SpDString>::Destruct() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_< SpDComplex>::Destruct() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + void Data_< SpDComplexDbl>::Destruct() + { + SizeT nEl = dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i = 0; i + BaseGDL* Data_::SetBuffer( const void* b) +@@ -1149,11 +1382,12 @@ + { + Data_* res = new Data_(dim_, BaseGDL::NOZERO); + SizeT nEl = res->dd.size(); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i SizeT Data_::NBytes() const +@@ -1275,6 +1509,16 @@ + return 1; + } + ++template ++int Data_::Scalar2RangeT( RangeT& st) const ++{ ++ if( dd.size() != 1) return 0; ++ ++ st= static_cast((*this)[0]); ++ if( this->dim.Rank() != 0) return 2; ++ return 1; ++} ++ + template<> + int Data_::Scalar2index( SizeT& st) const + { +@@ -1285,7 +1529,18 @@ + if( this->dim.Rank() != 0) return 2; + return 1; + } ++ + template<> ++int Data_::Scalar2RangeT( RangeT& st) const ++{ ++ if( dd.size() != 1) return 0; ++ float r=real((*this)[0]); ++ st= static_cast(r); ++ if( this->dim.Rank() != 0) return 2; ++ return 1; ++} ++ ++template<> + int Data_::Scalar2index( SizeT& st) const + { + if( dd.size() != 1) return 0; +@@ -1295,6 +1550,18 @@ + if( this->dim.Rank() != 0) return 2; + return 1; + } ++ ++template<> ++int Data_::Scalar2RangeT( RangeT& st) const ++{ ++ if( dd.size() != 1) return 0; ++ double r=real((*this)[0]); ++ st= static_cast(r); ++ if( this->dim.Rank() != 0) return 2; ++ return 1; ++} ++ ++ + template<> + int Data_::Scalar2index( SizeT& st) const + { +@@ -1316,11 +1583,36 @@ + return 1; + } + ++template<> ++int Data_::Scalar2RangeT( RangeT& st) const ++{ ++ if( dd.size() != 1) return 0; ++ ++ SizeT tSize=(*this)[0].size(); ++ ++ if( tSize == 0) ++ { ++ st=0; ++ } ++ else ++ { ++ long int number = Str2L( (*this)[0].c_str()); ++ st=number; ++ } ++ if( dim.Rank() != 0) return 2; ++ return 1; ++} ++ + int DStructGDL::Scalar2index( SizeT& st) const + { + throw GDLException("STRUCT expression not allowed in this context."); + return 0; // get rid of warning + } ++int DStructGDL::Scalar2RangeT( RangeT& st) const ++{ ++ throw GDLException("STRUCT expression not allowed in this context."); ++ return 0; // get rid of warning ++} + + template<> + int Data_::Scalar2index( SizeT& st) const +@@ -1328,6 +1620,12 @@ + throw GDLException("PTR expression not allowed in this context."); + return 0; // get rid of warning + } ++template<> ++int Data_::Scalar2RangeT( RangeT& st) const ++{ ++ throw GDLException("PTR expression not allowed in this context."); ++ return 0; // get rid of warning ++} + + template<> + int Data_::Scalar2index( SizeT& st) const +@@ -1335,6 +1633,12 @@ + throw GDLException("Object expression not allowed in this context."); + return 0; // get rid of warning + } ++template<> ++int Data_::Scalar2RangeT( RangeT& st) const ++{ ++ throw GDLException("Object expression not allowed in this context."); ++ return 0; // get rid of warning ++} + + // for FOR loop *indices* + template +@@ -1392,8 +1696,20 @@ + template<> + SizeT Data_::LoopIndex() const + { +- throw GDLException( "String expression not allowed as index."); +- return 0; ++ if( (*this)[0] == "") ++ return 0; ++ ++ const char* cStart=(*this)[0].c_str(); ++ char* cEnd; ++ SizeT ix=strtol(cStart,&cEnd,10); ++ if( cEnd == cStart) ++ { ++ Warning( "Type conversion error: " ++ "Unable to convert given STRING: '"+ ++ (*this)[0]+"' to index."); ++ return 0; ++ } ++ return ix; + } + // SizeT DStructGDL::LoopIndex() const + // { +@@ -1542,7 +1858,7 @@ + + // Equal (deletes r) + template +-bool Data_::Equal( BaseGDL* r) ++bool Data_::Equal( BaseGDL* r) const + { + if( !r->Scalar()) + { +@@ -1555,13 +1871,42 @@ + return ret; + } + +-bool DStructGDL::Equal( BaseGDL* r) ++// Equal (deletes r) ++template ++bool Data_::EqualNoDelete( const BaseGDL* r) const ++{ ++ if( !r->Scalar()) ++ { ++ throw GDLException("Expression must be a scalar in this context."); ++ } ++ bool ret; ++ if( r->Type() != this->t) ++ { ++ const Data_* rr=static_cast(const_cast(r)->Convert2( this->t, BaseGDL::COPY)); ++ ret= ((*this)[0] == (*rr)[0]); ++ delete rr; ++ } ++else ++{ ++ const Data_* rr=static_cast(r); ++ ret= ((*this)[0] == (*rr)[0]); ++} ++ return ret; ++} ++ ++bool DStructGDL::Equal( BaseGDL* r) const + { + delete r; + throw GDLException("Struct expression not allowed in this context."); + return false; + } + ++bool DStructGDL::EqualNoDelete( const BaseGDL* r) const ++{ ++ throw GDLException("Struct expression not allowed in this context."); ++ return false; ++} ++ + // For array_equal r must be of same type + template + bool Data_::ArrayEqual( BaseGDL* rIn) +@@ -1633,22 +1978,43 @@ + + // ForCheck must have been called before + template +-bool Data_::ForCondUp( BaseGDL* lEndIn) ++bool Data_::ForAddCondUp( BaseGDL* endLoopVar) ++// bool Data_::ForAddCondUp( ForLoopInfoT& loopInfo) + { ++ (*this)[0] += 1; + // Data_* lEnd=static_cast(lEndIn); +- Data_* lEnd=dynamic_cast(lEndIn); +- if( lEnd == NULL) ++ if( endLoopVar->Type() != this->t) + throw GDLException("Type of FOR index variable changed."); ++ Data_* lEnd=static_cast(endLoopVar); ++/* Data_* lEnd=dynamic_cast(endLoopVar); ++ if( lEnd == NULL) ++ throw GDLException("Type of FOR index variable changed.");*/ + return (*this)[0] <= (*lEnd)[0]; + } ++// ForCheck must have been called before + template +-bool Data_::ForCondDown( BaseGDL* lEndIn) ++bool Data_::ForCondUp( BaseGDL* lEndIn) + { + // Data_* lEnd=static_cast(lEndIn); +- Data_* lEnd=dynamic_cast(lEndIn); ++ if( lEndIn->Type() != this->t) ++ throw GDLException("Type of FOR index variable changed."); ++ Data_* lEnd=static_cast(lEndIn); ++/* Data_* lEnd=dynamic_cast(lEndIn); + if( lEnd == NULL) ++ throw GDLException("Type of FOR index variable changed.");*/ ++ return (*this)[0] <= (*lEnd)[0]; ++} ++template ++bool Data_::ForCondDown( BaseGDL* lEndIn) ++{ ++// Data_* lEnd=static_cast(lEndIn); ++ if( lEndIn->Type() != this->t) + throw GDLException("Type of FOR index variable changed."); +- return (*this)[0] >= (*lEnd)[0]; ++ Data_* lEnd=static_cast(lEndIn); ++/* Data_* lEnd=dynamic_cast(lEndIn); ++ if( lEnd == NULL) ++ throw GDLException("Type of FOR index variable changed.");*/ ++ return (*this)[0] >= (*lEnd)[0]; + } + + // error if the type of the loop variable changed +@@ -1668,12 +2034,28 @@ + throw GDLException("Type of FOR index variable changed to COMPLEX."); + return false; + } ++ ++template<> ++bool Data_::ForAddCondUp( BaseGDL* loopInfo) ++// bool Data_::ForAddCondUp( ForLoopInfoT& loopInfo) ++{ ++ throw GDLException("Type of FOR index variable changed to COMPLEX."); ++ return false; ++} + template<> + bool Data_::ForCondDown( BaseGDL*) + { + throw GDLException("Type of FOR index variable changed to COMPLEX."); + return false; + } ++ ++template<> ++bool Data_::ForAddCondUp( BaseGDL* loopInfo) ++// bool Data_::ForAddCondUp( ForLoopInfoT& loopInfo) ++{ ++ throw GDLException("Type of FOR index variable changed to DCOMPLEX."); ++ return false; ++} + template<> + bool Data_::ForCondUp( BaseGDL*) + { +@@ -1702,6 +2084,7 @@ + } + // cannnot be called, just to make the compiler shut-up + void DStructGDL::ForAdd( BaseGDL* addIn) {} ++ + // normal (+1) version + template + void Data_::ForAdd() +@@ -1729,8 +2112,7 @@ + // used by DotAccessDescT::DoAssign + // GDLInterpreter::l_array_expr + template +-void Data_::AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList, +- SizeT offset) ++void Data_::AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList, SizeT offset) + { + // breakpoint(); // gdbg can not handle breakpoints in template functions + Data_* src = static_cast(srcIn); +@@ -1746,25 +2128,25 @@ + { + SizeT nCp=Data_::N_Elements(); + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cN_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cGetIx( c)]=scalar; +- } ++//} // (*this)[ ixList->GetIx( c)]=scalar; ++ } + } + else + { +@@ -1779,12 +2161,12 @@ + else + throw GDLException("Source expression contains not enough elements."); + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cBuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++// } // (*this)[ ixList->GetIx( c)]=(*src)[c+offset]; + } + else + { +@@ -1822,12 +2204,12 @@ + " source expression."); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++// } // (*this)[ ixList->GetIx( c)]=(*src)[c+offset]; + } + } + } +@@ -1855,12 +2237,12 @@ + { + Ty scalar=(*src)[0]; + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cGetIx( c)]=scalar; ++// } // (*this)[ ixList->GetIx( c)]=scalar; + } + } + else +@@ -1879,12 +2261,12 @@ + " source expression."); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++// } // (*this)[ ixList->GetIx( c)]=(*src)[c+offset]; + } + } + } +@@ -1904,12 +2286,12 @@ + SizeT nCp=Data_::N_Elements(); + + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c just copy its number of elements + if( nCp > srcElem) nCp=srcElem; + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cN_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c + void Data_::IncAt( ArrayIndexListT* ixList) +@@ -1972,12 +2354,12 @@ + SizeT nCp=ixList->N_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c +@@ -1997,12 +2379,12 @@ + SizeT nCp=ixList->N_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c + void Data_::IncAt( ArrayIndexListT* ixList) +@@ -2021,12 +2403,12 @@ + SizeT nCp=ixList->N_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c + void Data_::DecAt( ArrayIndexListT* ixList) +@@ -2045,12 +2427,12 @@ + SizeT nCp=ixList->N_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c + void Data_::IncAt( ArrayIndexListT* ixList) +@@ -2069,12 +2451,12 @@ + SizeT nCp=ixList->N_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c +@@ -2086,23 +2468,23 @@ + + SizeT nCp=Data_::N_Elements(); + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cN_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c + void Data_::IncAt( ArrayIndexListT* ixList) +@@ -2113,23 +2495,23 @@ + + SizeT nCp=Data_::N_Elements(); + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cN_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c + void Data_::DecAt( ArrayIndexListT* ixList) +@@ -2140,23 +2522,23 @@ + + SizeT nCp=Data_::N_Elements(); + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cN_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c + void Data_::IncAt( ArrayIndexListT* ixList) +@@ -2167,23 +2549,23 @@ + + SizeT nCp=Data_::N_Elements(); + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cN_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c +@@ -2230,23 +2612,23 @@ + { + SizeT nCp=src->N_Elements(); + +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cN_Elements(); + + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cGetIx( c)]; ++//} // (*this)[ c+offset]=(*src)[ ixList->GetIx( c)]; + } + } + +@@ -2320,12 +2702,12 @@ + + // DataT& res_dd = res->dd; + AllIxT* allIx = ixList->BuildIx(); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; cGetIx(c)]; + + return res; +@@ -2447,6 +2829,7 @@ + } + } + } ++ + + // used for concatenation, called from CatArray + // assumes that everything is checked (see CatInfo) +@@ -2466,22 +2849,22 @@ + // number of elements to skip + SizeT gap=this->dim.Stride(atDim+1); // dest array + +-#ifdef _OPENMP +-SizeT nEl = srcArr->N_Elements(); +-#pragma omp parallel for if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +- for( SizeT c=0; cN_Elements(); ++// #pragma omp parallel for if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++// for( SizeT c=0; cdim[atDim]; // update 'at' + at += (add > 1)? add : 1; +@@ -3471,12 +3854,12 @@ + } + + SizeT resEl = res->N_Elements(); +-#pragma omp parallel if (resEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= resEl)) ++/*#pragma omp parallel if (resEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= resEl)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT r=0; r < resEl; ++r) + (*res)[ r] /= ratio; +-} ++// } + return res; + } + } +@@ -3948,15 +4331,19 @@ + srcTGuard.reset( srcT); + } + +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) + { +-#pragma omp for ++#pragma omp for*/ + for(long k=0; k < nEl; ++k) + { + (*this)[ k] = (*srcT)[ k]; +-} } ++}// } + } + ++ ++ ++ ++ + // return a new type of itself (only for one dimensional case) + template + Data_* Data_::NewIx( SizeT ix) +@@ -3968,12 +4355,12 @@ + { + SizeT nCp = ix->size(); + Data_* res=Data_::New( *dIn, BaseGDL::NOZERO); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c +@@ -3981,12 +4368,12 @@ + { + SizeT nCp = dd.size() - s; + Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c +@@ -3994,12 +4381,12 @@ + { + SizeT nCp = e - s + 1; + Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); +-#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++/*#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT c=0; c +@@ -4021,6 +4408,8 @@ + return res; + } + ++#undef NEWIX_SIGNEDINT ++#undef NEWIX_UNSIGNEDINT + #define NEWIX_UNSIGNEDINT \ + SizeT i = 0;\ + for( ; i < nElem; ++i)\ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/datatypes.hpp cvs/gdl/src/datatypes.hpp +--- gdl-0.9rc4/src/datatypes.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/datatypes.hpp 2010-05-21 10:23:55.525968552 -0600 +@@ -86,7 +86,7 @@ + Sp( dim_), dd( dd_) {} + + // c-i +- Data_(const Data_& d_): Sp(d_.dim), dd(d_.dd) {} ++ Data_(const Data_& d_);//: Sp(d_.dim), dd(d_.dd) {} + + // operators + // assignment. +@@ -151,10 +151,11 @@ + + // used by the interpreter + int Scalar2index( SizeT& st) const; +- SizeT LoopIndex() const; ++ int Scalar2RangeT( RangeT& st) const; ++ SizeT LoopIndex() const; + + // make a duplicate on the heap +- Data_* Dup() const { return new Data_(*this);} ++ Data_* Dup() const; + // // make a duplicate at loc + // Data_* Dup( void* loc) const { return ::new ( loc) Data_(*this);} + +@@ -208,11 +209,14 @@ + DLong* Where( bool comp, SizeT& count); + Data_* LogNeg(); + int Sgn(); // returns -1,0,1 +- bool Equal( BaseGDL*); ++ bool Equal( BaseGDL*) const; ++ bool EqualNoDelete( const BaseGDL*) const; + bool ArrayEqual( BaseGDL*); + void ForCheck( BaseGDL**, BaseGDL** =NULL); + bool ForCondUp( BaseGDL*); + bool ForCondDown( BaseGDL*); ++ bool ForAddCondUp( BaseGDL* loopInfo); ++// bool ForAddCondUp( ForLoopInfoT& loopInfo); + // bool ForCondUpDown( BaseGDL*); + void ForAdd(); + void ForAdd( BaseGDL* add); +@@ -253,7 +257,7 @@ + Data_* PowInv( BaseGDL* r); + Data_* PowInt( BaseGDL* r); + Data_* PowIntNew( BaseGDL* r); +- Data_* MatrixOp( BaseGDL* r); ++ Data_* MatrixOp( BaseGDL* r, bool transpose, bool transposeResult, bool strassen); + + Data_* AndOpS( BaseGDL* r); + Data_* AndOpInvS( BaseGDL* r); +@@ -367,6 +371,9 @@ + void CatInsert( const Data_* srcArr, const SizeT atDim, SizeT& at); + }; + ++// template<> Data_::Data_(const Ty& d_); ++// template<> Data_::Data_(const Ty& d_); ++ + #include "specializations.hpp" + + typedef Data_ DByteGDL; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/datatypesref.cpp cvs/gdl/src/datatypesref.cpp +--- gdl-0.9rc4/src/datatypesref.cpp 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/datatypesref.cpp 2010-03-31 12:59:33.000000000 -0600 +@@ -0,0 +1,1906 @@ ++/************************************************************************** ++ datatypesref.cpp - specializations for DPtrGDL and DObjGDL for reference counting ++ ------------------- ++ begin : March 08 2010 ++ copyright : (C) 2010 by Marc Schellens ++ email : m_schellens@users.sf.net ++ ***************************************************************************/ ++ ++/* ************************************************************************* ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++// to be included from datatypes.cpp ++#ifdef INCLUDE_DATATYPESREF_CPP ++#undef INCLUDE_DATATYPESREF_CPP ++ ++template<> ++void Data_::InsAt( Data_* srcIn, ArrayIndexListT* ixList, SizeT offset) ++{ ++// max. number of dimensions to copy ++SizeT nDim = ixList->NDim(); ++ ++if( nDim == 1) ++ { ++ SizeT destStart = ixList->LongIx(); ++ ++ //SizeT len; ++ if( this->N_Elements() == 1) ++ { ++ // len = 1; ++ SizeT rStride = srcIn->Stride(this->Rank()); ++ Ty& a = (*this)[ destStart]; ++ Ty b = (*srcIn)[ offset/rStride]; ++ GDLInterpreter::IncRef( b); ++ GDLInterpreter::DecRef( a); ++ a = b;//(*this)[ destStart] = (*srcIn)[ offset/rStride]; ++ } ++ else ++ { ++ SizeT len = srcIn->Dim( 0); // length of segment to copy ++ // TODO: IDL reports here (and probably in the insert-dimension case below as well) ++ // the name of a variable, e.g.: ++ // IDL> a=[0,0,0] & a[2]=[2,2,2] ++ // % Out of range subscript encountered: A. ++ if( (destStart+len) > this->N_Elements()) //dim[0]) ++ throw GDLException("Out of range subscript encountered (lenght of insert exceeds array boundaries)."); ++ ++ // DataT& srcIn_dd = srcIn->dd; ++ SizeT srcIx = 0; // this one simply runs from 0 to N_Elements(srcIn) ++ ++ SizeT destEnd = destStart + len; ++ for( SizeT destIx = destStart; destIx < destEnd; ++destIx) ++{ ++ Ty& a = (*this)[ destIx]; ++ Ty b = (*srcIn)[ srcIx++]; ++ GDLInterpreter::IncRef( b); ++ GDLInterpreter::DecRef( a); ++ ++ a = b;// (*this)[ destIx] = (*srcIn)[ srcIx++]; ++} ++ } ++ ++ return; ++ } ++ ++SizeT destStart; // 1-dim starting index ++// ATTENTION: dimension is used as an index here ++dimension ixDim = ixList->GetDimIx0( destStart); ++nDim--; ++ ++dimension srcDim=srcIn->Dim(); ++SizeT len=srcDim[0]; // length of one segment to copy (one line of srcIn) ++ ++// SizeT nDim =RankIx(ixDim.Rank()); ++SizeT srcNDim=RankIx(srcDim.Rank()); // number of source dimensions ++if( srcNDim < nDim) nDim=srcNDim; ++ ++// check limits (up to Rank to consider) ++for( SizeT dIx=0; dIx <= nDim; ++dIx) ++ // check if in bounds of a ++ if( (ixDim[dIx]+srcDim[dIx]) > this->dim[dIx]) ++ throw GDLException("Out of range subscript encountered (dimension of insert exceeds array boundaries for dimension " + i2s(dIx +1) + ")."); ++ ++SizeT nCp=srcIn->Stride(nDim+1)/len; // number of OVERALL copy actions ++ ++// as lines are copied, we need the stride from 2nd dim on ++SizeT retStride[MAXRANK]; ++for( SizeT a=0; a <= nDim; ++a) retStride[a]=srcDim.Stride(a+1)/len; ++ ++// a magic number, to reset destStart for this dimension ++SizeT resetStep[MAXRANK]; ++for( SizeT a=1; a <= nDim; ++a) ++ resetStep[a]=(retStride[a]-1)/retStride[a-1]*this->dim.Stride(a); ++ ++// SizeT destStart=this->dim.LongIndex(ixDim); // starting pos ++ ++// DataT& srcIn_dd = srcIn->dd; ++ ++SizeT srcIx=0; // this one simply runs from 0 to N_Elements(srcIn) ++for( SizeT c=1; c<=nCp; ++c) // linearized verison of nested loops ++ { ++ // copy one segment ++ SizeT destEnd=destStart+len; ++ for( SizeT destIx=destStart; destIxdim.Stride(a); ++ break; ++ } ++ else ++ { ++ // reset ++ destStart -= resetStep[a]; ++ } ++ } ++ } ++} ++ ++template<> ++void Data_::InsAt( Data_* srcIn, ArrayIndexListT* ixList, SizeT offset) ++{ ++// max. number of dimensions to copy ++SizeT nDim = ixList->NDim(); ++ ++if( nDim == 1) ++ { ++ SizeT destStart = ixList->LongIx(); ++ ++ //SizeT len; ++ if( this->N_Elements() == 1) ++ { ++ // len = 1; ++ SizeT rStride = srcIn->Stride(this->Rank()); ++ Ty& a = (*this)[ destStart]; ++ Ty b = (*srcIn)[ offset/rStride]; ++ GDLInterpreter::IncRefObj( b); ++ GDLInterpreter::DecRefObj( a); ++ a = b;//(*this)[ destStart] = (*srcIn)[ offset/rStride]; ++ } ++ else ++ { ++ SizeT len = srcIn->Dim( 0); // length of segment to copy ++ // TODO: IDL reports here (and probably in the insert-dimension case below as well) ++ // the name of a variable, e.g.: ++ // IDL> a=[0,0,0] & a[2]=[2,2,2] ++ // % Out of range subscript encountered: A. ++ if( (destStart+len) > this->N_Elements()) //dim[0]) ++ throw GDLException("Out of range subscript encountered (lenght of insert exceeds array boundaries)."); ++ ++ // DataT& srcIn_dd = srcIn->dd; ++ SizeT srcIx = 0; // this one simply runs from 0 to N_Elements(srcIn) ++ ++ SizeT destEnd = destStart + len; ++ for( SizeT destIx = destStart; destIx < destEnd; ++destIx) ++{ ++ Ty& a = (*this)[ destIx]; ++ Ty b = (*srcIn)[ srcIx++]; ++ GDLInterpreter::IncRefObj( b); ++ GDLInterpreter::DecRefObj( a); ++ ++ a = b;// (*this)[ destIx] = (*srcIn)[ srcIx++]; ++} ++ } ++ ++ return; ++ } ++ ++SizeT destStart; // 1-dim starting index ++// ATTENTION: dimension is used as an index here ++dimension ixDim = ixList->GetDimIx0( destStart); ++nDim--; ++ ++dimension srcDim=srcIn->Dim(); ++SizeT len=srcDim[0]; // length of one segment to copy (one line of srcIn) ++ ++// SizeT nDim =RankIx(ixDim.Rank()); ++SizeT srcNDim=RankIx(srcDim.Rank()); // number of source dimensions ++if( srcNDim < nDim) nDim=srcNDim; ++ ++// check limits (up to Rank to consider) ++for( SizeT dIx=0; dIx <= nDim; ++dIx) ++ // check if in bounds of a ++ if( (ixDim[dIx]+srcDim[dIx]) > this->dim[dIx]) ++ throw GDLException("Out of range subscript encountered (dimension of insert exceeds array boundaries for dimension " + i2s(dIx +1) + ")."); ++ ++SizeT nCp=srcIn->Stride(nDim+1)/len; // number of OVERALL copy actions ++ ++// as lines are copied, we need the stride from 2nd dim on ++SizeT retStride[MAXRANK]; ++for( SizeT a=0; a <= nDim; ++a) retStride[a]=srcDim.Stride(a+1)/len; ++ ++// a magic number, to reset destStart for this dimension ++SizeT resetStep[MAXRANK]; ++for( SizeT a=1; a <= nDim; ++a) ++ resetStep[a]=(retStride[a]-1)/retStride[a-1]*this->dim.Stride(a); ++ ++// SizeT destStart=this->dim.LongIndex(ixDim); // starting pos ++ ++// DataT& srcIn_dd = srcIn->dd; ++ ++SizeT srcIx=0; // this one simply runs from 0 to N_Elements(srcIn) ++for( SizeT c=1; c<=nCp; ++c) // linearized verison of nested loops ++ { ++ // copy one segment ++ SizeT destEnd=destStart+len; ++ for( SizeT destIx=destStart; destIxdim.Stride(a); ++ break; ++ } ++ else ++ { ++ // reset ++ destStart -= resetStep[a]; ++ } ++ } ++ } ++} ++ ++ ++ ++template<> ++void Data_::AssignAtIx( SizeT ix, BaseGDL* srcIn) ++{ ++ if( srcIn->Type() != this->Type()) ++ throw GDLException("Only expressions of type " + srcIn->TypeStr() + " can be assigned to " + this->TypeStr()); ++ GDLInterpreter::IncRef( (*static_cast(srcIn))[0]); ++ GDLInterpreter::DecRef( (*this)[ix]); ++ (*this)[ix] = (*static_cast(srcIn))[0]; ++} ++template<> ++void Data_::AssignAtIx( SizeT ix, BaseGDL* srcIn) ++{ ++ if( srcIn->Type() != this->Type()) ++ throw GDLException("Only expressions of type " + srcIn->TypeStr() + " can be assigned to " + this->TypeStr()); ++ GDLInterpreter::IncRefObj( (*static_cast(srcIn))[0]); ++ GDLInterpreter::DecRefObj( (*this)[ix]); ++ (*this)[ix] = (*static_cast(srcIn))[0]; ++} ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++template<> ++void Data_::AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList, SizeT offset) ++{ ++ // breakpoint(); // gdbg can not handle breakpoints in template functions ++ Data_* src = static_cast(srcIn); ++ ++ SizeT srcElem= src->N_Elements(); ++ // bool isScalar= (srcElem == 1); ++ bool isScalar= (srcElem == 1) && (src->Rank() == 0); ++ if( isScalar) ++ { // src is scalar ++ Ty scalar=(*src)[0]; ++ ++ if( ixList == NULL) ++ { ++ SizeT nCp=Data_::N_Elements(); ++ ++ GDLInterpreter::AddRef( scalar, nCp); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cN_Elements(); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++ ++ GDLInterpreter::AddRef( scalar, nCp); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=scalar; ++ } ++ } ++ else ++ { ++ if( ixList == NULL) ++ { ++ SizeT nCp=Data_::N_Elements(); ++ ++ // if (non-indexed) src is smaller -> just copy its number of elements ++ if( nCp > (srcElem-offset)) ++ if( offset == 0) ++ nCp=srcElem; ++ else ++ throw GDLException("Source expression contains not enough elements."); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cN_Elements(); ++ ++ if( nCp == 1) ++ { ++ SizeT destStart = ixList->LongIx(); ++ // len = 1; ++ SizeT rStride = srcIn->Stride(this->Rank()); ++ (*this)[ destStart] = (*src)[ offset/rStride]; ++ ++// InsAt( src, ixList, offset); ++ } ++ else ++ { ++ if( offset == 0) ++ { ++ if( srcElem < nCp) ++ throw GDLException("Array subscript must have same size as" ++ " source expression."); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++ } ++ else ++ { ++ if( (srcElem-offset) < nCp) ++ throw GDLException("Array subscript must have same size as" ++ " source expression."); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++ } ++ } ++ } ++ } ++} ++ ++template<> ++void Data_::AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList, SizeT offset) ++{ ++ // breakpoint(); // gdbg can not handle breakpoints in template functions ++ Data_* src = static_cast(srcIn); ++ ++ SizeT srcElem= src->N_Elements(); ++ // bool isScalar= (srcElem == 1); ++ bool isScalar= (srcElem == 1) && (src->Rank() == 0); ++ if( isScalar) ++ { // src is scalar ++ Ty scalar=(*src)[0]; ++ ++ if( ixList == NULL) ++ { ++ SizeT nCp=Data_::N_Elements(); ++ ++ GDLInterpreter::AddRefObj( scalar, nCp); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cN_Elements(); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++ ++ GDLInterpreter::AddRefObj( scalar, nCp); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=scalar; ++ } ++ } ++ else ++ { ++ if( ixList == NULL) ++ { ++ SizeT nCp=Data_::N_Elements(); ++ ++ // if (non-indexed) src is smaller -> just copy its number of elements ++ if( nCp > (srcElem-offset)) ++ if( offset == 0) ++ nCp=srcElem; ++ else ++ throw GDLException("Source expression contains not enough elements."); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cN_Elements(); ++ ++ if( nCp == 1) ++ { ++ SizeT destStart = ixList->LongIx(); ++ // len = 1; ++ SizeT rStride = srcIn->Stride(this->Rank()); ++ (*this)[ destStart] = (*src)[ offset/rStride]; ++ ++// InsAt( src, ixList, offset); ++ } ++ else ++ { ++ if( offset == 0) ++ { ++ if( srcElem < nCp) ++ throw GDLException("Array subscript must have same size as" ++ " source expression."); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++ } ++ else ++ { ++ if( (srcElem-offset) < nCp) ++ throw GDLException("Array subscript must have same size as" ++ " source expression."); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++ } ++ } ++ } ++ } ++} ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++template<> ++void Data_::AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList) ++{ ++assert( ixList != NULL); ++ ++// breakpoint(); // gdbg can not handle breakpoints in template functions ++Data_* src = static_cast(srcIn); ++ ++SizeT srcElem= src->N_Elements(); ++bool isScalar= (srcElem == 1); ++if( isScalar) ++ { // src is scalar ++ SizeT nCp=ixList->N_Elements(); ++ ++ if( nCp == 1) ++ { ++ Ty& a = (*this)[ ixList->LongIx()] ; ++ Ty b = (*src)[ 0]; ++ GDLInterpreter::IncRef( b); ++ GDLInterpreter::DecRef( a); ++ a = b;//(*this)[ ixList->LongIx()] = (*src)[0]; ++ } ++ else ++ { ++ Ty scalar=(*src)[0]; ++ AllIxT* allIx = ixList->BuildIx(); ++ ++ GDLInterpreter::AddRef( scalar, nCp); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=scalar; ++ } ++ } ++else ++ { ++ // crucial part ++ SizeT nCp=ixList->N_Elements(); ++ ++ if( nCp == 1) ++ { ++ InsAt( src, ixList); ++ } ++ else ++ { ++ if( srcElem < nCp) ++ throw GDLException("Array subscript must have same size as" ++ " source expression."); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++ } ++ } ++} ++template<> ++void Data_::AssignAt( BaseGDL* srcIn) ++{ ++// breakpoint(); // gdbg can not handle breakpoints in template functions ++Data_* src = static_cast(srcIn); ++ ++SizeT srcElem= src->N_Elements(); ++bool isScalar= (srcElem == 1); ++if( isScalar) ++ { // src is scalar ++ Ty scalar=(*src)[0]; ++ ++/* dd = scalar;*/ ++ SizeT nCp=Data_::N_Elements(); ++ ++ GDLInterpreter::AddRef( scalar, nCp); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; c just copy its number of elements ++ if( nCp > srcElem) nCp=srcElem; ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; c ++void Data_::AssignAt( BaseGDL* srcIn, ArrayIndexListT* ixList) ++{ ++assert( ixList != NULL); ++ ++// breakpoint(); // gdbg can not handle breakpoints in template functions ++Data_* src = static_cast(srcIn); ++ ++SizeT srcElem= src->N_Elements(); ++bool isScalar= (srcElem == 1); ++if( isScalar) ++ { // src is scalar ++ SizeT nCp=ixList->N_Elements(); ++ ++ if( nCp == 1) ++ { ++ Ty& a = (*this)[ ixList->LongIx()] ; ++ Ty b = (*src)[ 0]; ++ GDLInterpreter::IncRefObj( b); ++ GDLInterpreter::DecRefObj( a); ++ a = b;//(*this)[ ixList->LongIx()] = (*src)[0]; ++ } ++ else ++ { ++ Ty scalar=(*src)[0]; ++ AllIxT* allIx = ixList->BuildIx(); ++ ++ GDLInterpreter::AddRefObj( scalar, nCp); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=scalar; ++ } ++ } ++else ++ { ++ // crucial part ++ SizeT nCp=ixList->N_Elements(); ++ ++ if( nCp == 1) ++ { ++ InsAt( src, ixList); ++ } ++ else ++ { ++ if( srcElem < nCp) ++ throw GDLException("Array subscript must have same size as" ++ " source expression."); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]=(*src)[c+offset]; ++ } ++ } ++} ++template<> ++void Data_::AssignAt( BaseGDL* srcIn) ++{ ++// breakpoint(); // gdbg can not handle breakpoints in template functions ++Data_* src = static_cast(srcIn); ++ ++SizeT srcElem= src->N_Elements(); ++bool isScalar= (srcElem == 1); ++if( isScalar) ++ { // src is scalar ++ Ty scalar=(*src)[0]; ++ ++/* dd = scalar;*/ ++ SizeT nCp=Data_::N_Elements(); ++ ++ GDLInterpreter::AddRefObj( scalar, nCp); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; c just copy its number of elements ++ if( nCp > srcElem) nCp=srcElem; ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; c ++Data_* Data_::Index( ArrayIndexListT* ixList) ++{ ++// ixList->SetVariable( this); ++ ++Data_* res=Data_::New( ixList->GetDim(), BaseGDL::NOZERO); ++ ++SizeT nCp=ixList->N_Elements(); ++ ++// cout << "nCP = " << nCp << endl; ++// cout << "dim = " << this->dim << endl; ++ ++// DataT& res_dd = res->dd; ++AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; cGetIx(c)]; ++ ++return res; ++} ++// returns (*this)[ ixList] ++template<> ++Data_* Data_::Index( ArrayIndexListT* ixList) ++{ ++// ixList->SetVariable( this); ++ ++Data_* res=Data_::New( ixList->GetDim(), BaseGDL::NOZERO); ++ ++SizeT nCp=ixList->N_Elements(); ++ ++// cout << "nCP = " << nCp << endl; ++// cout << "dim = " << this->dim << endl; ++ ++// DataT& res_dd = res->dd; ++AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; cGetIx(c)]; ++ ++return res; ++} ++ ++ ++ ++// used by AccessDescT for resolving, no checking is done ++// inserts srcIn[ ixList] at offset ++// used by DotAccessDescT::DoResolve ++template<> ++void Data_::InsertAt( SizeT offset, BaseGDL* srcIn, ++ ArrayIndexListT* ixList) ++{ ++Data_* src=static_cast(srcIn); ++if( ixList == NULL) ++ { ++ SizeT nCp=src->N_Elements(); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cN_Elements(); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]; ++ } ++} ++} ++ ++ ++// used for concatenation, called from CatArray ++// assumes that everything is checked (see CatInfo) ++template<> ++void Data_::CatInsert( const Data_* srcArr, const SizeT atDim, SizeT& at) ++{ ++// length of one segment to copy ++SizeT len=srcArr->dim.Stride(atDim+1); // src array ++ ++// number of copy actions ++SizeT nCp=srcArr->N_Elements()/len; ++ ++// initial offset ++SizeT destStart= this->dim.Stride(atDim) * at; // dest array ++SizeT destEnd = destStart + len; ++ ++// number of elements to skip ++SizeT gap=this->dim.Stride(atDim+1); // dest array ++ ++#ifdef _OPENMP ++SizeT nEl = srcArr->N_Elements(); ++//#pragma omp parallel for if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++for( SizeT c=0; cdim[atDim]; // update 'at' ++at += (add > 1)? add : 1; ++} ++ ++ ++ ++// used by AccessDescT for resolving, no checking is done ++// inserts srcIn[ ixList] at offset ++// used by DotAccessDescT::DoResolve ++template<> ++void Data_::InsertAt( SizeT offset, BaseGDL* srcIn, ++ ArrayIndexListT* ixList) ++{ ++Data_* src=static_cast(srcIn); ++if( ixList == NULL) ++ { ++ SizeT nCp=src->N_Elements(); ++ ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cN_Elements(); ++ ++ AllIxT* allIx = ixList->BuildIx(); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++ for( SizeT c=0; cGetIx( c)]; ++ } ++} ++} ++ ++ ++// used for concatenation, called from CatArray ++// assumes that everything is checked (see CatInfo) ++template<> ++void Data_::CatInsert( const Data_* srcArr, const SizeT atDim, SizeT& at) ++{ ++// length of one segment to copy ++SizeT len=srcArr->dim.Stride(atDim+1); // src array ++ ++// number of copy actions ++SizeT nCp=srcArr->N_Elements()/len; ++ ++// initial offset ++SizeT destStart= this->dim.Stride(atDim) * at; // dest array ++SizeT destEnd = destStart + len; ++ ++// number of elements to skip ++SizeT gap=this->dim.Stride(atDim+1); // dest array ++ ++#ifdef _OPENMP ++SizeT nEl = srcArr->N_Elements(); ++//#pragma omp parallel for if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++for( SizeT c=0; cdim[atDim]; // update 'at' ++at += (add > 1)? add : 1; ++} ++ ++ ++ ++template<> ++void Data_::Assign( BaseGDL* src, SizeT nEl) ++{ ++Data_* srcT = dynamic_cast( src); ++ ++auto_ptr< Data_> srcTGuard; ++if( srcT == NULL) ++ { ++ srcT = static_cast( src->Convert2( Data_::t, BaseGDL::COPY)); ++ srcTGuard.reset( srcT); ++ } ++ ++//#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++{ ++//#pragma omp for ++for(long k=0; k < nEl; ++k) ++ { ++ Ty a = (*this)[ k]; ++ Ty b = (*srcT)[k]; ++ GDLInterpreter::IncRef( b); ++ GDLInterpreter::DecRef( a); ++ (*this)[ k] = (*srcT)[ k]; ++} } ++} ++ ++template<> ++void Data_::Assign( BaseGDL* src, SizeT nEl) ++{ ++Data_* srcT = dynamic_cast( src); ++ ++auto_ptr< Data_> srcTGuard; ++if( srcT == NULL) ++ { ++ srcT = static_cast( src->Convert2( Data_::t, BaseGDL::COPY)); ++ srcTGuard.reset( srcT); ++ } ++ ++//#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++{ ++//#pragma omp for ++for(long k=0; k < nEl; ++k) ++ { ++ Ty a = (*this)[ k]; ++ Ty b = (*srcT)[k]; ++ GDLInterpreter::IncRefObj( b); ++ GDLInterpreter::DecRefObj( a); ++ (*this)[ k] = (*srcT)[ k]; ++} } ++} ++ ++ ++ ++// return a new type of itself (only for one dimensional case) ++template<> ++Data_* Data_::NewIx( SizeT ix) ++{ ++ Ty b = (*this)[ ix]; ++ GDLInterpreter::IncRef( b); ++return new Data_( (*this)[ ix]); ++} ++ ++// return a new type of itself (only for one dimensional case) ++template<> ++Data_* Data_::NewIx( SizeT ix) ++{ ++ Ty b = (*this)[ ix]; ++ GDLInterpreter::IncRefObj( b); ++return new Data_( (*this)[ ix]); ++} ++ ++ ++ ++template<> ++Data_* Data_::NewIx( AllIxT* ix, dimension* dIn) ++{ ++SizeT nCp = ix->size(); ++Data_* res=Data_::New( *dIn, BaseGDL::NOZERO); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; c ++Data_* Data_::NewIx( AllIxT* ix, dimension* dIn) ++{ ++SizeT nCp = ix->size(); ++Data_* res=Data_::New( *dIn, BaseGDL::NOZERO); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; c ++Data_* Data_::NewIxFrom( SizeT s) ++{ ++SizeT nCp = dd.size() - s; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; c ++Data_* Data_::NewIxFrom( SizeT s) ++{ ++SizeT nCp = dd.size() - s; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; c ++Data_* Data_::NewIxFrom( SizeT s, SizeT e) ++{ ++SizeT nCp = e - s + 1; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; c ++Data_* Data_::NewIxFrom( SizeT s, SizeT e) ++{ ++SizeT nCp = e - s + 1; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++//#pragma omp parallel if (nCp >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nCp)) ++{ ++//#pragma omp for ++for( SizeT c=0; c ++Data_* Data_::NewIxFromStride( SizeT s, SizeT stride) ++{ ++SizeT nCp = (dd.size() - s + stride - 1)/stride; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++for( SizeT c=0; c ++Data_* Data_::NewIxFromStride( SizeT s, SizeT e, SizeT stride) ++{ ++SizeT nCp = (e - s + stride)/stride; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++for( SizeT c=0; c ++Data_* Data_::NewIxFromStride( SizeT s, SizeT stride) ++{ ++SizeT nCp = (dd.size() - s + stride - 1)/stride; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++for( SizeT c=0; c ++Data_* Data_::NewIxFromStride( SizeT s, SizeT e, SizeT stride) ++{ ++SizeT nCp = (e - s + stride)/stride; ++Data_* res=Data_::New( dimension( nCp), BaseGDL::NOZERO); ++for( SizeT c=0; c upper)\ ++ {\ ++ if( strict)\ ++ throw GDLException("Array used to subscript array "\ ++ "contains out of range (>) subscript.");\ ++ (*res)[i++]= upperVal;\ ++ break;\ ++ }\ ++ else\ ++ (*res)[i]= (*this)[ (*src)[i]];\ ++for(; i < nElem; ++i)\ ++ if( (*src)[i] > upper)\ ++ (*res)[i] = upperVal;\ ++ else\ ++ (*res)[i]= (*this)[ (*src)[i]];\ ++GDLInterpreter::IncRef( res);\ ++return guard.release(); ++ ++#define NEWIX_SIGNEDINT \ ++ SizeT i = 0;\ ++for(; i < nElem; ++i)\ ++ if( (*src)[i] < 0)\ ++ {\ ++ if( strict)\ ++ throw GDLException("Array used to subscript array "\ ++ "contains out of range (<0) subscript.");\ ++ (*res)[i++]= zeroVal;\ ++ break;\ ++ }\ ++ else if( (*src)[i] > upper)\ ++ {\ ++ if( strict)\ ++ throw GDLException("Array used to subscript array "\ ++ "contains out of range (>) subscript.");\ ++ (*res)[i++]= upperVal;\ ++ break;\ ++ }\ ++ else\ ++ (*res)[ i] = (*this)[ (*src)[ i]];\ ++ for(; i < nElem; ++i)\ ++ if( (*src)[i] < 0)\ ++ (*res)[i]= zeroVal;\ ++ else if( (*src)[i] > upper)\ ++ (*res)[i]= upperVal;\ ++ else\ ++ (*res)[ i] = (*this)[ (*src)[ i]];\ ++ GDLInterpreter::IncRef( res);\ ++ return guard.release(); ++ ++template<> ++Data_* Data_::NewIx( BaseGDL* ix, bool strict) ++{ ++SizeT nElem = ix->N_Elements(); ++ ++Data_* res = New( ix->Dim(), BaseGDL::NOZERO); ++auto_ptr guard( res); ++ ++SizeT upper = dd.size() - 1; ++Ty upperVal = (*this)[ upper]; ++Ty zeroVal = (*this)[ 0]; ++switch( ix->Type()) ++ { ++ case BYTE: ++ { ++ DByteGDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case INT: ++ { ++ DIntGDL* src = static_cast( ix); ++ ++ NEWIX_SIGNEDINT ++ } ++ case UINT: ++ { ++ DUIntGDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case LONG: // typical type (returned from WHERE) ++ { ++ DLongGDL* src = static_cast( ix); ++ ++ NEWIX_SIGNEDINT ++ } ++ case ULONG: ++ { ++ DULongGDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case LONG64: ++ { ++ DLong64GDL* src = static_cast( ix); ++ ++ NEWIX_SIGNEDINT ++ } ++ case ULONG64: ++ { ++ DULong64GDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case FLOAT: ++ { ++ DFloat maxF = upper; ++ DFloatGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( (*src)[i] <= 0.0) ++ { ++ Ty b = zeroVal; ++ GDLInterpreter::IncRef( b); ++ ++ (*res)[i] = zeroVal; ++ if( (*src)[i] <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ } ++ else if( (*src)[i] > maxF) ++ { ++ if( (*src)[i] >= (maxF + 1.0) && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ Ty b = upperVal; ++ GDLInterpreter::IncRef( b); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int((*src)[i])]; ++ } ++ GDLInterpreter::IncRef( res); ++ return guard.release(); ++ } ++ case DOUBLE: ++ { ++ DDouble maxF = upper; ++ DDoubleGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( (*src)[i] <= 0.0) ++ { ++ (*res)[i] = zeroVal; ++ if( (*src)[i] <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ } ++ else if( (*src)[i] > maxF) ++ { ++ (*res)[i] = upperVal; ++ if( (*src)[i] >= (maxF + 1.0) && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int((*src)[i])]; ++ } ++ GDLInterpreter::IncRef( res); ++ return guard.release(); ++ } ++ case STRING: ++ { ++ DStringGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ { ++ const char* cStart=(*src)[i].c_str(); ++ char* cEnd; ++ long l=strtol(cStart,&cEnd,10); ++ if( cEnd == cStart) ++ { ++ Warning("Type conversion error: " ++ "Unable to convert given STRING to LONG."); ++ (*res)[i] = zeroVal; ++ } ++ else if( l < 0) ++ { ++ if( strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ (*res)[i] = zeroVal; ++ } ++ else if( l > upper) ++ { ++ if( strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i] = (*this)[ l]; ++ } ++ } ++ GDLInterpreter::IncRef( res); ++ return guard.release(); ++ } ++ case COMPLEX: ++ { ++ DFloat maxF = upper; ++ DComplexGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( real((*src)[i]) <= 0.0) ++ { ++ if( real((*src)[i]) <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ (*res)[i] = zeroVal; ++ } ++ else if( real((*src)[i]) > upper) ++ { ++ if( real((*src)[i]) >= upper+1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int(real((*src)[i]))]; ++ } ++ GDLInterpreter::IncRef( res); ++ return guard.release(); ++ } ++ case COMPLEXDBL: ++ { ++ DDouble maxF = upper; ++ DComplexDblGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( real((*src)[i]) <= 0.0) ++ { ++ if( real((*src)[i]) <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ (*res)[i] = zeroVal; ++ } ++ else if( real((*src)[i]) > upper) ++ { ++ if( real((*src)[i]) >= upper+1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int(real((*src)[i]))]; ++ } ++ GDLInterpreter::IncRef( res); ++ return guard.release(); ++ } ++ default: ++ { ++ DType dType = ix->Type(); ++ assert( dType != UNDEF); ++ ++ int typeCheck = DTypeOrder[ dType]; ++ if( typeCheck >= 100) ++ throw GDLException("Type not allowed as subscript."); ++ ++ assert( 0); ++ } ++ } ++assert( 0); ++} ++ ++#undef NEWIX_SIGNEDINT ++#undef NEWIX_UNSIGNEDINT ++ ++#define NEWIX_UNSIGNEDINT \ ++SizeT i = 0;\ ++for( ; i < nElem; ++i)\ ++ if( (*src)[i] > upper)\ ++ {\ ++ if( strict)\ ++ throw GDLException("Array used to subscript array "\ ++ "contains out of range (>) subscript.");\ ++ (*res)[i++]= upperVal;\ ++ break;\ ++ }\ ++ else\ ++ (*res)[i]= (*this)[ (*src)[i]];\ ++for(; i < nElem; ++i)\ ++ if( (*src)[i] > upper)\ ++ (*res)[i] = upperVal;\ ++ else\ ++ (*res)[i]= (*this)[ (*src)[i]];\ ++GDLInterpreter::IncRefObj( res);\ ++return guard.release(); ++ ++#define NEWIX_SIGNEDINT \ ++ SizeT i = 0;\ ++for(; i < nElem; ++i)\ ++ if( (*src)[i] < 0)\ ++ {\ ++ if( strict)\ ++ throw GDLException("Array used to subscript array "\ ++ "contains out of range (<0) subscript.");\ ++ (*res)[i++]= zeroVal;\ ++ break;\ ++ }\ ++ else if( (*src)[i] > upper)\ ++ {\ ++ if( strict)\ ++ throw GDLException("Array used to subscript array "\ ++ "contains out of range (>) subscript.");\ ++ (*res)[i++]= upperVal;\ ++ break;\ ++ }\ ++ else\ ++ (*res)[ i] = (*this)[ (*src)[ i]];\ ++ for(; i < nElem; ++i)\ ++ if( (*src)[i] < 0)\ ++ (*res)[i]= zeroVal;\ ++ else if( (*src)[i] > upper)\ ++ (*res)[i]= upperVal;\ ++ else\ ++ (*res)[ i] = (*this)[ (*src)[ i]];\ ++ GDLInterpreter::IncRefObj( res);\ ++ return guard.release(); ++ ++template<> ++Data_* Data_::NewIx( BaseGDL* ix, bool strict) ++{ ++SizeT nElem = ix->N_Elements(); ++ ++Data_* res = New( ix->Dim(), BaseGDL::NOZERO); ++auto_ptr guard( res); ++ ++SizeT upper = dd.size() - 1; ++Ty upperVal = (*this)[ upper]; ++Ty zeroVal = (*this)[ 0]; ++switch( ix->Type()) ++ { ++ case BYTE: ++ { ++ DByteGDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case INT: ++ { ++ DIntGDL* src = static_cast( ix); ++ ++ NEWIX_SIGNEDINT ++ } ++ case UINT: ++ { ++ DUIntGDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case LONG: // typical type (returned from WHERE) ++ { ++ DLongGDL* src = static_cast( ix); ++ ++ NEWIX_SIGNEDINT ++ } ++ case ULONG: ++ { ++ DULongGDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case LONG64: ++ { ++ DLong64GDL* src = static_cast( ix); ++ ++ NEWIX_SIGNEDINT ++ } ++ case ULONG64: ++ { ++ DULong64GDL* src = static_cast( ix); ++ ++ NEWIX_UNSIGNEDINT ++ } ++ case FLOAT: ++ { ++ DFloat maxF = upper; ++ DFloatGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( (*src)[i] <= 0.0) ++ { ++ Ty b = zeroVal; ++ GDLInterpreter::IncRefObj( b); ++ ++ (*res)[i] = zeroVal; ++ if( (*src)[i] <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ } ++ else if( (*src)[i] > maxF) ++ { ++ if( (*src)[i] >= (maxF + 1.0) && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ Ty b = upperVal; ++ GDLInterpreter::IncRefObj( b); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int((*src)[i])]; ++ } ++ GDLInterpreter::IncRefObj( res); ++ return guard.release(); ++ } ++ case DOUBLE: ++ { ++ DDouble maxF = upper; ++ DDoubleGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( (*src)[i] <= 0.0) ++ { ++ (*res)[i] = zeroVal; ++ if( (*src)[i] <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ } ++ else if( (*src)[i] > maxF) ++ { ++ (*res)[i] = upperVal; ++ if( (*src)[i] >= (maxF + 1.0) && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int((*src)[i])]; ++ } ++ GDLInterpreter::IncRefObj( res); ++ return guard.release(); ++ } ++ case STRING: ++ { ++ DStringGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ { ++ const char* cStart=(*src)[i].c_str(); ++ char* cEnd; ++ long l=strtol(cStart,&cEnd,10); ++ if( cEnd == cStart) ++ { ++ Warning("Type conversion error: " ++ "Unable to convert given STRING to LONG."); ++ (*res)[i] = zeroVal; ++ } ++ else if( l < 0) ++ { ++ if( strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ (*res)[i] = zeroVal; ++ } ++ else if( l > upper) ++ { ++ if( strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i] = (*this)[ l]; ++ } ++ } ++ GDLInterpreter::IncRefObj( res); ++ return guard.release(); ++ } ++ case COMPLEX: ++ { ++ DFloat maxF = upper; ++ DComplexGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( real((*src)[i]) <= 0.0) ++ { ++ if( real((*src)[i]) <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ (*res)[i] = zeroVal; ++ } ++ else if( real((*src)[i]) > upper) ++ { ++ if( real((*src)[i]) >= upper+1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int(real((*src)[i]))]; ++ } ++ GDLInterpreter::IncRefObj( res); ++ return guard.release(); ++ } ++ case COMPLEXDBL: ++ { ++ DDouble maxF = upper; ++ DComplexDblGDL* src = static_cast( ix); ++ for( SizeT i=0; i < nElem; ++i) ++ if( real((*src)[i]) <= 0.0) ++ { ++ if( real((*src)[i]) <= -1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (<0) subscript."); ++ (*res)[i] = zeroVal; ++ } ++ else if( real((*src)[i]) > upper) ++ { ++ if( real((*src)[i]) >= upper+1.0 && strict) ++ throw GDLException("Array used to subscript array " ++ "contains out of range (>) subscript."); ++ (*res)[i] = upperVal; ++ } ++ else ++ { ++ (*res)[i]= (*this)[ Real2Int(real((*src)[i]))]; ++ } ++ GDLInterpreter::IncRefObj( res); ++ return guard.release(); ++ } ++ default: ++ { ++ DType dType = ix->Type(); ++ assert( dType != UNDEF); ++ ++ int typeCheck = DTypeOrder[ dType]; ++ if( typeCheck >= 100) ++ throw GDLException("Type not allowed as subscript."); ++ ++ assert( 0); ++ } ++ } ++assert( 0); ++} ++ ++#endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dcompiler.cpp cvs/gdl/src/dcompiler.cpp +--- gdl-0.9rc4/src/dcompiler.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dcompiler.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -29,7 +29,7 @@ + #include "GDLInterpreter.hpp" + + // print out AST tree +-//#define GDL_DEBUG ++// #define GDL_DEBUG + //#undef GDL_DEBUG + + #ifdef GDL_DEBUG +@@ -177,7 +177,10 @@ + EnvStackT& cS = GDLInterpreter::CallStack(); + SizeT stSz = cS.size(); + for( SizeT i=1; iGetPro() == p) return true; ++ { ++ if( cS[ i]->GetPro() == p) ++ return true; ++ } + return false; + } + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/deviceps.hpp cvs/gdl/src/deviceps.hpp +--- gdl-0.9rc4/src/deviceps.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/deviceps.hpp 2010-06-03 09:06:37.146799848 -0600 +@@ -60,8 +60,8 @@ + sprintf(as, "%f",a); + actStream->SetOpt( "a", as); // this necessary to keep labels from looking stretched (plplot bug) + // but plrender -a is also buggy: aspect ratios are not exactly correct +- xleng=floor(scale*540. +0.5); +- yleng=floor(scale*720. +0.5); ++ xleng=static_cast(floor(scale*540. +0.5)); ++ yleng=static_cast(floor(scale*720. +0.5)); + // setting this without plrender -a makes the labels stretched (plplot bug) + actStream->spage( xp, yp, xleng, yleng, xoff, yoff); + +@@ -154,14 +154,26 @@ + return true; + } + +- bool SetXPageSize( const float xs) ++ bool SetXPageSize( const float xs) // xs [cm] + { + XPageSize=xs; ++ ++ (*static_cast(dStruct->GetTag(dStruct->Desc()->TagIndex("X_SIZE"))))[0] ++ = floor(0.5+ ++ xs * (*static_cast(dStruct->GetTag(dStruct->Desc()->TagIndex("X_PX_CM"))))[0] ++ ); ++ + return true; + } +- bool SetYPageSize( const float ys) ++ bool SetYPageSize( const float ys) // ys [cm] + { + YPageSize=ys; ++ ++ (*static_cast(dStruct->GetTag(dStruct->Desc()->TagIndex("Y_SIZE"))))[0] ++ = floor(0.5+ ++ ys * (*static_cast(dStruct->GetTag(dStruct->Desc()->TagIndex("Y_PX_CM"))))[0] ++ ); ++ + return true; + } + bool SetColor() +Only in gdl-0.9rc4/src: deviceps.hpp.orig +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/devicex.hpp cvs/gdl/src/devicex.hpp +--- gdl-0.9rc4/src/devicex.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/devicex.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -30,9 +30,10 @@ + #include "initsysvar.hpp" + + #define ToXColor(a) (((0xFF & (a)) << 8) | (a)) ++#ifndef free_mem + #define free_mem(a) \ + if (a != NULL) { free((void *) a); a = NULL; } +- ++#endif + + const int maxWin=32; + +@@ -386,7 +387,10 @@ + return false; + + if( winList[ wIx] != NULL) +- delete winList[ wIx]; ++ { ++ delete winList[ wIx]; ++ winList[ wIx] = NULL; ++ } + + DLongGDL* pMulti = SysVar::GetPMulti(); + DLong nx = (*pMulti)[ 1]; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dimension.hpp cvs/gdl/src/dimension.hpp +--- gdl-0.9rc4/src/dimension.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dimension.hpp 2010-06-03 09:06:37.260740232 -0600 +@@ -65,7 +65,7 @@ + dim[i]= d[i]; + } + +- // simplified constructor for one to three dimensions ++ // simplified constructors for one to three dimensions + dimension(const SizeT d0) + { + assert( d0 != 0); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dinterpreter.cpp cvs/gdl/src/dinterpreter.cpp +--- gdl-0.9rc4/src/dinterpreter.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dinterpreter.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -39,6 +39,9 @@ + // #define GDL_DEBUG + //#undef GDL_DEBUG + ++// print out an exspression entered at teh comand line ++//#define AUTO_PRINT_EXPR ++ + #ifdef GDL_DEBUG + #include "print_tree.hpp" + #endif +@@ -46,6 +49,8 @@ + using namespace std; + using namespace antlr; + ++bool historyIntialized = false; ++ + // instantiation of static data + GDLInterpreter::HeapT GDLInterpreter::heap; + GDLInterpreter::ObjHeapT GDLInterpreter::objHeap; +@@ -82,16 +87,16 @@ + // tmpList.reserve(100); + } + +-void SetActualCompileOpt( unsigned int cOpt) +-{ +-if( BaseGDL::interpreter!=NULL && BaseGDL::interpreter->CallStack().size()>0) +- BaseGDL::interpreter->CallStack().back()->SetCompileOpt( cOpt); +-} ++// void SetActualCompileOpt( unsigned int cOpt) ++// { ++// if( BaseGDL::interpreter!=NULL && BaseGDL::interpreter->CallStack().size()>0) ++// BaseGDL::interpreter->CallStack().back()->SetCompileOpt( cOpt); ++// } + + // used in the statement function. + // runs a new instance of the interpreter if not + // at main level +-GDLInterpreter::RetCode GDLInterpreter::NewInterpreterInstance( SizeT lineOffset) ++RetCode GDLInterpreter::NewInterpreterInstance( SizeT lineOffset) + { + if( callStack.size() <= 1) return RC_ABORT; // stay in main loop + +@@ -149,6 +154,7 @@ + static StrArr openFiles; + + string proFile=StrLowCase(pro)+".pro"; ++ //AppendIfNeeded( proFile, ".pro"); + + bool found=CompleteFileName(proFile); + if( !found) return false; +@@ -737,6 +743,11 @@ + try { + auto_ptr lexer; + ++ // LineContinuation LC ++ // conactenate the strings and insert \n ++ // the resulting string can be fed to the lexer ++ ++ // print if expr parse ok + int lCNum = 0; + for(;;) + { +@@ -748,14 +759,40 @@ + lexer->Parser().interactive(); + break; // no error -> everything ok + } +- catch( GDLException e) ++ catch( GDLException& e) + { + int lCNew = lexer->LineContinuation(); + if( lCNew == lCNum) +- throw; // no LC -> real error ++// throw; // no LC -> real error ++ { ++#ifdef AUTO_PRINT_EXPR ++#ifndef GDL_DEBUG ++ try { ++// executeLine.clear(); // clear EOF (for executeLine) ++// lexer.reset( new GDLLexer(executeLine, "", callStack.back()->CompileOpt())); ++// lexer->Parser().expr(); ++ ++ executeLine.clear(); // clear EOF (for executeLine) ++ executeLine.str( "print," + executeLine.str()); // append new line ++ ++ lexer.reset( new GDLLexer(executeLine, "", callStack.back()->CompileOpt())); ++ lexer->Parser().interactive(); ++ ++ break; // no error -> everything ok ++ } ++ catch( GDLException& e2) ++#endif ++#endif ++ { ++ throw e; ++ } ++ } ++ + lCNum = lCNew; // save number to see if next line also has LC + } + ++ ++ + // line continuation -> get next line + if( in != NULL && !in->good()) + throw GDLException( "End of file encountered during line continuation."); +@@ -770,12 +807,12 @@ + theAST = lexer->Parser().getAST(); + + } +- catch( GDLException e) ++ catch( GDLException& e) + { + ReportCompileError( e); + return CC_OK; + } +- catch( ANTLRException e) ++ catch( ANTLRException& e) + { + cerr << "Lexer/Parser exception: " << e.getMessage() << endl; + return CC_OK; +@@ -793,9 +830,13 @@ + cout << "ExecuteLine: Parser end." << endl; + #endif + +- ProgNodeP progAST = NULL;; ++ ProgNodeP progAST = NULL; + + RefDNode trAST; ++ ++ assert( dynamic_cast(callStack.back()) != NULL); ++ EnvUDT* env = static_cast(callStack.back()); ++ int nForLoopsIn = env->NForLoops(); + try + { + GDLTreeParser treeParser( callStack.back()); +@@ -816,15 +857,24 @@ + cout << "ExecuteLine: Tree parser end." << endl; + #endif + +- progAST = ProgNode::NewProgNode( trAST); ++ progAST = ProgNode::NewProgNode( trAST); ++ ++ assert( dynamic_cast(callStack.back()) != NULL); ++ EnvUDT* env = static_cast(callStack.back()); ++ int nForLoops = ProgNode::NumberForLoops( progAST, nForLoopsIn); ++ env->ResizeForLoops( nForLoops); + } +- catch( GDLException e) ++ catch( GDLException& e) + { ++ env->ResizeForLoops( nForLoopsIn); ++ + ReportCompileError( e); + return CC_OK; + } +- catch( ANTLRException e) ++ catch( ANTLRException& e) + { ++ env->ResizeForLoops( nForLoopsIn); ++ + cerr << "Compiler exception: " << e.getMessage() << endl; + return CC_OK; + } +@@ -839,7 +889,9 @@ + cout << "end." << endl; + #endif + +- GDLInterpreter::RetCode retCode = interactive( progAST); ++ RetCode retCode = interactive( progAST); ++ ++ env->ResizeForLoops( nForLoopsIn); + + // write to journal file + string actualLine = GetClearActualLine(); +@@ -850,11 +902,15 @@ + } + catch( GDLException& e) + { ++ env->ResizeForLoops( nForLoopsIn); ++ + cerr << "Unhandled GDL exception: " << e.toString() << endl;; + return CC_OK; + } + catch( ANTLRException& e) + { ++ env->ResizeForLoops( nForLoopsIn); ++ + cerr << "Interpreter exception: " << e.getMessage() << endl; + return CC_OK; + } +@@ -890,12 +946,14 @@ + } + + bool lineEdit = false; ++string actualPrompt; + + void ControlCHandler(int) + { + cout << SysVar::MsgPrefix() << "Interrupt encountered." << endl; +- if( lineEdit) cout << SysVar::Prompt() /*.c_str()*/ << flush; ++ if( lineEdit) cout << actualPrompt /*SysVar::Prompt()*/ /*.c_str()*/ << flush; + sigControlC = true; ++ signal(SIGINT,ControlCHandler); + } + + string DInterpreter::GetLine() +@@ -911,17 +969,19 @@ + + char *cline; + ++ actualPrompt = SysVar::Prompt(); ++ + lineEdit = true; + + #ifdef HAVE_LIBREADLINE + + if( edit_input != 0) +- cline = readline(const_cast(SysVar::Prompt().c_str())); ++ cline = readline(const_cast(actualPrompt.c_str())); + else +- cline = NoReadline(SysVar::Prompt().c_str()); ++ cline = NoReadline(actualPrompt.c_str()); + #else + +- cline = NoReadline(SysVar::Prompt().c_str()); ++ cline = NoReadline(actualPrompt.c_str()); + #endif + + lineEdit = false; +@@ -937,9 +997,10 @@ + StrTrim(line); + break; + } +- ++ else + // make a string + line = cline; ++ + free(cline); // done here for compatibility with readline + + StrTrim(line); +@@ -965,7 +1026,7 @@ + + // reads user input and executes it + // inner loop (called via Control-C, STOP, error) +-GDLInterpreter::RetCode DInterpreter::InnerInterpreterLoop(SizeT lineOffset) ++RetCode DInterpreter::InnerInterpreterLoop(SizeT lineOffset) + { + + bool runCmd = false; +@@ -1107,7 +1168,7 @@ + + // reads user input and executes it + // the main loop +-GDLInterpreter::RetCode DInterpreter::InterpreterLoop( const string& startup, ++RetCode DInterpreter::InterpreterLoop( const string& startup, + vector& batch_files, const std::string& statement) + { + // process startup file +@@ -1191,7 +1252,12 @@ + // execute single statement and exit (a new-line is added to statement in gdl.cpp) + // (e.g. $ gdl -e "print, 'hello world'") + istringstream iss(statement, ios_base::out); +- ExecuteLine(&iss); ++ try { ++ ExecuteLine(&iss); ++ } ++ catch( RetAllException& retAllEx) ++ { ++ } + return RC_OK; + } + else +@@ -1204,6 +1270,7 @@ + } + + #ifdef HAVE_LIBREADLINE ++ + // initialize readline (own version - not pythons one) + // in includefirst.hpp readline is disabled for python_module + // http://www.delorie.com/gnu/docs/readline/rlman.html +@@ -1238,6 +1305,9 @@ + else cout<<"Fail to read back ~/.gdl/history"< + #include + ++ + void ControlCHandler(int); + ++extern bool lineEdit; // = false; ++extern bool historyIntialized; ++extern std::string actualPrompt; ++ + class DInterpreter: public GDLInterpreter + { + public: +@@ -61,10 +66,10 @@ + CC_RETURN + }; + +-private: +- + char* NoReadline(const std::string&); + ++private: ++ + // execute GDL command (.run, .step, ...) + CommandCode ExecuteCommand(const std::string& command); + CommandCode CmdCompile(const std::string& command); +@@ -99,11 +104,11 @@ + bool RunBatch( std::istream* in); + + // the main program for interactive mode +- GDLInterpreter::RetCode InterpreterLoop( const std::string& startup, ++ RetCode InterpreterLoop( const std::string& startup, + std::vector& batch_files, const std::string& statement); + + // called within InterpreterLoop() +- GDLInterpreter::RetCode InnerInterpreterLoop(SizeT lineOffset); ++ RetCode InnerInterpreterLoop(SizeT lineOffset); + + }; + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dnode.cpp cvs/gdl/src/dnode.cpp +--- gdl-0.9rc4/src/dnode.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dnode.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -1,5 +1,5 @@ + /*************************************************************************** +- dnode.cpp - GDL's AST is made of DNodes ++ dnode.cpp - GDL's AST is made of DNodes + ------------------- + begin : July 22 2002 + copyright : (C) 2002 by Marc Schellens +@@ -52,6 +52,7 @@ + DInterpreter* ProgNode::interpreter; + + DNode::DNode( const DNode& cp): ++// keepRight( false), + CommonAST( cp), //down(), right(), + lineNumber( cp.getLine()), cData(NULL), + var(cp.var), arrIxList(NULL), +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dnode.hpp cvs/gdl/src/dnode.hpp +--- gdl-0.9rc4/src/dnode.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dnode.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -62,7 +62,8 @@ + + ~DNode(); + +- DNode(): CommonAST(), //down(), right(), ++ DNode(): CommonAST(), //down(), right(), ++// keepRight( false), + lineNumber(0), cData(NULL), + var(NULL), + libFun(NULL), +@@ -74,17 +75,22 @@ + DNode( const DNode& cp); + + DNode(antlr::RefToken t) : antlr::CommonAST(t) //, down(), right() +- { ++// , keepRight( false) ++{ + // antlr::CommonAST::setType(t->getType() ); + // antlr::CommonAST::setText(t->getText() ); + DNode::SetLine(t->getLine() ); + } + ++// void DoKeepRight() { keepRight = true;} ++ + void initialize(int t, const std::string& txt) + { + antlr::CommonAST::setType(t); + antlr::CommonAST::setText(txt); + ++// keepRight = false; ++ + lineNumber = 0; + cData=NULL; + libFun=NULL; +@@ -258,6 +264,7 @@ + void SetLibFun(DLibFun* const l) { libFun=l;} + void SetLibPro(DLibPro* const l) { libPro=l;} + void SetNDot(const int n) { nDot=n;} ++ int GetNDot() const { return nDot;} + + void SetCompileOpt(const int n) { compileOpt=n; } + int GetCompileOpt() { return compileOpt; } +@@ -287,6 +294,8 @@ + { ArrayIndexListT* res = arrIxList; arrIxList=NULL; return res;} + ArrayIndexListT* CloneArrIxList(); + ++// bool keepRight; // for passing to ProgNode, nodes here are reference counted ++ + // RefDNode down; + // RefDNode right; + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dpro.cpp cvs/gdl/src/dpro.cpp +--- gdl-0.9rc4/src/dpro.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dpro.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -155,7 +155,7 @@ + + DLibFunRetNew::DLibFunRetNew( LibFun f, const string& n, const int nPar_, + const string keyNames[], const string warnKeyNames[], bool rConstant) +- : DLibFun(f,n,nPar_,keyNames, NULL), retConstant( rConstant) ++ : DLibFun(f,n,nPar_,keyNames, warnKeyNames), retConstant( rConstant) + {} + // DLibFunRetNew::DLibFunRetNew( LibFun f, const string& n, const int nPar_, + // bool rConstant) +@@ -185,7 +185,8 @@ + DSub(n,o), file(f), + tree( NULL), + labelList(), +- compileOpt(GDLParser::NONE) ++ compileOpt(GDLParser::NONE), ++ nForLoops( 0) + { + if( o != "") + AddPar( "SELF"); +@@ -215,6 +216,7 @@ + labelList.Clear(); // labels are invalid after tree is deleted + delete tree; + tree = NULL; //static_cast(antlr::nullAST); ++ nForLoops = 0; + } + + void DSubUD::AddPar(const string& p) +@@ -264,13 +266,18 @@ + void DSubUD::ResolveLabel( ProgNodeP p) + { + if( p == NULL) return; ++ ++// if( p->getNextSibling() != NULL) ++// std::cout << "Resolve("<< p->getLine()<<"): " << p << " keepRight: " << p->KeepRight()<< ": "<< p->getText() <<" r: "<< p->GetNextSibling()->getText() << std::endl; ++// else ++// std::cout << "Resolve("<< p->getLine()<<"): " << p << " keepRight: " << p->KeepRight()<< ": "<< p->getText() <<" r: NULL"<< std::endl; + + if( p->getType() == GDLTreeParser::ON_IOERROR || + p->getType() == GDLTreeParser::GOTO) + { + int ix = labelList.Find( p->getText()); + if( ix == -1) +- throw GDLException( p, ObjectName()+": Undefined label "+p->getText()+ ++ throw GDLException( p, ObjectName()+": Undefined label "+p->getText()+ + " referenced in GOTO statement.",false,false); + + p->SetGotoIx( ix); +@@ -280,8 +287,12 @@ + labelList.SetLabelNode( p); + } + +- ResolveLabel( p->getFirstChild()); +- ResolveLabel( p->getNextSibling()); ++ if( !p->KeepDown()) ++ ResolveLabel( p->getFirstChild()); ++ if( !p->KeepRight()) ++ ResolveLabel( p->getNextSibling()); ++// else ++// ResolveLabel( p->getNextSibling()); + } + + // the final "compilation" takes part here +@@ -294,6 +305,8 @@ + // + tree = ProgNode::NewProgNode( n); + ++ nForLoops = ProgNode::NumberForLoops( tree); ++ + #ifdef GDL_DEBUG + cout << "DSubUD::SetTree:" << endl; + antlr::print_tree pt; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dpro.hpp cvs/gdl/src/dpro.hpp +--- gdl-0.9rc4/src/dpro.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dpro.hpp 2010-05-21 10:23:56.602905285 -0600 +@@ -277,6 +277,9 @@ + + void ResolveLabel( ProgNodeP); + ++protected: ++ int nForLoops; ++ + public: + DSubUD(const std::string&,const std::string& o="",const std::string& f=""); + ~DSubUD(); +@@ -310,6 +313,8 @@ + void DelVar(const int ix) {var.erase(var.begin() + ix);} + + SizeT Size() { return var.size();} ++ ++ int NForLoops() const { return nForLoops;} + + // search for variable returns true if its found in var or common blocks + bool Find(const std::string& n) +@@ -351,7 +356,7 @@ + { + return key[ix]; + } +- ++ + bool GetCommonVarName(const BaseGDL* p, std::string& varName) + { + for( CommonBaseListT::iterator c=common.begin(); +@@ -427,7 +432,8 @@ + { + public: + // for main function, not inserted into proList +- DPro(): DSubUD("$MAIN$","","") {} ++ // should be fine (way too much): 32 NESTED loops in $MAIN$ (elswhere: unlimited) ++ DPro(): DSubUD("$MAIN$","","") { this->nForLoops = 32;} + + DPro(const std::string& n,const std::string& o="",const std::string& f=""): + DSubUD(n,o,f) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dstructgdl.cpp cvs/gdl/src/dstructgdl.cpp +--- gdl-0.9rc4/src/dstructgdl.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dstructgdl.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -118,10 +118,11 @@ + } + + // c-i ++// only used from Assoc_ + DStructGDL::DStructGDL(const DStructGDL& d_) +- : SpDStruct(d_.desc, d_.dim) ++ : SpDStruct(d_.desc, d_.dim) + , typeVar( d_.NTags()) +- , dd(d_.NBytes(), false) ++ , dd(d_.NBytes(), false) + { + MakeOwnDesc(); + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/dstructgdl.hpp cvs/gdl/src/dstructgdl.hpp +--- gdl-0.9rc4/src/dstructgdl.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/dstructgdl.hpp 2010-05-21 10:23:56.606906918 -0600 +@@ -117,7 +117,8 @@ + } + + // c-i (desc defined) +- DStructGDL(const DStructGDL& d_); ++ // only called from Assoc_'s c-i ++DStructGDL(const DStructGDL& d_); + + // For creating new structs (always scalar) + DStructGDL( DStructDesc* desc_) +@@ -411,6 +412,7 @@ + // used by the interpreter + // throws (datatypes.cpp) + int Scalar2index( SizeT& st) const; ++ int Scalar2RangeT( RangeT& st) const; + + bool Scalar() const + { return (N_Elements() == 1);} +@@ -498,7 +500,8 @@ + Data_* LogNeg() + { throw GDLException("Struct expression not allowed in this context.");} + int Sgn(); // -1,0,1 +- bool Equal( BaseGDL*); ++ bool Equal( BaseGDL*) const; ++ bool EqualNoDelete( const BaseGDL*) const; + bool ArrayEqual( BaseGDL*); + // 'for' statement compliance (int types , float types scalar only) + void ForCheck( BaseGDL**, BaseGDL** =NULL); +@@ -529,7 +532,7 @@ + DStructGDL* PowInv( BaseGDL* r); + DStructGDL* PowInt( BaseGDL* r); + DStructGDL* PowIntNew( BaseGDL* r); +- DStructGDL* MatrixOp( BaseGDL* r); ++ DStructGDL* MatrixOp( BaseGDL* r,bool,bool,bool); + + + DStructGDL* AndOpS( BaseGDL* r); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/envt.cpp cvs/gdl/src/envt.cpp +--- gdl-0.9rc4/src/envt.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/envt.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -53,6 +53,9 @@ + lastJump( -1) + { + DSubUD* proUD=static_cast(pro); ++ ++ forLoopInfo.resize( proUD->NForLoops()); ++ + SizeT envSize; + SizeT keySize; + +@@ -95,7 +98,7 @@ + lastJump( -1) + { + obj = true; +- ++ + DStructGDL* oStructGDL = interpreter->ObjectStruct( self, cN); + + const string& mp = cN->getText(); +@@ -120,6 +123,9 @@ + } + + DSubUD* proUD=static_cast(pro); ++ ++ forLoopInfo.resize( proUD->NForLoops()); ++ + SizeT envSize; + SizeT keySize; + envSize=proUD->var.size(); +@@ -169,6 +175,9 @@ + } + + DSubUD* proUD=static_cast(pro); ++ ++ forLoopInfo.resize( proUD->NForLoops()); ++ + SizeT envSize; + SizeT keySize; + envSize=proUD->var.size(); +@@ -204,7 +213,7 @@ + if( self != NULL) + env.Set( parIx++, self); //static_cast(oStructGDL)); + } +-EnvUDT::EnvUDT( EnvT* pEnv, DSub* newPro, BaseGDL** self): ++EnvUDT::EnvUDT( EnvBaseT* pEnv, DSub* newPro, BaseGDL** self): + EnvBaseT( pEnv->CallingNode(), newPro), + ioError(NULL), + onError( -1), +@@ -217,6 +226,9 @@ + obj = (self != NULL); + + DSubUD* proUD=static_cast(pro); ++ ++ forLoopInfo.resize( proUD->NForLoops()); ++ + SizeT envSize; + SizeT keySize; + envSize=proUD->var.size(); +@@ -229,7 +241,7 @@ + } + + +-void EnvBaseT::AddStruct( DPtrListT& ptrAccessible, ++void EnvBaseT::AddStruct( DPtrListT& ptrAccessible, + DPtrListT& objAccessible, DStructGDL* stru) + { + if( stru == NULL) return; +@@ -268,7 +280,7 @@ + + } + } +-void EnvBaseT::AddPtr( DPtrListT& ptrAccessible, DPtrListT& objAccessible, ++void EnvBaseT::AddPtr( DPtrListT& ptrAccessible, DPtrListT& objAccessible, + DPtrGDL* ptr) + { + if( ptr == NULL) return; +@@ -287,7 +299,7 @@ + } + } + } +-void EnvBaseT::AddObj( DPtrListT& ptrAccessible, DPtrListT& objAccessible, ++void EnvBaseT::AddObj( DPtrListT& ptrAccessible, DPtrListT& objAccessible, + DObjGDL* ptr) + { + if( ptr == NULL) return; +@@ -307,7 +319,7 @@ + } + } + } +-void EnvBaseT::Add( DPtrListT& ptrAccessible, DPtrListT& objAccessible, ++void EnvBaseT::Add( DPtrListT& ptrAccessible, DPtrListT& objAccessible, + BaseGDL* p) + { + DPtrGDL* ptr = dynamic_cast< DPtrGDL*>( p); +@@ -354,7 +366,7 @@ + DVar* var = common->Var( v); + if( var != NULL) + { +- Add( ptrAccessible, objAccessible, var->Data()); ++ Add( ptrAccessible, objAccessible, var->Data()); + } + } + } +@@ -378,11 +390,11 @@ + // do OBJ first as the cleanup might need the PTR be valid + if( doObj) + { +- DObjGDL* heap = interpreter->GetAllObjHeap(); +- auto_ptr< DObjGDL> heap_guard( heap); ++ std::vector* heap = interpreter->GetAllObjHeapSTL(); ++ auto_ptr< std::vector > heap_guard( heap); + if( (*heap)[0] != 0) + { +- SizeT nH = heap->N_Elements(); ++ SizeT nH = heap->size();//N_Elements(); + for( SizeT h=0; hGetAllHeap(); +- auto_ptr< BaseGDL> heap_guard( heap); ++ std::vector* heap = interpreter->GetAllHeapSTL(); ++ auto_ptr< std::vector > heap_guard( heap); + if( (*heap)[0] != 0) + { +- SizeT nH = heap->N_Elements(); ++ SizeT nH = heap->size(); + for( SizeT h=0; h EnvBaseT::inProgress; ++ ++// for CLEANUP calls due to reference counting ++// note: refcount is already zero for actID ++void EnvBaseT::ObjCleanup( DObj actID) + { +- static set< DObj> inProgress; ++ if( actID != 0 && (inProgress.find( actID) == inProgress.end())) ++ { ++ DStructGDL* actObj; ++ try{ ++// actObj=GetObjHeap( actID); ++ GDLInterpreter::ObjHeapT::iterator it; ++ actObj=GDLInterpreter::GetObjHeap( actID, it); ++ } ++ catch( GDLInterpreter::HeapException){ ++ actObj=NULL; ++ } ++ ++ if( actObj != NULL) ++ { ++ try{ ++ // call CLEANUP function ++ DPro* objCLEANUP= actObj->Desc()->GetPro( "CLEANUP"); ++ ++ if( objCLEANUP != NULL) ++ { ++ BaseGDL* actObjGDL = new DObjGDL( actID); ++ auto_ptr actObjGDL_guard( actObjGDL); ++ GDLInterpreter::IncRefObj( actID); // set refcount to 1 ++ ++ PushNewEmptyEnvUD( objCLEANUP, &actObjGDL); ++ ++ inProgress.insert( actID); ++ ++ interpreter->call_pro( objCLEANUP->GetTree()); ++ ++ inProgress.erase( actID); ++ ++ EnvBaseT* callStackBack = interpreter->CallStack().back(); ++ interpreter->CallStack().pop_back(); ++ delete callStackBack; ++ ++ FreeObjHeap( actID); // make sure actObj is freed ++ // actObjGDL goes out of scope -> refcount is (would be) decreased ++ } ++ } ++ catch( ...) ++ { ++ FreeObjHeap( actID); // make sure actObj is freed ++ throw; // rethrow ++ } ++ } ++ else ++ FreeObjHeap( actID); // the actual freeing ++ } ++} + ++ ++ ++void EnvT::ObjCleanup( DObj actID) ++{ + if( actID != 0 && (inProgress.find( actID) == inProgress.end())) + { + DStructGDL* actObj; + try{ +- actObj=GetObjHeap( actID); ++// actObj=GetObjHeap( actID); ++ GDLInterpreter::ObjHeapT::iterator it; ++ actObj=GDLInterpreter::GetObjHeap( actID, it); + } + catch( GDLInterpreter::HeapException){ +- actObj=NULL; ++ actObj=NULL; + } + + if( actObj != NULL) +- { +- // call CLEANUP function +- DPro* objCLEANUP= actObj->Desc()->GetPro( "CLEANUP"); +- +- if( objCLEANUP != NULL) +- { +- BaseGDL* actObjGDL = new DObjGDL( actID); +- auto_ptr actObjGDL_guard( actObjGDL); +- +- PushNewEnvUD( objCLEANUP, 1, &actObjGDL); +- +- inProgress.insert( actID); +- +- interpreter->call_pro( objCLEANUP->GetTree()); +- +- inProgress.erase( actID); ++ { ++ // call CLEANUP function ++ DPro* objCLEANUP= actObj->Desc()->GetPro( "CLEANUP"); ++ ++ if( objCLEANUP != NULL) ++ { ++ BaseGDL* actObjGDL = new DObjGDL( actID); ++ auto_ptr actObjGDL_guard( actObjGDL); ++ GDLInterpreter::IncRefObj( actID); ++ ++ PushNewEnvUD( objCLEANUP, 1, &actObjGDL); ++ ++ inProgress.insert( actID); ++ ++ interpreter->call_pro( objCLEANUP->GetTree()); ++ ++ inProgress.erase( actID); + +- delete interpreter->CallStack().back(); +- interpreter->CallStack().pop_back(); +- } +- +- FreeObjHeap( actID); // the actual freeing +- } ++ delete interpreter->CallStack().back(); ++ interpreter->CallStack().pop_back(); ++ } ++ ++ FreeObjHeap( actID); // the actual freeing ++ } + } + } + + + + // these two functions should be inlined +-SizeT EnvT::NewObjHeap( SizeT n, DStructGDL* v) ++SizeT EnvBaseT::NewObjHeap( SizeT n, DStructGDL* v) + { + return interpreter->NewObjHeap(n,v); + } +-SizeT EnvT::NewHeap( SizeT n, BaseGDL* v) ++SizeT EnvBaseT::NewHeap( SizeT n, BaseGDL* v) + { + return interpreter->NewHeap(n,v); + } +-void EnvT::FreeObjHeap( DObj id) ++void EnvBaseT::FreeObjHeap( DObj id) + { + interpreter->FreeObjHeap( id); + } +-void EnvT::FreeHeap( DPtrGDL* p) ++void EnvBaseT::FreeHeap( DPtrGDL* p) + { + interpreter->FreeHeap(p); + } +-DStructGDL* EnvT::GetObjHeap( DObj ID) ++// // DStructGDL* EnvT::GetObjHeap( DObj ID, ObjHeapT::iterator& it) ++// // { ++// // return interpreter->GetObjHeap( ID, it); ++// // } ++DStructGDL* EnvBaseT::GetObjHeap( DObj ID) + { + return interpreter->GetObjHeap( ID); + } +-BaseGDL* EnvT::GetHeap( DPtr ID) ++BaseGDL* EnvBaseT::GetHeap( DPtr ID) + { + return interpreter->GetHeap( ID); + } +@@ -769,6 +847,27 @@ + + // used by obj_new (basic_fun.cpp) + // and obj_destroy (basic_pro.cpp) ++void EnvBaseT::PushNewEmptyEnvUD( DSub* newPro, BaseGDL** newObj) ++{ ++ EnvUDT* newEnv= new EnvUDT( this, newPro, newObj); ++ ++ // pass the parameters, skip the first 'skipP' ++// SizeT nParam = NParam(); ++// for( SizeT p=skipP; pSetNextPar( &GetPar( p)); // pass as global ++// } ++ ++ interpreter->CallStack().push_back( newEnv); ++ ++ // _REF_EXTRA is set to the keyword string array ++// newEnv->extra = new ExtraT( newEnv); ++// newEnv->extra->Set( &env[0]); ++// newEnv->extra->Resolve(); ++} ++ ++// used by obj_new (basic_fun.cpp) ++// and obj_destroy (basic_pro.cpp) + void EnvT::PushNewEnvUD( DSub* newPro, SizeT skipP, BaseGDL** newObj) + { + EnvUDT* newEnv= new EnvUDT( this, newPro, newObj); +@@ -1114,10 +1213,11 @@ + BaseGDL*& EnvT::GetPar(SizeT i) + { + static BaseGDL* null=NULL; ++ assert( null == NULL); + SizeT ix= i + pro->key.size(); + if( ix >= env.size()) + { +- Warning( "EnvT::GetPar(): Index out of env: " + GetParString(ix)); ++// Warning( "EnvT::GetPar(): Index out of env size ("+i2s(env.size())+"): " + i2s(i) +" (+ "+i2s(pro->key.size())+" KW)"); + return null; + } + return env[ ix]; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/envt.hpp cvs/gdl/src/envt.hpp +--- gdl-0.9rc4/src/envt.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/envt.hpp 2010-05-21 10:23:56.876905583 -0600 +@@ -42,6 +42,9 @@ + class EnvBaseT + { + protected: ++ // for obj cleanup ++ static std::set< DObj> inProgress; ++ + static DInterpreter* interpreter; + DataListT env; + SizeT parIx; // ix of next parameter to put +@@ -57,22 +60,40 @@ + int GetKeywordIx( const std::string& k); + + // for HEAP_GC +- void AddStruct( DPtrListT& ptrAccessible, DPtrListT& objAccessible, ++ static void AddStruct( DPtrListT& ptrAccessible, DPtrListT& objAccessible, + DStructGDL* stru); +- void AddPtr( DPtrListT& ptrAccessible, DPtrListT& objAccessible, ++ static void AddPtr( DPtrListT& ptrAccessible, DPtrListT& objAccessible, + DPtrGDL* ptr); +- void AddObj( DPtrListT& ptrAccessible, DPtrListT& objAccessible, ++ static void AddObj( DPtrListT& ptrAccessible, DPtrListT& objAccessible, + DObjGDL* obj); +- void Add( DPtrListT& ptrAccessible, DPtrListT& objAccessible, ++ static void Add( DPtrListT& ptrAccessible, DPtrListT& objAccessible, + BaseGDL* p); + + public: ++// void DebugInfo() ++// { ++// std::cout << this->pro->ObjectName() << std::endl; ++// } ++ ++ virtual void ObjCleanup( DObj actID); ++ ++ // for CLEANUP calls due to reference counting ++ void PushNewEmptyEnvUD( DSub* newPro, BaseGDL** newObj = NULL); ++ + void AddEnv( DPtrListT& ptrAccessible, DPtrListT& objAccessible); + + virtual ~EnvBaseT() { delete extra;} + + EnvBaseT( ProgNodeP cN, DSub* pro_); + ++ static SizeT NewObjHeap( SizeT n=1, DStructGDL* v=NULL); ++ static SizeT NewHeap( SizeT n=1, BaseGDL* v=NULL); ++ static void FreeObjHeap( DObj id); ++ static void FreeHeap( DPtr id); ++ static void FreeHeap( DPtrGDL* p); ++ static DStructGDL* GetObjHeap( DObj ID); ++ static BaseGDL* GetHeap( DPtr ID); ++ + int GetLineNumber() + { + return lineNumber; +@@ -84,13 +105,15 @@ + unsigned int CompileOpt() + { + DSubUD* proUD = dynamic_cast(pro); +-if( proUD == NULL) throw GDLException("Intenal error: CompileOpt called non DSub object."); ++if( proUD == NULL) ++ throw GDLException("Intenal error: CompileOpt called non DSub object."); + return proUD->GetCompileOpt(); + } + void SetCompileOpt( unsigned int cOpt) + { + DSubUD* proUD = dynamic_cast(pro); +-if( proUD == NULL) throw GDLException("Intenal error: CompileOpt called non DSub object."); ++if( proUD == NULL) ++ throw GDLException("Intenal error: CompileOpt called non DSub object."); + proUD->SetCompileOpt( cOpt); + } + +@@ -198,9 +221,13 @@ + friend class DInterpreter; // gcc 4.4 compatibility + }; + ++ ++ + // for UD subroutines (written in GDL) ******************************** + class EnvUDT: public EnvBaseT + { ++ std::vector forLoopInfo; ++ + ProgNodeP ioError; + DLong onError; // on_error setting + BaseGDL** catchVar; +@@ -210,6 +237,11 @@ + int lastJump; // to which label last jump went + + public: ++ ForLoopInfoT& GetForLoopInfo( int forIx) { return forLoopInfo[forIx];} ++ ++ int NForLoops() const { return forLoopInfo.size();} ++ void ResizeForLoops( int newSize) { forLoopInfo.resize(newSize);} ++ + // UD pro/fun + EnvUDT( ProgNodeP idN, DSub* pro_, bool lF = false); + +@@ -222,7 +254,7 @@ + + + // for obj_new and obj_destroy +- EnvUDT( EnvT* pEnv, DSub* newPro, BaseGDL** self); ++ EnvUDT( EnvBaseT* pEnv, DSub* newPro, BaseGDL** self); + + DLong GetOnError() const { return onError;} + +@@ -293,15 +325,6 @@ + void HeapGC( bool doPtr, bool doObj, bool verbose); + void ObjCleanup( DObj actID); + +- +- SizeT NewObjHeap( SizeT n=1, DStructGDL* v=NULL); +- SizeT NewHeap( SizeT n=1, BaseGDL* v=NULL); +- void FreeObjHeap( DObj id); +- void FreeHeap( DPtr id); +- void FreeHeap( DPtrGDL* p); +- DStructGDL* GetObjHeap( DObj ID); +- BaseGDL* GetHeap( DPtr ID); +- + // used by obj_new (basic_fun.cpp) + void PushNewEnv( DSub* newPro, SizeT skipP, BaseGDL** newObj=NULL); + void PushNewEnvUD( DSub* newPro, SizeT skipP, BaseGDL** newObj=NULL); +@@ -584,7 +607,7 @@ + }; + + +-typedef std::deque EnvStackT; ++ typedef std::deque EnvStackT; + + #endif + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/fftw.cpp cvs/gdl/src/fftw.cpp +--- gdl-0.9rc4/src/fftw.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/fftw.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -175,18 +175,12 @@ + } + else if( p0->Type() == COMPLEX) { + +- DComplexGDL* res; ++ // DComplexGDL* res; + + return fftw_template< DComplexGDL> (p0, nEl, dbl, overwrite, direct); + + } +- else if (p0->Type() == FLOAT || +- p0->Type() == LONG || +- p0->Type() == ULONG || +- p0->Type() == INT || +- p0->Type() == UINT || +- p0->Type() == BYTE) { +- ++ else { + overwrite = 0; + + DComplexGDL* p0C = static_cast +@@ -194,15 +188,8 @@ + auto_ptr guard_p0C( p0C); + return fftw_template< DComplexGDL> (p0C, nEl, dbl, overwrite, direct); + +- } else { +- DFloatGDL* res = static_cast +- (p0->Convert2( FLOAT, BaseGDL::COPY)); +- +- return res; +- + } + } +- + } // namespace + + #endif // USE_FFTW +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/file.cpp cvs/gdl/src/file.cpp +--- gdl-0.9rc4/src/file.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/file.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -376,21 +376,25 @@ + return; + } + +- if( dirN[0] != '+') ++ if( dirN[0] != '+' && dirN[0] != '~') + { + result.push_back( dirN); + return; + } + +- if( dirN.length() == 1) // dirN == "+" +- return; ++ if( dirN.length() == 1) { ++ // dirN == "+" ++ if (dirN[0] == '+') return; ++ } + + // dirN == "+DIRNAME" + + // do first a glob because of '~' + int flags = GLOB_TILDE | GLOB_NOSORT; + glob_t p; +- int gRes = glob( dirN.substr(1).c_str(), flags, NULL, &p); ++ int offset_tilde=0; ++ if (dirN[0] == '+') offset_tilde=1; ++ int gRes = glob( dirN.substr(offset_tilde).c_str(), flags, NULL, &p); + if( gRes != 0 || p.gl_pathc == 0) + { + globfree( &p); +@@ -399,8 +403,16 @@ + + DString initDir = p.gl_pathv[ 0]; + globfree( &p); +- +- ExpandPathN( result, initDir, pat, all_dirs); ++ ++ if (dirN[0] == '+') ++ { ++ ExpandPathN( result, initDir, pat, all_dirs); ++ } ++ else ++ { ++ result.push_back(initDir); ++ } ++ + } + + BaseGDL* expand_path( EnvT* e) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/.#file.cpp.1.9 cvs/gdl/src/.#file.cpp.1.9 +--- gdl-0.9rc4/src/.#file.cpp.1.9 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/.#file.cpp.1.9 2008-11-12 17:03:31.000000000 -0700 +@@ -0,0 +1,842 @@ ++/*************************************************************************** ++ file.cpp - file related library functions ++ ------------------- ++ begin : July 22 2004 ++ copyright : (C) 2004 by Marc Schellens ++ email : m_schellens@users.sourceforge.net ++ ***************************************************************************/ ++ ++/*************************************************************************** ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++#include "includefirst.hpp" ++ ++#include "basegdl.hpp" ++#include "str.hpp" ++ ++//#ifdef HAVE_LIBWXWIDGETS ++ ++#include "envt.hpp" ++#include "file.hpp" ++ ++#include ++#include ++ ++// #include ++// #include ++// #include ++ ++#include ++#include ++#include ++ ++// workaround for HP-UX. A better solution is needed i think ++#if defined(__hpux__) ++#define GLOB_TILDE 0 ++#define GLOB_BRACE 0 ++#define GLOB_ONLYDIR 0 ++#define GLOB_PERIOD 0 ++#endif ++ ++ ++namespace lib { ++ ++ using namespace std; ++ ++ BaseGDL* file_test( EnvT* e) ++ { ++ SizeT nParam=e->NParam( 1); ++ ++ BaseGDL* p0 = e->GetParDefined( 0); ++ ++ DStringGDL* p0S = dynamic_cast( p0); ++ if( p0S == NULL) ++ e->Throw( "String expression required in this context: "+ ++ e->GetParString(0)); ++ ++ static int directoryIx = e->KeywordIx( "DIRECTORY"); ++ bool directory = e->KeywordSet( directoryIx); ++ ++ static int executableIx = e->KeywordIx( "EXECUTABLE"); ++ bool executable = e->KeywordSet( executableIx); ++ ++ static int readIx = e->KeywordIx( "READ"); ++ bool read = e->KeywordSet( readIx); ++ ++ static int writeIx = e->KeywordIx( "WRITE"); ++ bool write = e->KeywordSet( writeIx); ++ ++ static int zero_lengthIx = e->KeywordIx( "ZERO_LENGTH"); ++ bool zero_length = e->KeywordSet( zero_lengthIx); ++ ++ static int get_modeIx = e->KeywordIx( "GET_MODE"); ++ bool get_mode = e->KeywordPresent( get_modeIx); ++ ++ static int regularIx = e->KeywordIx( "REGULAR"); ++ bool regular = e->KeywordSet( regularIx); ++ ++ static int block_specialIx = e->KeywordIx( "BLOCK_SPECIAL"); ++ bool block_special = e->KeywordSet( block_specialIx); ++ ++ static int character_specialIx = e->KeywordIx( "CHARACTER_SPECIAL"); ++ bool character_special = e->KeywordSet( character_specialIx); ++ ++ static int named_pipeIx = e->KeywordIx( "NAMED_PIPE"); ++ bool named_pipe = e->KeywordSet( named_pipeIx); ++ ++ static int socketIx = e->KeywordIx( "SOCKET"); ++ bool socket = e->KeywordSet( socketIx); ++ ++ static int symlinkIx = e->KeywordIx( "SYMLINK"); ++ bool symlink = e->KeywordSet( symlinkIx); ++ ++ DLongGDL* getMode = NULL; ++ if( get_mode) ++ { ++ getMode = new DLongGDL( p0S->Dim()); // zero ++ e->SetKW( get_modeIx, getMode); ++ } ++ ++ DLongGDL* res = new DLongGDL( p0S->Dim()); // zero ++ ++// bool doStat = ++// zero_length || get_mode || directory || ++// regular || block_special || character_special || ++// named_pipe || socket || symlink; ++ ++ SizeT nEl = p0S->N_Elements(); ++ for( SizeT f=0; fNParam( 1); ++ ++ BaseGDL* p0 = e->GetParDefined( 0); ++ ++ DStringGDL* p0S = dynamic_cast( p0); ++ if( p0S == NULL) ++ e->Throw( "String expression required in this context: "+ ++ e->GetParString(0)); ++ ++ static int directoryIx = e->KeywordIx( "NOEXPAND_PATH"); ++ bool directory = e->KeywordSet( noexpand_pathIx); ++ ++ DLongGDL* getMode = NULL; ++ if( get_mode) ++ { ++ getMode = new DLongGDL( p0S->Dim()); // zero ++ e->SetKW( get_modeIx, getMode); ++ } ++ ++ DLongGDL* res = new DLongGDL( p0S->Dim()); // zero ++ ++// bool doStat = ++// zero_length || get_mode || directory || ++// regular || block_special || character_special || ++// named_pipe || socket || symlink; ++ ++ SizeT nEl = p0S->N_Elements(); ++ for( SizeT f=0; f 32000) ++ throw GDLException("Cannot get CWD."); ++ bufSize += PATH_MAX; ++ buf = new char[ bufSize]; ++ } ++ ++ DString cur( buf); ++ delete[] buf; ++ ++ return cur; ++ } ++ ++ void cd_pro( EnvT* e) ++ { ++ if( e->KeywordPresent( 0)) // CURRENT ++ { ++ DString cur = GetCWD(); ++ e->SetKW( 0, new DStringGDL( cur)); ++ } ++ ++ SizeT nParam=e->NParam(); ++ if( nParam == 0) return; ++ ++ DString dir; ++ e->AssureScalarPar( 0, dir); ++ ++ WordExp( dir); ++ ++// // expand tilde ++// if( dir[0] == '~') ++// { ++// char* homeDir = getenv( "HOME"); ++// if( homeDir != NULL) ++// { ++// dir = string( homeDir) + dir.substr(1); ++// } ++// } ++ ++ int success = chdir( dir.c_str()); ++ if( success != 0) ++ e->Throw( "Unable to change current directory to: "+dir+"."); ++ } ++ ++// void FileSearchWE( FileListT& fL, const DString& s) ++// { ++// wordexp_t p; ++// int wERes; ++// if( s == "") ++// wERes = wordexp( "*", &p, WRDE_NOCMD); ++// else ++// wERes = wordexp( s.c_str(), &p, WRDE_NOCMD); ++// if( wERes == 0) ++// for( SizeT f=0; fd_name); ++ if( entryStr != "." && entryStr != "..") ++ { ++ DString testFile = root + entryStr; ++ int actStat = lstat( testFile.c_str(), &statStruct); ++ if( S_ISDIR(statStruct.st_mode) == 0) ++ { // only test non-dirs ++ int match = fnmatch( pat.c_str(), entryStr.c_str(), 0); ++ if( match == 0) ++ { ++ closedir( dir); ++ return true; ++ } ++ } ++ } ++ } ++ ++ closedir( dir); ++ return false; ++ } ++ ++ void ExpandPathN( FileListT& result, ++ const DString& dirN, ++ const DString& pat, ++ bool all_dirs) ++ { ++ // expand "+" ++ ++ int fnFlags = 0; ++ ++ // fnFlags |= FNM_PERIOD; ++ // fnFlags |= FNM_NOESCAPE; ++ ++ DString root = dirN; ++ AppendIfNeeded( root, "/"); ++ ++ struct stat statStruct; ++ ++ FileListT recurDir; ++ ++ bool notAdded = true; ++ ++ DIR* dir = opendir( dirN.c_str()); ++ if( dir == NULL) return; ++ ++ if( all_dirs) ++ notAdded = false; ++ ++ for(;;) ++ { ++ struct dirent* entry = readdir( dir); ++ if( entry == NULL) break; ++ ++ DString entryStr( entry->d_name); ++ if( entryStr != "." && entryStr != "..") ++ { ++ DString testDir = root + entryStr; ++ int actStat = lstat( testDir.c_str(), &statStruct); ++ if( S_ISDIR(statStruct.st_mode) != 0) ++ { ++ recurDir.push_back( testDir); ++ } ++ else if( notAdded) ++ { ++ int match = fnmatch( pat.c_str(), entryStr.c_str(), 0); ++ if( match == 0) ++ notAdded = false; ++ } ++ } ++ } ++ ++ int c = closedir( dir); ++ if( c == -1) return; ++ ++ // recursive search ++ SizeT nRecur = recurDir.size(); ++ for( SizeT d=0; d" || ++ StrUpCase( dirN) == "") ++ { ++ // result.push_back( the default path here); ++ return; ++ } ++ ++ if( dirN[0] != '+') ++ { ++ result.push_back( dirN); ++ return; ++ } ++ ++ if( dirN.length() == 1) // dirN == "+" ++ return; ++ ++ // dirN == "+DIRNAME" ++ ++ // do first a glob because of '~' ++ int flags = GLOB_TILDE | GLOB_NOSORT; ++ glob_t p; ++ int gRes = glob( dirN.substr(1).c_str(), flags, NULL, &p); ++ if( gRes != 0 || p.gl_pathc == 0) ++ { ++ globfree( &p); ++ return; ++ } ++ ++ DString initDir = p.gl_pathv[ 0]; ++ globfree( &p); ++ ++ ExpandPathN( result, initDir, pat, all_dirs); ++ } ++ ++ BaseGDL* expand_path( EnvT* e) ++ { ++ e->NParam( 1); ++ ++ DString s; ++ e->AssureStringScalarPar( 0, s); ++ ++ FileListT sArr; ++ ++ static int all_dirsIx = e->KeywordIx( "ALL_DIRS"); ++ bool all_dirs = e->KeywordSet( all_dirsIx); ++ ++ static int arrayIx = e->KeywordIx( "ARRAY"); ++ bool array = e->KeywordSet( arrayIx); ++ ++ static int countIx = e->KeywordIx( "COUNT"); ++ ++ SizeT d; ++ long sPos=0; ++ do ++ { ++ d=s.find(':',sPos); ++ string act = s.substr(sPos,d-sPos); ++ ++ ExpandPath( sArr, act, "*.pro", all_dirs); ++ ++ sPos=d+1; ++ } ++ while( d != s.npos); ++ ++ SizeT nArr = sArr.size(); ++ ++ if( e->KeywordPresent( countIx)) ++ { ++ e->SetKW( countIx, new DLongGDL( nArr)); ++ } ++ ++ if( nArr == 0) ++ return new DStringGDL( ""); ++ ++ if( array) ++ { ++ DStringGDL* res = new DStringGDL( dimension( nArr), BaseGDL::NOZERO); ++ for( SizeT i=0; i= 0; --endR) ++ { ++ if( root[ endR] != '/') ++ break; ++ } ++ if( endR >= 0) ++ root = root.substr( 0, endR+1) + "/"; ++ else ++ root = "/"; ++ } ++ ++ DString prefix = root; ++// DString prefix = prefixIn; ++// if( prefix != "") ++// { ++// long endR; ++// for( endR = prefix.length()-1; endR >= 0; --endR) ++// { ++// if( prefix[ endR] != '/') ++// break; ++// } ++// if( endR >= 0) ++// prefix = prefix.substr( 0, endR+1) + "/"; ++// else ++// prefix = "/"; ++// } ++ ++ struct stat statStruct; ++ ++ FileListT recurDir; ++ ++ DIR* dir; ++ if( root != "") ++ dir = opendir( dirN.c_str()); ++ else ++ dir = opendir( "."); ++ if( dir == NULL) ++ if( accErr) ++ throw GDLException( "FILE_SEARCH: Error opening dir: "+dirN); ++ else ++ return; ++ ++ for(;;) ++ { ++ struct dirent* entry = readdir( dir); ++ if( entry == NULL) ++ break; ++ ++ DString entryStr( entry->d_name); ++ if( entryStr != "." && entryStr != "..") ++ { ++ if( root != "") // dirs for current ("") already included ++ { ++ DString testDir = root + entryStr; ++ int actStat = lstat( testDir.c_str(), &statStruct); ++ if( S_ISDIR(statStruct.st_mode) != 0) ++ recurDir.push_back( testDir); ++ } ++ ++ // dirs are also returned if they match ++ int match = fnmatch( pat.c_str(), entryStr.c_str(), fnFlags); ++ if( match == 0) ++ fL.push_back( prefix + entryStr); ++ } ++ } ++ ++ int c = closedir( dir); ++ if( c == -1) ++ if( accErr) ++ throw GDLException( "FILE_SEARCH: Error closing dir: "+dirN); ++ else ++ return; ++ ++ // recursive search ++ SizeT nRecur = recurDir.size(); ++ for( SizeT d=0; d 0)) // NOMATCH is no error ++ throw GDLException( "FILE_SEARCH: Read error: "+s); ++#endif ++ ++ if( gRes == 0) ++ for( SizeT f=0; fNParam(); // 0 -> "*" ++ ++ DStringGDL* pathSpec; ++ DString recurPattern; ++ ++ SizeT nPath = 0; ++ ++ if( nParam > 0) ++ { ++ BaseGDL* p0 = e->GetParDefined( 0); ++ pathSpec = dynamic_cast( p0); ++ if( pathSpec == NULL) ++ e->Throw( "String expression required in this context."); ++ ++ nPath = pathSpec->N_Elements(); ++ ++ if( nParam > 1) ++ e->AssureScalarPar< DStringGDL>( 1, recurPattern); ++ } ++ ++ // unix defaults ++ bool tilde = true; ++ bool environment = true; ++ bool fold_case = false; ++ ++ // keywords ++ // next three have default behaviour ++ static int tildeIx = e->KeywordIx( "EXPAND_TILDE"); ++ bool tildeKW = e->KeywordPresent( tildeIx); ++ if( tildeKW) tilde = e->KeywordSet( tildeIx); ++ ++ static int environmentIx = e->KeywordIx( "EXPAND_ENVIRONMENT"); ++ bool environmentKW = e->KeywordPresent( environmentIx); ++ if( environmentKW) ++ { ++ environment = e->KeywordSet( environmentIx); ++ if( environment) // only warn when expiclitely set ++ Warning( "FILE_SEARCH: EXPAND_ENVIRONMENT not supported."); ++ } ++ ++ static int fold_caseIx = e->KeywordIx( "FOLD_CASE"); ++ bool fold_caseKW = e->KeywordPresent( fold_caseIx); ++ if( fold_caseKW) fold_case = e->KeywordSet( fold_caseIx); ++ ++ // ++ static int countIx = e->KeywordIx( "COUNT"); ++ bool countKW = e->KeywordPresent( countIx); ++ ++ static int accerrIx = e->KeywordIx( "ISSUE_ACCESS_ERROR"); ++ bool accErr = e->KeywordSet( accerrIx); ++ ++ static int markIx = e->KeywordIx( "MARK_DIRECTORY"); ++ bool mark = e->KeywordSet( markIx); ++ ++ static int nosortIx = e->KeywordIx( "NOSORT"); ++ bool noSort = e->KeywordSet( nosortIx); ++ ++ static int quoteIx = e->KeywordIx( "QUOTE"); ++ bool quote = e->KeywordSet( quoteIx); ++ ++ static int match_dotIx = e->KeywordIx( "MATCH_INITIAL_DOT"); ++ bool match_dot = e->KeywordSet( match_dotIx); ++ ++ static int match_all_dotIx = e->KeywordIx( "MATCH_ALL_INITIAL_DOT"); ++ bool match_all_dot = e->KeywordSet( match_all_dotIx); ++ ++ // ... ++ if( fold_case) ++ Warning( "FILE_SEARCH: FOLD_CASE keyword ignored (not supported)."); ++ if( match_all_dot) ++ Warning( "FILE_SEARCH: MATCH_ALL_INITIAL_DOT keyword ignored (not supported)."); ++ ++ bool onlyDir = nParam > 1; ++ ++ FileListT fileList; ++ ++ if( nPath == 0) ++ FileSearch( fileList, "", ++ environment, tilde, ++ accErr, mark, noSort, quote, onlyDir, match_dot); ++ else ++ FileSearch( fileList, (*pathSpec)[0], ++ environment, tilde, ++ accErr, mark, noSort, quote, onlyDir, match_dot); ++ ++ for( SizeT f=1; f < nPath; ++f) ++ FileSearch( fileList, (*pathSpec)[f], ++ environment, tilde, ++ accErr, mark, noSort, quote, onlyDir, match_dot); ++ ++ DLong count = fileList.size(); ++ ++ if( onlyDir) ++ { // recursive search for recurPattern ++ FileListT fileOut; ++ ++ for( SizeT f=0; fSetKW( countIx, new DLongGDL( pCount)); ++ ++ if( pCount == 0) ++ return new DStringGDL(""); ++ ++ if( !noSort) ++ sort( fileOut.begin(), fileOut.end()); ++ ++ // fileOut -> res ++ DStringGDL* res = new DStringGDL( dimension( pCount), BaseGDL::NOZERO); ++ for( SizeT r=0; rSetKW( countIx, new DLongGDL( count)); ++ ++ if( count == 0) ++ return new DStringGDL(""); ++ ++ if( !noSort) ++ sort( fileList.begin(), fileList.end()); ++ ++ // fileList -> res ++ DStringGDL* res = new DStringGDL( dimension( count), BaseGDL::NOZERO); ++ for( SizeT r=0; r all file) +@@ -206,12 +218,14 @@ + | end:ENDCASE { #end->setType( IDENTIFIER);} + | ende:ENDELSE { #ende->setType( IDENTIFIER);} + | endf:ENDFOR { #endf->setType( IDENTIFIER);} ++ | endfe:ENDFOREACH { #endf->setType( IDENTIFIER);} + | endi:ENDIF { #endi->setType( IDENTIFIER);} + | endr:ENDREP { #endr->setType( IDENTIFIER);} + | ends:ENDSWITCH { #ends->setType( IDENTIFIER);} + | endw:ENDWHILE { #endw->setType( IDENTIFIER);} + | eq:EQ_OP { #eq->setType( IDENTIFIER);} + | f:FOR { #f->setType( IDENTIFIER);} ++ | fe:FOREACH { #f->setType( IDENTIFIER);} + | fo:FORWARD { #fo->setType( IDENTIFIER);} + | fu:FUNCTION { #fu->setType( IDENTIFIER);} + | g:GE_OP { #g->setType( IDENTIFIER);} +@@ -515,10 +529,15 @@ + | ENDCASE + | ENDSWITCH + | ENDFOR ++ | ENDFOREACH + | ENDWHILE + | ENDREP + ; + ++endforeach_mark! ++ : ENDFOREACH | ENDFOR | END ++ ; ++ + endfor_mark! + : ENDFOR | END + ; +@@ -586,8 +605,87 @@ + bool parent=false; + } + : (assign_expr)=> assign_expr (DEC^ | INC^)? +- | (deref_expr +- // assignment ++// | (deref_expr_dot)=> ++// (deref_expr ++// // assignment ++// (EQUAL! expr ++// { #statement = #([ASSIGN,":="], #statement);} ++// | ( AND_OP_EQ^ ++// | ASTERIX_EQ^ ++// | EQ_OP_EQ^ ++// | GE_OP_EQ^ ++// | GTMARK_EQ^ ++// | GT_OP_EQ^ ++// | LE_OP_EQ^ ++// | LTMARK_EQ^ ++// | LT_OP_EQ^ ++// | MATRIX_OP1_EQ^ ++// | MATRIX_OP2_EQ^ ++// | MINUS_EQ^ ++// | MOD_OP_EQ^ ++// | NE_OP_EQ^ ++// | OR_OP_EQ^ ++// | PLUS_EQ^ ++// | POW_EQ^ ++// | SLASH_EQ^ ++// | XOR_OP_EQ^) expr ++// | (DEC^ | INC^) // no POSTDEC/POSTINC for statements ++// | MEMBER! // member procedure call ++// (baseclass_method { parent=true; })? ++// formal_procedure_call ++// { ++// if( parent) ++// #statement = #([MPCALL_PARENT, "mpcall::"], ++// #statement); ++// else ++// #statement = #([MPCALL, "mpcall"], #statement); ++// } ++// | // empty -> member procedure call with DOT parsed by tag_access ++// ) ++// ) ++ ++ ++ | (deref_dot_expr_keeplast IDENTIFIER COMMA)=> ++ d1:deref_dot_expr_keeplast formal_procedure_call ++ { ++ #statement = #([MPCALL, "mpcall"], #statement); ++ #statement->SetLine( #d1->getLine()); ++ ++ } ++ | (deref_dot_expr_keeplast baseclass_method)=> ++ d2:deref_dot_expr_keeplast baseclass_method formal_procedure_call ++ { ++ #statement = #([MPCALL_PARENT, "mpcall::"], ++ #statement); ++ #statement->SetLine( #d2->getLine()); ++ } ++ | ( deref_expr ++ ( EQUAL ++ | AND_OP_EQ^ ++ | ASTERIX_EQ^ ++ | EQ_OP_EQ^ ++ | GE_OP_EQ^ ++ | GTMARK_EQ^ ++ | GT_OP_EQ^ ++ | LE_OP_EQ^ ++ | LTMARK_EQ^ ++ | LT_OP_EQ^ ++ | MATRIX_OP1_EQ^ ++ | MATRIX_OP2_EQ^ ++ | MINUS_EQ^ ++ | MOD_OP_EQ^ ++ | NE_OP_EQ^ ++ | OR_OP_EQ^ ++ | PLUS_EQ^ ++ | POW_EQ^ ++ | SLASH_EQ^ ++ | XOR_OP_EQ^ ++ | DEC^ ++ | INC^ // no POSTDEC/POSTINC for statements ++ | MEMBER! // member procedure call ++ ) ++ )=> ++ deref_expr + (EQUAL! expr + { #statement = #([ASSIGN,":="], #statement);} + | ( AND_OP_EQ^ +@@ -610,7 +708,7 @@ + | SLASH_EQ^ + | XOR_OP_EQ^) expr + | (DEC^ | INC^) // no POSTDEC/POSTINC for statements +- | MEMBER! // member procedure call ++ | MEMBER! // member procedure call + (baseclass_method { parent=true; })? + formal_procedure_call + { +@@ -621,12 +719,18 @@ + #statement = #([MPCALL, "mpcall"], #statement); + } + ) +- ) ++ | // (deref_dot_expr_keeplast IDENTIFIER)=> ++ d3:deref_dot_expr_keeplast formal_procedure_call ++ { ++ #statement = #([MPCALL, "mpcall"], #statement); ++ #statement->SetLine( #d3->getLine()); ++ } + | (DEC^ | INC^) expr + | procedure_call // next two handled by procedure_call also + // | BREAK // only valid in loops and switch_statement + // | CONTINUE // only valid in loops + | for_statement ++ | foreach_statement + | repeat_statement + | while_statement + | jump_statement +@@ -674,7 +778,6 @@ + for_block + ; + +- + for_block + : st:statement + { #for_block = #([BLOCK, "block"], #st);} +@@ -682,6 +785,18 @@ + { #for_block = #([BLOCK, "block"], #stl);} + ; + ++foreach_statement ++ : FOREACH^ IDENTIFIER OF! expr DO! ++ foreach_block ++ ; ++ ++foreach_block ++ : st:statement ++ { #foreach_block = #([BLOCK, "block"], #st);} ++ | BEGIN! stl:statement_list endforeach_mark ++ { #foreach_block = #([BLOCK, "block"], #stl);} ++ ; ++ + jump_statement + : GOTO^ COMMA! IDENTIFIER + // now handled as a procedure_call because RETURN is no reserved word +@@ -1185,15 +1300,100 @@ + ) + ; + ++tag_access_keeplast returns [int nDot] ++// { ++// nDot=0; ++// SizeT dotCount = 0 ; ++// int last; ++// } ++// : ++// (options {greedy=true;}: DOT! { ++nDot;} tag_array_expr_nth)+ ++// ; ++{ ++ int t; ++ bool parent = false; ++ nDot=1; ++} ++ : DOT! ++ ( ++ (tag_array_expr_nth tag_access_keeplast)=> ++ (tag_array_expr_nth t=tag_access_keeplast { nDot += t;}) ++ | //(tag_array_expr_nth DOT tag_array_expr_nth)=> ++ // (tag_array_expr_nth) ++ ) ++ ; ++ ++// // can be an array expr ++// deref_expr_dot // only used in predicate ++// : array_expr_1st t=tag_access ++// | ASTERIX! deref_expr_dot ++// { #deref_expr = ++// #([DEREF,"deref"], #deref_expr);} ++// ; ++ ++deref_dot_expr_keeplast ++{ ++ RefDNode dot; ++ int nDot; ++} ++ : a1:array_expr_1st ++ (// (tag_access_keeplast)=> ++ nDot=tag_access_keeplast ++ { ++ if( --nDot > 0) ++ { ++ dot=#[DOT,"."]; ++ dot->SetNDot( nDot); ++ dot->SetLine( #a1->getLine()); ++ #deref_dot_expr_keeplast = #(dot, #deref_dot_expr_keeplast); ++ } ++ } ++// | { #deref_dot_expr_keeplast = #a1;} ++ ) ++ | ASTERIX! deref_dot_expr_keeplast ++ { #deref_dot_expr_keeplast = ++ #([DEREF,"deref"], #deref_dot_expr_keeplast);} ++ ; ++// { ++// RefDNode dot; ++// SizeT nDot = 1; ++// } ++// : ++// (array_expr_1st tag_access_keeplast)=> ++// a1:array_expr_1st ++// ( /*(tag_access_keeplast)=>*/ nDot=tag_access_keeplast ++// { ++// dot=#[DOT,"."]; ++// dot->SetNDot( nDot); ++// dot->SetLine( #a1->getLine()); ++ ++// #deref_dot_expr_keeplast = #(dot, #deref_dot_expr_keeplast); ++// } ++// ) ++// | ++// (array_expr_1st DOT tag_array_expr_nth)=> ++// array_expr_1st ++// // {/*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/} ++// // { ++// // dot=#[DOT,"."]; ++// // dot->SetNDot( nDot); ++// // dot->SetLine( #a1->getLine()); ++ ++// // #deref_dot_expr_keeplast = #(dot, #deref_dot_expr_keeplast); ++// // } ++// | ASTERIX! deref_dot_expr_keeplast ++// { #deref_dot_expr_keeplast = ++// #([DEREF,"deref"], #deref_dot_expr_keeplast);} ++// ; ++ + tag_access returns [SizeT nDot] + { + nDot=0; + } +- : (DOT! { nDot++;} tag_array_expr_nth)+ ++ : (options {greedy=true;}: DOT! { ++nDot;} tag_array_expr_nth)+ + ; + +-// can be an array expr +-deref_expr //! ++deref_dot_expr + { + RefDNode dot; + SizeT nDot; +@@ -1207,6 +1407,29 @@ + dot->SetNDot( nDot); + dot->SetLine( #a1->getLine()); + ++ #deref_dot_expr = #(dot, #deref_dot_expr); ++ } ++// | { #deref_expr = #a1;} ++ ) ++ | ASTERIX! deref_dot_expr ++ { #deref_dot_expr = ++ #([DEREF,"deref"], #deref_dot_expr);} ++ ; ++ ++deref_expr ++{ ++ RefDNode dot; ++ SizeT nDot; ++} ++// : array_expr_1st (DOT array_expr_nth)* ++ : a1:array_expr_1st ++ ((tag_access)=> nDot=tag_access ++ { ++ ++ dot=#[DOT,"."]; ++ dot->SetNDot( nDot); ++ dot->SetLine( #a1->getLine()); ++ + #deref_expr = #(dot, #deref_expr); + } + | { #deref_expr = #a1;} +@@ -1216,36 +1439,42 @@ + #([DEREF,"deref"], #deref_expr);} + ; + ++// array or member function (only to be used in primary_expr) ++// array_expr_mfcall! ++// : v:var al:arrayindex_list ++// ; ++ + // array or function (only to be used in primary_expr) +-array_expr_fn!// +-{ +- RefDNode dot, t; +- SizeT nDot; +-} +- : v:var al:arrayindex_list +- ( nDot=tag_access // must be a variable with index list +- { // -> do so +- t= RefDNode(returnAST); +- +- dot=#[DOT,"."]; +- dot->SetNDot( nDot); +- dot->SetLine( #al->getLine()); ++//array_expr_fn ++// { ++// RefDNode dot;//, t; ++// SizeT nDot; ++// } ++// : v:var al:arrayindex_list ++// ( (tag_access)=> nDot=t:tag_access // must be a variable with index list ++// { // -> do so ++// //t= RefDNode(returnAST); ++ ++// dot=#[DOT,"."]; ++// dot->SetNDot( nDot); ++// dot->SetLine( #al->getLine()); + +- #array_expr_fn = +- #(dot, ([ARRAYEXPR,"arrayexpr"], #v, #al), #t);} ++// #array_expr_fn = ++// #(dot, ([ARRAYEXPR,"arrayexpr"], #v, #al), #t);} + +- | // still ambiguous +- { #array_expr_fn = +- #([ARRAYEXPR_FN,"arrayexpr_fn"], #v, #al);} ++// | // still ambiguous + // #([ARRAYEXPR_FN,"arrayexpr_fn"], #array_expr_fn);} +- ) +- ; ++// ) ++// ; + + + member_function_call returns [bool parent] + : { parent = false;} MEMBER! + (IDENTIFIER METHOD! { parent = true;} )? formal_function_call + ; ++member_function_call_dot ++ : DOT! (IDENTIFIER METHOD!) formal_function_call ++ ; + + assign_expr + : LBRACE! deref_expr EQUAL! expr RBRACE! // assignment +@@ -1257,30 +1486,89 @@ + { + bool parent; + } +- : // ambiguity (arrayexpr or fcall) +- (IDENTIFIER LBRACE expr (COMMA expr)* RBRACE)=> ++ ++ : ++ // with METHOD ++ (deref_dot_expr_keeplast baseclass_method)=> ++ d1:deref_dot_expr_keeplast baseclass_method formal_function_call ++ { ++ #primary_expr = #([MFCALL_PARENT, "mfcall::"], #primary_expr); ++ } ++ | ++ // ambiguity (arrayexpr or mfcall) ++ (deref_dot_expr_keeplast ++ (IDENTIFIER LBRACE expr (COMMA expr)* RBRACE))=> ++ d2:deref_dot_expr_keeplast ++ // here it is impossible to decide about function call ++ // as we do not know the object type/struct tag ++ IDENTIFIER arrayindex_list ++ { #primary_expr = #([ARRAYEXPR_MFCALL,"arrayexpr_mfcall"], #primary_expr);} ++ | ++ // not the above -> unambigous mfcall (or unambigous array expr handled below) ++ (deref_dot_expr_keeplast formal_function_call)=> ++ d3:deref_dot_expr_keeplast ++ // here it is impossible to decide about function call ++ // as we do not know the object type/struct tag ++ formal_function_call ++ { #primary_expr = #([MFCALL, "mfcall"], #primary_expr);} ++ | // a member function call starts with a deref_expr ++ (deref_dot_expr)=> ++ // same parsing as (deref_expr)=> see below ++ deref_expr ++ ( parent=member_function_call ++ { ++ if( parent) ++ { ++ #primary_expr = #([MFCALL_PARENT, "mfcall::"], #primary_expr); ++ } ++ else ++ { ++ #primary_expr = #([MFCALL, "mfcall"], #primary_expr); ++ } ++ } ++ | // empty -> array expression ++ ) ++ | ++ // ambiguity (arrayexpr or fcall) ++ (IDENTIFIER LBRACE expr (COMMA expr)* RBRACE)=> + ( + // already known function + // (could be reordered, but this is conform to original) + { IsFun(LT(1))}? formal_function_call +- { #primary_expr = #([FCALL, "fcall"], #primary_expr);} ++ { ++// if( StrUpCase(#i->getText) == "N_ELEMENTS") ++// #primary_expr = #([FCALL_LIB_N_ELEMENTS, "fcall_n_elements"], #primary_expr); ++// else ++ #primary_expr = #([FCALL, "fcall"], #primary_expr); ++ } + | +- // no function call (fcall cannot be followed by MEMBER or DOT) +- array_expr_fn +- ( parent=member_function_call +- { +- if( parent) +- { +- #primary_expr = +- #([MFCALL_PARENT, "mfcall::"], #primary_expr); +- } +- else +- { +- #primary_expr = +- #([MFCALL, "mfcall"], #primary_expr); +- } +- } +- )? ++ // still ambiguity (arrayexpr or fcall) ++ var arrayindex_list // array_expr_fn ++ { #primary_expr = #([ARRAYEXPR_FN,"arrayexpr_fn"], #primary_expr);} ++// ( parent=member_function_call ++// { ++// if( parent) ++// { ++// #primary_expr = ++// #([MFCALL_PARENT, "mfcall::"], #primary_expr); ++// } ++// else ++// { ++// #primary_expr = ++// #([MFCALL, "mfcall"], #primary_expr); ++// } ++// } ++// | (DOT IDENTIFIER METHOD)=> member_function_call_dot ++// { ++// #primary_expr = ++// #([MFCALL_PARENT, "mfcall::"], #primary_expr); ++// } ++// | DOT! formal_function_call ++// { ++// #primary_expr = #([MFCALL, "mfcall"], #primary_expr); ++// } ++// | ++// ) + // commented out to leave checking to tree parser (if MEMBER and DOT are + // present it could be decided already here if it can be a FCALL) + // | +@@ -1292,9 +1580,9 @@ + | // not the above => keyword parameter (or no args) => function call + (formal_function_call)=> formal_function_call + { #primary_expr = #([FCALL, "fcall"], #primary_expr);} +- + | // a member function call starts with a deref_expr +- (deref_expr)=> ++ // deref_dot_expr already failed ++ (deref_expr)=> + deref_expr + ( parent=member_function_call + { +@@ -1307,7 +1595,17 @@ + #primary_expr = #([MFCALL, "mfcall"], #primary_expr); + } + } +- )? ++// | (DOT IDENTIFIER METHOD)=> member_function_call_dot ++// { ++// #primary_expr = ++// #([MFCALL_PARENT, "mfcall::"], #primary_expr); ++// } ++// | DOT! formal_function_call ++// { ++// #primary_expr = #([MFCALL, "mfcall"], #primary_expr); ++// } ++ | // empty -> array expression ++ ) + |! sl:STRING_LITERAL // also a CONSTANT + { #primary_expr=#[CONSTANT,sl->getText()]; + #primary_expr->Text2String(); +@@ -1477,12 +1775,14 @@ + ENDCASE="endcase"; + ENDELSE="endelse"; + ENDFOR="endfor"; ++ ENDFOREACH="endforeach"; + ENDIF="endif"; + ENDREP="endrep"; + ENDSWITCH="endswitch"; + ENDWHILE="endwhile"; + EQ_OP="eq"; + FOR="for"; ++ FOREACH="foreach"; + FORWARD="forward_function"; + FUNCTION="function"; + GE_OP="ge"; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlc.i.g cvs/gdl/src/gdlc.i.g +--- gdl-0.9rc4/src/gdlc.i.g 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlc.i.g 2010-05-21 10:23:57.195908800 -0600 +@@ -1,3 +1,12 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ + /* ************************************************************************* + gdlc.i.g + the GDL interpreter +@@ -35,29 +44,6 @@ + #define RefAST( xxx) ConvertAST( xxx) /* antlr::RefAST( Ref type) */ + #define match( a, b) /* remove from source */ + +-// optimizations +-// #define constant constantNotOptimized +-// #define interactive interactiveNotOptimized +-// #define statement_list statement_listNotOptimized +-// #define execute executeNotOptimized +-// #define call_fun call_funNotOptimized +-// #define call_lfun call_lfunNotOptimized +-// #define call_pro call_proNotOptimized +-// #define block blockNotOptimized +-// #define expr exprNotOptimized +-// #define l_simple_var l_simple_varNotOptimized +-// #define sys_var sys_varNotOptimized +-// #define sys_var_nocopy sys_var_nocopyNotOptimized +-// #define dot_expr dot_exprNotOptimized +-// #define simple_var simple_varNotOptimized +-// #define ref_parameter ref_parameterNotOptimized +-// #define unnamed_struct_def unnamed_struct_defNotOptimized +-// #define lib_function_call_retnew lib_function_call_retnewNotOptimized +-// #define lib_function_call lib_function_callNotOptimized +-// #define constant_nocopy constant_nocopyNotOptimized +-// #define struct_def struct_defNotOptimized +- +- + using namespace std; + } + +@@ -88,6 +74,7 @@ + // print out AST tree + //#define GDL_DEBUG + //#undef GDL_DEBUG ++//#define GDL_DEBUG_HEAP + + } + +@@ -126,23 +113,35 @@ + friend class NSTRUCNode; + friend class NSTRUC_REFNode; + friend class ASSIGNNode; ++ friend class ASSIGN_ARRAYEXPR_MFCALLNode; + friend class ASSIGN_REPLACENode; +-friend class PCALL_LIBNode;//: public CommandNode +-friend class MPCALLNode;//: public CommandNode +-friend class MPCALL_PARENTNode;//: public CommandNode +-friend class PCALLNode;//: public CommandNode +- +- friend class KEYDEFNode; +- friend class KEYDEF_REFNode; +- friend class KEYDEF_REF_CHECKNode; +- friend class KEYDEF_REF_EXPRNode; +- friend class REFNode; +- friend class REF_CHECKNode; +- friend class REF_EXPRNode; +- friend class ParameterNode; ++ friend class PCALL_LIBNode;//: public CommandNode ++ friend class MPCALLNode;//: public CommandNode ++ friend class MPCALL_PARENTNode;//: public CommandNode ++ friend class PCALLNode;//: public CommandNode ++ friend class RETFNode; ++ friend class RETPNode; ++ friend class FORNode; ++ friend class FOR_LOOPNode; ++ friend class FOREACHNode; ++ friend class FOREACH_LOOPNode; ++ friend class FOR_STEPNode; ++ friend class FOR_STEP_LOOPNode; ++ ++ friend class KEYDEFNode; ++ friend class KEYDEF_REFNode; ++ friend class KEYDEF_REF_CHECKNode; ++ friend class KEYDEF_REF_EXPRNode; ++ friend class REFNode; ++ friend class REF_CHECKNode; ++ friend class REF_EXPRNode; ++ friend class ParameterNode; + + public: ++ + // RetCode returnCode; ++ ProgNodeP GetNULLProgNodeP() const { return NULLProgNodeP;} ++ + + void SetRetTree( ProgNodeP rT) + { +@@ -153,13 +152,13 @@ + // this->returnCode = rC; + // } + +- enum RetCode { +- RC_OK=0, +- RC_BREAK, +- RC_CONTINUE, +- RC_RETURN, +- RC_ABORT, // checked as retCode >= RC_RETURN +- }; ++// enum RetCode { ++// RC_OK=0, ++// RC_BREAK, ++// RC_CONTINUE, ++// RC_RETURN, ++// RC_ABORT, // checked as retCode >= RC_RETURN ++// }; + + // code in: dinterpreter.cpp + static bool SearchCompilePro(const std::string& pro); +@@ -170,9 +169,12 @@ + DStructGDL* ObjectStruct( BaseGDL* self, ProgNodeP mp); + DStructGDL* ObjectStructCheckAccess( BaseGDL* self, ProgNodeP mp); + +-private: + // code in: dinterpreter.cpp + static void SetFunIx( ProgNodeP f); // triggers read/compile ++ ++ ++private: ++ + static void SetProIx( ProgNodeP f); // triggers read/compile + static void AdjustTypes( BaseGDL*&, BaseGDL*&); + +@@ -208,14 +210,24 @@ + + // code in: dinterpreter.cpp + // static bool CompleteFileName(std::string& fn); -> str.cpp +- static bool CompileFile(const std::string& f, const std::string& untilPro=""); ++ + BaseGDL* returnValue; // holding the return value for functions + BaseGDL** returnValueL; // holding the return value for l_functions + + bool interruptEnable; + +- typedef std::map HeapT; +- typedef std::map ObjHeapT; ++public: ++ static bool CompileFile(const std::string& f, const std::string& untilPro=""); ++ ++ typedef RefHeap RefBaseGDL; ++ typedef RefHeap RefDStructGDL; ++ ++ typedef std::map HeapT; ++ typedef std::map ObjHeapT; ++ ++protected: ++// typedef std::map HeapT; ++// typedef std::map ObjHeapT; + + // the following must be all static because several interpreter might be active + // the heap for all dynamic variables +@@ -244,7 +256,7 @@ + SizeT tmpIx=objHeapIx; + for( SizeT i=0; i( objHeapIx++, var)); ++ std::pair( objHeapIx++, (DStructGDL*)var)); + return tmpIx; + } + SizeT NewHeap( SizeT n=1, BaseGDL* var=NULL) +@@ -252,7 +264,7 @@ + SizeT tmpIx=heapIx; + for( SizeT i=0; i( heapIx++, var)); ++ std::pair( heapIx++, var)); + return tmpIx; + } + static void FreeObjHeap( DObj id) +@@ -262,11 +274,16 @@ + ObjHeapT::iterator it=objHeap.find( id); + if ( it != objHeap.end()) + { +- delete (*it).second; ++ delete (*it).second.get(); + objHeap.erase( id); + } + } + } ++ static void FreeObjHeapDirect( DObj id, ObjHeapT::iterator it) ++ { ++ delete (*it).second.get(); ++ objHeap.erase( id); ++ } + static void FreeHeap( DPtr id) + { + if( id != 0) +@@ -274,11 +291,16 @@ + HeapT::iterator it=heap.find( id); + if( it != heap.end()) + { +- delete (*it).second; ++ delete (*it).second.get(); + heap.erase( id); + } + } + } ++ static void FreeHeapDirect( DPtr id, HeapT::iterator it) ++ { ++ delete (*it).second.get(); ++ heap.erase( id); ++ } + + static void FreeHeap( DPtrGDL* p) + { +@@ -290,19 +312,176 @@ + } + } + ++ static void DecRef( DPtr id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++ std::cout << "-- " << std::endl; ++#endif ++ HeapT::iterator it=heap.find( id); ++ if( it != heap.end()) ++ { ++ if( (*it).second.Dec()) ++ { ++ std::cout << "Out of scope (garbage collected): " ++ << " at: " << callStack.back()->GetProName() ++ << " line: " << callStack.back()->GetLineNumber() ++ << std::endl; ++ FreeHeapDirect( id, it); ++ } ++#ifdef GDL_DEBUG_HEAP ++ else ++std::cout << " = " << (*it).second.Count() << std::endl; ++#endif ++ } ++ } ++ } ++ static void DecRef( DPtrGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DPtr id= (*p)[ix]; ++ DecRef( id); ++ } ++ } ++ static void DecRefObj( DObj id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << "-- " << std::endl; ++#endif ++ ObjHeapT::iterator it=objHeap.find( id); ++ if( it != objHeap.end()) ++ { ++ if( (*it).second.Dec()) ++ { ++ std::cout << "Out of scope (garbage collected): " ++ << " at: " << callStack.back()->GetProName() ++ << " line: " << callStack.back()->GetLineNumber() ++ << std::endl; ++ callStack.back()->ObjCleanup( id); ++// FreeObjHeapDirect( id, it); ++ } ++#ifdef GDL_DEBUG_HEAP ++ else ++std::cout << " = " << (*it).second.Count() << std::endl; ++#endif ++ ++ } ++ } ++ } ++ static void DecRefObj( DObjGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DObj id= (*p)[ix]; ++ DecRefObj( id); ++ } ++ } ++ static void IncRef( DPtr id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << "++ " << std::endl; ++#endif ++ HeapT::iterator it=heap.find( id); ++ if( it != heap.end()) ++ { ++ (*it).second.Inc(); ++#ifdef GDL_DEBUG_HEAP ++std::cout << " = " << (*it).second.Count() << std::endl; ++#endif ++ } ++ } ++ } ++ static void AddRef( DPtr id, SizeT add) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << add << " + " << std::endl; ++#endif ++ HeapT::iterator it=heap.find( id); ++ if( it != heap.end()) ++ { ++ (*it).second.Add(add); ++ } ++ } ++ } ++ static void IncRef( DPtrGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DPtr id= (*p)[ix]; ++ IncRef( id); ++ } ++ } ++ static void IncRefObj( DObj id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << "++ " << std::endl; ++#endif ++ ObjHeapT::iterator it=objHeap.find( id); ++ if( it != objHeap.end()) ++ { ++ (*it).second.Inc(); ++ } ++ } ++ } ++ static void AddRefObj( DObj id, SizeT add) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << add << " + " << std::endl; ++#endif ++ ObjHeapT::iterator it=objHeap.find( id); ++ if( it != objHeap.end()) ++ { ++ (*it).second.Add(add); ++ } ++ } ++ } ++ static void IncRefObj( DObjGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DObj id= (*p)[ix]; ++ IncRefObj( id); ++ } ++ } ++ + class HeapException {}; + + static BaseGDL*& GetHeap( DPtr ID) + { + HeapT::iterator it=heap.find( ID); + if( it == heap.end()) throw HeapException(); +- return it->second; ++ return it->second.get(); + } + static DStructGDL*& GetObjHeap( DObj ID) + { + ObjHeapT::iterator it=objHeap.find( ID); + if( it == objHeap.end()) throw HeapException(); +- return it->second; ++ return it->second.get(); ++ } ++ static DStructGDL*& GetObjHeap( DObj ID, ObjHeapT::iterator& it) ++ { ++// ObjHeapT::iterator it=objHeap.find( ID); ++ it=objHeap.find( ID); ++ if( it == objHeap.end()) throw HeapException(); ++ return it->second.get(); + } + + static bool PtrValid( DPtr ID) +@@ -316,6 +495,15 @@ + return heap.size(); + } + ++ static DPtr FindInHeap( BaseGDL** p) ++ { ++ for( HeapT::iterator it=heap.begin(); it != heap.end(); ++it) ++ { ++ if( &it->second.get() == p) ++ return it->first; ++ } ++ return 0; ++ } + static DPtrGDL* GetAllHeap() + { + SizeT nEl = heap.size(); +@@ -324,6 +512,21 @@ + SizeT i=0; + for( HeapT::iterator it=heap.begin(); it != heap.end(); ++it) + { ++ IncRef( it->first); ++ (*ret)[ i++] = it->first; ++ } ++ return ret; ++ } ++ ++ // no ref counting here ++ static std::vector* GetAllHeapSTL() ++ { ++ SizeT nEl = heap.size(); ++ if( nEl == 0) return new std::vector(); ++ std::vector* ret = new std::vector( nEl); ++ SizeT i=0; ++ for( HeapT::iterator it=heap.begin(); it != heap.end(); ++it) ++ { + (*ret)[ i++] = it->first; + } + return ret; +@@ -340,6 +543,15 @@ + return objHeap.size(); + } + ++// static DObj FindInObjHeap( BaseGDL** p) ++// { ++// for( ObjHeapT::iterator it=objHeap.begin(); it != objHeap.end(); ++it) ++// { ++// if( &it->second == reinterpret_cast(p)) ++// return it->first; ++// } ++// return 0; ++// } + static DObjGDL* GetAllObjHeap() + { + SizeT nEl = objHeap.size(); +@@ -348,6 +560,21 @@ + SizeT i=0; + for( ObjHeapT::iterator it=objHeap.begin(); it != objHeap.end(); ++it) + { ++ IncRefObj( it->first); ++ (*ret)[ i++] = it->first; ++ } ++ return ret; ++ } ++ ++ // no ref counting here ++ static std::vector* GetAllObjHeapSTL() ++ { ++ SizeT nEl = objHeap.size(); ++ if( nEl == 0) return new std::vector(); ++ std::vector* ret = new std::vector( nEl); ++ SizeT i=0; ++ for( ObjHeapT::iterator it=objHeap.begin(); it != objHeap.end(); ++it) ++ { + (*ret)[ i++] = it->first; + } + return ret; +@@ -361,7 +588,12 @@ + + static const std::string Name( BaseGDL** p) // const + { +- return "<(Find name not implemented yet)>"; ++ assert( *p == NULL); ++ DPtr h = FindInHeap( p); ++ if( h != 0) return std::string(""; ++// DObj o = FindInObjHeap( p); ++// if( o != 0) return std::string(""; ++ return "<(ptr to undefined expression not found on the heap)>"; + } + + // compiler (lexer, parser, treeparser) def in dinterpreter.cpp +@@ -506,14 +738,14 @@ + //*********************************************************************** + + // intercative usage +-interactive returns[ GDLInterpreter::RetCode retCode] ++interactive returns[ RetCode retCode] + // { + // return interactive_statement_list(_t); + // } + // : retCode=statement_list + // ; + // // used from interactive nulls line number +-// interactive_statement_list returns[ GDLInterpreter::RetCode retCode] ++// interactive_statement_list returns[ RetCode retCode] + { + for (; _t != NULL;) { + +@@ -534,9 +766,9 @@ + ; + + // execute statement +-execute returns[ GDLInterpreter::RetCode retCode] ++execute returns[ RetCode retCode] + { +-// GDLInterpreter::RetCode retCode; ++// RetCode retCode; + ValueGuard guard( interruptEnable); + interruptEnable = false; + +@@ -552,12 +784,11 @@ + + res = NULL; + returnValue = NULL; +- GDLInterpreter::RetCode retCode; ++ RetCode retCode; + + for (; _t != NULL;) { + + retCode=statement(_t); +- _t = _retTree; + + // if( retCode == RC_RETURN) + if( retCode >= RC_RETURN) +@@ -566,8 +797,9 @@ + returnValue=NULL; + + break; +- } +- ++ } ++ ++ _t = _retTree; + } + + // default return value if none was set +@@ -598,7 +830,7 @@ + { + res = NULL; + returnValueL = NULL; +- GDLInterpreter::RetCode retCode; ++ RetCode retCode; + + ProgNodeP in = _t; + +@@ -648,7 +880,7 @@ + // used to call procedures + call_pro + { +- GDLInterpreter::RetCode retCode; ++ RetCode retCode; + + for (; _t != NULL;) { + retCode=statement(_t); +@@ -670,7 +902,7 @@ + + + // used on many occasions +-statement_list returns[ GDLInterpreter::RetCode retCode] ++statement_list returns[ RetCode retCode] + { + for (; _t != NULL;) { + +@@ -689,74 +921,144 @@ + )+ + ; + +-statement returns[ GDLInterpreter::RetCode retCode] ++statement returns[ RetCode retCode] + { +- retCode = RC_OK; +- ProgNodeP actPos = _t; ++// ProgNodeP& actPos = statement_AST_in; + assert( _t != NULL); +-// if( callStack.back()->GetLineNumber() == 0) +- if( _t->getLine() != 0) +- callStack.back()->SetLineNumber( _t->getLine()); ++ ProgNodeP last; ++ _retTree = _t; ++// if( callStack.back()->GetLineNumber() == 0) ++// if( _t->getLine() != 0) ++// callStack.back()->SetLineNumber( _t->getLine()); ++} ++ : ++ { ++ do { ++// if( _t->getLine() != 0) ++// callStack.back()->SetLineNumber( _t->getLine()); ++ ++ last = _retTree; ++ ++ retCode = last->Run(); // Run() sets _retTree ++ ++ } ++ while( ++ _retTree != NULL && ++ retCode == RC_OK && ++ !(sigControlC && interruptEnable) && ++ (debugMode == DEBUG_CLEAR)); ++ ++ if( _retTree != NULL) ++ last = _retTree; ++ ++ goto afterStatement; + } +- : ( ++ ( + // note: assignment must take care to update the owner of lvalue + // a real copy must be performed (creating a new BaseGDL) +- a:ASSIGN +- {a->Run();} +- | r:ASSIGN_REPLACE +- {r->Run();} ++ ASSIGN ++// {a->Run();} ++ | ASSIGN_ARRAYEXPR_MFCALL ++// {ac->Run();} ++ | ASSIGN_REPLACE ++// {ar->Run();} + // assignment +- | l:PCALL_LIB +- {l->Run();} +- | m:MPCALL +- {m->Run();} +- | mp:MPCALL_PARENT +- {mp->Run();} +- | p:PCALL +- {p->Run();} ++ | PCALL_LIB ++// {pl->Run();} ++ | MPCALL ++// {m->Run();} ++ | MPCALL_PARENT ++// {mp->Run();} ++ | PCALL ++// {p->Run();} + // procedure_call + // | lib_procedure_call +- | d:DEC +- {d->Run();} +- | i:INC +- {i->Run();} ++ | DEC ++// {d->Run();} ++ | INC ++// {in->Run();} + // decinc_statement +- | retCode=for_statement +- | retCode=repeat_statement +- | retCode=while_statement +- | retCode=if_statement +- | retCode=if_else_statement +- | retCode=case_statement +- | retCode=switch_statement +- | retCode=block +- | retCode=jump_statement ++ | FOR ++// {f->Run(); _t = _retTree;} ++ | FOR_LOOP ++// {fl->Run(); _t = _retTree;} ++ | FOREACH ++// {fe->Run(); _t = _retTree;} ++ | FOREACH_LOOP ++// {fel->Run(); _t = _retTree;} ++ | FOR_STEP ++// {fs->Run(); _t = _retTree;} ++ | FOR_STEP_LOOP ++// {fsl->Run(); _t = _retTree;} ++ | REPEAT ++// {r->Run(); _t = _retTree;} ++ | REPEAT_LOOP ++// {rl->Run(); _t = _retTree;} ++ | WHILE ++// {w->Run(); _t = _retTree;} ++ | IF ++// {i->Run(); _t = _retTree;} ++ | IF_ELSE ++// {ie->Run(); _t = _retTree;} ++ | CASE ++// {c->Run(); _t = _retTree;} ++ | SWITCH ++// {s->Run(); _t = _retTree;} ++ | BLOCK ++// {b->Run(); _t = _retTree;} ++// | retCode=jump_statement + | LABEL ++// {l->Run(); _t = _retTree;} + | ON_IOERROR_NULL +- { +- static_cast(callStack.back())->SetIOError( -1); +- } +- | o:ON_IOERROR +- { +- static_cast(callStack.back())-> +- SetIOError( o->targetIx); +- } ++// {on->Run(); _t = _retTree;} ++ | ON_IOERROR ++// {o->Run(); _t = _retTree;} ++ | BREAK ++// {br->Run(); _t = _retTree;} ++ | CONTINUE ++// {co->Run(); _t = _retTree;} ++ | GOTO ++// {g->Run(); _t = _retTree;} ++ | RETF ++// ( { !static_cast(callStack.back())->LFun()}? e=expr // expr -> r value ++// { ++// delete returnValue; ++// returnValue=e; ++// retCode=RC_RETURN; ++// callStack.back()->RemoveLoc( e); // steal e from local list ++// } ++// | eL=l_ret_expr ++// { ++// // returnValueL is otherwise owned ++// returnValueL=eL; ++// retCode=RC_RETURN; ++// } ++// ) ++// ) ++ | RETP ++// { ++// retCode=RC_RETURN; ++// } + ) +- // control c and debugging ++ ++ // control-c and debugging + { ++ afterStatement:; ++ + // possible optimization: make sigControlC a debugMode + if( interruptEnable && sigControlC) + { +- DebugMsg( actPos, "Interrupted at: "); ++ DebugMsg( last, "Interrupted at: "); + + sigControlC = false; + +- retCode = NewInterpreterInstance(actPos->getLine()-1); ++ retCode = NewInterpreterInstance( last->getLine()-1); + } +- else if( debugMode != DEBUG_CLEAR) ++ else if( debugMode != DEBUG_CLEAR) + { + if( debugMode == DEBUG_STOP) + { +- DebugMsg( actPos, "Stop encoutered: "); ++ DebugMsg( last, "Stop encoutered: "); + if( !interruptEnable) + debugMode = DEBUG_PROCESS_STOP; + } +@@ -765,18 +1067,19 @@ + { + if( debugMode == DEBUG_PROCESS_STOP) + { +- DebugMsg( actPos, "Stepped to: "); ++ DebugMsg( last, "Stepped to: "); + } + + debugMode = DEBUG_CLEAR; + +- retCode = NewInterpreterInstance(actPos->getLine()-1); ++ retCode = NewInterpreterInstance( last->getLine()-1); + } + else + { + retCode = RC_ABORT; + } + } ++ return retCode; + } + ; + exception +@@ -785,15 +1088,14 @@ + if( dynamic_cast< GDLIOException*>( &e) != NULL) + { + // set the jump target - also logs the jump +- ProgNodeP onIOErr = static_cast(callStack.back())->GetIOError(); ++ ProgNodeP onIOErr = ++ static_cast(callStack.back())->GetIOError(); + if( onIOErr != NULL) + { + SysVar::SetErr_String( e.getMessage()); +- _t = onIOErr; +- retCode=RC_OK; + +- _retTree = _t; +- return retCode; ++ _retTree = onIOErr; ++ return RC_OK; + } + } + +@@ -823,7 +1125,10 @@ + // 2 -> caller of routine which called ON_ERROR + else if( oE == 2) + { +- ++i; // set to caller ++ // set to caller, handle nested ++ while( static_cast(*(++i))->GetOnError() == 2 ++ && i != callStack.rend()); ++ + if( i == callStack.rend()) + { + EnvUDT* cS_begin = +@@ -843,19 +1148,27 @@ + targetEnv = iUDT; + } + +- // remeber where to stop +- e.SetTargetEnv( targetEnv); + + // State where error occured + // if( e.getLine() == 0 && _t != NULL) + // e.SetLine( _t->getLine()); + // if( e.getLine() == 0 && _retTree != NULL) + // e.SetLine( _retTree->getLine()); +- if( e.getLine() == 0 && actPos != NULL) +- e.SetLine( actPos->getLine()); +- +- ReportError(e, "Error occurred at:"); ++ if( e.getLine() == 0 && last != NULL) ++ e.SetLine( last->getLine()); ++ ++ if( interruptEnable) ++ ReportError(e, "Error occurred at:"); ++ ++ // remeber where to stop ++ e.SetTargetEnv( targetEnv); + ++ if( targetEnv->GetLineNumber() != 0) ++ e.SetLine( targetEnv->GetLineNumber()); ++ ++// ProgNodeP errorNodeP = targetEnv->CallingNode(); ++// e.SetErrorNodeP( errorNodeP); ++ + // break on first occurence of set oE + break; + } +@@ -874,8 +1187,8 @@ + // e.SetLine( _t->getLine()); + // if( e.getLine() == 0 && _retTree != NULL) + // e.SetLine( _retTree->getLine()); +- if( e.getLine() == 0 && actPos != NULL) +- e.SetLine( actPos->getLine()); ++// if( e.getLine() == 0 && actPos != NULL) ++// e.SetLine( actPos->getLine()); + + if( interruptEnable) + { +@@ -901,36 +1214,41 @@ + + retCode = RC_ABORT; + } ++ ++ return retCode; + } + +-block returns[ GDLInterpreter::RetCode retCode] ++block returns[ RetCode retCode] + { +- retCode = RC_OK; +- +- ProgNodeP block = _t; + match(antlr::RefAST(_t),BLOCK); +- _t = _t->getFirstChild(); +- if (_t != NULL) +- { ++ _retTree = _t->getFirstChild(); ++ return RC_OK; ++// retCode = RC_OK; ++ ++// ProgNodeP block = _t; ++// match(antlr::RefAST(_t),BLOCK); ++// _t = _t->getFirstChild(); ++// if (_t != NULL) ++// { + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++// SizeT nJump = static_cast(callStack.back())->NJump(); + +- retCode=statement_list(_t); ++// retCode=statement_list(_t); + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !block->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this block +- return retCode; +- } +- } +- _retTree = block->getNextSibling(); +- return retCode; ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !block->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this block ++// return retCode; ++// } ++// } ++// _retTree = block->getNextSibling(); ++// return retCode; + } + : #(BLOCK (retCode=statement_list)?) + ; + +-switch_statement returns[ GDLInterpreter::RetCode retCode] ++switch_statement returns[ RetCode retCode] + { + BaseGDL* e; + retCode = RC_OK; // not set if no branch is executed +@@ -939,7 +1257,7 @@ + { + auto_ptr e_guard(e); + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++// SizeT nJump = static_cast(callStack.back())->NJump(); + + ProgNodeP b=_t; // remeber block begin (block) + +@@ -952,25 +1270,29 @@ + + ProgNodeP sL = b->GetFirstChild(); // statement_list + +- if( sL != NULL ) ++ if(sL != NULL ) + { +- // statement there +- retCode=statement_list( sL); +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; // break +- } +- if( retCode >= RC_RETURN) break; // goto ++ _retTree = sL; ++ return RC_OK; ++ } + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !s->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++// // statement there ++// retCode=statement_list( sL); ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; // break ++// } ++// if( retCode >= RC_RETURN) break; // goto + +- } ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !s->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } ++ ++// } + } + else + { +@@ -987,35 +1309,47 @@ + hook=e->Equal(ee); // Equal deletes ee + } + +- if(bb != NULL && hook) ++ if( hook) + { + // statement there +- retCode=statement_list(bb); +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; // break +- } +- if( retCode >= RC_RETURN) break; // goto ++ if(bb != NULL ) ++ { ++ _retTree = bb; ++ return RC_OK; ++ } ++ ++// _retTree = // find first non empty ++// return RC_OK; ++// } + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !s->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++// retCode=statement_list(bb); ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; // break ++// } ++// if( retCode >= RC_RETURN) break; // goto ++ ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !s->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } + } + + } + b=b->GetNextSibling(); // next block + } ++ _retTree = s->GetNextSibling(); ++ return RC_OK; + // finish or break + // retCode=RC_OK; // clear RC_BREAK retCode + } + ) + ; + +-case_statement returns[ GDLInterpreter::RetCode retCode] ++case_statement returns[ RetCode retCode] + { + BaseGDL* e; + retCode = RC_OK; // not set if no branch is executed +@@ -1024,7 +1358,7 @@ + { + auto_ptr e_guard(e); + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++// SizeT nJump = static_cast(callStack.back())->NJump(); + + if( !e->Scalar()) + throw GDLException( _t, "Expression must be a" +@@ -1032,7 +1366,7 @@ + + ProgNodeP b=_t; // remeber block begin + +- for( int i=0; inumBranch; i++) ++ for( int i=0; inumBranch; ++i) + { + if( b->getType() == ELSEBLK) + { +@@ -1040,22 +1374,31 @@ + + if(sL != NULL ) + { +- // statement there +- retCode=statement_list(sL); +- //if( retCode == RC_BREAK) break; // break anyway +-// if( retCode >= RC_RETURN) return retCode; +- if( retCode >= RC_RETURN) break; ++ _retTree = sL; ++ return RC_OK; ++ } ++ else ++ { ++ _retTree = c->GetNextSibling(); ++ return RC_OK; ++ } ++ ++// // statement there ++// retCode=statement_list(sL); ++// //if( retCode == RC_BREAK) break; // break anyway ++// // if( retCode >= RC_RETURN) return retCode; ++// if( retCode >= RC_RETURN) break; + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !c->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !c->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } + +- } +- retCode = RC_OK; +- break; ++// } ++// retCode = RC_OK; ++// break; + } + else + { +@@ -1069,129 +1412,185 @@ + + if( equalexpr) + { +- if(bb != NULL) +- { +- // statement there +- retCode=statement_list(bb); +- //if( retCode == RC_BREAK) break; // break anyway +-// if( retCode >= RC_RETURN) return retCode; +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !c->LabelInRange( static_cast(callStack.back())->LastJump())) ++ if(bb != NULL ) + { +- // a jump (goto) occured out of this loop +- return retCode; ++ _retTree = bb; ++ return RC_OK; + } ++ else ++ { ++ _retTree = c->GetNextSibling(); ++ return RC_OK; ++ } ++// if(bb != NULL) ++// { ++// // statement there ++// retCode=statement_list(bb); ++// //if( retCode == RC_BREAK) break; // break anyway ++// // if( retCode >= RC_RETURN) return retCode; ++// if( retCode >= RC_RETURN) break; ++ ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !c->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } + +- } +- retCode = RC_OK; +- break; ++// } ++// retCode = RC_OK; ++// break; + } + + } + b=b->GetNextSibling(); // next block +- } ++ } // for + // finish or break + // retCode=RC_OK; // clear RC_BREAK retCode ++ throw GDLException( c, "CASE statement found no match.",true,false); + } ++ + ) + ; + +-repeat_statement returns[ GDLInterpreter::RetCode retCode] +-{ +- retCode = RC_OK; // not set if no branch is executed +-} ++ ++ ++repeat_statement returns[ RetCode retCode] + : #(r:REPEAT // block expr + { +- SizeT nJump = static_cast(callStack.back())->NJump(); +- +- // remember block and expr nodes +- ProgNodeP e =_t; +- ProgNodeP bb = e->GetNextSibling(); +- +-// ProgNodeP bb =_t; +-// ProgNodeP e = bb->GetNextSibling(); +-// bb = bb->GetFirstChild(); +- +- auto_ptr eVal; +- do { +- if( bb != NULL) +- { +- retCode=statement_list(bb); ++ // _t is REPEAT_LOOP, GetFirstChild() is expr, GetNextSibling is first loop statement ++ _retTree = _t->GetFirstChild()->GetNextSibling(); // statement ++ return RC_OK; ++ } ++ ) ++ ; + +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) ++repeat_loop_statement returns[ RetCode retCode] ++// { ++// retCode = RC_OK; // not set if no branch is executed ++// } ++ : #(r:REPEAT_LOOP // block expr ++ { ++ auto_ptr eVal( expr(_t)); ++ if( eVal.get()->False()) + { +- retCode = RC_OK; +- break; ++ _retTree = _t->GetNextSibling(); // 1st loop statement ++ if( _retTree == NULL) ++ throw GDLException(r, ++ "Empty REPEAT loop entered (infinite loop).", ++ true,false); ++ return RC_OK; + } +- if( retCode >= RC_RETURN) break; +- // if( retCode == RC_BREAK) break; +- // if( retCode >= RC_RETURN) return retCode; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !r->LabelInRange( static_cast(callStack.back())->LastJump())) ++ else + { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ _retTree = r->GetNextSibling(); // statement ++ return RC_OK; + } +- eVal.reset( expr(e)); +- } while( eVal.get()->False()); ++ ++// retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode ++// SizeT nJump = static_cast(callStack.back())->NJump(); ++ ++// // remember block and expr nodes ++// ProgNodeP e =_t; ++// ProgNodeP bb = e->GetNextSibling(); ++ ++// // ProgNodeP bb =_t; ++// // ProgNodeP e = bb->GetNextSibling(); ++// // bb = bb->GetFirstChild(); + +- // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode ++// auto_ptr eVal; ++// do { ++// if( bb != NULL) ++// { ++// retCode=statement_list(bb); ++ ++// if( retCode == RC_CONTINUE) ++// { ++// retCode = RC_OK; ++// continue; ++// } ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; ++// } ++// if( retCode >= RC_RETURN) break; ++// // if( retCode == RC_BREAK) break; ++// // if( retCode >= RC_RETURN) return retCode; ++ ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !r->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } ++// } ++// eVal.reset( expr(e)); ++// } while( eVal.get()->False()); ++ ++// // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode + } + ) + ; + +-while_statement returns[ GDLInterpreter::RetCode retCode] ++while_statement returns[ RetCode retCode] + { + retCode = RC_OK; + } + : #(w:WHILE // statement expr + { +- SizeT nJump = static_cast(callStack.back())->NJump(); ++// SizeT nJump = static_cast(callStack.back())->NJump(); + +- ProgNodeP e = _t; //->GetFirstChild(); // expr +- ProgNodeP s = _t->GetNextSibling(); // statement ++// ProgNodeP e = _t; //->GetFirstChild(); // expr + +- auto_ptr< BaseGDL> eVal( expr( e)); +- while( eVal.get()->True()) { +- retCode=statement(s); +- +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) ++ auto_ptr eVal( expr( _t)); ++ if( eVal.get()->True()) + { +- retCode = RC_OK; +- break; ++ _retTree = _t->GetNextSibling(); // 1st loop statement ++ if( _retTree == NULL) ++ throw GDLException(w, ++ "Empty WHILE loop entered (infinite loop).", ++ true,false); ++ return RC_OK; + } +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !w->LabelInRange( static_cast(callStack.back())->LastJump())) ++ else + { +- // a jump (goto) occured out of this loop +- return retCode; ++ _retTree = w->GetNextSibling(); // statement ++ return RC_OK; + } + +- eVal.reset( expr( e)); +- } ++// auto_ptr< BaseGDL> eVal( expr( e)); ++// while( eVal.get()->True()) { ++// retCode=statement_list(s); ++ ++// if( retCode == RC_CONTINUE) ++// { ++// retCode = RC_OK; ++// continue; ++// } ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; ++// } ++// if( retCode >= RC_RETURN) break; ++ ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !w->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } ++ ++// eVal.reset( expr( e)); ++// } + + // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode + } + ) + ; + +-for_statement returns[ GDLInterpreter::RetCode retCode] ++for_statement returns[ RetCode retCode] + { + BaseGDL** v; + BaseGDL* s; +@@ -1199,422 +1598,542 @@ + BaseGDL* st; + retCode = RC_OK; + } +- : #(f:FOR // (VAR|VARPTR) expr expr +- { +- ProgNodeP sv = _t; +- } +- v=l_simple_var +- s=expr e=expr ++ : #(f:FOR // #(FOR_LOOP (VAR|VARPTR) expr expr ...) + { +- auto_ptr s_guard(s); +- auto_ptr e_guard(e); ++ _t = f->GetNextSibling()->GetFirstChild(); + + EnvUDT* callStack_back = + static_cast(callStack.back()); +- SizeT nJump = callStack_back->NJump(); + +- s->ForCheck( &e); +- e_guard.release(); +- e_guard.reset(e); ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( f->forLoopIx); ++ ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ s=expr(_t); ++ auto_ptr s_guard(s); ++ _t = _retTree; ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=expr(_t); ++ ++ ProgNodeP b = _retTree; ++ ++ s->ForCheck( &loopInfo.endLoopVar); + +- ProgNodeP b=_t; //->getFirstChild(); +- + // ASSIGNMENT used here also + delete (*v); ++ (*v)= s_guard.release(); // s held in *v after this + +-// problem: +-// EXECUTE may call DataListT.loc.resize(), as v points to the +-// old sequence v might be invalidated -> segfault +-// note that the value (*v) is preserved by resize() +- s_guard.release(); // s held in *v after this +- for((*v)=s; (*v)->ForCondUp( e); +- v=l_simple_var( sv), (*v)->ForAdd()) ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) + { +-// retCode=block(b); +- if( b != NULL) +- { +- retCode=statement_list(b); +- +- if( retCode != RC_OK) // optimization +- { +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; +- } +- if( retCode >= RC_RETURN) break; +- } ++ _retTree = b; ++ return RC_OK; ++ } ++ else ++ { ++ // skip if initial test fails ++ _retTree = f->GetNextSibling()->GetNextSibling(); ++ return RC_OK; ++ } ++ } ++ ) ++ | #(fl:FOR_LOOP// (VAR|VARPTR) expr expr ++ { ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); + +- if( (callStack_back->NJump() != nJump) && +- !f->LabelInRange( callStack_back->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fl->forLoopIx); ++ ++ if( loopInfo.endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; + } ++ ++// // problem: ++// // EXECUTE may call DataListT.loc.resize(), as v points to the ++// // old sequence v might be invalidated -> segfault ++// // note that the value (*v) is preserved by resize() ++ ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ (*v)->ForAdd(); ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ _retTree = _t->GetNextSibling()->GetNextSibling(); ++ return RC_OK; ++ } ++ else ++ { ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; + } +-// retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode ++ + } + ) ++// for((*v)=s; (*v)->ForCondUp( e); ++// v=l_simple_var( sv), (*v)->ForAdd()) ++// { ++// // retCode=block(b); ++// if( b != NULL) ++// { ++// retCode=statement_list(b); ++ ++// if( retCode != RC_OK) // optimization ++// { ++// if( retCode == RC_CONTINUE) ++// { ++// retCode = RC_OK; ++// continue; ++// } ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; ++// } ++// if( retCode >= RC_RETURN) break; ++// } ++ ++// if( (callStack_back->NJump() != nJump) && ++// !f->LabelInRange( callStack_back->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } ++// } ++// } ++// // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode ++// } ++// ) + | #(fs:FOR_STEP // (VAR|VARPTR) expr expr expr + { +- ProgNodeP sv = _t; +- } +- v=l_simple_var +- s=expr e=expr st=expr +- { ++ _t = fs->GetNextSibling()->GetFirstChild(); ++ ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fs->forLoopIx); ++ ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ s=expr(_t); + auto_ptr s_guard(s); +- auto_ptr e_guard(e); +- auto_ptr st_guard(st); ++ _t = _retTree; + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=expr(_t); ++ _t = _retTree; ++ ++ delete loopInfo.loopStepVar; ++ loopInfo.loopStepVar=expr(_t); ++ ++ ProgNodeP b = _retTree; ++ ++ s->ForCheck( &loopInfo.endLoopVar, &loopInfo.loopStepVar); + +- s->ForCheck( &e, &st); +- e_guard.release(); +- e_guard.reset(e); +- st_guard.release(); +- st_guard.reset(st); +- +- ProgNodeP bs=_t; +- + // ASSIGNMENT used here also + delete (*v); +- +- if( st->Sgn() == -1) +- { +- s_guard.release(); +- for((*v)=s; (*v)->ForCondDown( e); +- v=l_simple_var( sv), (*v)->ForAdd(st)) ++ (*v)= s_guard.release(); // s held in *v after this ++ ++ if( loopInfo.loopStepVar->Sgn() == -1) + { +- if( bs != NULL) ++ if( (*v)->ForCondDown( loopInfo.endLoopVar)) + { +- retCode=statement_list(bs); +- +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; +- } +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !fs->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ _retTree = b; ++ return RC_OK; + } + } +- } + else +- { +- s_guard.release(); +- for((*v)=s; (*v)->ForCondUp( e); +- v=l_simple_var( sv), (*v)->ForAdd(st)) +- { +- if( bs != NULL) ++ { ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) + { +- retCode=statement_list(bs); +- +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } ++ _retTree = b; ++ return RC_OK; ++ } ++ } + +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; +- } +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !fs->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ // skip if initial test fails ++ _retTree = f->GetNextSibling()->GetNextSibling(); ++ return RC_OK; ++ } ++ ) ++ | #(fsl:FOR_STEP_LOOP // (VAR|VARPTR) expr expr expr ++ { ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fsl->forLoopIx); ++ ++ if( loopInfo.endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ _retTree = fsl->GetNextSibling(); ++ return RC_OK; ++ } ++ ++// // problem: ++// // EXECUTE may call DataListT.loc.resize(), as v points to the ++// // old sequence v might be invalidated -> segfault ++// // note that the value (*v) is preserved by resize() ++ ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ ProgNodeP b = _t->GetNextSibling()->GetNextSibling()->GetNextSibling(); ++ ++ (*v)->ForAdd(loopInfo.loopStepVar); ++ if( loopInfo.loopStepVar->Sgn() == -1) ++ { ++ if( (*v)->ForCondDown( loopInfo.endLoopVar)) ++ { ++ _retTree = b; ++ return RC_OK; + } + } +- } ++ else ++ { ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ _retTree = b; ++ return RC_OK; ++ } ++ } ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ delete loopInfo.loopStepVar; ++ loopInfo.loopStepVar = NULL; ++ _retTree = fsl->GetNextSibling(); ++ return RC_OK; ++ + } + ) ++// { ++// ProgNodeP sv = _t; ++// } ++// v=l_simple_var ++// s=expr e=expr st=expr ++// { ++// auto_ptr s_guard(s); ++// auto_ptr e_guard(e); ++// auto_ptr st_guard(st); ++ ++// SizeT nJump = static_cast(callStack.back())->NJump(); ++ ++// s->ForCheck( &e, &st); ++// e_guard.release(); ++// e_guard.reset(e); ++// st_guard.release(); ++// st_guard.reset(st); ++ ++// ProgNodeP bs=_t; ++ ++// // ASSIGNMENT used here also ++// delete (*v); ++ ++// if( st->Sgn() == -1) ++// { ++// s_guard.release(); ++// for((*v)=s; (*v)->ForCondDown( e); ++// v=l_simple_var( sv), (*v)->ForAdd(st)) ++// { ++// if( bs != NULL) ++// { ++// retCode=statement_list(bs); ++ ++// if( retCode == RC_CONTINUE) ++// { ++// retCode = RC_OK; ++// continue; ++// } ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; ++// } ++// if( retCode >= RC_RETURN) break; ++ ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !fs->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } ++// } ++// } ++// } ++// else ++// { ++// s_guard.release(); ++// for((*v)=s; (*v)->ForCondUp( e); ++// v=l_simple_var( sv), (*v)->ForAdd(st)) ++// { ++// if( bs != NULL) ++// { ++// retCode=statement_list(bs); ++ ++// if( retCode == RC_CONTINUE) ++// { ++// retCode = RC_OK; ++// continue; ++// } ++ ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; ++// } ++// if( retCode >= RC_RETURN) break; ++ ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !fs->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } ++// } ++// } ++// } ++// } ++// ) + ; + +-if_statement returns[ GDLInterpreter::RetCode retCode] ++ ++ ++foreach_statement returns[ RetCode retCode] + { +- BaseGDL* e; +- retCode = RC_OK; // not set if not executed ++ BaseGDL** v; ++ BaseGDL* s; ++ retCode = RC_OK; + } +- : #(i:IF e=expr +- { +- auto_ptr e_guard(e); ++ : #(f:FOREACH // #(FOREACH_LOOP (VAR|VARPTR) expr ...) ++ { ++ _t = f->GetNextSibling()->GetFirstChild(); ++ ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( f->forLoopIx); + +- if( e->True()) +- { +- retCode=statement(_t); +-// if( retCode != RC_OK) return retCode; ++ v=l_simple_var(_t); ++ _t = _retTree; + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !i->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } +- } ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=expr(_t); ++ ++ ProgNodeP b = _retTree; ++ ++ loopInfo.foreachIx = 0; ++ ++ // currently there are no empty arrays ++ //SizeT nEl = loopInfo.endLoopVar->N_Elements(); ++ ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v) = loopInfo.endLoopVar->NewIx( 0); ++ ++ _retTree = b; ++ return RC_OK; + } + ) +- ; ++ | #(fl:FOREACH_LOOP // (VAR|VARPTR) expr ++ { ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fl->forLoopIx); ++ ++ if( loopInfo.endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; ++ } ++ ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ // skip expr ++ _t = _t->getNextSibling(); ++ ++ ++loopInfo.foreachIx; ++ ++ SizeT nEl = loopInfo.endLoopVar->N_Elements(); ++ ++ if( loopInfo.foreachIx < nEl) ++ { ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v) = loopInfo.endLoopVar->NewIx( loopInfo.foreachIx); ++ ++ _retTree = _t; ++ return RC_OK; ++ } ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ loopInfo.foreachIx = -1; ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; ++ } ++ ) ++// // always copies (owned by caller) ++// s=expr ++// { ++// EnvUDT* callStack_back = ++// static_cast(callStack.back()); ++// SizeT nJump = callStack_back->NJump(); ++ ++// ProgNodeP b=_t; //->getFirstChild(); ++ ++// // ASSIGNMENT used here also ++ ++ ++// SizeT nEl = s->N_Elements(); ++// // problem: ++// // EXECUTE may call DataListT.loc.resize(), as v points to the ++// // old sequence v might be invalidated -> segfault ++// // note that the value (*v) is preserved by resize() ++// for( SizeT i=0; iNewIx( i); ++ ++// if( b != NULL) ++// { ++// retCode=statement_list(b); ++ ++// if( retCode != RC_OK) // optimization ++// { ++// if( retCode == RC_CONTINUE) ++// { ++// retCode = RC_OK; ++// continue; ++// } ++// if( retCode == RC_BREAK) ++// { ++// retCode = RC_OK; ++// break; ++// } ++// if( retCode >= RC_RETURN) break; ++// } ++ ++// if( (callStack_back->NJump() != nJump) && ++// !f->LabelInRange( callStack_back->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } ++// } ++// } ++// // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode ++// } ++// ) ++ ; ++ ++ + +-if_else_statement returns[ GDLInterpreter::RetCode retCode] ++if_statement returns[ RetCode retCode] + { + BaseGDL* e; +- retCode = RC_OK; // not set if not executed ++// retCode = RC_OK; // not set if not executed + } +- : #(i:IF_ELSE e=expr ++ : #(i:IF e=expr + { + auto_ptr e_guard(e); + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++// SizeT nJump = static_cast(callStack.back())->NJump(); + + if( e->True()) + { +- retCode=statement(_t); +-// if( retCode != RC_OK) return retCode; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !i->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ _retTree = _t; ++ return RC_OK; + } +- else +- { +- _t=_t->GetNextSibling(); // jump over 1st statement +- retCode=statement(_t); +-// if( retCode != RC_OK) return retCode; + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !i->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } +- } ++ _retTree = i->GetNextSibling(); ++ return RC_OK; ++ ++// retCode=statement(_t); ++// // if( retCode != RC_OK) return retCode; ++ ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } + } + ) + ; + +-// to be processed (to make sure it really returns) +-jump_statement returns[ GDLInterpreter::RetCode retCode] ++if_else_statement returns[ RetCode retCode] + { +-BaseGDL* e; +-BaseGDL** eL; ++ BaseGDL* e; ++ retCode = RC_OK; // not set if not executed + } +- : g:GOTO // target in g->gotoTarget; // pointer to an DNode (NO RefDNode) +- { +- // note that this version jumps 'dumb' +- // jumping into loops is legal, even then looping is not done ++ : #(i:IF_ELSE e=expr ++ { ++ auto_ptr e_guard(e); + +- // set the jump target - also logs the jump +- _t = static_cast(callStack.back())->GotoTarget( g->targetIx); +- _t = _t->GetNextSibling(); +- retCode=RC_OK; +- } +- | #(RETF ( { !static_cast(callStack.back())->LFun()}? e=expr // expr -> r value +- { +- delete returnValue; +- returnValue=e; +- retCode=RC_RETURN; +- callStack.back()->RemoveLoc( e); // steal e from local list +- } +- | eL=l_ret_expr ++// SizeT nJump = static_cast(callStack.back())->NJump(); ++ ++ if( e->True()) + { +- // returnValueL is otherwise owned +- returnValueL=eL; +- retCode=RC_RETURN; ++ _retTree = _t->GetFirstChild(); ++ return RC_OK; + } +- ) +- ) +- | RETP +- { +- retCode=RC_RETURN; +- } +- | BREAK // only in loops or switch_statement and case_statement +- { +- retCode=RC_BREAK; +- } +- | CONTINUE // only in loops +- { +- retCode=RC_CONTINUE; +- } +- ; +- +-// procedure_call +-// { +-// // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack +-// StackGuard guard(callStack); +-// BaseGDL *self; +-// EnvUDT* newEnv; +-// } +-// : #(PCALL_LIB pl:IDENTIFIER +-// { +-// EnvT* newEnv=new EnvT( pl, pl->libPro);//libProList[pl->proIx]); +-// } +-// parameter_def[ newEnv] +-// { +-// // push environment onto call stack +-// callStack.push_back(newEnv); +- +-// // make the call +-// static_cast(newEnv->GetPro())->Pro()(newEnv); +-// } +-// ) +-// | +-// ( +-// ( #(MPCALL +-// self=expr mp:IDENTIFIER +-// { +-// auto_ptr self_guard(self); +- +-// newEnv=new EnvUDT( mp, self); + +-// self_guard.release(); +-// } +-// parameter_def[ newEnv] +-// ) +-// | #(MPCALL_PARENT +-// self=expr parent:IDENTIFIER pp:IDENTIFIER +-// { +-// auto_ptr self_guard(self); +- +-// newEnv = new EnvUDT( pp, self, parent->getText()); ++ _retTree = _t->GetNextSibling(); ++ return RC_OK; ++// { ++// auto_ptr e_guard(e); + +-// self_guard.release(); +-// } +-// parameter_def[ newEnv] +-// ) +-// | #(PCALL p:IDENTIFIER +-// { +-// SetProIx( p); +- +-// newEnv = new EnvUDT( p, proList[p->proIx]); +-// } +-// parameter_def[ newEnv] +-// ) +-// ) +-// { +-// // push environment onto call stack +-// callStack.push_back(newEnv); +- +-// // make the call +-// call_pro(static_cast(newEnv->GetPro())->GetTree()); +-// } +-// ) +-// ; ++// SizeT nJump = static_cast(callStack.back())->NJump(); + +-// assignment +-// { +-// BaseGDL* r; +-// BaseGDL** l; +-// auto_ptr r_guard; +-// } +-// : #(ASSIGN +-// // ( r=tmp_expr +-// // { +-// // r_guard.reset( r); +-// // } +-// // | r=check_expr +-// // { +-// // if( !callStack.back()->Contains( r)) +-// // r_guard.reset( r); +-// // } +-// // ) +-// ( r=indexable_expr +-// | r=indexable_tmp_expr { r_guard.reset( r);} +-// | r=check_expr ++// if( e->True()) + // { +-// if( !callStack.back()->Contains( r)) +-// r_guard.reset( r); // guard if no global data +-// } +-// ) ++// retCode=statement(_t); ++// // // if( retCode != RC_OK) return retCode; + +-// l=l_expr[ r] +-// // { +-// // // no delete if assigned to itself +-// // // only possible from lib function +-// // if( (*l) == r || callStack.back()->Contains( r)) +-// // r_guard.release(); +-// // } +-// ) +-// // | #(ASSIGN_INPLACE // ;=, *=, ... +-// // { +-// // ProgNodeP op = _t; +-// // _t = _t->getNextSibling(); +-// // } +-// // ( r=indexable_expr +-// // | r=indexable_tmp_expr { r_guard.reset( r);} +-// // | r=check_expr +-// // { +-// // if( !callStack.back()->Contains( r)) +-// // r_guard.reset( r); // guard if no global data +-// // } +-// // ) +-// // // don't forget ASSIGN_EXPR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +-// // l=l_inplace_expr[ op, r] +-// // ) +-// | #(ASSIGN_REPLACE +-// ( r=tmp_expr +-// { +-// r_guard.reset( r); ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } + // } +-// | r=check_expr ++// else + // { ++// _t=_t->GetNextSibling(); // jump over 1st statement ++// retCode=statement(_t); ++// // // if( retCode != RC_OK) return retCode; + +-// if( !callStack.back()->Contains( r)) +-// r_guard.reset( r); ++// if( (static_cast(callStack.back())->NJump() != nJump) && ++// !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++// { ++// // a jump (goto) occured out of this loop ++// return retCode; ++// } + // } +-// ) +-// ( +-// l=l_function_call // FCALL_LIB, MFCALL, MFCALL_PARENT, FCALL +-// | l=l_deref // DEREF +-// | l=l_simple_var // VAR, VARPTR +-// ) +-// { +-// if( r != (*l)) +-// { +-// delete *l; ++ } ++ ) ++ ; + +-// if( r_guard.get() == r) +-// *l = r_guard.release(); +-// else +-// *l = r->Dup(); +-// } +-// } +-// ) +-// ; + +-// decinc_statement +-// { +-// BaseGDL* l; +-// } +-// : #(DEC l=l_decinc_expr[ DECSTATEMENT]) +-// | #(INC l=l_decinc_expr[ INCSTATEMENT]) +-// ; + + // *************************************************************************** + // the expressions *********************************************************** +@@ -1622,32 +2141,107 @@ + + l_deref returns [BaseGDL** res] + { +- BaseGDL* e1; ++ ProgNodeP retTree = _t->getNextSibling(); ++ ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = _t->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) ++ { ++ e1 = evalExpr->EvalNC(); ++ } ++ else if( evalExpr->getType() == GDLTokenTypes::FCALL_LIB) ++ { ++ e1=lib_function_call(evalExpr); ++ ++ if( e1 == NULL) // ROUTINE_NAMES ++ throw GDLException( evalExpr, "Undefined return value", true, false); ++ ++ if( !callStack.back()->Contains( e1)) ++ e1_guard.reset( e1); ++ } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++ ++ if( e1 == NULL || e1->Type() != PTR) ++ throw GDLException( evalExpr, "Pointer type required" ++ " in this context: "+Name(e1),true,false); ++ ++ DPtrGDL* ptr=static_cast(e1); ++ ++// _t = _t->getFirstChild(); ++ ++// BaseGDL* e1; ++ ++// auto_ptr e1_guard; ++ ++// if( _t->getType() == GDLTokenTypes::FCALL_LIB) ++// { ++// e1=lib_function_call(_t); ++ ++// if( e1 == NULL) // ROUTINE_NAMES ++// throw GDLException( _t, "Undefined return value", true, false); ++ ++// if( !ProgNode::interpreter->callStack.back()->Contains( e1)) ++// e1_guard.reset( e1); ++// } ++// else ++// { ++// e1=tmp_expr(_t); ++// e1_guard.reset( e1); ++// } ++ ++// DPtrGDL* ptr=dynamic_cast(e1); ++// if( ptr == NULL) ++// throw GDLException( _t, "Pointer type required" ++// " in this context: "+Name(e1),true,false); ++ DPtr sc; ++ if( !ptr->Scalar(sc)) ++ throw GDLException( _t, "Expression must be a " ++ "scalar in this context: "+Name(e1),true,false); ++ if( sc == 0) ++ throw GDLException( _t, "Unable to dereference" ++ " NULL pointer: "+Name(e1),true,false); ++ ++ try{ ++ res = &GetHeap(sc); ++ } ++ catch( HeapException) ++ { ++ throw GDLException( _t, "Invalid pointer: "+Name(e1),true,false); ++ } ++ ++ _retTree = retTree; ++ return res; ++ + } + : #(DEREF e1=expr +- { +- auto_ptr e1_guard(e1); ++// { ++// auto_ptr e1_guard(e1); + +- DPtrGDL* ptr=dynamic_cast(e1); +- if( ptr == NULL) +- throw GDLException( _t, "Pointer type required" +- " in this context: "+Name(e1),true,false); +- DPtr sc; +- if( !ptr->Scalar(sc)) +- throw GDLException( _t, "Expression must be a " +- "scalar in this context: "+Name(e1),true,false); +- if( sc == 0) +- throw GDLException( _t, "Unable to dereference" +- " NULL pointer: "+Name(e1),true,false); ++// DPtrGDL* ptr=dynamic_cast(e1); ++// if( ptr == NULL) ++// throw GDLException( _t, "Pointer type required" ++// " in this context: "+Name(e1),true,false); ++// DPtr sc; ++// if( !ptr->Scalar(sc)) ++// throw GDLException( _t, "Expression must be a " ++// "scalar in this context: "+Name(e1),true,false); ++// if( sc == 0) ++// throw GDLException( _t, "Unable to dereference" ++// " NULL pointer: "+Name(e1),true,false); + +- try{ +- res = &GetHeap(sc); +- } +- catch( HeapException) +- { +- throw GDLException( _t, "Invalid pointer: "+Name(e1),true,false); +- } +- } ++// try{ ++// res = &GetHeap(sc); ++// } ++// catch( HeapException) ++// { ++// throw GDLException( _t, "Invalid pointer: "+Name(e1),true,false); ++// } ++// } + ) + ; + +@@ -1673,6 +2267,7 @@ + } + ) // trinary operator + // | #(EXPR res=l_ret_expr) // does not exist anymore ++ | res=l_arrayexpr_mfcall_as_mfcall + | res=l_function_call + { // here a local to the actual environment could be returned + if( callStack.back()->IsLocalKW( res)) +@@ -1702,7 +2297,7 @@ + { + r_guard.reset( e1); + } +- | e1=check_expr ++ | e1=lib_function_call + { + if( !callStack.back()->Contains( e1)) + r_guard.reset( e1); +@@ -1718,6 +2313,30 @@ + r_guard.release(); + } + ) ++ | #(ASSIGN_ARRAYEXPR_MFCALL // here as return value of l_function ++ { ++ auto_ptr r_guard; ++ } ++ ( e1=tmp_expr ++ { ++ r_guard.reset( e1); ++ } ++ | e1=lib_function_call ++ { ++ if( !callStack.back()->Contains( e1)) ++ r_guard.reset( e1); ++ } ++ ) ++ res=l_arrayexpr_mfcall_as_mfcall ++ { ++ if( e1 != (*res)) ++ { ++ delete *res; ++ *res = e1; ++ } ++ r_guard.release(); ++ } ++ ) + | #(ASSIGN_REPLACE + { + auto_ptr r_guard; +@@ -1726,7 +2345,7 @@ + { + r_guard.reset( e1); + } +- | e1=check_expr ++ | e1=lib_function_call + { + if( !callStack.back()->Contains( e1)) + r_guard.reset( e1); +@@ -1906,6 +2525,7 @@ + l_decinc_expr [int dec_inc] returns [BaseGDL* res] + { + BaseGDL* e1; ++ ProgNodeP startNode = _t; + } + : #(QUESTION e1=expr + { +@@ -1930,7 +2550,7 @@ + // { + // r_guard.reset( e1); + // } +-// | e1=check_expr ++// | e1=lib_function_call + // { + // if( !callStack.back()->Contains( e1)) + // r_guard.reset( e1); +@@ -1938,7 +2558,7 @@ + // ) + ( e1=indexable_expr + | e1=indexable_tmp_expr { r_guard.reset( e1);} +- | e1=check_expr ++ | e1=lib_function_call + { + if( !callStack.back()->Contains( e1)) + r_guard.reset( e1); // guard if no global data +@@ -1955,6 +2575,57 @@ + } + res=l_decinc_expr[ dec_inc] + ) ++ | #(ASSIGN_ARRAYEXPR_MFCALL ++ { ++ auto_ptr r_guard; ++ } ++ ( e1=indexable_expr ++ | e1=indexable_tmp_expr { r_guard.reset( e1);} ++ | e1=lib_function_call ++ { ++ if( !callStack.back()->Contains( e1)) ++ r_guard.reset( e1); // guard if no global data ++ } ++ ) ++ { ++ ProgNodeP l = _t; ++ ++ BaseGDL** tmp; ++ ++ // try MFCALL ++ try ++ { ++ ++ tmp=l_arrayexpr_mfcall_as_mfcall(l); ++ ++ if( e1 != (*tmp)) ++ { ++ delete *tmp; ++ ++ if( r_guard.get() == e1) ++ *tmp = r_guard.release(); ++ else ++ *tmp = e1->Dup(); ++ } ++ ++ res=l_decinc_expr( l, dec_inc); ++ } ++ catch( GDLException& ex) ++ { ++ // try ARRAYEXPR ++ try ++ { ++ tmp=l_arrayexpr_mfcall_as_arrayexpr(l, e1); ++ } ++ catch( GDLException& ex2) ++ { ++ throw GDLException(ex.toString() + " or "+ex2.toString()); ++ } ++ ++ res=l_decinc_expr( l, dec_inc); ++ } ++ } ++ ) + | #(ASSIGN_REPLACE + { + auto_ptr r_guard; +@@ -1963,7 +2634,7 @@ + { + r_guard.reset( e1); + } +- | e1=check_expr ++ | e1=lib_function_call + { + if( !callStack.back()->Contains( e1)) + r_guard.reset( e1); +@@ -1985,18 +2656,90 @@ + { + delete *tmp; + +- if( r_guard.get() == e1) +- *tmp = r_guard.release(); +- else +- *tmp = e1->Dup(); +- } +- } +- { +- _t = l; +- } +- res=l_decinc_expr[ dec_inc] ++ if( r_guard.get() == e1) ++ *tmp = r_guard.release(); ++ else ++ *tmp = e1->Dup(); ++ } ++ } ++ { ++ _t = l; ++ } ++ res=l_decinc_expr[ dec_inc] ++ ) ++ | res=l_decinc_array_expr[ dec_inc] ++ | #(ARRAYEXPR_MFCALL ++ { ++ ProgNodeP mark = _t; ++ _t = _t->getNextSibling(); // step over DOT ++ ++ BaseGDL* self; ++ } ++ ++ //BaseGDL** e = l_arrayexpr_mfcall_as_mfcall( _t); ++ self=expr mp2:IDENTIFIER ++ ++ { ++ auto_ptr self_guard(self); ++ ++ EnvUDT* newEnv; ++ ++ try { ++ newEnv=new EnvUDT( self, mp2, "", true); ++ self_guard.release(); ++ } ++ catch( GDLException& ex) ++ { ++ _t = mark; ++ ++ res=l_decinc_dot_expr(_t, dec_inc); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ } ++ ++ parameter_def[ newEnv] ++ ++ { ++ // push environment onto call stack ++ callStack.push_back(newEnv); ++ ++ // make the call ++ BaseGDL** ee=call_lfun(static_cast( ++ newEnv->GetPro())->GetTree()); ++ ++ BaseGDL* e = *ee; ++ if( e == NULL) ++ throw GDLException( _t, "Variable is undefined: "+Name(ee),true,false); ++ ++ if( dec_inc == DECSTATEMENT) ++ { ++ e->Dec(); ++ res = NULL; ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ if( dec_inc == INCSTATEMENT) ++ { ++ e->Inc(); ++ res = NULL; ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ ++ if( dec_inc == DEC) e->Dec(); ++ else if( dec_inc == INC) e->Inc(); ++ // ++ res = e->Dup(); ++ ++ if( dec_inc == POSTDEC) e->Dec(); ++ else if( dec_inc == POSTINC) e->Inc(); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } + ) +- | res=l_decinc_array_expr[ dec_inc] + | res=l_decinc_dot_expr[ dec_inc] + | e1=r_expr + { +@@ -2025,6 +2768,11 @@ + if( *res == NULL) + throw GDLException( _t, "Variable is undefined: "+Name(res),true,false); + } ++ | res=l_arrayexpr_mfcall_as_mfcall ++ { ++ if( *res == NULL) ++ throw GDLException( _t, "Variable is undefined: "+Name(res),true,false); ++ } + | res=l_deref + { + if( *res == NULL) +@@ -2049,7 +2797,6 @@ + aL->AssignAt( *res, right); + + // aL->SetVariable( *res); +- + // if( (*res)->EqType( right)) + // { + // (*res)->AssignAt( right, aL); // assigns inplace +@@ -2058,7 +2805,6 @@ + // { + // BaseGDL* rConv = right->Convert2( (*res)->Type(), BaseGDL::COPY); + // auto_ptr conv_guard( rConv); +- + // (*res)->AssignAt( rConv, aL); // assigns inplace + // } + } +@@ -2161,7 +2907,7 @@ + // { + // r_guard.reset( e1); + // } +-// | e1=check_expr ++// | e1=lib_function_call + // { + // if( !callStack.back()->Contains( e1)) + // r_guard.reset( e1); +@@ -2170,7 +2916,7 @@ + ( e1=indexable_expr + | e1=indexable_tmp_expr { delete e1;} + // | e1=indexable_tmp_expr { r_guard.reset( e1);} +- | e1=check_expr ++ | e1=lib_function_call + { + if( !callStack.back()->Contains( e1)) + delete e1; // guard if no global data +@@ -2184,6 +2930,44 @@ + // r_guard.release(); + // } + ) ++ | #(ASSIGN_ARRAYEXPR_MFCALL ++ ( e1=indexable_expr ++ | e1=indexable_tmp_expr { delete e1;} ++ | e1=lib_function_call ++ { ++ if( !callStack.back()->Contains( e1)) ++ delete e1; ++ } ++ ) ++ { ++ ProgNodeP l = _t; ++ ++ // try MFCALL ++ try ++ { ++ ++ res=l_arrayexpr_mfcall_as_mfcall( l); ++ ++ if( right != (*res)) ++ { ++ delete *res; ++ *res = right->Dup(); ++ } ++ } ++ catch( GDLException& ex) ++ { ++ // try ARRAYEXPR ++ try ++ { ++ res=l_arrayexpr_mfcall_as_arrayexpr(l, right); ++ } ++ catch( GDLException& ex2) ++ { ++ throw GDLException(ex.toString() + " or "+ex2.toString()); ++ } ++ } ++ } ++ ) + | #(ASSIGN_REPLACE //???e1=expr + // { + // auto_ptr r_guard; +@@ -2193,7 +2977,7 @@ + delete e1; + // r_guard.reset( e1); + } +- | e1=check_expr ++ | e1=lib_function_call + { + if( !callStack.back()->Contains( e1)) + delete e1; +@@ -2266,6 +3050,7 @@ + // *res = right->Dup(); + // } + // } ++ | res=l_arrayexpr_mfcall[ right] + // | res=l_dot_expr[ right] + | #(dot:DOT // struct assignment + { +@@ -2302,83 +3087,63 @@ + { + assert( _t != NULL); + ++ _retTree = _t->getNextSibling(); ++ + if( _t->getType() == VAR) + { +- ProgNodeP var = _t; ++ return &callStack.back()->GetKW(_t->varIx); ++// ProgNodeP var = _t; + // match(antlr::RefAST(_t),VAR); +- _t = _t->getNextSibling(); +- +- +- res=&callStack.back()->GetKW(var->varIx); +- + } + else + { +- ProgNodeP varPtr = _t; ++ return &_t->var->Data(); // returns BaseGDL* of var (DVar*) ++// ProgNodeP varPtr = _t; + // match(antlr::RefAST(_t),VARPTR); +- _t = _t->getNextSibling(); +- +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) +- + } +- +- _retTree = _t; + return res; + } +- : var:VAR // DNode.varIx is index into functions/procedures environment +- { +- +- res=&callStack.back()->GetKW(var->varIx); +- } +- | varPtr:VARPTR // DNode.var is ptr to common block variable +- { +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) +- } ++ : VAR // DNode.varIx is index into functions/procedures environment ++ | VARPTR // DNode.var is ptr to common block variable + ; + + l_defined_simple_var returns [BaseGDL** res] + { + if( _t->getType() == VAR) + { +- var = _t; + // match(antlr::RefAST(_t),VAR); +- _t = _t->getNextSibling(); +- +- res=&callStack.back()->GetKW(var->varIx); ++ res=&callStack.back()->GetKW(_t->varIx); + if( *res == NULL) +- throw GDLException( var, "Variable is undefined: "+ +- callStack.back()->GetString(var->varIx),true,false); ++ throw GDLException( _t, "Variable is undefined: "+ ++ callStack.back()->GetString(_t->varIx),true,false); + + } + else + { +- varPtr = _t; + // match(antlr::RefAST(_t),VARPTR); +- _t = _t->getNextSibling(); +- +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) ++ res=&_t->var->Data(); // returns BaseGDL* of var (DVar*) + if( *res == NULL) + throw GDLException( _t, "Variable is undefined: "+ + callStack.back()->GetString( *res),true,false); + + } +- _retTree = _t; ++ _retTree = _t->getNextSibling(); + return res; + } +- : var:VAR // DNode.varIx is index into functions/procedures environment +- { +- res=&callStack.back()->GetKW(var->varIx); +- if( *res == NULL) +- throw GDLException( _t, "Variable is undefined: "+ +- callStack.back()->GetString(var->varIx),true,false); +- } +- | varPtr:VARPTR // DNode.var is ptr to common block variable +- { +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) +- if( *res == NULL) +- throw GDLException( _t, "Variable is undefined: "+ +- callStack.back()->GetString( *res),true,false); +- } ++ : VAR // DNode.varIx is index into functions/procedures environment ++// { ++// res=&callStack.back()->GetKW(var->varIx); ++// if( *res == NULL) ++// throw GDLException( _t, "Variable is undefined: "+ ++// callStack.back()->GetString(var->varIx),true,false); ++// } ++ | VARPTR // DNode.var is ptr to common block variable ++// { ++// res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) ++// if( *res == NULL) ++// throw GDLException( _t, "Variable is undefined: "+ ++// callStack.back()->GetString( *res),true,false); ++// } + ; + + l_sys_var returns [BaseGDL** res] +@@ -2412,309 +3177,55 @@ + // expressions which always only return a value + // expecting to delete any sub-expressions + r_expr returns [BaseGDL* res] +- : e:EXPR +- { res = e->Eval();} +- | a:ARRAYDEF +- { res = a->Eval(); _t=_retTree;} +-// | c:ARRAYDEF_CONST +-// { res = c->Eval(); _t=_retTree;} +- | s:STRUC +- { res = s->Eval(); _t=_retTree;} +- | n:NSTRUC +- { res = n->Eval(); _t=_retTree;} +- | r:NSTRUC_REF +- { res = r->Eval(); _t=_retTree;} +-// | res=array_def +-// | res=struct_def +- +-// { +-// BaseGDL* e1; +-// BaseGDL* e2; +-// } +-// : #(NOT_OP e1=expr { res= e1->NotOp();} ) +-// | #(UMINUS e1=expr { res= e1->UMinus();} ) +-// | #(AND_OP e1=expr e2=expr) // binary operators... +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->AndOp(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->AndOpInv(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->AndOpInv(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->AndOp(e1); // smaller + larger +-// } +-// | #(OR_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->OrOp(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->OrOpInv(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->OrOpInv(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->OrOp(e1); // smaller + larger +-// } +-// | #(XOR_OP e1=expr e2=expr) // xor is only defined for integers +-// { +-// AdjustTypes(e1,e2); +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->XorOp(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->XorOp(e1); // smaller + larger +-// } +-// | #(EQ_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// res=e1->EqOp(e2); +-// } +-// | #(NE_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// res=e1->NeOp(e2); +-// } +-// | #(LE_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// res=e1->LeOp(e2); +-// } +-// | #(LT_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// res=e1->LtOp(e2); +-// } +-// | #(GE_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// res=e1->GeOp(e2); +-// } +-// | #(GT_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// res=e1->GtOp(e2); +-// } +-// | #(PLUS e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->AddInv(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->Add(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->Add(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->AddInv(e1); // smaller + larger +-// } +-// | #(MINUS e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->SubInv(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->Sub(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->Sub(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->SubInv(e1); // smaller + larger +-// } +-// | #(LTMARK e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->LtMark(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->LtMark(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->LtMark(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->LtMark(e1); // smaller + larger +-// } +-// | #(GTMARK e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->GtMark(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->GtMark(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->GtMark(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->GtMark(e1); // smaller + larger +-// } +-// | #(ASTERIX e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->Mult(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->Mult(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->Mult(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->Mult(e1); // smaller + larger +-// } +-// | #(MATRIX_OP1 e1=expr e2=expr) // # +-// { +-// DType aTy=e1->Type(); +-// DType bTy=e2->Type(); +-// DType maxTy=(DTypeOrder[aTy] >= DTypeOrder[bTy])? aTy: bTy; +- +-// DType cTy=maxTy; +-// if( maxTy == BYTE || maxTy == INT) +-// cTy=LONG; +-// else if( maxTy == UINT) +-// cTy=ULONG; +- +-// if( aTy != cTy) e1=e1->Convert2( cTy); +- +-// AdjustTypes(e1,e2); +-// res=e1->MatrixOp(e2); +-// } +-// | #(MATRIX_OP2 e1=expr e2=expr) // ## +-// { +-// DType aTy=e1->Type(); +-// DType bTy=e2->Type(); +-// DType maxTy=(DTypeOrder[aTy] >= DTypeOrder[bTy])? aTy: bTy; +- +-// DType cTy=maxTy; +-// if( maxTy == BYTE || maxTy == INT) +-// cTy=LONG; +-// else if( maxTy == UINT) +-// cTy=ULONG; +- +-// if( aTy != cTy) e1=e1->Convert2( cTy); +- +-// AdjustTypes(e1,e2); +-// res=e2->MatrixOp(e1); +-// } +-// | #(SLASH e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->DivInv(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->Div(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->Div(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->DivInv(e1); // smaller + larger +-// } +-// | #(MOD_OP e1=expr e2=expr) +-// { +-// AdjustTypes(e1,e2); +-// if( e1->Scalar()) +-// res= e2->ModInv(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->Mod(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->Mod(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->ModInv(e1); // smaller + larger +-// } +-// | #(POW e1=expr e2=expr) +-// { +-// // special handling for complex +-// DType aTy=e1->Type(); +-// if( aTy == COMPLEX) +-// { +-// DType bTy=e2->Type(); +-// if( IntType( bTy)) +-// { +-// e2 = e2->Convert2( FLOAT); +-// res = e1->Pow( e2); +-// goto endPOW; +-// } +-// else if( bTy == FLOAT) +-// { +-// res = e1->Pow( e2); +-// goto endPOW; +-// } +-// } +-// else if( aTy == COMPLEXDBL) +-// { +-// DType bTy=e2->Type(); +-// if( IntType( bTy)) +-// { +-// e2 = e2->Convert2( DOUBLE); +-// res = e1->Pow( e2); +-// goto endPOW; +-// } +-// else if( bTy == DOUBLE) +-// { +-// res = e1->Pow( e2); +-// goto endPOW; +-// } +-// } +- +-// DType convertBackT; +- +-// // convert back +-// if( IntType( e2->Type()) && +-// DTypeOrder[e2->Type()] > DTypeOrder[e1->Type()]) +-// convertBackT = e1->Type(); +-// else +-// convertBackT = UNDEF; +- +-// AdjustTypes(e2,e1); // order crucial here (for converting back) +- +-// if( e1->Scalar()) +-// res= e2->PowInv(e1); // scalar+scalar or array+scalar +-// else +-// if( e2->Scalar()) +-// res= e1->Pow(e2); // array+scalar +-// else +-// if( e1->N_Elements() <= e2->N_Elements()) +-// res= e1->Pow(e2); // smaller_array + larger_array or same size +-// else +-// res= e2->PowInv(e1); // smaller + larger +-// if( convertBackT != UNDEF) +-// { +-// res = res->Convert2( convertBackT, BaseGDL::CONVERT); +-// } +-// endPOW: +-// } ++{ ++ switch ( _t->getType()) { ++ case EXPR: ++ case ARRAYDEF: ++ case STRUC: ++ case NSTRUC: ++ case NSTRUC_REF: ++ { ++ res = _t->Eval(); ++ break; ++ } ++ case DEC: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), DEC); ++ break; ++ } ++ case INC: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), INC); ++ break; ++ } ++ case POSTDEC: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), POSTDEC); ++ break; ++ } ++// case POSTINC: ++ default: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), POSTINC); ++ break; ++ } ++// default: ++// { ++// throw antlr::NoViableAltException(antlr::RefAST(_t)); ++// } ++ } ++ _retTree = _t->getNextSibling(); ++ return res; ++} ++ : EXPR ++ | ARRAYDEF ++ | STRUC ++ | NSTRUC ++ | NSTRUC_REF + | #(DEC res=l_decinc_expr[ DEC]) + | #(INC res=l_decinc_expr[ INC]) + | #(POSTDEC res=l_decinc_expr[ POSTDEC]) + | #(POSTINC res=l_decinc_expr[ POSTINC]) +-// // logical expressions +-// | #(LOG_AND e1=expr e2=expr) +-// { +-// if( !e1->LogTrue()) {res = new DByteGDL( 0); break;} +-// if( !e2->LogTrue()) {res = new DByteGDL( 0); break;} +-// res = new DByteGDL( 1); +-// } +-// | #(LOG_OR e1=expr e2=expr) +-// { +-// if( e1->LogTrue()) {res = new DByteGDL( 1); break;} +-// if( e2->LogTrue()) {res = new DByteGDL( 1); break;} +-// res = new DByteGDL( 0); +-// } +-// | #(LOG_NEG e1=expr) +-// { +-// res = e1->LogNeg(); +-// } +-// | res=constant + ; + + array_expr returns [BaseGDL* res] +@@ -2724,15 +3235,164 @@ + ArrayIndexListGuard guard; + auto_ptr r_guard; + +- ExprListT exprList; // for cleanup +- IxExprListT ixExprList; +- SizeT nExpr; +- BaseGDL* s; ++ ExprListT exprList; // for cleanup ++ IxExprListT ixExprList; ++ SizeT nExpr; ++ BaseGDL* s; ++ ++ ProgNodeP retTree = _t->getNextSibling(); ++// match(antlr::RefAST(_t),ARRAYEXPR); ++ _t = _t->getFirstChild(); ++ ++ switch ( _t->getType()) { ++ case VAR: ++ case CONSTANT: ++ case DEREF: ++ case SYSVAR: ++ case VARPTR: ++ { ++ r=_t->EvalNC(); ++ //r=indexable_expr(_t); ++ _t = _t->getNextSibling(); //_retTree; ++ break; ++ } ++ case FCALL_LIB: ++ { ++ r=lib_function_call(_t); ++ _t = _t->getNextSibling(); ++ ++ if( !callStack.back()->Contains( r)) ++ r_guard.reset( r); // guard if no global data ++ ++ break; ++ } ++// case ASSIGN: ++// case ASSIGN_REPLACE: ++// case ASSIGN_ARRAYEXPR_MFCALL: ++// case ARRAYDEF: ++// case ARRAYEXPR: ++// case ARRAYEXPR_MFCALL: ++// case EXPR: ++// case FCALL: ++// case FCALL_LIB_RETNEW: ++// case MFCALL: ++// case MFCALL_PARENT: ++// case NSTRUC: ++// case NSTRUC_REF: ++// case POSTDEC: ++// case POSTINC: ++// case STRUC: ++// case DEC: ++// case INC: ++// case DOT: ++// case QUESTION: ++ default: ++ { ++ r=indexable_tmp_expr(_t); ++ _t = _retTree; ++ r_guard.reset( r); ++ break; ++ } ++ } ++ ++ ++ aL = _t->arrIxList; ++ assert( aL != NULL); ++ guard.reset(aL); ++ ++// ax = _t ++// match(antlr::RefAST(_t),ARRAYIX); ++ _t = _t->getFirstChild(); ++ ++ nExpr = aL->NParam(); ++ ++ if( nExpr == 0) ++ { ++ goto empty; ++ } ++ // if( nExpr > 1) ++ // { ++ // ixExprList.reserve( nExpr); ++ // exprList.reserve( nExpr); ++ // } ++ // if( nExpr == 0) goto empty; ++ ++ for (;;) { ++// if ((_tokenSet_1.member(_t->getType()))) { ++ switch ( _t->getType()) { ++ case VAR: ++ case CONSTANT: ++ case DEREF: ++ case SYSVAR: ++ case VARPTR: ++ { ++ s=_t->EvalNC();//indexable_expr(_t); ++ _t = _t->getNextSibling();//_retTree; ++ break; ++ } ++ case FCALL_LIB: ++ { ++ s=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( s)) ++ exprList.push_back( s); ++ ++ break; ++ } ++// case ASSIGN: ++// case ASSIGN_REPLACE: ++// case ASSIGN_ARRAYEXPR_MFCALL: ++// case ARRAYDEF: ++// case ARRAYEXPR: ++// case ARRAYEXPR_MFCALL: ++// case EXPR: ++// case FCALL: ++// case FCALL_LIB_RETNEW: ++// case MFCALL: ++// case MFCALL_PARENT: ++// case NSTRUC: ++// case NSTRUC_REF: ++// case POSTDEC: ++// case POSTINC: ++// case STRUC: ++// case DEC: ++// case INC: ++// case DOT: ++// case QUESTION: ++ default: ++ { ++ s=indexable_tmp_expr(_t); ++ _t = _retTree; ++ exprList.push_back( s); ++ break; ++ } ++ } // switch ++ ++ ixExprList.push_back( s); ++ if( ixExprList.size() == nExpr) ++ break; // finish ++ ++ } // for ++// else { ++// assert( 0);//goto _loop106; ++// } ++ ++ empty: ++ //_retTree = ax; ++ res = aL->Index( r, ixExprList); ++ // aL->Init( ixExprList); ++ // aL->SetVariable( r); ++ // res=r->Index( aL); ++ // ClearTmpList(); ++ ++ _retTree = retTree; ++ return res; + } + : #(ARRAYEXPR + ( r=indexable_expr + | r=indexable_tmp_expr { r_guard.reset( r);} +- | r=check_expr ++ | r=lib_function_call + { + if( !callStack.back()->Contains( r)) + r_guard.reset( r); // guard if no global data +@@ -2750,7 +3410,7 @@ + + if( nExpr == 0) + { +- goto empty; ++ goto empty2; + } + // if( nExpr > 1) + // { +@@ -2761,7 +3421,7 @@ + } + ( + ( s=indexable_expr +- | s=check_expr ++ | s=lib_function_call + { + if( !callStack.back()->Contains( s)) + exprList.push_back( s); +@@ -2777,7 +3437,7 @@ + // { empty: ;} + ) + { +-empty: ++empty2: + //_retTree = ax; + res = aL->Index( r, ixExprList); + // aL->Init( ixExprList); +@@ -2980,7 +3640,7 @@ + // } + // } + ) // trinary operator +- | res=array_expr ++ | (a:ARRAYEXPR { res = a->Eval();}) //res=array_expr + | res=dot_expr + | res=assign_expr + | res=function_call +@@ -2991,6 +3651,9 @@ + // not owned by caller + indexable_expr returns [BaseGDL* res] + { ++ _retTree = _t->getNextSibling(); ++ return _t->EvalNC(); ++ + BaseGDL** e2; + } + : e2=l_defined_simple_var +@@ -3027,7 +3690,7 @@ + } + } + : res=tmp_expr +- | res=check_expr ++ | res=lib_function_call + { + if( callStack.back()->Contains( res)) + res = res->Dup(); +@@ -3035,9 +3698,9 @@ + ; + + +-check_expr returns [BaseGDL* res] +- : res=lib_function_call +- ; ++// check_expr returns [BaseGDL* res] ++// : res=lib_function_call ++// ; + + // l_expr used as r_expr and true r_expr + tmp_expr returns [BaseGDL* res] +@@ -3057,7 +3720,6 @@ + // e1=expr + // { + // auto_ptr e1_guard(e1); +- + // if( e1->True()) + // { + // res=expr(_t); +@@ -3069,7 +3731,8 @@ + // } + // } + ) // trinary operator +- | res=array_expr ++ | (a:ARRAYEXPR { res = a->Eval();}) //res=array_expr ++// | res=array_expr + | res=dot_expr + | res=assign_expr + | res=function_call +@@ -3086,9 +3749,9 @@ + BaseGDL** l; + BaseGDL* r; + ++ ProgNodeP startNode = _t; + if( _t->getType() == ASSIGN) + { +- ProgNodeP __t130 = _t; + // match(antlr::RefAST(_t),ASSIGN); + _t = _t->getFirstChild(); + +@@ -3096,7 +3759,7 @@ + + if( _t->getType() == FCALL_LIB) + { +- res=check_expr(_t); ++ res=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( res)) +@@ -3120,12 +3783,73 @@ + else + res = res->Dup(); + +- _t = __t130; +- _t = _t->getNextSibling(); + } ++ else if( _t->getType() == ASSIGN_ARRAYEXPR_MFCALL) ++ { ++ ++ _t = _t->getFirstChild(); ++ ++ auto_ptr r_guard; ++ ++ if( _t->getType() == FCALL_LIB) ++ { ++ res=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( res)) ++ r_guard.reset( res); ++ ++ } ++ else ++ { ++ res=tmp_expr(_t); ++ _t = _retTree; ++ ++ r_guard.reset( res); ++ ++ } ++ ++ ProgNodeP mark = _t; ++ ++ // try MFCALL ++ try ++ { ++ l=l_arrayexpr_mfcall_as_mfcall( mark); ++ ++ if( res != (*l)) ++ { ++ delete *l; ++ *l = res->Dup(); ++ ++ if( r_guard.get() == res) // owner ++ { ++ r_guard.release(); ++ } ++ else ++ res = res->Dup(); ++ } ++ } ++ catch( GDLException& ex) ++ { ++ // try ARRAYEXPR ++ try ++ { ++ l=l_arrayexpr_mfcall_as_arrayexpr(mark, res); ++ ++ if( r_guard.get() == res) // owner ++ r_guard.release(); ++ else ++ res = res->Dup(); ++ } ++ catch( GDLException& ex2) ++ { ++ throw GDLException(ex.toString() + " or "+ex2.toString()); ++ } ++ } ++ ++ } + else + { +- ProgNodeP __t132 = _t; + // match(antlr::RefAST(_t),ASSIGN_REPLACE); + _t = _t->getFirstChild(); + +@@ -3134,7 +3858,7 @@ + if( _t->getType() == FCALL_LIB) + { + +- res=check_expr(_t); ++ res=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( res)) +@@ -3185,15 +3909,12 @@ + else + res = res->Dup(); + } +- +- _t = __t132; +- _t = _t->getNextSibling(); +- } ++ } + +- _retTree = _t; ++ _retTree = startNode->getNextSibling(); + return res; +- + } ++ + : #(ASSIGN + { + auto_ptr r_guard; +@@ -3202,7 +3923,29 @@ + { + r_guard.reset( res); + } +- | res=check_expr ++ | res=lib_function_call ++ { ++ if( !callStack.back()->Contains( res)) ++ r_guard.reset( res); ++ } ++ ) ++ l=l_expr[ res] ++ { ++ if( r_guard.get() == res) // owner ++ r_guard.release(); ++ else ++ res = res->Dup(); ++ } // here res is returned! ++ ) ++ | #(ASSIGN_ARRAYEXPR_MFCALL ++ { ++ auto_ptr r_guard; ++ } ++ ( res=tmp_expr ++ { ++ r_guard.reset( res); ++ } ++ | res=lib_function_call + { + if( !callStack.back()->Contains( res)) + r_guard.reset( res); +@@ -3224,7 +3967,7 @@ + { + r_guard.reset( res); + } +- | res=check_expr ++ | res=lib_function_call + { + if( !callStack.back()->Contains( res)) + r_guard.reset( res); +@@ -3252,6 +3995,8 @@ + ) + ; + ++ ++ + simple_var returns [BaseGDL* res] + { + assert( _t != NULL); +@@ -3366,20 +4111,21 @@ + ; + + constant returns [BaseGDL* res] +- : c:CONSTANT +- { +- res=c->cData->Dup(); +- } ++{ ++ _retTree = _t->getNextSibling(); ++ return _t->cData->Dup(); ++} ++ : CONSTANT ++// { ++// res=c->cData->Dup(); ++// } + ; + + constant_nocopy returns [BaseGDL* res] + { +- + //BaseGDL* +- res = _t->cData; // no ->Dup(); +- + _retTree = _t->getNextSibling(); +- return res; ++ return _t->cData; // no ->Dup(); + } + : c:CONSTANT + { +@@ -3400,8 +4146,8 @@ + ProgNodeP& fl = _t; + EnvT* newEnv=new EnvT( fl, fl->libFun);//libFunList[fl->funIx]); + +- parameter_def(_t->getFirstChild(), newEnv); +- ++ parameter_def(_t->getFirstChild(), newEnv); ++ + // push id.pro onto call stack + callStack.push_back(newEnv); + // make the call +@@ -3411,7 +4157,6 @@ + // if( res == NULL) + // throw GDLException( _t, ""); + +- + _retTree = rTree; + return res; + } +@@ -3429,101 +4174,289 @@ + //*** MUST always return a defined expression + } + ) +- ; ++ ; ++ ++lib_function_call_retnew returns[ BaseGDL* res] ++{ ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(callStack); ++ ++ ProgNodeP rTree = _t->getNextSibling(); ++ ++// match(antlr::RefAST(_t),FCALL_LIB_RETNEW); ++// _t = _t->getFirstChild(); ++// match(antlr::RefAST(_t),IDENTIFIER); ++ EnvT* newEnv=new EnvT( _t, _t->libFun);//libFunList[fl->funIx]); ++ ++// _t =_t->getFirstChild(); ++ ++// EnvT* newEnv=new EnvT( fl, fl->libFun);//libFunList[fl->funIx]); ++ static int n_elementsIx = LibFunIx("N_ELEMENTS"); ++ static DLibFun* n_elementsFun = libFunList[n_elementsIx]; ++ ++ if( _t->libFun == n_elementsFun) ++ { ++ parameter_def_n_elements(_t->getFirstChild(), newEnv); ++ } ++ else ++ { ++ parameter_def(_t->getFirstChild(), newEnv); ++ } ++ ++ ++// parameter_def(_t->getFirstChild(), newEnv); ++ ++ // push id.pro onto call stack ++ callStack.push_back(newEnv); ++ // make the call ++ //BaseGDL* ++ res=static_cast(newEnv->GetPro())->Fun()(newEnv); ++ //*** MUST always return a defined expression ++ ++ _retTree = rTree; ++ return res; ++} ++ : #(fll:FCALL_LIB_RETNEW //fll:IDENTIFIER ++ { ++ //EnvT* ++ newEnv=new EnvT( fll, fll->libFun);//libFunList[fl->funIx]); ++ } ++ parameter_def[ newEnv] ++ { ++ // push id.pro onto call stack ++ callStack.push_back(newEnv); ++ // make the call ++ res=static_cast(newEnv->GetPro())->Fun()(newEnv); ++ //*** MUST always return a defined expression ++ } ++ ) ++ ; ++ ++ ++function_call returns[ BaseGDL* res] ++{ ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(callStack); ++ BaseGDL *self; ++ EnvUDT* newEnv; ++ ProgNodeP startNode = _t; ++ ProgNodeP mark; ++} ++ : ( ++ #(MFCALL ++ self=expr mp:IDENTIFIER ++ { ++ auto_ptr self_guard(self); ++ ++ newEnv=new EnvUDT( self, mp); ++ ++ self_guard.release(); ++ } ++ parameter_def[ newEnv] ++ ) ++ | #(MFCALL_PARENT ++ self=expr parent:IDENTIFIER p:IDENTIFIER ++ { ++ auto_ptr self_guard(self); ++ ++ newEnv=new EnvUDT( self, p, ++ parent->getText()); ++ ++ self_guard.release(); ++ } ++ parameter_def[ newEnv] ++ ) ++ | #(f:FCALL //f:IDENTIFIER ++ { ++ SetFunIx( f); ++ ++ newEnv=new EnvUDT( f, funList[f->funIx]); ++ } ++ parameter_def[ newEnv] ++ ) ++ | #(ARRAYEXPR_MFCALL ++ { ++ mark = _t; ++ _t = _t->getNextSibling(); // skip DOT ++ } ++ ++ self=expr mp2:IDENTIFIER ++ ++ { ++ auto_ptr self_guard(self); ++ ++ try { ++ newEnv=new EnvUDT( self, mp2); ++ self_guard.release(); ++ } ++ catch( GDLException& ex) ++ { ++ goto tryARRAYEXPR; ++ } ++ } ++ ++ parameter_def[ newEnv] ++ ) ++ ) ++ { ++ // push environment onto call stack ++ callStack.push_back(newEnv); ++ ++ // make the call ++ res=call_fun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ ++ tryARRAYEXPR:; ++ //_t = mark; ++ ++ ProgNodeP dot = mark; ++ // match(antlr::RefAST(_t),DOT); ++ _t = mark->getFirstChild(); ++ ++ SizeT nDot=dot->nDot; ++ auto_ptr aD( new DotAccessDescT(nDot+1)); ++ ++ r_dot_array_expr(_t, aD.get()); ++ _t = _retTree; ++ for (; _t != NULL;) { ++ tag_array_expr(_t, aD.get()); ++ _t = _retTree; ++ } ++ res= aD->Resolve(); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ ; ++ ++ ++ ++l_arrayexpr_mfcall [BaseGDL* right] returns [BaseGDL** res] ++{ ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(callStack); ++ BaseGDL *self; ++ EnvUDT* newEnv; ++ ProgNodeP startNode = _t; ++} ++ : #(ARRAYEXPR_MFCALL ++ { ++ ProgNodeP mark = _t; ++ _t = _t->getNextSibling(); // skip DOT ++ } ++ ++ self=expr mp2:IDENTIFIER ++ ++ { ++ auto_ptr self_guard(self); ++ ++ try { ++ newEnv=new EnvUDT( self, mp2, "", true); ++ self_guard.release(); ++ } ++ catch( GDLException& ex) ++ { ++ goto tryARRAYEXPR; ++ } ++ } ++ ++ parameter_def[ newEnv] ++ ) ++ { ++ // push environment onto call stack ++ callStack.push_back(newEnv); ++ ++ // make the call ++ res=call_lfun(static_cast( ++ newEnv->GetPro())->GetTree()); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ ++ tryARRAYEXPR:; ++ _t = mark; ++ } ++ #(dot:DOT // struct assignment ++ { ++ SizeT nDot=dot->nDot; ++ auto_ptr aD( new DotAccessDescT(nDot+1)); ++ } ++ l_dot_array_expr[ aD.get()] ++ (tag_array_expr[ aD.get()] /* nDot times*/ )+ ++ ) ++ { ++ if( right == NULL) ++ throw GDLException( _t, ++ "Struct expression not allowed in this context.", ++ true,false); ++ ++ aD->Assign( right); + +-lib_function_call_retnew returns[ BaseGDL* res] +-{ +- // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack +- StackGuard guard(callStack); ++ res=NULL; + +- ProgNodeP rTree = _t->getNextSibling(); ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ ; + +-// match(antlr::RefAST(_t),FCALL_LIB_RETNEW); +-// _t = _t->getFirstChild(); +-// match(antlr::RefAST(_t),IDENTIFIER); +- EnvT* newEnv=new EnvT( _t, _t->libFun);//libFunList[fl->funIx]); + +-// _t =_t->getFirstChild(); +- +-// EnvT* newEnv=new EnvT( fl, fl->libFun);//libFunList[fl->funIx]); +- +- parameter_def(_t->getFirstChild(), newEnv); +- +- // push id.pro onto call stack +- callStack.push_back(newEnv); +- // make the call +- //BaseGDL* +- res=static_cast(newEnv->GetPro())->Fun()(newEnv); +- //*** MUST always return a defined expression +- +- _retTree = rTree; +- return res; +-} +- : #(fll:FCALL_LIB_RETNEW //fll:IDENTIFIER +- { +- //EnvT* +- newEnv=new EnvT( fll, fll->libFun);//libFunList[fl->funIx]); +- } +- parameter_def[ newEnv] +- { +- // push id.pro onto call stack +- callStack.push_back(newEnv); +- // make the call +- res=static_cast(newEnv->GetPro())->Fun()(newEnv); +- //*** MUST always return a defined expression +- } ++ ++l_arrayexpr_mfcall_as_arrayexpr [BaseGDL* right] returns [BaseGDL** res] ++ : #(ARRAYEXPR_MFCALL ++ #(dot:DOT // struct assignment ++ { ++ SizeT nDot=dot->nDot; ++ auto_ptr aD( new DotAccessDescT(nDot+1)); ++ } ++ l_dot_array_expr[ aD.get()] ++ (tag_array_expr[ aD.get()] /* nDot times*/ )+ ++ ) + ) +- ; ++ { ++ if( right == NULL) ++ throw GDLException( _t, ++ "Struct expression not allowed in this context.", ++ true,false); ++ ++ aD->Assign( right); + ++ res=NULL; ++ } ++ ; + +-function_call returns[ BaseGDL* res] ++// function call can be l_values (within (#EXPR ...) only) ++l_arrayexpr_mfcall_as_mfcall returns[ BaseGDL** res] + { + // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack + StackGuard guard(callStack); + BaseGDL *self; + EnvUDT* newEnv; + } +- : ( +- ( #(MFCALL +- self=expr mp:IDENTIFIER +- { +- auto_ptr self_guard(self); +- +- newEnv=new EnvUDT( self, mp); +- +- self_guard.release(); +- } +- parameter_def[ newEnv] +- ) +- | #(MFCALL_PARENT +- self=expr parent:IDENTIFIER p:IDENTIFIER ++ : #(ARRAYEXPR_MFCALL + { ++ _t = _t->getNextSibling(); // skip DOT ++ } ++ ++ self=expr mp2:IDENTIFIER ++ { + auto_ptr self_guard(self); + +- newEnv=new EnvUDT( self, p, +- parent->getText()); ++ newEnv=new EnvUDT( self, mp2, "", true); + + self_guard.release(); + } + parameter_def[ newEnv] +- ) +- | #(f:FCALL //f:IDENTIFIER +- { +- SetFunIx( f); +- +- newEnv=new EnvUDT( f, funList[f->funIx]); +- } +- parameter_def[ newEnv] +- ) + ) + { + // push environment onto call stack + callStack.push_back(newEnv); + + // make the call +- res=call_fun(static_cast(newEnv->GetPro())->GetTree()); +- } +- ) ++ res=call_lfun(static_cast( ++ newEnv->GetPro())->GetTree()); ++ } + ; + + // function call can be l_values (within (#EXPR ...) only) +@@ -3627,6 +4560,60 @@ + ; + + // the environment must be on the callstack ++parameter_def_n_elements [EnvBaseT* actEnv] ++{ ++ auto_ptr guard(actEnv); ++ _retTree = _t; ++// bool interruptEnableIn = interruptEnable; ++ if( _retTree != NULL) ++ { ++ if( _retTree->getType() == REF || ++ _retTree->getType() == REF_EXPR || ++ _retTree->getType() == REF_CHECK || ++ _retTree->getType() == PARAEXPR) ++ { ++ try{ ++// interruptEnable = false; ++ static_cast(_retTree)->Parameter( actEnv); ++// interruptEnable = interruptEnableIn; ++ } ++ catch( GDLException& e) ++ { ++// interruptEnable = interruptEnableIn; ++ if( actEnv->NParam() == 0) ++ { ++ BaseGDL* nP = NULL; ++ actEnv->SetNextPar( nP); ++ } ++ } ++ } ++ } ++ try{ ++ while(_retTree != NULL) { ++ static_cast(_retTree)->Parameter( actEnv); ++ } ++ } ++ catch( GDLException& e) ++ { ++ // update line number, currently set to caller->CallingNode() ++ // because actEnv is not on the stack yet, ++ // report caller->Pro()'s name is ok, because we are not inside ++ // the call yet ++ e.SetErrorNodeP( actEnv->CallingNode()); ++ throw e; ++ } ++ ++ actEnv->Extra(); // expand _EXTRA ++ ++ guard.release(); ++ ++ return; ++} ++ : #(KEYDEF_REF_EXPR IDENTIFIER //ref_parameter ++ ) ++; ++ ++// the environment must be on the callstack + parameter_def [EnvBaseT* actEnv] + { + auto_ptr guard(actEnv); +@@ -3653,246 +4640,10 @@ + guard.release(); + + return; +- +-// BaseGDL* kval = NULL; +-// BaseGDL* pval; +-// BaseGDL** kvalRef; +-// BaseGDL** pvalRef; +- +-// // while(_t != NULL) { +-// // switch ( _t->getType()) { +-// // case KEYDEF_REF: +-// // { +-// // ProgNodeP __t160 = _t; +- +-// // // match(antlr::RefAST(_t),KEYDEF_REF); +-// // _t = _t->getFirstChild(); +-// // knameR = _t; +-// // // match(antlr::RefAST(_t),IDENTIFIER); +-// // _t = _t->getNextSibling(); +-// // kvalRef=ref_parameter(_t); +-// // _t = _retTree; +-// // // pass reference +-// // actEnv->SetKeyword( knameR->getText(), kvalRef); +- +-// // _t = __t160; +-// // _t = _t->getNextSibling(); +-// // break; +-// // } +-// // case KEYDEF_REF_EXPR: +-// // { +-// // ProgNodeP __t161 = _t; +- +-// // // match(antlr::RefAST(_t),KEYDEF_REF_EXPR); +-// // _t = _t->getFirstChild(); +-// // knameE = _t; +-// // // match(antlr::RefAST(_t),IDENTIFIER); +-// // _t = _t->getNextSibling(); +-// // kval=expr(_t); +-// // _t = _retTree; +-// // kvalRef=ref_parameter(_t); +-// // _t = _retTree; +-// // // pass reference +-// // delete kval; +-// // actEnv->SetKeyword( knameE->getText(), kvalRef); +- +-// // _t = __t161; +-// // _t = _t->getNextSibling(); +-// // break; +-// // } +-// // case KEYDEF: +-// // { +-// // ProgNodeP __t162 = _t; +- +-// // // match(antlr::RefAST(_t),KEYDEF); +-// // _t = _t->getFirstChild(); +-// // kname = _t; +-// // // match(antlr::RefAST(_t),IDENTIFIER); +-// // _t = _t->getNextSibling(); +-// // kval=expr(_t); +-// // _t = _retTree; +-// // // pass value +-// // actEnv->SetKeyword( kname->getText(), kval); +- +-// // _t = __t162; +-// // _t = _t->getNextSibling(); +-// // break; +-// // } +-// // case REF: +-// // { +-// // ProgNodeP __t163 = _t; +- +-// // // match(antlr::RefAST(_t),REF); +-// // _t = _t->getFirstChild(); +-// // pvalRef=ref_parameter(_t); +-// // _t = _retTree; +-// // // pass reference +-// // actEnv->SetNextPar(pvalRef); +- +-// // _t = __t163; +-// // _t = _t->getNextSibling(); +-// // break; +-// // } +-// // case REF_EXPR: +-// // { +-// // ProgNodeP __t164 = _t; +- +-// // // match(antlr::RefAST(_t),REF_EXPR); +-// // _t = _t->getFirstChild(); +-// // pval=expr(_t); +-// // _t = _retTree; +-// // pvalRef=ref_parameter(_t); +-// // _t = _retTree; +-// // // pass reference +-// // delete pval; +-// // actEnv->SetNextPar(pvalRef); +- +-// // _t = __t164; +-// // _t = _t->getNextSibling(); +-// // break; +-// // } +-// // case KEYDEF_REF_CHECK: +-// // { +-// // ProgNodeP __t165 = _t; +- +-// // // match(antlr::RefAST(_t),KEYDEF_REF_CHECK); +-// // _t = _t->getFirstChild(); +-// // knameCk = _t; +-// // // match(antlr::RefAST(_t),IDENTIFIER); +-// // _t = _t->getNextSibling(); +-// // kval=check_expr(_t); +-// // _t = _retTree; +- +-// // kvalRef = callStack.back()->GetPtrTo( kval); +-// // if( kvalRef != NULL) +-// // { // pass reference +-// // actEnv->SetKeyword(knameCk->getText(), kvalRef); +-// // } +-// // else +-// // { // pass value +-// // actEnv->SetKeyword(knameCk->getText(), kval); +-// // } +- +-// // _t = __t165; +-// // _t = _t->getNextSibling(); +-// // break; +-// // } +-// // case REF_CHECK: +-// // { +-// // ProgNodeP __t166 = _t; +- +-// // // match(antlr::RefAST(_t),REF_CHECK); +-// // _t = _t->getFirstChild(); +-// // pval=check_expr(_t); +-// // _t = _retTree; +- +-// // pvalRef = callStack.back()->GetPtrTo( pval); +-// // if( pvalRef != NULL) +-// // { // pass reference +-// // actEnv->SetNextPar( pvalRef); +-// // } +-// // else +-// // { // pass value +-// // actEnv->SetNextPar( pval); +-// // } +- +-// // _t = __t166; +-// // _t = _t->getNextSibling(); +-// // break; +-// // } +-// // default: +-// // { +-// // pval=expr(_t); +-// // _t = _retTree; +- +-// // // pass value +-// // actEnv->SetNextPar(pval); +- +-// // break; +-// // } +- +-// // } // switch +-// // } // while +- +- +-// // actEnv->Extra(); // expand _EXTRA +-// // guard.release(); +- +-// // _retTree = _t; +- +-// // return; + } + : ( #(KEYDEF_REF IDENTIFIER //ref_parameter +-// { // pass reference +-// actEnv->SetKeyword( knameR->getText(), kvalRef); +-// } + ) +-// | #(KEYDEF_REF_EXPR IDENTIFIER +-// // execute ++ and assignment +-// //expr +-// //ref_parameter +-// // { // pass reference +-// // delete kval; +-// // actEnv->SetKeyword( knameE->getText(), kvalRef); +-// // } +-// ) +-// | #(KEYDEF IDENTIFIER //expr +-// // { // pass value +-// // actEnv->SetKeyword( kname->getText(), kval); +-// // } +-// ) +-// | #(REF ref_parameter +-// // { // pass reference +-// // actEnv->SetNextPar(pvalRef); +-// // } +-// ) +-// | #(REF_EXPR +-// // execute ++ and assignment +-// //expr +-// //ref_parameter +-// // { // pass reference +-// // delete pval; +-// // actEnv->SetNextPar(pvalRef); +-// // } +-// ) +-// | //expr +-// // { +-// // // pass value +-// // actEnv->SetNextPar(pval); +-// // } +-// | #(KEYDEF_REF_CHECK IDENTIFIER +-// //check_expr +-// // { +-// // kvalRef = callStack.back()->GetPtrTo( kval); +-// // if( kvalRef != NULL) +-// // { // pass reference +-// // actEnv->SetKeyword(knameCk->getText(), kvalRef); +-// // } +-// // else +-// // { // pass value +-// // actEnv->SetKeyword(knameCk->getText(), kval); +-// // } +-// // } +-// ) +-// | #(REF_CHECK +-// //check_expr +-// // { +-// // pvalRef = callStack.back()->GetPtrTo( pval); +-// // if( pvalRef != NULL) +-// // { // pass reference +-// // actEnv->SetNextPar( pvalRef); +-// // } +-// // else +-// // { // pass value +-// // actEnv->SetNextPar( pval); +-// // } +-// // } +-// ) +- )* +-// { +-// actEnv->Extra(); // expand _EXTRA +-// guard.release(); +-// } ++ ) + ; + + arrayindex_list returns [ArrayIndexListT* aL] +@@ -3929,13 +4680,13 @@ + case VARPTR: + { + s=indexable_expr(_t); +- _t = _retTree; ++// _t = _retTree; + break; + } + case FCALL_LIB: + { +- s=check_expr(_t); +- _t = _retTree; ++ s=lib_function_call(_t); ++// _t = _retTree; + + if( !callStack.back()->Contains( s)) + exprList.push_back( s); +@@ -3945,7 +4696,7 @@ + default: + { + s=indexable_tmp_expr(_t); +- _t = _retTree; ++// _t = _retTree; + exprList.push_back( s); + break; + } +@@ -3955,6 +4706,8 @@ + ixExprList.push_back( s); + if( ixExprList.size() == nExpr) + break; // allows some manual tuning ++ ++ _t = _t->getNextSibling(); + } + + aL->Init( ixExprList); +@@ -3983,7 +4736,7 @@ + // } + ( + ( s=indexable_expr +- | s=check_expr ++ | s=lib_function_call + { + if( !callStack.back()->Contains( s)) + exprList.push_back( s); +@@ -4004,241 +4757,3 @@ + // } + ; + +-// // and array_def is a primary expression +-// array_def returns [BaseGDL* res] +-// { +-// DType cType=UNDEF; // conversion type +-// SizeT maxRank=0; +-// BaseGDL* e; +-// ExprListT exprList; +-// BaseGDL* cTypeData; +-// } +-// : #(a:ARRAYDEF +-// (e=expr +-// { +-// // add first (this way it will get cleaned up anyway) +-// exprList.push_back(e); +- +-// DType ty=e->Type(); +-// if( ty == UNDEF) +-// { +-// throw GDLException( _t, "Variable is undefined: "+ +-// Name(e)); +-// } +-// if( cType == UNDEF) +-// { +-// cType=ty; +-// cTypeData=e; +-// } +-// else +-// { +-// if( cType != ty) +-// { +-// if( DTypeOrder[ty] > 100 || DTypeOrder[cType] > 100) // struct, ptr, object +-// { +-// throw +-// GDLException( _t, e->TypeStr()+ +-// " is not allowed in this context."); +-// } +- +-// // update order if larger type (or types are equal) +-// if( DTypeOrder[ty] >= DTypeOrder[cType]) +-// { +-// cType=ty; +-// cTypeData=e; +-// } +-// } +-// if( ty == STRUCT) +-// { +-// // check for struct compatibility +-// DStructDesc* newS= +-// static_cast(e)->Desc(); +-// DStructDesc* oldS= +-// static_cast(cTypeData)->Desc(); +- +-// // *** here (*newS) != (*oldS) must be set when +-// // unnamed structs not in struct list anymore +-// // WRONG! This speeds up things for named structs +-// // unnamed structs all have their own desc +-// // and thus the next is always true for them +-// if( newS != oldS) +-// { +-// // if( (*newS) == (*oldS)) +-// // { +-// // Not needed, CatArray puts the right descriptor +-// // // different structs with same layout +-// // // replace desc with first one +-// // if( oldS->IsUnnamed()) +-// // oldS = new DStructDesc( oldS); +- +-// // static_cast(e)->SetDesc( oldS); +-// // } +-// // else +- +-// if( (*newS) != (*oldS)) +-// throw GDLException( _t, +-// "Conflicting data structures: "+ +-// Name(cTypeData)+", "+Name(e)); +-// } +-// } +-// } +- +-// // memorize maximum Rank +-// SizeT rank=e->Rank(); +-// if( rank > maxRank) maxRank=rank; +-// } +-// )+ +-// ) +-// { +-// res=cTypeData->CatArray(exprList,a->arrayDepth,maxRank); +-// } +-// ; +- +- +-// named_struct_def returns[ BaseGDL* res] +-// { +-// DStructDesc* nStructDesc; +-// auto_ptr nStructDescGuard; +-// BaseGDL* e; +-// BaseGDL* ee; +-// } +-// : #(n:NSTRUC id:IDENTIFIER +-// { +-// // definedStruct: no tags present +-// if( n->definedStruct == 1) GetStruct( id->getText(), _t); +- +-// // find struct 'id' (for compatibility check) +-// DStructDesc* oStructDesc= +-// FindInStructList( structList, id->getText()); +- +-// if( oStructDesc == NULL || oStructDesc->NTags() > 0) +-// { +-// // not defined at all yet (-> define now) +-// // or completely defined (-> define now and check equality) +-// nStructDesc= new DStructDesc( id->getText()); +- +-// // guard it +-// nStructDescGuard.reset( nStructDesc); +-// } +-// else +-// { // NTags() == 0 +-// // not completely defined (only name in list) +-// nStructDesc= oStructDesc; +-// } +- +-// // the instance variable +-// // DStructGDL* instance= new DStructGDL( nStructDesc, +-// // dimension(1)); +-// DStructGDL* instance= new DStructGDL( nStructDesc); +- +-// auto_ptr instance_guard(instance); +-// } +- +-// // PROBLEM: both the descriptor AND the instance must be defined +-// ( ee=expr +-// { +-// // also adds to descriptor, grabs +-// instance->NewTag( +-// oStructDesc->TagName( nStructDesc->NTags()), +-// ee); +-// } +-// | i:IDENTIFIER e=expr // e is a new BaseGDL* +-// { +-// // also adds to descriptor, grabs +-// instance->NewTag( i->getText(), e); +-// } +-// | INHERITS ii:IDENTIFIER +-// // INHERITS triggers read/compile/interpret of +-// // IDENTIFIER__define.pro +-// // if the struct named IDENTIFIER is not already known +-// { +-// DStructDesc* inherit=GetStruct( ii->getText(), _t); +- +-// // nStructDesc->AddParent( inherit); +-// instance->AddParent( inherit); +-// } +- +-// )+ +- +-// { +-// // inherit refers to nStructDesc, in case of error both have to +-// // be freed here +-// if( oStructDesc != NULL) +-// { +-// if( oStructDesc != nStructDesc) +-// { +-// oStructDesc->AssureIdentical(nStructDesc); +-// instance->DStructGDL::SetDesc(oStructDesc); +-// //delete nStructDesc; // auto_ptr +-// } +-// } +-// else +-// { +-// // release from guard (if not NULL) +-// nStructDescGuard.release(); +- +-// // insert into struct list +-// structList.push_back(nStructDesc); +-// } +- +-// instance_guard.release(); +-// res=instance; +-// } +-// ) +-// ; +- +-// unnamed_struct_def returns[ BaseGDL* res] +-// { +-// // don't forget the struct in extrat.cpp if you change something here +-// // "$" as first char in the name is necessary +-// // as it defines unnnamed structs (see dstructdesc.hpp) +-// DStructDesc* nStructDesc = new DStructDesc( "$truct"); +- +-// // instance takes care of nStructDesc since it is unnamed +-// // DStructGDL* instance = new DStructGDL( nStructDesc, dimension(1)); +-// DStructGDL* instance = new DStructGDL( nStructDesc); +-// auto_ptr instance_guard(instance); +- +-// BaseGDL* e; +-// } +-// : #(STRUC +-// ( si:IDENTIFIER e=expr +-// { +-// // also adds to descriptor, grabs +-// instance->NewTag( si->getText(), e); +-// } +-// )+ +- +-// { +-// // DStructDesc* oStructDesc=nStructDesc->FindEqual( structList); +-// // if( oStructDesc != NULL) +-// // { +-// // instance->SetDesc(oStructDesc); +-// // //delete nStructDesc; // auto_ptr +-// // } +-// // else +-// // { +-// // // insert into struct list +-// // structList.push_back( nStructDesc.release()); +-// // } +- +-// instance_guard.release(); +-// res=instance; +-// } +-// ) +-// ; +- +-// // only from named structs +-// struct_def returns[ BaseGDL* res] +-// : res=named_struct_def +-// | res=unnamed_struct_def +-// | #(NSTRUC_REF idRef:IDENTIFIER +-// { +-// // find struct 'id' +-// // returns it or throws an exception +-// DStructDesc* dStruct=GetStruct( idRef->getText(), _t); +- +-// res=new DStructGDL( dStruct, dimension(1)); +-// } +-// ) +-// ; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdl.cpp cvs/gdl/src/gdl.cpp +--- gdl-0.9rc4/src/gdl.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdl.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -191,7 +191,7 @@ + } + } + +- if (statement.length() > 0 && batch_files.size() > 0) ++ if (0&&statement.length() > 0 && batch_files.size() > 0) + { + cerr << argv[0] << ": " << "-e option cannot be specified with batch files" << endl; + return 0; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlc.tree.g cvs/gdl/src/gdlc.tree.g +--- gdl-0.9rc4/src/gdlc.tree.g 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlc.tree.g 2010-04-22 09:50:41.000000000 -0600 +@@ -120,21 +120,29 @@ + { + if( LoopVar( lN)) + { +- Warning( "Warning: Assignment to FOR loop variable detected."); ++ Warning( "Warning: Assignment to loop variable detected."); + } + int lT = lN->getType(); + if( lT == FCALL || lT == MFCALL || lT == MFCALL_PARENT || +- lT == FCALL_LIB || ++ lT == FCALL_LIB || ++// lT == FCALL_LIB_N_ELEMENTS || + lT == FCALL_LIB_RETNEW || + lT == MFCALL_LIB || + lT == MFCALL_LIB_RETNEW || + lT == MFCALL_PARENT_LIB || + lT == MFCALL_PARENT_LIB_RETNEW || +- lT == DEREF || lT == VAR || lT == VARPTR) ++ lT == DEREF || lT == VAR || lT == VARPTR ++ ) + { + aN->setType( ASSIGN_REPLACE); + aN->setText( "r="); + } ++ if( lT == ARRAYEXPR_MFCALL) // is MFCALL or DOT ++ { ++ aN->setType( ASSIGN_ARRAYEXPR_MFCALL); ++ aN->setText( "?="); ++ } ++ + } + + bool SelfAssignment( RefDNode& lN, RefDNode& rN) +@@ -379,7 +387,7 @@ + + + caseswitch_body +- : #(BLOCK expr //labeled_expr ++ : #(b:BLOCK { #b->setType(CSBLOCK);#b->setText("csblock");} expr //labeled_expr + (statement_list)? + ) + | #(ELSEBLK +@@ -408,13 +416,27 @@ + ; + + block +- : #(BLOCK (statement_list)?) ++{ ++// int labelStart = comp.NDefLabel(); ++} ++ : #(b:BLOCK (statement_list)?) ++ { ++// #b->SetLabelRange( labelStart, comp.NDefLabel()); ++ } + ; + + unblock! +- : #(BLOCK ++ : #(b:BLOCK + ( s:statement_list { #unblock = #s;} +- | ++ | { #unblock = #b;} ++ ) ++ ) ++ ; ++ ++unblock_empty! ++ : #(b:BLOCK ++ ( s:statement_list { #unblock_empty = #s;} ++ | + ) + ) + ; +@@ -428,7 +450,8 @@ + // | assign_expr + | comp_assign_expr + | procedure_call +- | for_statement ++ | for_statement ++ | foreach_statement + | repeat_statement + | while_statement + | jump_statement +@@ -440,7 +463,7 @@ + | block + | #(DEC expr) //unbrace_expr) + | #(INC expr) //unbrace_expr) +- | BREAK // only in loops or switch_statement ++ | BREAK // only in loops or case/switch_statement + | CONTINUE // only in loops + ; + +@@ -448,7 +471,7 @@ + { + int labelStart = comp.NDefLabel(); + } +- : #(r:REPEAT b:unblock e:expr) ++ : #(r:REPEAT b:unblock_empty e:expr) + { + #r->SetLabelRange( labelStart, comp.NDefLabel()); + #repeat_statement=#( r, e, b); +@@ -498,7 +521,29 @@ + } + )? + // for_block +- unblock ++ unblock_empty ++ ) ++ { ++ #f->SetLabelRange( labelStart, comp.NDefLabel()); ++ } ++ ; ++ ++foreach_statement //! ++{ ++ StackSizeGuard guard( loopVarStack); ++ int labelStart = comp.NDefLabel(); ++} ++ : #(f:FOREACH i:IDENTIFIER ++ { ++ #i->setType(VAR); ++ comp.Var(#i); ++ ++ loopVarStack.push_back(#i->getText()); ++ } ++ expr ++// for_block ++ unblock_empty ++// unblock + ) + { + #f->SetLabelRange( labelStart, comp.NDefLabel()); +@@ -526,11 +571,24 @@ + { + if( comp.IsFun()) + { +- if( !exprThere) throw GDLException( _t, ++ if( !exprThere) throw GDLException( r, + "Return statement in functions " + "must have 1 value."); ++ ++// // wrong: this is only true for l_function as return value ++// // a ARRAYEXPR_MFCALL can only be a MFCALL here -> change tree ++// if( #e->getType() == ARRAYEXPR_MFCALL) ++// { ++// #e->setType( MFCALL); ++// #e->setText( "mfcall"); ++// RefDNode mfc; ++// mfc = #e->getFirstChild(); ++// mfc = mfc->getNextSibling(); ++// #e->setFirstChild( antlr::RefAST(mfc)); ++// } ++ + #jump_statement=#([RETF,"retf"],e); +- #jump_statement->SetLine(r->getLine()); ++ #jump_statement->SetLine(r->getLine()); + } + else + { +@@ -561,20 +619,28 @@ + + if_statement!// + { +- int labelStart = comp.NDefLabel(); ++// int labelStart = comp.NDefLabel(); ++ RefDNode block; + } + : #(i:IF e:expr s1:statement + ( + { +- #i->SetLabelRange( labelStart, comp.NDefLabel()); ++// #i->SetLabelRange( labelStart, comp.NDefLabel()); + #if_statement=#(i,e,s1); + } + | s2:statement + { + #i->setText( "if_else"); + #i->setType( IF_ELSE); +- #i->SetLabelRange( labelStart, comp.NDefLabel()); +- #if_statement=#(i,e,s1,s2); ++// #i->SetLabelRange( labelStart, comp.NDefLabel()); ++ if( #s1->getType() != BLOCK) ++ { ++ #block = astFactory->create(BLOCK,"block"); ++ #block->SetLine( #s1->getLine()); ++ #if_statement=#(i,e, #(block, s1), s2); ++ } ++ else ++ #if_statement=#(i,e,s1,s2); + } + ) + ) +@@ -637,10 +703,13 @@ + else + { + int t = #k->getType(); +- if( t == FCALL_LIB || t == MFCALL_LIB || +- t == MFCALL_PARENT_LIB || +- t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || +- t == MFCALL_PARENT_LIB_RETNEW) ++ if( t == FCALL_LIB || t == MFCALL_LIB || //t == FCALL_LIB_N_ELEMENTS || ++ ++ t == MFCALL_PARENT_LIB //|| ++// t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || ++// t == MFCALL_PARENT_LIB_RETNEW //|| ++// t == ARRARYEXPR_MFCALL_LIB // MFCALL_LIB or VAR or DEREF ++ ) + { + #d=#[KEYDEF_REF_CHECK,"keydef_ref_check"]; + #key_parameter=#(d,i,k); +@@ -680,10 +749,12 @@ + else + { + int t = #e->getType(); +- if( t == FCALL_LIB || t == MFCALL_LIB || +- t == MFCALL_PARENT_LIB || +- t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || +- t == MFCALL_PARENT_LIB_RETNEW) ++ if( t == FCALL_LIB || t == MFCALL_LIB || //t == FCALL_LIB_N_ELEMENTS || ++ t == MFCALL_PARENT_LIB //|| ++// t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || ++// t == MFCALL_PARENT_LIB_RETNEW ++// t == ARRARYEXPR_MFCALL_LIB // MFCALL_LIB or VAR or DEREF ++ ) + { + // something like: CALLAPRO,reform(a,/OVERWRITE) + #pos_parameter=#([REF_CHECK,"ref_check"],e); +@@ -1140,11 +1211,12 @@ + + // system variables have as variable ptr NULL initially + sysvar!// +- : #(SYSVAR i:SYSVARNAME) ++ : #(s:SYSVAR i:SYSVARNAME) + { + std::string sysVarName = i->getText(); + // here we create the real sysvar node + #sysvar=astFactory->create(SYSVAR, sysVarName.substr(1)); ++ #sysvar->SetLine(s->getLine()); + // #sysvar=#[SYSVAR,i->getText()]; + comp.SysVar(#sysvar); // sets var to NULL + } +@@ -1155,23 +1227,23 @@ + // VARPTR for common block variables with a ptr to the + // variable in the common block + var!// +- : #(VAR i:IDENTIFIER) ++ : #(v:VAR i:IDENTIFIER) + { + #var=astFactory->create(VAR,i->getText()); ++ #var->SetLine(v->getLine()); + // #var=#[VAR,i->getText()]; + comp.Var(#var); + } + ; + +-// out parameter_def_list is an expression list here +-arrayindex_list_to_expression_list! // ??? ++arrayindex_list_to_parameter_list! // ??? + //{ + // RefDNode variable; + //} +- : (#(ARRAYIX e:pos_parameter) ++ : (options {greedy=true;}: #(ARRAYIX e:pos_parameter) + { +- #arrayindex_list_to_expression_list= +- #(NULL, arrayindex_list_to_expression_list, e); ++ #arrayindex_list_to_parameter_list= ++ #(NULL, arrayindex_list_to_parameter_list, e); + } + )+ + ; +@@ -1193,7 +1265,7 @@ + } + + ( { isVar}? al:arrayindex_list +- | el:arrayindex_list_to_expression_list ++ | el:arrayindex_list_to_parameter_list + ) + { + if( !isVar) +@@ -1206,17 +1278,17 @@ + #id->SetLibFun( libFunList[i]); + if( libFunList[ i]->RetNew()) + { +- #id->setType( FCALL_LIB_RETNEW); +- #arrayexpr_fn= +- #( id, el); +-// #([/*FCALL_LIB_RETNEW,"fcall_lib_retnew"],*/ id, el); ++ #id->setType( FCALL_LIB_RETNEW); ++ #arrayexpr_fn = ++ #( id, el); ++// #([/*FCALL_LIB_RETNEW,"fcall_lib_retnew"],*/ id, el); + } + else + { +- #id->setType( FCALL_LIB); +- #arrayexpr_fn= +- #( id, el); +-// #(/*[FCALL_LIB,"fcall_lib"],*/ id, el); ++ #id->setType( FCALL_LIB); ++ #arrayexpr_fn = ++ #( id, el); ++// #(/*[FCALL_LIB,"fcall_lib"],*/ id, el); + } + } + else +@@ -1246,38 +1318,111 @@ + ) + ; + ++ ++ ++arrayexpr_mfcall!// ++ : #(a:ARRAYEXPR_MFCALL ++ { ++ RefDNode mark = _t; // mark ++ } ++ e:expr i:IDENTIFIER //al:arrayindex_list ++ { ++ bool success = true; ++ RefDNode #first; ++ try { ++ arrayindex_list(_t); ++ ++ RefDNode al = returnAST; ++ RefDNode #ae = #([ARRAYEXPR,"arrayexpr"], #i, al); ++ ++ if( e->getType() == DOT) ++ { ++ int nDot = #e->GetNDot(); ++ #e->SetNDot( ++nDot); ++ ++ #e->addChild( #ae); ++ ++ #first = #e; ++ } ++ else ++ { ++ RefDNode #dot = #([DOT,"."], e, ae); ++ #dot->SetNDot( 1); ++ ++ #first = #dot; ++ } ++ } ++ catch( GDLException& ex) ++ { ++ Message( "Ambiguity resolved: member function call " ++ "due to invalid array index."); ++ ++ success = false; ++ ++ #a->setType( MFCALL); ++ #a->setText( "mfcall"); ++ } ++ ++ _t = mark; // rewind to parse again ++ } ++ e2:expr i2:IDENTIFIER a2:arrayindex_list_to_parameter_list ++ { ++ if( success) ++ #arrayexpr_mfcall = #(a, first, e2, i2, a2); ++ else ++ #arrayexpr_mfcall = #(a, e2, i2, a2); ++ } ++ ++ ) ++ ; ++ + // only here a function call is ok also + primary_expr + { + int dummy; ++RefDNode mark; + } + : assign_expr +- | comp_assign_expr ++ | comp_assign_expr ++ | arrayexpr_mfcall + | #(MFCALL expr IDENTIFIER parameter_def + ) + | #(MFCALL_PARENT expr IDENTIFIER + IDENTIFIER parameter_def + ) ++// | #(nEl:FCALL_LIB_N_ELEMENTS id2:IDENTIFIER! parameter_def ++// ) + | #(f:FCALL id:IDENTIFIER! parameter_def + { + // first search library functions + int i=LibFunIx(id->getText()); + if( i != -1) + { ++ // N_ELEMENTS must handle exceptions during parameter evaluation ++// if( StrUpCase( #id->getText()) == "N_ELEMENTS") ++// { ++// #f->setType(FCALL_LIB_N_ELEMENTS); ++// #f->setText(#id->getText()); ++// #f->SetLibFun( libFunList[i]); ++// // #id->SetFunIx(i); ++// } ++// else ++ { + if( libFunList[ i]->RetNew()) + { +- #f->setType(FCALL_LIB_RETNEW); +- #f->setText(#id->getText()); +- #f->SetLibFun( libFunList[i]); ++ #f->setType(FCALL_LIB_RETNEW); ++ #f->setText(#id->getText()); ++ #f->SetLibFun( libFunList[i]); + // #id->SetFunIx(i); + } + else + { +- #f->setType(FCALL_LIB); +- #f->setText(#id->getText()); +- #f->SetLibFun( libFunList[i]); ++ #f->setType(FCALL_LIB); ++ #f->setText(#id->getText()); ++ #f->SetLibFun( libFunList[i]); + // #id->SetFunIx(i); + } ++ } + } + else + { +@@ -1404,4 +1549,3 @@ + | #(DEREF expr) // deref + | op_expr + ; +- +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlgstream.cpp cvs/gdl/src/gdlgstream.cpp +--- gdl-0.9rc4/src/gdlgstream.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlgstream.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -15,6 +15,9 @@ + * * + ***************************************************************************/ + ++// try because of segfault in magick ++// #include "gdlgstream.hpp" ++ + #include "includefirst.hpp" + + #include +@@ -25,6 +28,8 @@ + + using namespace std; + ++// bool GDLGStream::plstreamInitCalled = false; ++ + // void PLPlotAbortHandler(const char *c) + // { + // cout << "PLPlot abort handler: " << c << endl; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlgstream.hpp cvs/gdl/src/gdlgstream.hpp +--- gdl-0.9rc4/src/gdlgstream.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlgstream.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -31,6 +31,8 @@ + class GDLGStream: public plstream + { + void init(); // prevent plstream::init from being called directly ++ ++// static bool plstreamInitCalled; + + protected: + bool valid; +@@ -38,28 +40,48 @@ + public: + GDLGStream( int nx, int ny, + const char *driver, +- const char *file=NULL): +- plstream( nx, ny, driver, file), valid( true) ++ const char *file=NULL) ++ : plstream( nx, ny, driver, file) ++ , valid( true) + { ++// std::cerr << "GDLGStream()" << std::endl; + if (!checkPlplotDriver(driver)) + ThrowGDLException(string("PLplot installation lacks the requested driver: ") + driver); + } + + virtual ~GDLGStream() + { ++// std::cerr << "~GDLGStream()" << std::endl; ++// plend(); + } + ++// void PlstreamInit() ++// { ++// if( !plstreamInitCalled) ++// { ++// this->plstream::init(); ++// plstreamInitCalled = true; ++// } ++// } ++ + static bool checkPlplotDriver(const char *driver) + { +- int numdevs_plus_one = 50; ++ int numdevs_plus_one = 64; + #ifdef HAVE_OLDPLPLOT +- char **devlongnames = NULL, **devnames = NULL; ++ char **devlongnames = NULL; ++ char **devnames = NULL; + #else +- const char **devlongnames = NULL, **devnames = NULL; ++ const char **devlongnames = NULL; ++ const char **devnames = NULL; + #endif + ++ static vector devNames;// = NULL; ++ ++// do only once ++if( devNames.empty())// == NULL) ++{ + // acquireing a list of drivers from plPlot +- for (int maxnumdevs = numdevs_plus_one;; numdevs_plus_one = maxnumdevs += 5) ++ for (int maxnumdevs = numdevs_plus_one;; numdevs_plus_one = maxnumdevs += 16) + { + #ifdef HAVE_OLDPLPLOT + devlongnames = static_cast(realloc(devlongnames, maxnumdevs * sizeof(char*))); +@@ -75,17 +97,31 @@ + } + free(devlongnames); // we do not need this information + +- // checking if a given driver is in the list +- bool supported = false; +- for (int i = numdevs_plus_one - 1; i--;) +- { +- if (strcmp(driver, devnames[i]) == 0) +- { +- supported = true; +- } +- } ++// devNames = new std::vector( numdevs_plus_one - 1); ++ for( int i = 0; i < numdevs_plus_one - 1; ++i) ++ devNames.push_back(string(devnames[ i])); ++ + free(devnames); +- return supported; ++} ++ ++// for debug ++std::vector devnamesDbg = devNames; ++ ++return std::find( devNames.begin(), devNames.end(), string( driver)) != devNames.end(); ++ ++// checking if a given driver is in the list ++// bool supported = false; ++// for (int i = numdevs_plus_one - 1; i--;) ++// { ++// ++// if (strcmp(driver, devnames[i]) == 0) ++// { ++// supported = true; ++// break; ++// } ++// } ++// free(devnames); ++// return supported; + } + + static void SetErrorHandlers(); +@@ -96,9 +132,9 @@ + + virtual void eop() { plstream::eop();} + +- virtual void Raise() {} +- virtual void Lower() {} +- virtual void Clear() {} ++ virtual void Raise() {} ++ virtual void Lower() {} ++ virtual void Clear() {} + virtual void Clear( DLong bColor) {} + + bool Valid() { return valid;} +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLInterpreter.cpp cvs/gdl/src/GDLInterpreter.cpp +--- gdl-0.9rc4/src/GDLInterpreter.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLInterpreter.cpp 2010-05-21 10:23:54.409906082 -0600 +@@ -23,37 +23,14 @@ + #define RefAST( xxx) ConvertAST( xxx) /* antlr::RefAST( Ref type) */ + #define match( a, b) /* remove from source */ + +-// optimizations +-// #define constant constantNotOptimized +-// #define interactive interactiveNotOptimized +-// #define statement_list statement_listNotOptimized +-// #define execute executeNotOptimized +-// #define call_fun call_funNotOptimized +-// #define call_lfun call_lfunNotOptimized +-// #define call_pro call_proNotOptimized +-// #define block blockNotOptimized +-// #define expr exprNotOptimized +-// #define l_simple_var l_simple_varNotOptimized +-// #define sys_var sys_varNotOptimized +-// #define sys_var_nocopy sys_var_nocopyNotOptimized +-// #define dot_expr dot_exprNotOptimized +-// #define simple_var simple_varNotOptimized +-// #define ref_parameter ref_parameterNotOptimized +-// #define unnamed_struct_def unnamed_struct_defNotOptimized +-// #define lib_function_call_retnew lib_function_call_retnewNotOptimized +-// #define lib_function_call lib_function_callNotOptimized +-// #define constant_nocopy constant_nocopyNotOptimized +-// #define struct_def struct_defNotOptimized +- +- + using namespace std; + + GDLInterpreter::GDLInterpreter() + : antlr::TreeParser() { + } + +- GDLInterpreter::RetCode GDLInterpreter::interactive(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; ++ RetCode GDLInterpreter::interactive(ProgNodeP _t) { ++ RetCode retCode; + ProgNodeP interactive_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + + for (; _t != NULL;) { +@@ -92,181 +69,260 @@ + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; ++ RetCode GDLInterpreter::statement(ProgNodeP _t) { ++ RetCode retCode; + ProgNodeP statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP a = ProgNodeP(antlr::nullAST); +- ProgNodeP r = ProgNodeP(antlr::nullAST); +- ProgNodeP l = ProgNodeP(antlr::nullAST); +- ProgNodeP m = ProgNodeP(antlr::nullAST); +- ProgNodeP mp = ProgNodeP(antlr::nullAST); +- ProgNodeP p = ProgNodeP(antlr::nullAST); +- ProgNodeP d = ProgNodeP(antlr::nullAST); +- ProgNodeP i = ProgNodeP(antlr::nullAST); +- ProgNodeP o = ProgNodeP(antlr::nullAST); + +- retCode = RC_OK; +- ProgNodeP actPos = _t; ++ // ProgNodeP& actPos = statement_AST_in; + assert( _t != NULL); +- // if( callStack.back()->GetLineNumber() == 0) +- if( _t->getLine() != 0) +- callStack.back()->SetLineNumber( _t->getLine()); ++ ProgNodeP last; ++ _retTree = _t; ++ // if( callStack.back()->GetLineNumber() == 0) ++ // if( _t->getLine() != 0) ++ // callStack.back()->SetLineNumber( _t->getLine()); + + + try { // for error handling ++ ++ do { ++ // if( _t->getLine() != 0) ++ // callStack.back()->SetLineNumber( _t->getLine()); ++ ++ last = _retTree; ++ ++ retCode = last->Run(); // Run() sets _retTree ++ ++ } ++ while( ++ _retTree != NULL && ++ retCode == RC_OK && ++ !(sigControlC && interruptEnable) && ++ (debugMode == DEBUG_CLEAR)); ++ ++ if( _retTree != NULL) ++ last = _retTree; ++ ++ goto afterStatement; ++ + { + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; + switch ( _t->getType()) { + case ASSIGN: + { +- a = _t; ++ ProgNodeP tmp1_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN); + _t = _t->getNextSibling(); +- a->Run(); ++ break; ++ } ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ { ++ ProgNodeP tmp2_AST_in = _t; ++ match(antlr::RefAST(_t),ASSIGN_ARRAYEXPR_MFCALL); ++ _t = _t->getNextSibling(); + break; + } + case ASSIGN_REPLACE: + { +- r = _t; ++ ProgNodeP tmp3_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN_REPLACE); + _t = _t->getNextSibling(); +- r->Run(); + break; + } + case PCALL_LIB: + { +- l = _t; ++ ProgNodeP tmp4_AST_in = _t; + match(antlr::RefAST(_t),PCALL_LIB); + _t = _t->getNextSibling(); +- l->Run(); + break; + } + case MPCALL: + { +- m = _t; ++ ProgNodeP tmp5_AST_in = _t; + match(antlr::RefAST(_t),MPCALL); + _t = _t->getNextSibling(); +- m->Run(); + break; + } + case MPCALL_PARENT: + { +- mp = _t; ++ ProgNodeP tmp6_AST_in = _t; + match(antlr::RefAST(_t),MPCALL_PARENT); + _t = _t->getNextSibling(); +- mp->Run(); + break; + } + case PCALL: + { +- p = _t; ++ ProgNodeP tmp7_AST_in = _t; + match(antlr::RefAST(_t),PCALL); + _t = _t->getNextSibling(); +- p->Run(); + break; + } + case DEC: + { +- d = _t; ++ ProgNodeP tmp8_AST_in = _t; + match(antlr::RefAST(_t),DEC); + _t = _t->getNextSibling(); +- d->Run(); + break; + } + case INC: + { +- i = _t; ++ ProgNodeP tmp9_AST_in = _t; + match(antlr::RefAST(_t),INC); + _t = _t->getNextSibling(); +- i->Run(); + break; + } +- case FOR_STEP: + case FOR: + { +- retCode=for_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp10_AST_in = _t; ++ match(antlr::RefAST(_t),FOR); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case FOR_LOOP: ++ { ++ ProgNodeP tmp11_AST_in = _t; ++ match(antlr::RefAST(_t),FOR_LOOP); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case FOREACH: ++ { ++ ProgNodeP tmp12_AST_in = _t; ++ match(antlr::RefAST(_t),FOREACH); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case FOREACH_LOOP: ++ { ++ ProgNodeP tmp13_AST_in = _t; ++ match(antlr::RefAST(_t),FOREACH_LOOP); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case FOR_STEP: ++ { ++ ProgNodeP tmp14_AST_in = _t; ++ match(antlr::RefAST(_t),FOR_STEP); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case FOR_STEP_LOOP: ++ { ++ ProgNodeP tmp15_AST_in = _t; ++ match(antlr::RefAST(_t),FOR_STEP_LOOP); ++ _t = _t->getNextSibling(); + break; + } + case REPEAT: + { +- retCode=repeat_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp16_AST_in = _t; ++ match(antlr::RefAST(_t),REPEAT); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case REPEAT_LOOP: ++ { ++ ProgNodeP tmp17_AST_in = _t; ++ match(antlr::RefAST(_t),REPEAT_LOOP); ++ _t = _t->getNextSibling(); + break; + } + case WHILE: + { +- retCode=while_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp18_AST_in = _t; ++ match(antlr::RefAST(_t),WHILE); ++ _t = _t->getNextSibling(); + break; + } + case IF: + { +- retCode=if_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp19_AST_in = _t; ++ match(antlr::RefAST(_t),IF); ++ _t = _t->getNextSibling(); + break; + } + case IF_ELSE: + { +- retCode=if_else_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp20_AST_in = _t; ++ match(antlr::RefAST(_t),IF_ELSE); ++ _t = _t->getNextSibling(); + break; + } + case CASE: + { +- retCode=case_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp21_AST_in = _t; ++ match(antlr::RefAST(_t),CASE); ++ _t = _t->getNextSibling(); + break; + } + case SWITCH: + { +- retCode=switch_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp22_AST_in = _t; ++ match(antlr::RefAST(_t),SWITCH); ++ _t = _t->getNextSibling(); + break; + } + case BLOCK: + { +- retCode=block(_t); +- _t = _retTree; +- break; +- } +- case BREAK: +- case CONTINUE: +- case RETF: +- case RETP: +- case GOTO: +- { +- retCode=jump_statement(_t); +- _t = _retTree; ++ ProgNodeP tmp23_AST_in = _t; ++ match(antlr::RefAST(_t),BLOCK); ++ _t = _t->getNextSibling(); + break; + } + case LABEL: + { +- ProgNodeP tmp1_AST_in = _t; ++ ProgNodeP tmp24_AST_in = _t; + match(antlr::RefAST(_t),LABEL); + _t = _t->getNextSibling(); + break; + } + case ON_IOERROR_NULL: + { +- ProgNodeP tmp2_AST_in = _t; ++ ProgNodeP tmp25_AST_in = _t; + match(antlr::RefAST(_t),ON_IOERROR_NULL); + _t = _t->getNextSibling(); +- +- static_cast(callStack.back())->SetIOError( -1); +- + break; + } + case ON_IOERROR: + { +- o = _t; ++ ProgNodeP tmp26_AST_in = _t; + match(antlr::RefAST(_t),ON_IOERROR); + _t = _t->getNextSibling(); +- +- static_cast(callStack.back())-> +- SetIOError( o->targetIx); +- ++ break; ++ } ++ case BREAK: ++ { ++ ProgNodeP tmp27_AST_in = _t; ++ match(antlr::RefAST(_t),BREAK); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case CONTINUE: ++ { ++ ProgNodeP tmp28_AST_in = _t; ++ match(antlr::RefAST(_t),CONTINUE); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case GOTO: ++ { ++ ProgNodeP tmp29_AST_in = _t; ++ match(antlr::RefAST(_t),GOTO); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case RETF: ++ { ++ ProgNodeP tmp30_AST_in = _t; ++ match(antlr::RefAST(_t),RETF); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case RETP: ++ { ++ ProgNodeP tmp31_AST_in = _t; ++ match(antlr::RefAST(_t),RETP); ++ _t = _t->getNextSibling(); + break; + } + default: +@@ -276,20 +332,22 @@ + } + } + ++ afterStatement:; ++ + // possible optimization: make sigControlC a debugMode + if( interruptEnable && sigControlC) + { +- DebugMsg( actPos, "Interrupted at: "); ++ DebugMsg( last, "Interrupted at: "); + + sigControlC = false; + +- retCode = NewInterpreterInstance(actPos->getLine()-1); ++ retCode = NewInterpreterInstance( last->getLine()-1); + } + else if( debugMode != DEBUG_CLEAR) + { + if( debugMode == DEBUG_STOP) + { +- DebugMsg( actPos, "Stop encoutered: "); ++ DebugMsg( last, "Stop encoutered: "); + if( !interruptEnable) + debugMode = DEBUG_PROCESS_STOP; + } +@@ -298,18 +356,19 @@ + { + if( debugMode == DEBUG_PROCESS_STOP) + { +- DebugMsg( actPos, "Stepped to: "); ++ DebugMsg( last, "Stepped to: "); + } + + debugMode = DEBUG_CLEAR; + +- retCode = NewInterpreterInstance(actPos->getLine()-1); ++ retCode = NewInterpreterInstance( last->getLine()-1); + } + else + { + retCode = RC_ABORT; + } + } ++ return retCode; + + } + catch ( GDLException& e) { +@@ -317,15 +376,14 @@ + if( dynamic_cast< GDLIOException*>( &e) != NULL) + { + // set the jump target - also logs the jump +- ProgNodeP onIOErr = static_cast(callStack.back())->GetIOError(); ++ ProgNodeP onIOErr = ++ static_cast(callStack.back())->GetIOError(); + if( onIOErr != NULL) + { + SysVar::SetErr_String( e.getMessage()); +- _t = onIOErr; +- retCode=RC_OK; + +- _retTree = _t; +- return retCode; ++ _retTree = onIOErr; ++ return RC_OK; + } + } + +@@ -355,7 +413,10 @@ + // 2 -> caller of routine which called ON_ERROR + else if( oE == 2) + { +- ++i; // set to caller ++ // set to caller, handle nested ++ while( static_cast(*(++i))->GetOnError() == 2 ++ && i != callStack.rend()); ++ + if( i == callStack.rend()) + { + EnvUDT* cS_begin = +@@ -375,19 +436,27 @@ + targetEnv = iUDT; + } + +- // remeber where to stop +- e.SetTargetEnv( targetEnv); + + // State where error occured + // if( e.getLine() == 0 && _t != NULL) + // e.SetLine( _t->getLine()); + // if( e.getLine() == 0 && _retTree != NULL) + // e.SetLine( _retTree->getLine()); +- if( e.getLine() == 0 && actPos != NULL) +- e.SetLine( actPos->getLine()); ++ if( e.getLine() == 0 && last != NULL) ++ e.SetLine( last->getLine()); + ++ if( interruptEnable) + ReportError(e, "Error occurred at:"); + ++ // remeber where to stop ++ e.SetTargetEnv( targetEnv); ++ ++ if( targetEnv->GetLineNumber() != 0) ++ e.SetLine( targetEnv->GetLineNumber()); ++ ++ // ProgNodeP errorNodeP = targetEnv->CallingNode(); ++ // e.SetErrorNodeP( errorNodeP); ++ + // break on first occurence of set oE + break; + } +@@ -406,8 +475,8 @@ + // e.SetLine( _t->getLine()); + // if( e.getLine() == 0 && _retTree != NULL) + // e.SetLine( _retTree->getLine()); +- if( e.getLine() == 0 && actPos != NULL) +- e.SetLine( actPos->getLine()); ++ // if( e.getLine() == 0 && actPos != NULL) ++ // e.SetLine( actPos->getLine()); + + if( interruptEnable) + { +@@ -434,16 +503,18 @@ + retCode = RC_ABORT; + } + ++ return retCode; ++ + } + _retTree = _t; + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::execute(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; ++ RetCode GDLInterpreter::execute(ProgNodeP _t) { ++ RetCode retCode; + ProgNodeP execute_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + +- // GDLInterpreter::RetCode retCode; ++ // RetCode retCode; + ValueGuard guard( interruptEnable); + interruptEnable = false; + +@@ -456,8 +527,8 @@ + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::statement_list(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; ++ RetCode GDLInterpreter::statement_list(ProgNodeP _t) { ++ RetCode retCode; + ProgNodeP statement_list_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + + for (; _t != NULL;) { +@@ -502,12 +573,11 @@ + + res = NULL; + returnValue = NULL; +- GDLInterpreter::RetCode retCode; ++ RetCode retCode; + + for (; _t != NULL;) { + + retCode=statement(_t); +- _t = _retTree; + + // if( retCode == RC_RETURN) + if( retCode >= RC_RETURN) +@@ -516,8 +586,9 @@ + returnValue=NULL; + + break; +- } +- ++ } ++ ++ _t = _retTree; + } + + // default return value if none was set +@@ -566,7 +637,7 @@ + + res = NULL; + returnValueL = NULL; +- GDLInterpreter::RetCode retCode; ++ RetCode retCode; + + ProgNodeP in = _t; + +@@ -632,7 +703,7 @@ + void GDLInterpreter::call_pro(ProgNodeP _t) { + ProgNodeP call_pro_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + +- GDLInterpreter::RetCode retCode; ++ RetCode retCode; + + for (; _t != NULL;) { + retCode=statement(_t); +@@ -667,197 +738,82 @@ + _retTree = _t; + } + +- GDLInterpreter::RetCode GDLInterpreter::for_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP for_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP f = ProgNodeP(antlr::nullAST); +- ProgNodeP fs = ProgNodeP(antlr::nullAST); ++ RetCode GDLInterpreter::block(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP block_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + +- BaseGDL** v; +- BaseGDL* s; +- BaseGDL* e; +- BaseGDL* st; +- retCode = RC_OK; ++ match(antlr::RefAST(_t),BLOCK); ++ _retTree = _t->getFirstChild(); ++ return RC_OK; ++ // retCode = RC_OK; ++ ++ // ProgNodeP block = _t; ++ // match(antlr::RefAST(_t),BLOCK); ++ // _t = _t->getFirstChild(); ++ // if (_t != NULL) ++ // { ++ ++ // SizeT nJump = static_cast(callStack.back())->NJump(); ++ ++ // retCode=statement_list(_t); + ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !block->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this block ++ // return retCode; ++ // } ++ // } ++ // _retTree = block->getNextSibling(); ++ // return retCode; + ++ ++ ProgNodeP __t20 = _t; ++ ProgNodeP tmp32_AST_in = _t; ++ match(antlr::RefAST(_t),BLOCK); ++ _t = _t->getFirstChild(); ++ { + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; + switch ( _t->getType()) { ++ case ASSIGN: ++ case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ case BLOCK: ++ case BREAK: ++ case CONTINUE: + case FOR: ++ case FOR_STEP: ++ case FOREACH: ++ case FOR_LOOP: ++ case FOR_STEP_LOOP: ++ case FOREACH_LOOP: ++ case IF_ELSE: ++ case LABEL: ++ case MPCALL: ++ case MPCALL_PARENT: ++ case ON_IOERROR_NULL: ++ case PCALL: ++ case PCALL_LIB: ++ case REPEAT: ++ case REPEAT_LOOP: ++ case RETF: ++ case RETP: ++ case WHILE: ++ case CASE: ++ case GOTO: ++ case IF: ++ case ON_IOERROR: ++ case SWITCH: ++ case DEC: ++ case INC: + { +- ProgNodeP __t31 = _t; +- f = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),FOR); +- _t = _t->getFirstChild(); +- +- ProgNodeP sv = _t; +- +- v=l_simple_var(_t); +- _t = _retTree; +- s=expr(_t); +- _t = _retTree; +- e=expr(_t); ++ retCode=statement_list(_t); + _t = _retTree; +- +- auto_ptr s_guard(s); +- auto_ptr e_guard(e); +- +- EnvUDT* callStack_back = +- static_cast(callStack.back()); +- SizeT nJump = callStack_back->NJump(); +- +- s->ForCheck( &e); +- e_guard.release(); +- e_guard.reset(e); +- +- ProgNodeP b=_t; //->getFirstChild(); +- +- // ASSIGNMENT used here also +- delete (*v); +- +- // problem: +- // EXECUTE may call DataListT.loc.resize(), as v points to the +- // old sequence v might be invalidated -> segfault +- // note that the value (*v) is preserved by resize() +- s_guard.release(); // s held in *v after this +- for((*v)=s; (*v)->ForCondUp( e); +- v=l_simple_var( sv), (*v)->ForAdd()) +- { +- // retCode=block(b); +- if( b != NULL) +- { +- retCode=statement_list(b); +- +- if( retCode != RC_OK) // optimization +- { +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; +- } +- if( retCode >= RC_RETURN) break; +- } +- +- if( (callStack_back->NJump() != nJump) && +- !f->LabelInRange( callStack_back->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } +- } +- } +- // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode +- +- _t = __t31; +- _t = _t->getNextSibling(); + break; + } +- case FOR_STEP: ++ case 3: + { +- ProgNodeP __t32 = _t; +- fs = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),FOR_STEP); +- _t = _t->getFirstChild(); +- +- ProgNodeP sv = _t; +- +- v=l_simple_var(_t); +- _t = _retTree; +- s=expr(_t); +- _t = _retTree; +- e=expr(_t); +- _t = _retTree; +- st=expr(_t); +- _t = _retTree; +- +- auto_ptr s_guard(s); +- auto_ptr e_guard(e); +- auto_ptr st_guard(st); +- +- SizeT nJump = static_cast(callStack.back())->NJump(); +- +- s->ForCheck( &e, &st); +- e_guard.release(); +- e_guard.reset(e); +- st_guard.release(); +- st_guard.reset(st); +- +- ProgNodeP bs=_t; +- +- // ASSIGNMENT used here also +- delete (*v); +- +- if( st->Sgn() == -1) +- { +- s_guard.release(); +- for((*v)=s; (*v)->ForCondDown( e); +- v=l_simple_var( sv), (*v)->ForAdd(st)) +- { +- if( bs != NULL) +- { +- retCode=statement_list(bs); +- +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; +- } +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !fs->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } +- } +- } +- } +- else +- { +- s_guard.release(); +- for((*v)=s; (*v)->ForCondUp( e); +- v=l_simple_var( sv), (*v)->ForAdd(st)) +- { +- if( bs != NULL) +- { +- retCode=statement_list(bs); +- +- if( retCode == RC_CONTINUE) +- { +- retCode = RC_OK; +- continue; +- } +- +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; +- } +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !fs->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } +- } +- } +- } +- +- _t = __t32; +- _t = _t->getNextSibling(); + break; + } + default: +@@ -865,216 +821,201 @@ + throw antlr::NoViableAltException(antlr::RefAST(_t)); + } + } ++ } ++ _t = __t20; ++ _t = _t->getNextSibling(); + _retTree = _t; + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::repeat_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP repeat_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP r = ProgNodeP(antlr::nullAST); ++ RetCode GDLInterpreter::switch_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP switch_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP s = ProgNodeP(antlr::nullAST); + ++ BaseGDL* e; + retCode = RC_OK; // not set if no branch is executed + + +- ProgNodeP __t27 = _t; +- r = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),REPEAT); ++ ProgNodeP __t23 = _t; ++ s = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),SWITCH); + _t = _t->getFirstChild(); ++ e=expr(_t); ++ _t = _retTree; + +- SizeT nJump = static_cast(callStack.back())->NJump(); +- +- // remember block and expr nodes +- ProgNodeP e =_t; +- ProgNodeP bb = e->GetNextSibling(); ++ auto_ptr e_guard(e); + +- // ProgNodeP bb =_t; +- // ProgNodeP e = bb->GetNextSibling(); +- // bb = bb->GetFirstChild(); ++ // SizeT nJump = static_cast(callStack.back())->NJump(); + +- auto_ptr eVal; +- do { +- if( bb != NULL) +- { +- retCode=statement_list(bb); ++ ProgNodeP b=_t; // remeber block begin (block) + +- if( retCode == RC_CONTINUE) ++ bool hook=false; // switch executes everything after 1st match ++ for( int i=0; inumBranch; i++) + { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) ++ if( b->getType() == ELSEBLK) + { +- retCode = RC_OK; +- break; +- } +- if( retCode >= RC_RETURN) break; +- // if( retCode == RC_BREAK) break; +- // if( retCode >= RC_RETURN) return retCode; ++ hook=true; ++ ++ ProgNodeP sL = b->GetFirstChild(); // statement_list + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !r->LabelInRange( static_cast(callStack.back())->LastJump())) ++ if(sL != NULL ) + { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ _retTree = sL; ++ return RC_OK; + } +- eVal.reset( expr(e)); +- } while( eVal.get()->False()); +- +- // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode + +- _t = __t27; +- _t = _t->getNextSibling(); +- _retTree = _t; +- return retCode; +-} +- +- GDLInterpreter::RetCode GDLInterpreter::while_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP while_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP w = ProgNodeP(antlr::nullAST); ++ // // statement there ++ // retCode=statement_list( sL); ++ // if( retCode == RC_BREAK) ++ // { ++ // retCode = RC_OK; ++ // break; // break ++ // } ++ // if( retCode >= RC_RETURN) break; // goto ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !s->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } + +- retCode = RC_OK; +- +- +- ProgNodeP __t29 = _t; +- w = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),WHILE); +- _t = _t->getFirstChild(); ++ // } ++ } ++ else ++ { ++ ProgNodeP ex = b->GetFirstChild(); // EXPR ++ ProgNodeP bb = ex->GetNextSibling(); // statement_list + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++ if( !hook) ++ { ++ // RefDNode ee_ = _t->GetFirstChild(); // expr + +- ProgNodeP e = _t; //->GetFirstChild(); // expr +- ProgNodeP s = _t->GetNextSibling(); // statement ++ BaseGDL* ee=expr(ex); ++ // auto_ptr ee_guard(ee); + +- auto_ptr< BaseGDL> eVal( expr( e)); +- while( eVal.get()->True()) { +- retCode=statement(s); ++ hook=e->Equal(ee); // Equal deletes ee ++ } + +- if( retCode == RC_CONTINUE) ++ if( hook) + { +- retCode = RC_OK; +- continue; +- } +- if( retCode == RC_BREAK) ++ // statement there ++ if(bb != NULL ) + { +- retCode = RC_OK; +- break; ++ _retTree = bb; ++ return RC_OK; + } +- if( retCode >= RC_RETURN) break; + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !w->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; ++ // _retTree = // find first non empty ++ // return RC_OK; ++ // } ++ ++ // retCode=statement_list(bb); ++ // if( retCode == RC_BREAK) ++ // { ++ // retCode = RC_OK; ++ // break; // break ++ // } ++ // if( retCode >= RC_RETURN) break; // goto ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !s->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } + } + +- eVal.reset( expr( e)); +- } +- +- // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode +- +- _t = __t29; +- _t = _t->getNextSibling(); +- _retTree = _t; +- return retCode; +-} +- +- GDLInterpreter::RetCode GDLInterpreter::if_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP if_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP i = ProgNodeP(antlr::nullAST); +- +- BaseGDL* e; +- retCode = RC_OK; // not set if not executed +- +- +- ProgNodeP __t34 = _t; +- i = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),IF); +- _t = _t->getFirstChild(); +- e=expr(_t); +- _t = _retTree; +- +- auto_ptr e_guard(e); +- +- SizeT nJump = static_cast(callStack.back())->NJump(); +- +- if( e->True()) +- { +- retCode=statement(_t); +- // if( retCode != RC_OK) return retCode; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !i->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; + } ++ b=b->GetNextSibling(); // next block + } ++ _retTree = s->GetNextSibling(); ++ return RC_OK; ++ // finish or break ++ // retCode=RC_OK; // clear RC_BREAK retCode + +- _t = __t34; ++ _t = __t23; + _t = _t->getNextSibling(); + _retTree = _t; + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::if_else_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP if_else_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP i = ProgNodeP(antlr::nullAST); +- +- BaseGDL* e; +- retCode = RC_OK; // not set if not executed +- ++BaseGDL* GDLInterpreter::expr(ProgNodeP _t) { ++ BaseGDL* res; ++ ProgNodeP expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + +- ProgNodeP __t36 = _t; +- i = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),IF_ELSE); +- _t = _t->getFirstChild(); +- e=expr(_t); +- _t = _retTree; ++ ++ assert( _t != NULL); + +- auto_ptr e_guard(e); ++ if ( _t->getType() == FCALL_LIB) { ++ BaseGDL* res=lib_function_call(_t); ++ ++ if( callStack.back()->Contains( res)) ++ res = res->Dup(); + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++ return res; ++ } ++ else ++ { ++ return tmp_expr(_t); ++ } + +- if( e->True()) +- { +- retCode=statement(_t); +- // if( retCode != RC_OK) return retCode; + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++ if (_t == ProgNodeP(antlr::nullAST) ) ++ _t = ASTNULL; ++ switch ( _t->getType()) { ++ case ASSIGN: ++ case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ case ARRAYDEF: ++ case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: ++ case CONSTANT: ++ case DEREF: ++ case EXPR: ++ case FCALL: ++ case FCALL_LIB_RETNEW: ++ case MFCALL: ++ case MFCALL_PARENT: ++ case NSTRUC: ++ case NSTRUC_REF: ++ case POSTDEC: ++ case POSTINC: ++ case STRUC: ++ case SYSVAR: ++ case VAR: ++ case VARPTR: ++ case DEC: ++ case INC: ++ case DOT: ++ case QUESTION: + { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ res=tmp_expr(_t); ++ _t = _retTree; ++ break; + } +- else ++ case FCALL_LIB: + { +- _t=_t->GetNextSibling(); // jump over 1st statement +- retCode=statement(_t); +- // if( retCode != RC_OK) return retCode; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++ res=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( callStack.back()->Contains( res)) ++ res = res->Dup(); ++ ++ break; ++ } ++ default: + { +- // a jump (goto) occured out of this loop +- return retCode; ++ throw antlr::NoViableAltException(antlr::RefAST(_t)); + } + } +- +- _t = __t36; +- _t = _t->getNextSibling(); + _retTree = _t; +- return retCode; ++ return res; + } + +- GDLInterpreter::RetCode GDLInterpreter::case_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; ++ RetCode GDLInterpreter::case_statement(ProgNodeP _t) { ++ RetCode retCode; + ProgNodeP case_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + ProgNodeP c = ProgNodeP(antlr::nullAST); + +@@ -1091,7 +1032,7 @@ + + auto_ptr e_guard(e); + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++ // SizeT nJump = static_cast(callStack.back())->NJump(); + + if( !e->Scalar()) + throw GDLException( _t, "Expression must be a" +@@ -1099,7 +1040,7 @@ + + ProgNodeP b=_t; // remeber block begin + +- for( int i=0; inumBranch; i++) ++ for( int i=0; inumBranch; ++i) + { + if( b->getType() == ELSEBLK) + { +@@ -1107,22 +1048,31 @@ + + if(sL != NULL ) + { +- // statement there +- retCode=statement_list(sL); +- //if( retCode == RC_BREAK) break; // break anyway +- // if( retCode >= RC_RETURN) return retCode; +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !c->LabelInRange( static_cast(callStack.back())->LastJump())) ++ _retTree = sL; ++ return RC_OK; ++ } ++ else + { +- // a jump (goto) occured out of this loop +- return retCode; ++ _retTree = c->GetNextSibling(); ++ return RC_OK; + } + +- } +- retCode = RC_OK; +- break; ++ // // statement there ++ // retCode=statement_list(sL); ++ // //if( retCode == RC_BREAK) break; // break anyway ++ // // if( retCode >= RC_RETURN) return retCode; ++ // if( retCode >= RC_RETURN) break; ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !c->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } ++ ++ // } ++ // retCode = RC_OK; ++ // break; + } + else + { +@@ -1136,31 +1086,42 @@ + + if( equalexpr) + { +- if(bb != NULL) +- { +- // statement there +- retCode=statement_list(bb); +- //if( retCode == RC_BREAK) break; // break anyway +- // if( retCode >= RC_RETURN) return retCode; +- if( retCode >= RC_RETURN) break; +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !c->LabelInRange( static_cast(callStack.back())->LastJump())) ++ if(bb != NULL ) + { +- // a jump (goto) occured out of this loop +- return retCode; ++ _retTree = bb; ++ return RC_OK; + } +- ++ else ++ { ++ _retTree = c->GetNextSibling(); ++ return RC_OK; + } +- retCode = RC_OK; +- break; ++ // if(bb != NULL) ++ // { ++ // // statement there ++ // retCode=statement_list(bb); ++ // //if( retCode == RC_BREAK) break; // break anyway ++ // // if( retCode >= RC_RETURN) return retCode; ++ // if( retCode >= RC_RETURN) break; ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !c->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } ++ ++ // } ++ // retCode = RC_OK; ++ // break; + } + + } + b=b->GetNextSibling(); // next block +- } ++ } // for + // finish or break + // retCode=RC_OK; // clear RC_BREAK retCode ++ throw GDLException( c, "CASE statement found no match.",true,false); + + _t = __t25; + _t = _t->getNextSibling(); +@@ -1168,277 +1129,402 @@ + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::switch_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP switch_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP s = ProgNodeP(antlr::nullAST); +- +- BaseGDL* e; +- retCode = RC_OK; // not set if no branch is executed +- ++ RetCode GDLInterpreter::repeat_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP repeat_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP r = ProgNodeP(antlr::nullAST); + +- ProgNodeP __t23 = _t; +- s = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),SWITCH); ++ ProgNodeP __t27 = _t; ++ r = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),REPEAT); + _t = _t->getFirstChild(); +- e=expr(_t); +- _t = _retTree; + +- auto_ptr e_guard(e); ++ // _t is REPEAT_LOOP, GetFirstChild() is expr, GetNextSibling is first loop statement ++ _retTree = _t->GetFirstChild()->GetNextSibling(); // statement ++ return RC_OK; + +- SizeT nJump = static_cast(callStack.back())->NJump(); ++ _t = __t27; ++ _t = _t->getNextSibling(); ++ _retTree = _t; ++ return retCode; ++} ++ ++ RetCode GDLInterpreter::repeat_loop_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP repeat_loop_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP r = ProgNodeP(antlr::nullAST); + +- ProgNodeP b=_t; // remeber block begin (block) ++ ProgNodeP __t29 = _t; ++ r = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),REPEAT_LOOP); ++ _t = _t->getFirstChild(); + +- bool hook=false; // switch executes everything after 1st match +- for( int i=0; inumBranch; i++) ++ auto_ptr eVal( expr(_t)); ++ if( eVal.get()->False()) + { +- if( b->getType() == ELSEBLK) ++ _retTree = _t->GetNextSibling(); // 1st loop statement ++ if( _retTree == NULL) ++ throw GDLException(r, ++ "Empty REPEAT loop entered (infinite loop).", ++ true,false); ++ return RC_OK; ++ } ++ else + { +- hook=true; ++ _retTree = r->GetNextSibling(); // statement ++ return RC_OK; ++ } + +- ProgNodeP sL = b->GetFirstChild(); // statement_list ++ // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode ++ // SizeT nJump = static_cast(callStack.back())->NJump(); + +- if( sL != NULL ) +- { +- // statement there +- retCode=statement_list( sL); +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; // break +- } +- if( retCode >= RC_RETURN) break; // goto ++ // // remember block and expr nodes ++ // ProgNodeP e =_t; ++ // ProgNodeP bb = e->GetNextSibling(); ++ ++ // // ProgNodeP bb =_t; ++ // // ProgNodeP e = bb->GetNextSibling(); ++ // // bb = bb->GetFirstChild(); ++ ++ // auto_ptr eVal; ++ // do { ++ // if( bb != NULL) ++ // { ++ // retCode=statement_list(bb); ++ ++ // if( retCode == RC_CONTINUE) ++ // { ++ // retCode = RC_OK; ++ // continue; ++ // } ++ // if( retCode == RC_BREAK) ++ // { ++ // retCode = RC_OK; ++ // break; ++ // } ++ // if( retCode >= RC_RETURN) break; ++ // // if( retCode == RC_BREAK) break; ++ // // if( retCode >= RC_RETURN) return retCode; ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !r->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } ++ // } ++ // eVal.reset( expr(e)); ++ // } while( eVal.get()->False()); + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !s->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } ++ // // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode + +- } +- } +- else +- { +- ProgNodeP ex = b->GetFirstChild(); // EXPR +- ProgNodeP bb = ex->GetNextSibling(); // statement_list +- +- if( !hook) +- { +- // RefDNode ee_ = _t->GetFirstChild(); // expr +- +- BaseGDL* ee=expr(ex); +- // auto_ptr ee_guard(ee); +- +- hook=e->Equal(ee); // Equal deletes ee +- } +- +- if(bb != NULL && hook) +- { +- // statement there +- retCode=statement_list(bb); +- if( retCode == RC_BREAK) +- { +- retCode = RC_OK; +- break; // break +- } +- if( retCode >= RC_RETURN) break; // goto +- +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !s->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this loop +- return retCode; +- } +- } +- +- } +- b=b->GetNextSibling(); // next block +- } +- // finish or break +- // retCode=RC_OK; // clear RC_BREAK retCode +- +- _t = __t23; ++ _t = __t29; + _t = _t->getNextSibling(); + _retTree = _t; + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::block(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP block_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ RetCode GDLInterpreter::while_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP while_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP w = ProgNodeP(antlr::nullAST); + + retCode = RC_OK; + +- ProgNodeP block = _t; +- match(antlr::RefAST(_t),BLOCK); +- _t = _t->getFirstChild(); +- if (_t != NULL) +- { +- +- SizeT nJump = static_cast(callStack.back())->NJump(); + +- retCode=statement_list(_t); ++ ProgNodeP __t31 = _t; ++ w = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),WHILE); ++ _t = _t->getFirstChild(); + +- if( (static_cast(callStack.back())->NJump() != nJump) && +- !block->LabelInRange( static_cast(callStack.back())->LastJump())) +- { +- // a jump (goto) occured out of this block +- return retCode; +- } +- } +- _retTree = block->getNextSibling(); +- return retCode; ++ // SizeT nJump = static_cast(callStack.back())->NJump(); + ++ // ProgNodeP e = _t; //->GetFirstChild(); // expr + +- ProgNodeP __t20 = _t; +- ProgNodeP tmp3_AST_in = _t; +- match(antlr::RefAST(_t),BLOCK); +- _t = _t->getFirstChild(); +- { +- if (_t == ProgNodeP(antlr::nullAST) ) +- _t = ASTNULL; +- switch ( _t->getType()) { +- case ASSIGN: +- case ASSIGN_REPLACE: +- case BLOCK: +- case BREAK: +- case CONTINUE: +- case FOR_STEP: +- case IF_ELSE: +- case LABEL: +- case MPCALL: +- case MPCALL_PARENT: +- case ON_IOERROR_NULL: +- case PCALL: +- case PCALL_LIB: +- case RETF: +- case RETP: +- case CASE: +- case FOR: +- case GOTO: +- case IF: +- case ON_IOERROR: +- case REPEAT: +- case SWITCH: +- case WHILE: +- case DEC: +- case INC: ++ auto_ptr eVal( expr( _t)); ++ if( eVal.get()->True()) + { +- retCode=statement_list(_t); +- _t = _retTree; +- break; ++ _retTree = _t->GetNextSibling(); // 1st loop statement ++ if( _retTree == NULL) ++ throw GDLException(w, ++ "Empty WHILE loop entered (infinite loop).", ++ true,false); ++ return RC_OK; + } +- case 3: +- { +- break; +- } +- default: ++ else + { +- throw antlr::NoViableAltException(antlr::RefAST(_t)); +- } +- } ++ _retTree = w->GetNextSibling(); // statement ++ return RC_OK; + } +- _t = __t20; ++ ++ // auto_ptr< BaseGDL> eVal( expr( e)); ++ // while( eVal.get()->True()) { ++ // retCode=statement_list(s); ++ ++ // if( retCode == RC_CONTINUE) ++ // { ++ // retCode = RC_OK; ++ // continue; ++ // } ++ // if( retCode == RC_BREAK) ++ // { ++ // retCode = RC_OK; ++ // break; ++ // } ++ // if( retCode >= RC_RETURN) break; ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !w->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } ++ ++ // eVal.reset( expr( e)); ++ // } ++ ++ // retCode=RC_OK; // clear RC_BREAK/RC_CONTINUE retCode ++ ++ _t = __t31; + _t = _t->getNextSibling(); + _retTree = _t; + return retCode; + } + +- GDLInterpreter::RetCode GDLInterpreter::jump_statement(ProgNodeP _t) { +- GDLInterpreter::RetCode retCode; +- ProgNodeP jump_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP g = ProgNodeP(antlr::nullAST); ++ RetCode GDLInterpreter::for_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP for_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP f = ProgNodeP(antlr::nullAST); ++ ProgNodeP fl = ProgNodeP(antlr::nullAST); ++ ProgNodeP fs = ProgNodeP(antlr::nullAST); ++ ProgNodeP fsl = ProgNodeP(antlr::nullAST); + +- BaseGDL* e; +- BaseGDL** eL; ++ BaseGDL** v; ++ BaseGDL* s; ++ BaseGDL* e; ++ BaseGDL* st; ++ retCode = RC_OK; + + + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; + switch ( _t->getType()) { +- case GOTO: ++ case FOR: + { +- g = _t; +- match(antlr::RefAST(_t),GOTO); +- _t = _t->getNextSibling(); ++ ProgNodeP __t33 = _t; ++ f = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),FOR); ++ _t = _t->getFirstChild(); + +- // note that this version jumps 'dumb' +- // jumping into loops is legal, even then looping is not done ++ _t = f->GetNextSibling()->GetFirstChild(); + +- // set the jump target - also logs the jump +- _t = static_cast(callStack.back())->GotoTarget( g->targetIx); +- _t = _t->GetNextSibling(); +- retCode=RC_OK; ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( f->forLoopIx); ++ ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ s=expr(_t); ++ auto_ptr s_guard(s); ++ _t = _retTree; ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=expr(_t); ++ ++ ProgNodeP b = _retTree; ++ ++ s->ForCheck( &loopInfo.endLoopVar); ++ ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v)= s_guard.release(); // s held in *v after this + ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ _retTree = b; ++ return RC_OK; ++ } ++ else ++ { ++ // skip if initial test fails ++ _retTree = f->GetNextSibling()->GetNextSibling(); ++ return RC_OK; ++ } ++ ++ _t = __t33; ++ _t = _t->getNextSibling(); + break; + } +- case RETF: ++ case FOR_LOOP: + { +- ProgNodeP __t38 = _t; +- ProgNodeP tmp4_AST_in = _t; +- match(antlr::RefAST(_t),RETF); ++ ProgNodeP __t34 = _t; ++ fl = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),FOR_LOOP); + _t = _t->getFirstChild(); ++ ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fl->forLoopIx); ++ ++ if( loopInfo.endLoopVar == NULL) + { +- if (_t == ProgNodeP(antlr::nullAST) ) +- _t = ASTNULL; +- if (((_tokenSet_1.member(_t->getType())))&&( !static_cast(callStack.back())->LFun())) { +- e=expr(_t); +- _t = _retTree; +- +- delete returnValue; +- returnValue=e; +- retCode=RC_RETURN; +- callStack.back()->RemoveLoc( e); // steal e from local list +- ++ // non-initialized loop (GOTO) ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; + } +- else if ((_tokenSet_2.member(_t->getType()))) { +- eL=l_ret_expr(_t); +- _t = _retTree; +- +- // returnValueL is otherwise owned +- returnValueL=eL; +- retCode=RC_RETURN; +- ++ ++ // // problem: ++ // // EXECUTE may call DataListT.loc.resize(), as v points to the ++ // // old sequence v might be invalidated -> segfault ++ // // note that the value (*v) is preserved by resize() ++ ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ (*v)->ForAdd(); ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ _retTree = _t->GetNextSibling()->GetNextSibling(); ++ return RC_OK; + } +- else { +- throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ else ++ { ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; + } + +- } +- _t = __t38; ++ ++ _t = __t34; + _t = _t->getNextSibling(); + break; + } +- case RETP: ++ case FOR_STEP: + { +- ProgNodeP tmp5_AST_in = _t; +- match(antlr::RefAST(_t),RETP); +- _t = _t->getNextSibling(); ++ ProgNodeP __t35 = _t; ++ fs = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),FOR_STEP); ++ _t = _t->getFirstChild(); + +- retCode=RC_RETURN; ++ _t = fs->GetNextSibling()->GetFirstChild(); + +- break; +- } +- case BREAK: +- { +- ProgNodeP tmp6_AST_in = _t; +- match(antlr::RefAST(_t),BREAK); +- _t = _t->getNextSibling(); ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); + +- retCode=RC_BREAK; ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fs->forLoopIx); + ++ v=l_simple_var(_t); ++ _t = _retTree; ++ ++ s=expr(_t); ++ auto_ptr s_guard(s); ++ _t = _retTree; ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=expr(_t); ++ _t = _retTree; ++ ++ delete loopInfo.loopStepVar; ++ loopInfo.loopStepVar=expr(_t); ++ ++ ProgNodeP b = _retTree; ++ ++ s->ForCheck( &loopInfo.endLoopVar, &loopInfo.loopStepVar); ++ ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v)= s_guard.release(); // s held in *v after this ++ ++ if( loopInfo.loopStepVar->Sgn() == -1) ++ { ++ if( (*v)->ForCondDown( loopInfo.endLoopVar)) ++ { ++ _retTree = b; ++ return RC_OK; ++ } ++ } ++ else ++ { ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ _retTree = b; ++ return RC_OK; ++ } ++ } ++ ++ // skip if initial test fails ++ _retTree = f->GetNextSibling()->GetNextSibling(); ++ return RC_OK; ++ ++ _t = __t35; ++ _t = _t->getNextSibling(); + break; + } +- case CONTINUE: ++ case FOR_STEP_LOOP: + { +- ProgNodeP tmp7_AST_in = _t; +- match(antlr::RefAST(_t),CONTINUE); +- _t = _t->getNextSibling(); ++ ProgNodeP __t36 = _t; ++ fsl = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),FOR_STEP_LOOP); ++ _t = _t->getFirstChild(); ++ ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fsl->forLoopIx); ++ ++ if( loopInfo.endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ _retTree = fsl->GetNextSibling(); ++ return RC_OK; ++ } ++ ++ // // problem: ++ // // EXECUTE may call DataListT.loc.resize(), as v points to the ++ // // old sequence v might be invalidated -> segfault ++ // // note that the value (*v) is preserved by resize() ++ ++ v=l_simple_var(_t); ++ _t = _retTree; + +- retCode=RC_CONTINUE; ++ ProgNodeP b = _t->GetNextSibling()->GetNextSibling()->GetNextSibling(); + ++ (*v)->ForAdd(loopInfo.loopStepVar); ++ if( loopInfo.loopStepVar->Sgn() == -1) ++ { ++ if( (*v)->ForCondDown( loopInfo.endLoopVar)) ++ { ++ _retTree = b; ++ return RC_OK; ++ } ++ } ++ else ++ { ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ _retTree = b; ++ return RC_OK; ++ } ++ } ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ delete loopInfo.loopStepVar; ++ loopInfo.loopStepVar = NULL; ++ _retTree = fsl->GetNextSibling(); ++ return RC_OK; ++ ++ ++ _t = __t36; ++ _t = _t->getNextSibling(); + break; + } + default: +@@ -1450,66 +1536,107 @@ + return retCode; + } + +-BaseGDL* GDLInterpreter::expr(ProgNodeP _t) { +- BaseGDL* res; +- ProgNodeP expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- +- +- assert( _t != NULL); +- +- if ( _t->getType() == FCALL_LIB) { +- BaseGDL* res=lib_function_call(_t); +- +- if( callStack.back()->Contains( res)) +- res = res->Dup(); ++ RetCode GDLInterpreter::foreach_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP foreach_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP f = ProgNodeP(antlr::nullAST); ++ ProgNodeP fl = ProgNodeP(antlr::nullAST); + +- return res; +- } +- else +- { +- return tmp_expr(_t); +- } ++ BaseGDL** v; ++ BaseGDL* s; ++ retCode = RC_OK; + + + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; + switch ( _t->getType()) { +- case ASSIGN: +- case ASSIGN_REPLACE: +- case ARRAYDEF: +- case ARRAYEXPR: +- case CONSTANT: +- case DEREF: +- case EXPR: +- case FCALL: +- case FCALL_LIB_RETNEW: +- case MFCALL: +- case MFCALL_PARENT: +- case NSTRUC: +- case NSTRUC_REF: +- case POSTDEC: +- case POSTINC: +- case STRUC: +- case SYSVAR: +- case VAR: +- case VARPTR: +- case DEC: +- case INC: +- case DOT: +- case QUESTION: ++ case FOREACH: + { +- res=tmp_expr(_t); ++ ProgNodeP __t38 = _t; ++ f = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),FOREACH); ++ _t = _t->getFirstChild(); ++ ++ _t = f->GetNextSibling()->GetFirstChild(); ++ ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( f->forLoopIx); ++ ++ v=l_simple_var(_t); + _t = _retTree; ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=expr(_t); ++ ++ ProgNodeP b = _retTree; ++ ++ loopInfo.foreachIx = 0; ++ ++ // currently there are no empty arrays ++ //SizeT nEl = loopInfo.endLoopVar->N_Elements(); ++ ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v) = loopInfo.endLoopVar->NewIx( 0); ++ ++ _retTree = b; ++ return RC_OK; ++ ++ _t = __t38; ++ _t = _t->getNextSibling(); + break; + } +- case FCALL_LIB: ++ case FOREACH_LOOP: + { +- res=check_expr(_t); ++ ProgNodeP __t39 = _t; ++ fl = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),FOREACH_LOOP); ++ _t = _t->getFirstChild(); ++ ++ EnvUDT* callStack_back = ++ static_cast(callStack.back()); ++ ++ ForLoopInfoT& loopInfo = ++ callStack_back->GetForLoopInfo( fl->forLoopIx); ++ ++ if( loopInfo.endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; ++ } ++ ++ v=l_simple_var(_t); + _t = _retTree; + +- if( callStack.back()->Contains( res)) +- res = res->Dup(); ++ // skip expr ++ _t = _t->getNextSibling(); ++ ++ ++loopInfo.foreachIx; ++ ++ SizeT nEl = loopInfo.endLoopVar->N_Elements(); ++ ++ if( loopInfo.foreachIx < nEl) ++ { ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v) = loopInfo.endLoopVar->NewIx( loopInfo.foreachIx); ++ ++ _retTree = _t; ++ return RC_OK; ++ } ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ loopInfo.foreachIx = -1; ++ _retTree = fl->GetNextSibling(); ++ return RC_OK; + ++ _t = __t39; ++ _t = _t->getNextSibling(); + break; + } + default: +@@ -1518,70 +1645,209 @@ + } + } + _retTree = _t; +- return res; ++ return retCode; + } + +-BaseGDL** GDLInterpreter::l_simple_var(ProgNodeP _t) { +- BaseGDL** res; +- ProgNodeP l_simple_var_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP var = ProgNodeP(antlr::nullAST); +- ProgNodeP varPtr = ProgNodeP(antlr::nullAST); ++ RetCode GDLInterpreter::if_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP if_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP i = ProgNodeP(antlr::nullAST); + +- assert( _t != NULL); ++ BaseGDL* e; ++ // retCode = RC_OK; // not set if not executed + +- if( _t->getType() == VAR) +- { +- ProgNodeP var = _t; +- // match(antlr::RefAST(_t),VAR); +- _t = _t->getNextSibling(); +- +- +- res=&callStack.back()->GetKW(var->varIx); +- +- } +- else +- { +- ProgNodeP varPtr = _t; +- // match(antlr::RefAST(_t),VARPTR); +- _t = _t->getNextSibling(); +- +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) +- +- } + +- _retTree = _t; +- return res; ++ ProgNodeP __t41 = _t; ++ i = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),IF); ++ _t = _t->getFirstChild(); ++ e=expr(_t); ++ _t = _retTree; ++ ++ auto_ptr e_guard(e); + ++ // SizeT nJump = static_cast(callStack.back())->NJump(); + +- if (_t == ProgNodeP(antlr::nullAST) ) +- _t = ASTNULL; +- switch ( _t->getType()) { +- case VAR: ++ if( e->True()) + { +- var = _t; +- match(antlr::RefAST(_t),VAR); +- _t = _t->getNextSibling(); +- +- +- res=&callStack.back()->GetKW(var->varIx); +- +- break; ++ _retTree = _t; ++ return RC_OK; + } +- case VARPTR: ++ ++ _retTree = i->GetNextSibling(); ++ return RC_OK; ++ ++ // retCode=statement(_t); ++ // // if( retCode != RC_OK) return retCode; ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } ++ ++ _t = __t41; ++ _t = _t->getNextSibling(); ++ _retTree = _t; ++ return retCode; ++} ++ ++ RetCode GDLInterpreter::if_else_statement(ProgNodeP _t) { ++ RetCode retCode; ++ ProgNodeP if_else_statement_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP i = ProgNodeP(antlr::nullAST); ++ ++ BaseGDL* e; ++ retCode = RC_OK; // not set if not executed ++ ++ ++ ProgNodeP __t43 = _t; ++ i = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),IF_ELSE); ++ _t = _t->getFirstChild(); ++ e=expr(_t); ++ _t = _retTree; ++ ++ auto_ptr e_guard(e); ++ ++ // SizeT nJump = static_cast(callStack.back())->NJump(); ++ ++ if( e->True()) + { +- varPtr = _t; +- match(antlr::RefAST(_t),VARPTR); +- _t = _t->getNextSibling(); +- +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) +- +- break; ++ _retTree = _t->GetFirstChild(); ++ return RC_OK; + } +- default: ++ ++ _retTree = _t->GetNextSibling(); ++ return RC_OK; ++ // { ++ // auto_ptr e_guard(e); ++ ++ // SizeT nJump = static_cast(callStack.back())->NJump(); ++ ++ // if( e->True()) ++ // { ++ // retCode=statement(_t); ++ // // // if( retCode != RC_OK) return retCode; ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } ++ // } ++ // else ++ // { ++ // _t=_t->GetNextSibling(); // jump over 1st statement ++ // retCode=statement(_t); ++ // // // if( retCode != RC_OK) return retCode; ++ ++ // if( (static_cast(callStack.back())->NJump() != nJump) && ++ // !i->LabelInRange( static_cast(callStack.back())->LastJump())) ++ // { ++ // // a jump (goto) occured out of this loop ++ // return retCode; ++ // } ++ // } ++ ++ _t = __t43; ++ _t = _t->getNextSibling(); ++ _retTree = _t; ++ return retCode; ++} ++ ++BaseGDL** GDLInterpreter::l_deref(ProgNodeP _t) { ++ BaseGDL** res; ++ ProgNodeP l_deref_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ++ ProgNodeP retTree = _t->getNextSibling(); ++ ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = _t->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) + { +- throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ e1 = evalExpr->EvalNC(); + } ++ else if( evalExpr->getType() == GDLTokenTypes::FCALL_LIB) ++ { ++ e1=lib_function_call(evalExpr); ++ ++ if( e1 == NULL) // ROUTINE_NAMES ++ throw GDLException( evalExpr, "Undefined return value", true, false); ++ ++ if( !callStack.back()->Contains( e1)) ++ e1_guard.reset( e1); + } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++ ++ if( e1 == NULL || e1->Type() != PTR) ++ throw GDLException( evalExpr, "Pointer type required" ++ " in this context: "+Name(e1),true,false); ++ ++ DPtrGDL* ptr=static_cast(e1); ++ ++ // _t = _t->getFirstChild(); ++ ++ // BaseGDL* e1; ++ ++ // auto_ptr e1_guard; ++ ++ // if( _t->getType() == GDLTokenTypes::FCALL_LIB) ++ // { ++ // e1=lib_function_call(_t); ++ ++ // if( e1 == NULL) // ROUTINE_NAMES ++ // throw GDLException( _t, "Undefined return value", true, false); ++ ++ // if( !ProgNode::interpreter->callStack.back()->Contains( e1)) ++ // e1_guard.reset( e1); ++ // } ++ // else ++ // { ++ // e1=tmp_expr(_t); ++ // e1_guard.reset( e1); ++ // } ++ ++ // DPtrGDL* ptr=dynamic_cast(e1); ++ // if( ptr == NULL) ++ // throw GDLException( _t, "Pointer type required" ++ // " in this context: "+Name(e1),true,false); ++ DPtr sc; ++ if( !ptr->Scalar(sc)) ++ throw GDLException( _t, "Expression must be a " ++ "scalar in this context: "+Name(e1),true,false); ++ if( sc == 0) ++ throw GDLException( _t, "Unable to dereference" ++ " NULL pointer: "+Name(e1),true,false); ++ ++ try{ ++ res = &GetHeap(sc); ++ } ++ catch( HeapException) ++ { ++ throw GDLException( _t, "Invalid pointer: "+Name(e1),true,false); ++ } ++ ++ _retTree = retTree; ++ return res; ++ ++ ++ ++ ProgNodeP __t45 = _t; ++ ProgNodeP tmp33_AST_in = _t; ++ match(antlr::RefAST(_t),DEREF); ++ _t = _t->getFirstChild(); ++ e1=expr(_t); ++ _t = _retTree; ++ _t = __t45; ++ _t = _t->getNextSibling(); + _retTree = _t; + return res; + } +@@ -1606,8 +1872,8 @@ + } + case QUESTION: + { +- ProgNodeP __t43 = _t; +- ProgNodeP tmp8_AST_in = _t; ++ ProgNodeP __t47 = _t; ++ ProgNodeP tmp34_AST_in = _t; + match(antlr::RefAST(_t),QUESTION); + _t = _t->getFirstChild(); + e1=expr(_t); +@@ -1624,10 +1890,16 @@ + res=l_ret_expr(_t); + } + +- _t = __t43; ++ _t = __t47; + _t = _t->getNextSibling(); + break; + } ++ case ARRAYEXPR_MFCALL: ++ { ++ res=l_arrayexpr_mfcall_as_mfcall(_t); ++ _t = _retTree; ++ break; ++ } + case FCALL: + case FCALL_LIB: + case MFCALL: +@@ -1670,8 +1942,8 @@ + } + case ASSIGN: + { +- ProgNodeP __t44 = _t; +- ProgNodeP tmp9_AST_in = _t; ++ ProgNodeP __t48 = _t; ++ ProgNodeP tmp35_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN); + _t = _t->getFirstChild(); + +@@ -1683,8 +1955,10 @@ + switch ( _t->getType()) { + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -1714,7 +1988,7 @@ + } + case FCALL_LIB: + { +- e1=check_expr(_t); ++ e1=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( e1)) +@@ -1738,14 +2012,90 @@ + } + r_guard.release(); + +- _t = __t44; ++ _t = __t48; ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ { ++ ProgNodeP __t50 = _t; ++ ProgNodeP tmp36_AST_in = _t; ++ match(antlr::RefAST(_t),ASSIGN_ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ ++ auto_ptr r_guard; ++ ++ { ++ if (_t == ProgNodeP(antlr::nullAST) ) ++ _t = ASTNULL; ++ switch ( _t->getType()) { ++ case ASSIGN: ++ case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ case ARRAYDEF: ++ case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: ++ case CONSTANT: ++ case DEREF: ++ case EXPR: ++ case FCALL: ++ case FCALL_LIB_RETNEW: ++ case MFCALL: ++ case MFCALL_PARENT: ++ case NSTRUC: ++ case NSTRUC_REF: ++ case POSTDEC: ++ case POSTINC: ++ case STRUC: ++ case SYSVAR: ++ case VAR: ++ case VARPTR: ++ case DEC: ++ case INC: ++ case DOT: ++ case QUESTION: ++ { ++ e1=tmp_expr(_t); ++ _t = _retTree; ++ ++ r_guard.reset( e1); ++ ++ break; ++ } ++ case FCALL_LIB: ++ { ++ e1=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( e1)) ++ r_guard.reset( e1); ++ ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ } ++ } ++ } ++ res=l_arrayexpr_mfcall_as_mfcall(_t); ++ _t = _retTree; ++ ++ if( e1 != (*res)) ++ { ++ delete *res; ++ *res = e1; ++ } ++ r_guard.release(); ++ ++ _t = __t50; + _t = _t->getNextSibling(); + break; + } + case ASSIGN_REPLACE: + { +- ProgNodeP __t46 = _t; +- ProgNodeP tmp10_AST_in = _t; ++ ProgNodeP __t52 = _t; ++ ProgNodeP tmp37_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN_REPLACE); + _t = _t->getFirstChild(); + +@@ -1757,8 +2107,10 @@ + switch ( _t->getType()) { + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -1788,7 +2140,7 @@ + } + case FCALL_LIB: + { +- e1=check_expr(_t); ++ e1=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( e1)) +@@ -1812,14 +2164,14 @@ + } + r_guard.release(); + +- _t = __t46; ++ _t = __t52; + _t = _t->getNextSibling(); + break; + } + case ARRAYEXPR: + { +- ProgNodeP __t48 = _t; +- ProgNodeP tmp11_AST_in = _t; ++ ProgNodeP __t54 = _t; ++ ProgNodeP tmp38_AST_in = _t; + match(antlr::RefAST(_t),ARRAYEXPR); + _t = _t->getFirstChild(); + +@@ -1827,14 +2179,14 @@ + "Indexed expression not allowed as left-function" + " return value.",true,false); + +- _t = __t48; ++ _t = __t54; + _t = _t->getNextSibling(); + break; + } + case DOT: + { +- ProgNodeP __t49 = _t; +- ProgNodeP tmp12_AST_in = _t; ++ ProgNodeP __t55 = _t; ++ ProgNodeP tmp39_AST_in = _t; + match(antlr::RefAST(_t),DOT); + _t = _t->getFirstChild(); + +@@ -1842,13 +2194,13 @@ + "Struct expression not allowed as left-function" + " return value.",true,false); + +- _t = __t49; ++ _t = __t55; + _t = _t->getNextSibling(); + break; + } + case SYSVAR: + { +- ProgNodeP tmp13_AST_in = _t; ++ ProgNodeP tmp40_AST_in = _t; + match(antlr::RefAST(_t),SYSVAR); + _t = _t->getNextSibling(); + +@@ -1895,45 +2247,49 @@ + _retTree = _t; + return res; + } +- +-BaseGDL** GDLInterpreter::l_deref(ProgNodeP _t) { +- BaseGDL** res; +- ProgNodeP l_deref_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ++ BaseGDL** GDLInterpreter::l_arrayexpr_mfcall_as_mfcall(ProgNodeP _t) { ++ BaseGDL** res; ++ ProgNodeP l_arrayexpr_mfcall_as_mfcall_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP mp2 = ProgNodeP(antlr::nullAST); + +- BaseGDL* e1; ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(callStack); ++ BaseGDL *self; ++ EnvUDT* newEnv; + + +- ProgNodeP __t41 = _t; +- ProgNodeP tmp14_AST_in = _t; +- match(antlr::RefAST(_t),DEREF); ++ ProgNodeP __t161 = _t; ++ ProgNodeP tmp41_AST_in = _t; ++ match(antlr::RefAST(_t),ARRAYEXPR_MFCALL); + _t = _t->getFirstChild(); +- e1=expr(_t); ++ ++ _t = _t->getNextSibling(); // skip DOT ++ ++ self=expr(_t); + _t = _retTree; ++ mp2 = _t; ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); + +- auto_ptr e1_guard(e1); ++ auto_ptr self_guard(self); + +- DPtrGDL* ptr=dynamic_cast(e1); +- if( ptr == NULL) +- throw GDLException( _t, "Pointer type required" +- " in this context: "+Name(e1),true,false); +- DPtr sc; +- if( !ptr->Scalar(sc)) +- throw GDLException( _t, "Expression must be a " +- "scalar in this context: "+Name(e1),true,false); +- if( sc == 0) +- throw GDLException( _t, "Unable to dereference" +- " NULL pointer: "+Name(e1),true,false); ++ newEnv=new EnvUDT( self, mp2, "", true); + +- try{ +- res = &GetHeap(sc); +- } +- catch( HeapException) +- { +- throw GDLException( _t, "Invalid pointer: "+Name(e1),true,false); +- } ++ self_guard.release(); + +- _t = __t41; ++ parameter_def(_t, newEnv); ++ _t = _retTree; ++ _t = __t161; + _t = _t->getNextSibling(); ++ ++ // push environment onto call stack ++ callStack.push_back(newEnv); ++ ++ // make the call ++ res=call_lfun(static_cast( ++ newEnv->GetPro())->GetTree()); ++ + _retTree = _t; + return res; + } +@@ -1959,7 +2315,7 @@ + switch ( _t->getType()) { + case FCALL_LIB: + { +- ProgNodeP __t137 = _t; ++ ProgNodeP __t163 = _t; + fl = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),FCALL_LIB); + _t = _t->getFirstChild(); +@@ -1981,7 +2337,7 @@ + throw GDLException( _t, "Library function must return a " + "l-value in this context: "+fl->getText()); + +- _t = __t137; ++ _t = __t163; + _t = _t->getNextSibling(); + break; + } +@@ -1996,8 +2352,8 @@ + switch ( _t->getType()) { + case MFCALL: + { +- ProgNodeP __t140 = _t; +- ProgNodeP tmp15_AST_in = _t; ++ ProgNodeP __t166 = _t; ++ ProgNodeP tmp42_AST_in = _t; + match(antlr::RefAST(_t),MFCALL); + _t = _t->getFirstChild(); + self=expr(_t); +@@ -2014,14 +2370,14 @@ + + parameter_def(_t, newEnv); + _t = _retTree; +- _t = __t140; ++ _t = __t166; + _t = _t->getNextSibling(); + break; + } + case MFCALL_PARENT: + { +- ProgNodeP __t141 = _t; +- ProgNodeP tmp16_AST_in = _t; ++ ProgNodeP __t167 = _t; ++ ProgNodeP tmp43_AST_in = _t; + match(antlr::RefAST(_t),MFCALL_PARENT); + _t = _t->getFirstChild(); + self=expr(_t); +@@ -2042,13 +2398,13 @@ + + parameter_def(_t, newEnv); + _t = _retTree; +- _t = __t141; ++ _t = __t167; + _t = _t->getNextSibling(); + break; + } + case FCALL: + { +- ProgNodeP __t142 = _t; ++ ProgNodeP __t168 = _t; + f = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),FCALL); + _t = _t->getFirstChild(); +@@ -2059,7 +2415,7 @@ + + parameter_def(_t, newEnv); + _t = _retTree; +- _t = __t142; ++ _t = __t168; + _t = _t->getNextSibling(); + break; + } +@@ -2093,6 +2449,7 @@ + BaseGDL* res; + ProgNodeP tmp_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + ProgNodeP q = ProgNodeP(antlr::nullAST); ++ ProgNodeP a = ProgNodeP(antlr::nullAST); + + BaseGDL* e1; + BaseGDL** e2; +@@ -2115,19 +2472,23 @@ + } + case QUESTION: + { +- ProgNodeP __t114 = _t; ++ ProgNodeP __t125 = _t; + q = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),QUESTION); + _t = _t->getFirstChild(); + res = q->Eval(); +- _t = __t114; ++ _t = __t125; + _t = _t->getNextSibling(); + break; + } + case ARRAYEXPR: + { +- res=array_expr(_t); +- _t = _retTree; ++ { ++ a = _t; ++ match(antlr::RefAST(_t),ARRAYEXPR); ++ _t = _t->getNextSibling(); ++ res = a->Eval(); ++ } + break; + } + case DOT: +@@ -2138,11 +2499,13 @@ + } + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + { + res=assign_expr(_t); + _t = _retTree; + break; + } ++ case ARRAYEXPR_MFCALL: + case FCALL: + case MFCALL: + case MFCALL_PARENT: +@@ -2199,12 +2562,56 @@ + return res; + } + +-BaseGDL* GDLInterpreter::check_expr(ProgNodeP _t) { +- BaseGDL* res; +- ProgNodeP check_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ BaseGDL* GDLInterpreter::lib_function_call(ProgNodeP _t) { ++ BaseGDL* res; ++ ProgNodeP lib_function_call_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP fll = ProgNodeP(antlr::nullAST); ++ ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(callStack); ++ ++ ProgNodeP rTree = _t->getNextSibling(); ++ // match(antlr::RefAST(_t),FCALL_LIB); ++ ++ // match(antlr::RefAST(_t),IDENTIFIER); ++ ++ ProgNodeP& fl = _t; ++ EnvT* newEnv=new EnvT( fl, fl->libFun);//libFunList[fl->funIx]); ++ ++ parameter_def(_t->getFirstChild(), newEnv); ++ ++ // push id.pro onto call stack ++ callStack.push_back(newEnv); ++ // make the call ++ //BaseGDL* ++ res=static_cast(newEnv->GetPro())->Fun()(newEnv); ++ // *** MUST always return a defined expression ++ // if( res == NULL) ++ // throw GDLException( _t, ""); ++ ++ _retTree = rTree; ++ return res; ++ ++ ++ ProgNodeP __t141 = _t; ++ fll = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),FCALL_LIB); ++ _t = _t->getFirstChild(); ++ ++ //EnvT* ++ newEnv=new EnvT( fll, fll->libFun);//libFunList[fl->funIx]); + +- res=lib_function_call(_t); ++ parameter_def(_t, newEnv); + _t = _retTree; ++ ++ // push id.pro onto call stack ++ callStack.push_back(newEnv); ++ // make the call ++ res=static_cast(newEnv->GetPro())->Fun()(newEnv); ++ //*** MUST always return a defined expression ++ ++ _t = __t141; ++ _t = _t->getNextSibling(); + _retTree = _t; + return res; + } +@@ -2212,100 +2619,130 @@ + BaseGDL* GDLInterpreter::r_expr(ProgNodeP _t) { + BaseGDL* res; + ProgNodeP r_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP e = ProgNodeP(antlr::nullAST); +- ProgNodeP a = ProgNodeP(antlr::nullAST); +- ProgNodeP s = ProgNodeP(antlr::nullAST); +- ProgNodeP n = ProgNodeP(antlr::nullAST); +- ProgNodeP r = ProgNodeP(antlr::nullAST); ++ ++ switch ( _t->getType()) { ++ case EXPR: ++ case ARRAYDEF: ++ case STRUC: ++ case NSTRUC: ++ case NSTRUC_REF: ++ { ++ res = _t->Eval(); ++ break; ++ } ++ case DEC: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), DEC); ++ break; ++ } ++ case INC: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), INC); ++ break; ++ } ++ case POSTDEC: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), POSTDEC); ++ break; ++ } ++ // case POSTINC: ++ default: ++ { ++ res=l_decinc_expr( _t->getFirstChild(), POSTINC); ++ break; ++ } ++ // default: ++ // { ++ // throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ // } ++ } ++ _retTree = _t->getNextSibling(); ++ return res; ++ + + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; + switch ( _t->getType()) { + case EXPR: + { +- e = _t; ++ ProgNodeP tmp44_AST_in = _t; + match(antlr::RefAST(_t),EXPR); + _t = _t->getNextSibling(); +- res = e->Eval(); + break; + } + case ARRAYDEF: + { +- a = _t; ++ ProgNodeP tmp45_AST_in = _t; + match(antlr::RefAST(_t),ARRAYDEF); + _t = _t->getNextSibling(); +- res = a->Eval(); _t=_retTree; + break; + } + case STRUC: + { +- s = _t; ++ ProgNodeP tmp46_AST_in = _t; + match(antlr::RefAST(_t),STRUC); + _t = _t->getNextSibling(); +- res = s->Eval(); _t=_retTree; + break; + } + case NSTRUC: + { +- n = _t; ++ ProgNodeP tmp47_AST_in = _t; + match(antlr::RefAST(_t),NSTRUC); + _t = _t->getNextSibling(); +- res = n->Eval(); _t=_retTree; + break; + } + case NSTRUC_REF: + { +- r = _t; ++ ProgNodeP tmp48_AST_in = _t; + match(antlr::RefAST(_t),NSTRUC_REF); + _t = _t->getNextSibling(); +- res = r->Eval(); _t=_retTree; + break; + } + case DEC: + { +- ProgNodeP __t85 = _t; +- ProgNodeP tmp17_AST_in = _t; ++ ProgNodeP __t96 = _t; ++ ProgNodeP tmp49_AST_in = _t; + match(antlr::RefAST(_t),DEC); + _t = _t->getFirstChild(); + res=l_decinc_expr(_t, DEC); + _t = _retTree; +- _t = __t85; ++ _t = __t96; + _t = _t->getNextSibling(); + break; + } + case INC: + { +- ProgNodeP __t86 = _t; +- ProgNodeP tmp18_AST_in = _t; ++ ProgNodeP __t97 = _t; ++ ProgNodeP tmp50_AST_in = _t; + match(antlr::RefAST(_t),INC); + _t = _t->getFirstChild(); + res=l_decinc_expr(_t, INC); + _t = _retTree; +- _t = __t86; ++ _t = __t97; + _t = _t->getNextSibling(); + break; + } + case POSTDEC: + { +- ProgNodeP __t87 = _t; +- ProgNodeP tmp19_AST_in = _t; ++ ProgNodeP __t98 = _t; ++ ProgNodeP tmp51_AST_in = _t; + match(antlr::RefAST(_t),POSTDEC); + _t = _t->getFirstChild(); + res=l_decinc_expr(_t, POSTDEC); + _t = _retTree; +- _t = __t87; ++ _t = __t98; + _t = _t->getNextSibling(); + break; + } + case POSTINC: + { +- ProgNodeP __t88 = _t; +- ProgNodeP tmp20_AST_in = _t; ++ ProgNodeP __t99 = _t; ++ ProgNodeP tmp52_AST_in = _t; + match(antlr::RefAST(_t),POSTINC); + _t = _t->getFirstChild(); + res=l_decinc_expr(_t, POSTINC); + _t = _retTree; +- _t = __t88; ++ _t = __t99; + _t = _t->getNextSibling(); + break; + } +@@ -2323,12 +2760,9 @@ + ProgNodeP constant_nocopy_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + ProgNodeP c = ProgNodeP(antlr::nullAST); + +- + //BaseGDL* +- res = _t->cData; // no ->Dup(); +- + _retTree = _t->getNextSibling(); +- return res; ++ return _t->cData; // no ->Dup(); + + + c = _t; +@@ -2405,34 +2839,26 @@ + BaseGDL** GDLInterpreter::l_defined_simple_var(ProgNodeP _t) { + BaseGDL** res; + ProgNodeP l_defined_simple_var_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP var = ProgNodeP(antlr::nullAST); +- ProgNodeP varPtr = ProgNodeP(antlr::nullAST); + + if( _t->getType() == VAR) + { +- var = _t; + // match(antlr::RefAST(_t),VAR); +- _t = _t->getNextSibling(); +- +- res=&callStack.back()->GetKW(var->varIx); ++ res=&callStack.back()->GetKW(_t->varIx); + if( *res == NULL) +- throw GDLException( var, "Variable is undefined: "+ +- callStack.back()->GetString(var->varIx),true,false); ++ throw GDLException( _t, "Variable is undefined: "+ ++ callStack.back()->GetString(_t->varIx),true,false); + + } + else + { +- varPtr = _t; + // match(antlr::RefAST(_t),VARPTR); +- _t = _t->getNextSibling(); +- +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) ++ res=&_t->var->Data(); // returns BaseGDL* of var (DVar*) + if( *res == NULL) + throw GDLException( _t, "Variable is undefined: "+ + callStack.back()->GetString( *res),true,false); + + } +- _retTree = _t; ++ _retTree = _t->getNextSibling(); + return res; + + +@@ -2441,28 +2867,16 @@ + switch ( _t->getType()) { + case VAR: + { +- var = _t; ++ ProgNodeP tmp53_AST_in = _t; + match(antlr::RefAST(_t),VAR); + _t = _t->getNextSibling(); +- +- res=&callStack.back()->GetKW(var->varIx); +- if( *res == NULL) +- throw GDLException( _t, "Variable is undefined: "+ +- callStack.back()->GetString(var->varIx),true,false); +- + break; + } + case VARPTR: + { +- varPtr = _t; ++ ProgNodeP tmp54_AST_in = _t; + match(antlr::RefAST(_t),VARPTR); + _t = _t->getNextSibling(); +- +- res=&varPtr->var->Data(); // returns BaseGDL* of var (DVar*) +- if( *res == NULL) +- throw GDLException( _t, "Variable is undefined: "+ +- callStack.back()->GetString( *res),true,false); +- + break; + } + default: +@@ -2523,15 +2937,15 @@ + switch ( _t->getType()) { + case ARRAYEXPR: + { +- ProgNodeP __t52 = _t; +- ProgNodeP tmp21_AST_in = _t; ++ ProgNodeP __t58 = _t; ++ ProgNodeP tmp55_AST_in = _t; + match(antlr::RefAST(_t),ARRAYEXPR); + _t = _t->getFirstChild(); + e=l_decinc_indexable_expr(_t, dec_inc); + _t = _retTree; + aL=arrayindex_list(_t); + _t = _retTree; +- _t = __t52; ++ _t = __t58; + _t = _t->getNextSibling(); + + guard.reset( aL); +@@ -2641,13 +3055,13 @@ + case VARPTR: + { + s=indexable_expr(_t); +- _t = _retTree; ++ // _t = _retTree; + break; + } + case FCALL_LIB: + { +- s=check_expr(_t); +- _t = _retTree; ++ s=lib_function_call(_t); ++ // _t = _retTree; + + if( !callStack.back()->Contains( s)) + exprList.push_back( s); +@@ -2657,7 +3071,7 @@ + default: + { + s=indexable_tmp_expr(_t); +- _t = _retTree; ++ // _t = _retTree; + exprList.push_back( s); + break; + } +@@ -2667,6 +3081,8 @@ + ixExprList.push_back( s); + if( ixExprList.size() == nExpr) + break; // allows some manual tuning ++ ++ _t = _t->getNextSibling(); + } + + aL->Init( ixExprList); +@@ -2675,7 +3091,7 @@ + return aL; + + +- ProgNodeP __t149 = _t; ++ ProgNodeP __t176 = _t; + ax = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),ARRAYIX); + _t = _t->getFirstChild(); +@@ -2700,7 +3116,7 @@ + } + case FCALL_LIB: + { +- s=check_expr(_t); ++ s=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( s)) +@@ -2710,8 +3126,10 @@ + } + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case EXPR: + case FCALL: + case FCALL_LIB_RETNEW: +@@ -2740,13 +3158,13 @@ + } + } + else { +- goto _loop152; ++ goto _loop179; + } + + } +- _loop152:; ++ _loop179:; + } // ( ... )* +- _t = __t149; ++ _t = __t176; + _t = _t->getNextSibling(); + _retTree = _t; + return aL; +@@ -2759,7 +3177,7 @@ + ProgNodeP l_decinc_dot_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + ProgNodeP dot = ProgNodeP(antlr::nullAST); + +- ProgNodeP __t54 = _t; ++ ProgNodeP __t60 = _t; + dot = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),DOT); + _t = _t->getFirstChild(); +@@ -2770,7 +3188,7 @@ + l_dot_array_expr(_t, aD.get()); + _t = _retTree; + { // ( ... )+ +- int _cnt56=0; ++ int _cnt62=0; + for (;;) { + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; +@@ -2779,14 +3197,14 @@ + _t = _retTree; + } + else { +- if ( _cnt56>=1 ) { goto _loop56; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt62>=1 ) { goto _loop62; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + +- _cnt56++; ++ _cnt62++; + } +- _loop56:; ++ _loop62:; + } // ( ... )+ +- _t = __t54; ++ _t = __t60; + _t = _t->getNextSibling(); + + if( dec_inc == DECSTATEMENT) +@@ -2831,8 +3249,8 @@ + switch ( _t->getType()) { + case ARRAYEXPR: + { +- ProgNodeP __t69 = _t; +- ProgNodeP tmp22_AST_in = _t; ++ ProgNodeP __t78 = _t; ++ ProgNodeP tmp56_AST_in = _t; + match(antlr::RefAST(_t),ARRAYEXPR); + _t = _t->getFirstChild(); + rP=l_indexable_expr(_t); +@@ -2840,7 +3258,7 @@ + aL=arrayindex_list(_t); + _t = _retTree; + guard.reset(aL); +- _t = __t69; ++ _t = __t78; + _t = _t->getNextSibling(); + + // check here for object and get struct +@@ -2871,6 +3289,7 @@ + + break; + } ++ case ARRAYEXPR_MFCALL: + case DEREF: + case EXPR: + case FCALL: +@@ -2935,8 +3354,8 @@ + switch ( _t->getType()) { + case ARRAYEXPR: + { +- ProgNodeP __t99 = _t; +- ProgNodeP tmp23_AST_in = _t; ++ ProgNodeP __t110 = _t; ++ ProgNodeP tmp57_AST_in = _t; + match(antlr::RefAST(_t),ARRAYEXPR); + _t = _t->getFirstChild(); + tag_expr(_t, aD); +@@ -2944,7 +3363,7 @@ + aL=arrayindex_list(_t); + _t = _retTree; + aD->AddIx(aL); +- _t = __t99; ++ _t = __t110; + _t = _t->getNextSibling(); + break; + } +@@ -2969,8 +3388,10 @@ + ) { + BaseGDL* res; + ProgNodeP l_decinc_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP mp2 = ProgNodeP(antlr::nullAST); + + BaseGDL* e1; ++ ProgNodeP startNode = _t; + + + if (_t == ProgNodeP(antlr::nullAST) ) +@@ -2978,8 +3399,8 @@ + switch ( _t->getType()) { + case QUESTION: + { +- ProgNodeP __t58 = _t; +- ProgNodeP tmp24_AST_in = _t; ++ ProgNodeP __t64 = _t; ++ ProgNodeP tmp58_AST_in = _t; + match(antlr::RefAST(_t),QUESTION); + _t = _t->getFirstChild(); + e1=expr(_t); +@@ -2997,14 +3418,14 @@ + res=l_decinc_expr(_t, dec_inc); + } + +- _t = __t58; ++ _t = __t64; + _t = _t->getNextSibling(); + break; + } + case ASSIGN: + { +- ProgNodeP __t59 = _t; +- ProgNodeP tmp25_AST_in = _t; ++ ProgNodeP __t65 = _t; ++ ProgNodeP tmp59_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN); + _t = _t->getFirstChild(); + +@@ -3026,8 +3447,91 @@ + } + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ case ARRAYDEF: ++ case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: ++ case EXPR: ++ case FCALL: ++ case FCALL_LIB_RETNEW: ++ case MFCALL: ++ case MFCALL_PARENT: ++ case NSTRUC: ++ case NSTRUC_REF: ++ case POSTDEC: ++ case POSTINC: ++ case STRUC: ++ case DEC: ++ case INC: ++ case DOT: ++ case QUESTION: ++ { ++ e1=indexable_tmp_expr(_t); ++ _t = _retTree; ++ r_guard.reset( e1); ++ break; ++ } ++ case FCALL_LIB: ++ { ++ e1=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( e1)) ++ r_guard.reset( e1); // guard if no global data ++ ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ } ++ } ++ } ++ ++ ProgNodeP l = _t; ++ ++ BaseGDL** tmp; ++ ++ tmp=l_expr(_t, e1); ++ _t = _retTree; ++ ++ _t = l; ++ ++ res=l_decinc_expr(_t, dec_inc); ++ _t = _retTree; ++ _t = __t65; ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ { ++ ProgNodeP __t67 = _t; ++ ProgNodeP tmp60_AST_in = _t; ++ match(antlr::RefAST(_t),ASSIGN_ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ ++ auto_ptr r_guard; ++ ++ { ++ if (_t == ProgNodeP(antlr::nullAST) ) ++ _t = ASTNULL; ++ switch ( _t->getType()) { ++ case CONSTANT: ++ case DEREF: ++ case SYSVAR: ++ case VAR: ++ case VARPTR: ++ { ++ e1=indexable_expr(_t); ++ _t = _retTree; ++ break; ++ } ++ case ASSIGN: ++ case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case EXPR: + case FCALL: + case FCALL_LIB_RETNEW: +@@ -3050,7 +3554,7 @@ + } + case FCALL_LIB: + { +- e1=check_expr(_t); ++ e1=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( e1)) +@@ -3065,25 +3569,51 @@ + } + } + +- ProgNodeP l = _t; +- +- BaseGDL** tmp; +- +- tmp=l_expr(_t, e1); +- _t = _retTree; +- +- _t = l; ++ ProgNodeP l = _t; ++ ++ BaseGDL** tmp; ++ ++ // try MFCALL ++ try ++ { ++ ++ tmp=l_arrayexpr_mfcall_as_mfcall(l); ++ ++ if( e1 != (*tmp)) ++ { ++ delete *tmp; ++ ++ if( r_guard.get() == e1) ++ *tmp = r_guard.release(); ++ else ++ *tmp = e1->Dup(); ++ } ++ ++ res=l_decinc_expr( l, dec_inc); ++ } ++ catch( GDLException& ex) ++ { ++ // try ARRAYEXPR ++ try ++ { ++ tmp=l_arrayexpr_mfcall_as_arrayexpr(l, e1); ++ } ++ catch( GDLException& ex2) ++ { ++ throw GDLException(ex.toString() + " or "+ex2.toString()); ++ } ++ ++ res=l_decinc_expr( l, dec_inc); ++ } + +- res=l_decinc_expr(_t, dec_inc); +- _t = _retTree; +- _t = __t59; ++ _t = __t67; + _t = _t->getNextSibling(); + break; + } + case ASSIGN_REPLACE: + { +- ProgNodeP __t61 = _t; +- ProgNodeP tmp26_AST_in = _t; ++ ProgNodeP __t69 = _t; ++ ProgNodeP tmp61_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN_REPLACE); + _t = _t->getFirstChild(); + +@@ -3095,8 +3625,10 @@ + switch ( _t->getType()) { + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -3126,7 +3658,7 @@ + } + case FCALL_LIB: + { +- e1=check_expr(_t); ++ e1=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( e1)) +@@ -3193,7 +3725,7 @@ + + res=l_decinc_expr(_t, dec_inc); + _t = _retTree; +- _t = __t61; ++ _t = __t69; + _t = _t->getNextSibling(); + break; + } +@@ -3211,6 +3743,86 @@ + _t = _retTree; + break; + } ++ case ARRAYEXPR_MFCALL: ++ { ++ ProgNodeP __t72 = _t; ++ ProgNodeP tmp62_AST_in = _t; ++ match(antlr::RefAST(_t),ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ ++ ProgNodeP mark = _t; ++ _t = _t->getNextSibling(); // step over DOT ++ ++ BaseGDL* self; ++ ++ self=expr(_t); ++ _t = _retTree; ++ mp2 = _t; ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ++ auto_ptr self_guard(self); ++ ++ EnvUDT* newEnv; ++ ++ try { ++ newEnv=new EnvUDT( self, mp2, "", true); ++ self_guard.release(); ++ } ++ catch( GDLException& ex) ++ { ++ _t = mark; ++ ++ res=l_decinc_dot_expr(_t, dec_inc); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ ++ parameter_def(_t, newEnv); ++ _t = _retTree; ++ ++ // push environment onto call stack ++ callStack.push_back(newEnv); ++ ++ // make the call ++ BaseGDL** ee=call_lfun(static_cast( ++ newEnv->GetPro())->GetTree()); ++ ++ BaseGDL* e = *ee; ++ if( e == NULL) ++ throw GDLException( _t, "Variable is undefined: "+Name(ee),true,false); ++ ++ if( dec_inc == DECSTATEMENT) ++ { ++ e->Dec(); ++ res = NULL; ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ if( dec_inc == INCSTATEMENT) ++ { ++ e->Inc(); ++ res = NULL; ++ _retTree = startNode->getNextSibling(); ++ return res; ++ } ++ ++ if( dec_inc == DEC) e->Dec(); ++ else if( dec_inc == INC) e->Inc(); ++ // ++ res = e->Dup(); ++ ++ if( dec_inc == POSTDEC) e->Dec(); ++ else if( dec_inc == POSTINC) e->Inc(); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ ++ _t = __t72; ++ _t = _t->getNextSibling(); ++ break; ++ } + case DOT: + { + res=l_decinc_dot_expr(_t, dec_inc); +@@ -3259,6 +3871,9 @@ + BaseGDL* res; + ProgNodeP indexable_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + ++ _retTree = _t->getNextSibling(); ++ return _t->EvalNC(); ++ + BaseGDL** e2; + + +@@ -3311,6 +3926,7 @@ + BaseGDL* res; + ProgNodeP indexable_tmp_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + ProgNodeP q = ProgNodeP(antlr::nullAST); ++ ProgNodeP a = ProgNodeP(antlr::nullAST); + + BaseGDL* e1; + +@@ -3320,19 +3936,23 @@ + switch ( _t->getType()) { + case QUESTION: + { +- ProgNodeP __t109 = _t; ++ ProgNodeP __t120 = _t; + q = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),QUESTION); + _t = _t->getFirstChild(); + res = q->Eval(); +- _t = __t109; ++ _t = __t120; + _t = _t->getNextSibling(); + break; + } + case ARRAYEXPR: + { +- res=array_expr(_t); +- _t = _retTree; ++ { ++ a = _t; ++ match(antlr::RefAST(_t),ARRAYEXPR); ++ _t = _t->getNextSibling(); ++ res = a->Eval(); ++ } + break; + } + case DOT: +@@ -3343,11 +3963,13 @@ + } + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + { + res=assign_expr(_t); + _t = _retTree; + break; + } ++ case ARRAYEXPR_MFCALL: + case FCALL: + case MFCALL: + case MFCALL_PARENT: +@@ -3400,8 +4022,8 @@ + switch ( _t->getType()) { + case QUESTION: + { +- ProgNodeP __t71 = _t; +- ProgNodeP tmp27_AST_in = _t; ++ ProgNodeP __t80 = _t; ++ ProgNodeP tmp63_AST_in = _t; + match(antlr::RefAST(_t),QUESTION); + _t = _t->getFirstChild(); + e1=expr(_t); +@@ -3419,14 +4041,14 @@ + res=l_expr(_t, right); + } + +- _t = __t71; ++ _t = __t80; + _t = _t->getNextSibling(); + break; + } + case ASSIGN: + { +- ProgNodeP __t72 = _t; +- ProgNodeP tmp28_AST_in = _t; ++ ProgNodeP __t81 = _t; ++ ProgNodeP tmp64_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN); + _t = _t->getFirstChild(); + { +@@ -3445,8 +4067,10 @@ + } + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case EXPR: + case FCALL: + case FCALL_LIB_RETNEW: +@@ -3469,7 +4093,7 @@ + } + case FCALL_LIB: + { +- e1=check_expr(_t); ++ e1=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( e1)) +@@ -3486,14 +4110,108 @@ + } + res=l_expr(_t, right); + _t = _retTree; +- _t = __t72; ++ _t = __t81; ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ { ++ ProgNodeP __t83 = _t; ++ ProgNodeP tmp65_AST_in = _t; ++ match(antlr::RefAST(_t),ASSIGN_ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ { ++ if (_t == ProgNodeP(antlr::nullAST) ) ++ _t = ASTNULL; ++ switch ( _t->getType()) { ++ case CONSTANT: ++ case DEREF: ++ case SYSVAR: ++ case VAR: ++ case VARPTR: ++ { ++ e1=indexable_expr(_t); ++ _t = _retTree; ++ break; ++ } ++ case ASSIGN: ++ case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ case ARRAYDEF: ++ case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: ++ case EXPR: ++ case FCALL: ++ case FCALL_LIB_RETNEW: ++ case MFCALL: ++ case MFCALL_PARENT: ++ case NSTRUC: ++ case NSTRUC_REF: ++ case POSTDEC: ++ case POSTINC: ++ case STRUC: ++ case DEC: ++ case INC: ++ case DOT: ++ case QUESTION: ++ { ++ e1=indexable_tmp_expr(_t); ++ _t = _retTree; ++ delete e1; ++ break; ++ } ++ case FCALL_LIB: ++ { ++ e1=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( e1)) ++ delete e1; ++ ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ } ++ } ++ } ++ ++ ProgNodeP l = _t; ++ ++ // try MFCALL ++ try ++ { ++ ++ res=l_arrayexpr_mfcall_as_mfcall( l); ++ ++ if( right != (*res)) ++ { ++ delete *res; ++ *res = right->Dup(); ++ } ++ } ++ catch( GDLException& ex) ++ { ++ // try ARRAYEXPR ++ try ++ { ++ res=l_arrayexpr_mfcall_as_arrayexpr(l, right); ++ } ++ catch( GDLException& ex2) ++ { ++ throw GDLException(ex.toString() + " or "+ex2.toString()); ++ } ++ } ++ ++ _t = __t83; + _t = _t->getNextSibling(); + break; + } + case ASSIGN_REPLACE: + { +- ProgNodeP __t74 = _t; +- ProgNodeP tmp29_AST_in = _t; ++ ProgNodeP __t85 = _t; ++ ProgNodeP tmp66_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN_REPLACE); + _t = _t->getFirstChild(); + { +@@ -3502,8 +4220,10 @@ + switch ( _t->getType()) { + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -3534,7 +4254,7 @@ + } + case FCALL_LIB: + { +- e1=check_expr(_t); ++ e1=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( e1)) +@@ -3593,7 +4313,7 @@ + *res = right->Dup(); + } + +- _t = __t74; ++ _t = __t85; + _t = _t->getNextSibling(); + break; + } +@@ -3683,9 +4403,15 @@ + + break; + } ++ case ARRAYEXPR_MFCALL: ++ { ++ res=l_arrayexpr_mfcall(_t, right); ++ _t = _retTree; ++ break; ++ } + case DOT: + { +- ProgNodeP __t78 = _t; ++ ProgNodeP __t89 = _t; + dot = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),DOT); + _t = _t->getFirstChild(); +@@ -3696,7 +4422,7 @@ + l_dot_array_expr(_t, aD.get()); + _t = _retTree; + { // ( ... )+ +- int _cnt80=0; ++ int _cnt91=0; + for (;;) { + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; +@@ -3705,14 +4431,14 @@ + _t = _retTree; + } + else { +- if ( _cnt80>=1 ) { goto _loop80; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt91>=1 ) { goto _loop91; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + +- _cnt80++; ++ _cnt91++; + } +- _loop80:; ++ _loop91:; + } // ( ... )+ +- _t = __t78; ++ _t = __t89; + _t = _t->getNextSibling(); + + if( right == NULL) +@@ -3762,6 +4488,100 @@ + return res; + } + ++BaseGDL** GDLInterpreter::l_simple_var(ProgNodeP _t) { ++ BaseGDL** res; ++ ProgNodeP l_simple_var_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ++ assert( _t != NULL); ++ ++ _retTree = _t->getNextSibling(); ++ ++ if( _t->getType() == VAR) ++ { ++ return &callStack.back()->GetKW(_t->varIx); ++ // ProgNodeP var = _t; ++ // match(antlr::RefAST(_t),VAR); ++ } ++ else ++ { ++ return &_t->var->Data(); // returns BaseGDL* of var (DVar*) ++ // ProgNodeP varPtr = _t; ++ // match(antlr::RefAST(_t),VARPTR); ++ } ++ return res; ++ ++ ++ if (_t == ProgNodeP(antlr::nullAST) ) ++ _t = ASTNULL; ++ switch ( _t->getType()) { ++ case VAR: ++ { ++ ProgNodeP tmp67_AST_in = _t; ++ match(antlr::RefAST(_t),VAR); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case VARPTR: ++ { ++ ProgNodeP tmp68_AST_in = _t; ++ match(antlr::RefAST(_t),VARPTR); ++ _t = _t->getNextSibling(); ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ } ++ } ++ _retTree = _t; ++ return res; ++} ++ ++void GDLInterpreter::parameter_def(ProgNodeP _t, ++ EnvBaseT* actEnv ++) { ++ ProgNodeP parameter_def_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ++ auto_ptr guard(actEnv); ++ try{ ++ ++ _retTree = _t; ++ while(_retTree != NULL) { ++ static_cast(_retTree)->Parameter( actEnv); ++ } ++ ++ actEnv->Extra(); // expand _EXTRA ++ ++ } ++ catch( GDLException& e) ++ { ++ // update line number, currently set to caller->CallingNode() ++ // because actEnv is not on the stack yet, ++ // report caller->Pro()'s name is ok, because we are not inside ++ // the call yet ++ e.SetErrorNodeP( actEnv->CallingNode()); ++ throw e; ++ } ++ ++ guard.release(); ++ ++ return; ++ ++ ++ { ++ ProgNodeP __t174 = _t; ++ ProgNodeP tmp69_AST_in = _t; ++ match(antlr::RefAST(_t),KEYDEF_REF); ++ _t = _t->getFirstChild(); ++ ProgNodeP tmp70_AST_in = _t; ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ _t = __t174; ++ _t = _t->getNextSibling(); ++ } ++ _retTree = _t; ++} ++ + BaseGDL** GDLInterpreter::l_indexable_expr(ProgNodeP _t) { + BaseGDL** res; + ProgNodeP l_indexable_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +@@ -3771,13 +4591,13 @@ + switch ( _t->getType()) { + case EXPR: + { +- ProgNodeP __t65 = _t; +- ProgNodeP tmp30_AST_in = _t; ++ ProgNodeP __t74 = _t; ++ ProgNodeP tmp71_AST_in = _t; + match(antlr::RefAST(_t),EXPR); + _t = _t->getFirstChild(); + res=l_expr(_t, NULL); + _t = _retTree; +- _t = __t65; ++ _t = __t74; + _t = _t->getNextSibling(); + + if( *res == NULL) +@@ -3798,6 +4618,16 @@ + + break; + } ++ case ARRAYEXPR_MFCALL: ++ { ++ res=l_arrayexpr_mfcall_as_mfcall(_t); ++ _t = _retTree; ++ ++ if( *res == NULL) ++ throw GDLException( _t, "Variable is undefined: "+Name(res),true,false); ++ ++ break; ++ } + case DEREF: + { + res=l_deref(_t); +@@ -3840,8 +4670,8 @@ + ArrayIndexListGuard guard; + + +- ProgNodeP __t67 = _t; +- ProgNodeP tmp31_AST_in = _t; ++ ProgNodeP __t76 = _t; ++ ProgNodeP tmp72_AST_in = _t; + match(antlr::RefAST(_t),ARRAYEXPR); + _t = _t->getFirstChild(); + res=l_indexable_expr(_t); +@@ -3849,7 +4679,7 @@ + aL=arrayindex_list(_t); + _t = _retTree; + guard.reset(aL); +- _t = __t67; ++ _t = __t76; + _t = _t->getNextSibling(); + + if( right == NULL) +@@ -3859,7 +4689,6 @@ + aL->AssignAt( *res, right); + + // aL->SetVariable( *res); +- + // if( (*res)->EqType( right)) + // { + // (*res)->AssignAt( right, aL); // assigns inplace +@@ -3868,7 +4697,6 @@ + // { + // BaseGDL* rConv = right->Convert2( (*res)->Type(), BaseGDL::COPY); + // auto_ptr conv_guard( rConv); +- + // (*res)->AssignAt( rConv, aL); // assigns inplace + // } + +@@ -3876,6 +4704,110 @@ + return res; + } + ++BaseGDL** GDLInterpreter::l_arrayexpr_mfcall(ProgNodeP _t, ++ BaseGDL* right ++) { ++ BaseGDL** res; ++ ProgNodeP l_arrayexpr_mfcall_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP mp2 = ProgNodeP(antlr::nullAST); ++ ProgNodeP dot = ProgNodeP(antlr::nullAST); ++ ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(callStack); ++ BaseGDL *self; ++ EnvUDT* newEnv; ++ ProgNodeP startNode = _t; ++ ++ ++ ProgNodeP __t151 = _t; ++ ProgNodeP tmp73_AST_in = _t; ++ match(antlr::RefAST(_t),ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ ++ ProgNodeP mark = _t; ++ _t = _t->getNextSibling(); // skip DOT ++ ++ self=expr(_t); ++ _t = _retTree; ++ mp2 = _t; ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ++ auto_ptr self_guard(self); ++ ++ try { ++ newEnv=new EnvUDT( self, mp2, "", true); ++ self_guard.release(); ++ } ++ catch( GDLException& ex) ++ { ++ goto tryARRAYEXPR; ++ } ++ ++ parameter_def(_t, newEnv); ++ _t = _retTree; ++ _t = __t151; ++ _t = _t->getNextSibling(); ++ ++ // push environment onto call stack ++ callStack.push_back(newEnv); ++ ++ // make the call ++ res=call_lfun(static_cast( ++ newEnv->GetPro())->GetTree()); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ ++ tryARRAYEXPR:; ++ _t = mark; ++ ++ ProgNodeP __t152 = _t; ++ dot = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),DOT); ++ _t = _t->getFirstChild(); ++ ++ SizeT nDot=dot->nDot; ++ auto_ptr aD( new DotAccessDescT(nDot+1)); ++ ++ l_dot_array_expr(_t, aD.get()); ++ _t = _retTree; ++ { // ( ... )+ ++ int _cnt154=0; ++ for (;;) { ++ if (_t == ProgNodeP(antlr::nullAST) ) ++ _t = ASTNULL; ++ if ((_t->getType() == ARRAYEXPR || _t->getType() == EXPR || _t->getType() == IDENTIFIER)) { ++ tag_array_expr(_t, aD.get()); ++ _t = _retTree; ++ } ++ else { ++ if ( _cnt154>=1 ) { goto _loop154; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ } ++ ++ _cnt154++; ++ } ++ _loop154:; ++ } // ( ... )+ ++ _t = __t152; ++ _t = _t->getNextSibling(); ++ ++ if( right == NULL) ++ throw GDLException( _t, ++ "Struct expression not allowed in this context.", ++ true,false); ++ ++ aD->Assign( right); ++ ++ res=NULL; ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ ++ _retTree = _t; ++ return res; ++} ++ + BaseGDL* GDLInterpreter::array_expr(ProgNodeP _t) { + BaseGDL* res; + ProgNodeP array_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +@@ -3891,9 +4823,158 @@ + SizeT nExpr; + BaseGDL* s; + ++ ProgNodeP retTree = _t->getNextSibling(); ++ // match(antlr::RefAST(_t),ARRAYEXPR); ++ _t = _t->getFirstChild(); ++ ++ switch ( _t->getType()) { ++ case VAR: ++ case CONSTANT: ++ case DEREF: ++ case SYSVAR: ++ case VARPTR: ++ { ++ r=_t->EvalNC(); ++ //r=indexable_expr(_t); ++ _t = _t->getNextSibling(); //_retTree; ++ break; ++ } ++ case FCALL_LIB: ++ { ++ r=lib_function_call(_t); ++ _t = _t->getNextSibling(); ++ ++ if( !callStack.back()->Contains( r)) ++ r_guard.reset( r); // guard if no global data ++ ++ break; ++ } ++ // case ASSIGN: ++ // case ASSIGN_REPLACE: ++ // case ASSIGN_ARRAYEXPR_MFCALL: ++ // case ARRAYDEF: ++ // case ARRAYEXPR: ++ // case ARRAYEXPR_MFCALL: ++ // case EXPR: ++ // case FCALL: ++ // case FCALL_LIB_RETNEW: ++ // case MFCALL: ++ // case MFCALL_PARENT: ++ // case NSTRUC: ++ // case NSTRUC_REF: ++ // case POSTDEC: ++ // case POSTINC: ++ // case STRUC: ++ // case DEC: ++ // case INC: ++ // case DOT: ++ // case QUESTION: ++ default: ++ { ++ r=indexable_tmp_expr(_t); ++ _t = _retTree; ++ r_guard.reset( r); ++ break; ++ } ++ } ++ + +- ProgNodeP __t90 = _t; +- ProgNodeP tmp32_AST_in = _t; ++ aL = _t->arrIxList; ++ assert( aL != NULL); ++ guard.reset(aL); ++ ++ // ax = _t ++ // match(antlr::RefAST(_t),ARRAYIX); ++ _t = _t->getFirstChild(); ++ ++ nExpr = aL->NParam(); ++ ++ if( nExpr == 0) ++ { ++ goto empty; ++ } ++ // if( nExpr > 1) ++ // { ++ // ixExprList.reserve( nExpr); ++ // exprList.reserve( nExpr); ++ // } ++ // if( nExpr == 0) goto empty; ++ ++ for (;;) { ++ // if ((_tokenSet_1.member(_t->getType()))) { ++ switch ( _t->getType()) { ++ case VAR: ++ case CONSTANT: ++ case DEREF: ++ case SYSVAR: ++ case VARPTR: ++ { ++ s=_t->EvalNC();//indexable_expr(_t); ++ _t = _t->getNextSibling();//_retTree; ++ break; ++ } ++ case FCALL_LIB: ++ { ++ s=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( s)) ++ exprList.push_back( s); ++ ++ break; ++ } ++ // case ASSIGN: ++ // case ASSIGN_REPLACE: ++ // case ASSIGN_ARRAYEXPR_MFCALL: ++ // case ARRAYDEF: ++ // case ARRAYEXPR: ++ // case ARRAYEXPR_MFCALL: ++ // case EXPR: ++ // case FCALL: ++ // case FCALL_LIB_RETNEW: ++ // case MFCALL: ++ // case MFCALL_PARENT: ++ // case NSTRUC: ++ // case NSTRUC_REF: ++ // case POSTDEC: ++ // case POSTINC: ++ // case STRUC: ++ // case DEC: ++ // case INC: ++ // case DOT: ++ // case QUESTION: ++ default: ++ { ++ s=indexable_tmp_expr(_t); ++ _t = _retTree; ++ exprList.push_back( s); ++ break; ++ } ++ } // switch ++ ++ ixExprList.push_back( s); ++ if( ixExprList.size() == nExpr) ++ break; // finish ++ ++ } // for ++ // else { ++ // assert( 0);//goto _loop106; ++ // } ++ ++ empty: ++ //_retTree = ax; ++ res = aL->Index( r, ixExprList); ++ // aL->Init( ixExprList); ++ // aL->SetVariable( r); ++ // res=r->Index( aL); ++ // ClearTmpList(); ++ ++ _retTree = retTree; ++ return res; ++ ++ ++ ProgNodeP __t101 = _t; ++ ProgNodeP tmp74_AST_in = _t; + match(antlr::RefAST(_t),ARRAYEXPR); + _t = _t->getFirstChild(); + { +@@ -3912,8 +4993,10 @@ + } + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case EXPR: + case FCALL: + case FCALL_LIB_RETNEW: +@@ -3936,7 +5019,7 @@ + } + case FCALL_LIB: + { +- r=check_expr(_t); ++ r=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( r)) +@@ -3950,7 +5033,7 @@ + } + } + } +- ProgNodeP __t92 = _t; ++ ProgNodeP __t103 = _t; + ax = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),ARRAYIX); + _t = _t->getFirstChild(); +@@ -3964,7 +5047,7 @@ + + if( nExpr == 0) + { +- goto empty; ++ goto empty2; + } + // if( nExpr > 1) + // { +@@ -3994,7 +5077,7 @@ + } + case FCALL_LIB: + { +- s=check_expr(_t); ++ s=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( s)) +@@ -4004,8 +5087,10 @@ + } + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case EXPR: + case FCALL: + case FCALL_LIB_RETNEW: +@@ -4039,16 +5124,16 @@ + + } + else { +- goto _loop95; ++ goto _loop106; + } + + } +- _loop95:; ++ _loop106:; + } // ( ... )* +- _t = __t92; ++ _t = __t103; + _t = _t->getNextSibling(); + +- empty: ++ empty2: + //_retTree = ax; + res = aL->Index( r, ixExprList); + // aL->Init( ixExprList); +@@ -4056,7 +5141,7 @@ + // res=r->Index( aL); + // ClearTmpList(); + +- _t = __t90; ++ _t = __t101; + _t = _t->getNextSibling(); + _retTree = _t; + return res; +@@ -4076,8 +5161,8 @@ + switch ( _t->getType()) { + case EXPR: + { +- ProgNodeP __t97 = _t; +- ProgNodeP tmp33_AST_in = _t; ++ ProgNodeP __t108 = _t; ++ ProgNodeP tmp75_AST_in = _t; + match(antlr::RefAST(_t),EXPR); + _t = _t->getFirstChild(); + e=expr(_t); +@@ -4093,7 +5178,7 @@ + + aD->Add( tagIx); + +- _t = __t97; ++ _t = __t108; + _t = _t->getNextSibling(); + break; + } +@@ -4130,14 +5215,14 @@ + switch ( _t->getType()) { + case EXPR: + { +- ProgNodeP __t101 = _t; +- ProgNodeP tmp34_AST_in = _t; ++ ProgNodeP __t112 = _t; ++ ProgNodeP tmp76_AST_in = _t; + match(antlr::RefAST(_t),EXPR); + _t = _t->getFirstChild(); + res=expr(_t); + _t = _retTree; + aD->SetOwner( true); +- _t = __t101; ++ _t = __t112; + _t = _t->getNextSibling(); + break; + } +@@ -4227,8 +5312,8 @@ + switch ( _t->getType()) { + case ARRAYEXPR: + { +- ProgNodeP __t103 = _t; +- ProgNodeP tmp35_AST_in = _t; ++ ProgNodeP __t114 = _t; ++ ProgNodeP tmp77_AST_in = _t; + match(antlr::RefAST(_t),ARRAYEXPR); + _t = _t->getFirstChild(); + r=r_dot_indexable_expr(_t, aD); +@@ -4236,7 +5321,7 @@ + aL=arrayindex_list(_t); + _t = _retTree; + guard.reset(aL); +- _t = __t103; ++ _t = __t114; + _t = _t->getNextSibling(); + + // check here for object and get struct +@@ -4356,14 +5441,14 @@ + return res; + + +- ProgNodeP __t105 = _t; ++ ProgNodeP __t116 = _t; + dot = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),DOT); + _t = _t->getFirstChild(); + r_dot_array_expr(_t, aD.get()); + _t = _retTree; + { // ( ... )+ +- int _cnt107=0; ++ int _cnt118=0; + for (;;) { + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; +@@ -4372,14 +5457,14 @@ + _t = _retTree; + } + else { +- if ( _cnt107>=1 ) { goto _loop107; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt118>=1 ) { goto _loop118; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + +- _cnt107++; ++ _cnt118++; + } +- _loop107:; ++ _loop118:; + } // ( ... )+ +- _t = __t105; ++ _t = __t116; + _t = _t->getNextSibling(); + _retTree = _t; + return res; +@@ -4392,9 +5477,9 @@ + BaseGDL** l; + BaseGDL* r; + ++ ProgNodeP startNode = _t; + if( _t->getType() == ASSIGN) + { +- ProgNodeP __t130 = _t; + // match(antlr::RefAST(_t),ASSIGN); + _t = _t->getFirstChild(); + +@@ -4402,7 +5487,7 @@ + + if( _t->getType() == FCALL_LIB) + { +- res=check_expr(_t); ++ res=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( res)) +@@ -4426,12 +5511,73 @@ + else + res = res->Dup(); + +- _t = __t130; +- _t = _t->getNextSibling(); + } ++ else if( _t->getType() == ASSIGN_ARRAYEXPR_MFCALL) ++ { ++ ++ _t = _t->getFirstChild(); ++ ++ auto_ptr r_guard; ++ ++ if( _t->getType() == FCALL_LIB) ++ { ++ res=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( res)) ++ r_guard.reset( res); ++ ++ } ++ else ++ { ++ res=tmp_expr(_t); ++ _t = _retTree; ++ ++ r_guard.reset( res); ++ ++ } ++ ++ ProgNodeP mark = _t; ++ ++ // try MFCALL ++ try ++ { ++ l=l_arrayexpr_mfcall_as_mfcall( mark); ++ ++ if( res != (*l)) ++ { ++ delete *l; ++ *l = res->Dup(); ++ ++ if( r_guard.get() == res) // owner ++ { ++ r_guard.release(); ++ } ++ else ++ res = res->Dup(); ++ } ++ } ++ catch( GDLException& ex) ++ { ++ // try ARRAYEXPR ++ try ++ { ++ l=l_arrayexpr_mfcall_as_arrayexpr(mark, res); ++ ++ if( r_guard.get() == res) // owner ++ r_guard.release(); ++ else ++ res = res->Dup(); ++ } ++ catch( GDLException& ex2) ++ { ++ throw GDLException(ex.toString() + " or "+ex2.toString()); ++ } ++ } ++ ++ } + else + { +- ProgNodeP __t132 = _t; + // match(antlr::RefAST(_t),ASSIGN_REPLACE); + _t = _t->getFirstChild(); + +@@ -4440,7 +5586,7 @@ + if( _t->getType() == FCALL_LIB) + { + +- res=check_expr(_t); ++ res=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( res)) +@@ -4491,24 +5637,94 @@ + else + res = res->Dup(); + } +- +- _t = __t132; +- _t = _t->getNextSibling(); +- } ++ } + +- _retTree = _t; ++ _retTree = startNode->getNextSibling(); + return res; + + +- + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; + switch ( _t->getType()) { + case ASSIGN: + { +- ProgNodeP __t116 = _t; +- ProgNodeP tmp36_AST_in = _t; +- match(antlr::RefAST(_t),ASSIGN); ++ ProgNodeP __t128 = _t; ++ ProgNodeP tmp78_AST_in = _t; ++ match(antlr::RefAST(_t),ASSIGN); ++ _t = _t->getFirstChild(); ++ ++ auto_ptr r_guard; ++ ++ { ++ if (_t == ProgNodeP(antlr::nullAST) ) ++ _t = ASTNULL; ++ switch ( _t->getType()) { ++ case ASSIGN: ++ case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ case ARRAYDEF: ++ case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: ++ case CONSTANT: ++ case DEREF: ++ case EXPR: ++ case FCALL: ++ case FCALL_LIB_RETNEW: ++ case MFCALL: ++ case MFCALL_PARENT: ++ case NSTRUC: ++ case NSTRUC_REF: ++ case POSTDEC: ++ case POSTINC: ++ case STRUC: ++ case SYSVAR: ++ case VAR: ++ case VARPTR: ++ case DEC: ++ case INC: ++ case DOT: ++ case QUESTION: ++ { ++ res=tmp_expr(_t); ++ _t = _retTree; ++ ++ r_guard.reset( res); ++ ++ break; ++ } ++ case FCALL_LIB: ++ { ++ res=lib_function_call(_t); ++ _t = _retTree; ++ ++ if( !callStack.back()->Contains( res)) ++ r_guard.reset( res); ++ ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ } ++ } ++ } ++ l=l_expr(_t, res); ++ _t = _retTree; ++ ++ if( r_guard.get() == res) // owner ++ r_guard.release(); ++ else ++ res = res->Dup(); ++ ++ _t = __t128; ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case ASSIGN_ARRAYEXPR_MFCALL: ++ { ++ ProgNodeP __t130 = _t; ++ ProgNodeP tmp79_AST_in = _t; ++ match(antlr::RefAST(_t),ASSIGN_ARRAYEXPR_MFCALL); + _t = _t->getFirstChild(); + + auto_ptr r_guard; +@@ -4519,8 +5735,10 @@ + switch ( _t->getType()) { + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4550,7 +5768,7 @@ + } + case FCALL_LIB: + { +- res=check_expr(_t); ++ res=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( res)) +@@ -4572,14 +5790,14 @@ + else + res = res->Dup(); + +- _t = __t116; ++ _t = __t130; + _t = _t->getNextSibling(); + break; + } + case ASSIGN_REPLACE: + { +- ProgNodeP __t118 = _t; +- ProgNodeP tmp37_AST_in = _t; ++ ProgNodeP __t132 = _t; ++ ProgNodeP tmp80_AST_in = _t; + match(antlr::RefAST(_t),ASSIGN_REPLACE); + _t = _t->getFirstChild(); + +@@ -4591,8 +5809,10 @@ + switch ( _t->getType()) { + case ASSIGN: + case ASSIGN_REPLACE: ++ case ASSIGN_ARRAYEXPR_MFCALL: + case ARRAYDEF: + case ARRAYEXPR: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4622,7 +5842,7 @@ + } + case FCALL_LIB: + { +- res=check_expr(_t); ++ res=lib_function_call(_t); + _t = _retTree; + + if( !callStack.back()->Contains( res)) +@@ -4682,7 +5902,7 @@ + res = res->Dup(); + } + +- _t = __t118; ++ _t = __t132; + _t = _t->getNextSibling(); + break; + } +@@ -4702,22 +5922,24 @@ + ProgNodeP parent = ProgNodeP(antlr::nullAST); + ProgNodeP p = ProgNodeP(antlr::nullAST); + ProgNodeP f = ProgNodeP(antlr::nullAST); ++ ProgNodeP mp2 = ProgNodeP(antlr::nullAST); + + // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack + StackGuard guard(callStack); + BaseGDL *self; +- EnvUDT* newEnv; ++ EnvUDT* newEnv; ++ ProgNodeP startNode = _t; ++ ProgNodeP mark; + + + { +- { + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; + switch ( _t->getType()) { + case MFCALL: + { +- ProgNodeP __t133 = _t; +- ProgNodeP tmp38_AST_in = _t; ++ ProgNodeP __t146 = _t; ++ ProgNodeP tmp81_AST_in = _t; + match(antlr::RefAST(_t),MFCALL); + _t = _t->getFirstChild(); + self=expr(_t); +@@ -4734,14 +5956,14 @@ + + parameter_def(_t, newEnv); + _t = _retTree; +- _t = __t133; ++ _t = __t146; + _t = _t->getNextSibling(); + break; + } + case MFCALL_PARENT: + { +- ProgNodeP __t134 = _t; +- ProgNodeP tmp39_AST_in = _t; ++ ProgNodeP __t147 = _t; ++ ProgNodeP tmp82_AST_in = _t; + match(antlr::RefAST(_t),MFCALL_PARENT); + _t = _t->getFirstChild(); + self=expr(_t); +@@ -4762,13 +5984,13 @@ + + parameter_def(_t, newEnv); + _t = _retTree; +- _t = __t134; ++ _t = __t147; + _t = _t->getNextSibling(); + break; + } + case FCALL: + { +- ProgNodeP __t135 = _t; ++ ProgNodeP __t148 = _t; + f = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + match(antlr::RefAST(_t),FCALL); + _t = _t->getFirstChild(); +@@ -4779,7 +6001,40 @@ + + parameter_def(_t, newEnv); + _t = _retTree; +- _t = __t135; ++ _t = __t148; ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case ARRAYEXPR_MFCALL: ++ { ++ ProgNodeP __t149 = _t; ++ ProgNodeP tmp83_AST_in = _t; ++ match(antlr::RefAST(_t),ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ ++ mark = _t; ++ _t = _t->getNextSibling(); // skip DOT ++ ++ self=expr(_t); ++ _t = _retTree; ++ mp2 = _t; ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ++ auto_ptr self_guard(self); ++ ++ try { ++ newEnv=new EnvUDT( self, mp2); ++ self_guard.release(); ++ } ++ catch( GDLException& ex) ++ { ++ goto tryARRAYEXPR; ++ } ++ ++ parameter_def(_t, newEnv); ++ _t = _retTree; ++ _t = __t149; + _t = _t->getNextSibling(); + break; + } +@@ -4796,7 +6051,30 @@ + // make the call + res=call_fun(static_cast(newEnv->GetPro())->GetTree()); + ++ _retTree = startNode->getNextSibling(); ++ return res; ++ ++ tryARRAYEXPR:; ++ //_t = mark; ++ ++ ProgNodeP dot = mark; ++ // match(antlr::RefAST(_t),DOT); ++ _t = mark->getFirstChild(); ++ ++ SizeT nDot=dot->nDot; ++ auto_ptr aD( new DotAccessDescT(nDot+1)); ++ ++ r_dot_array_expr(_t, aD.get()); ++ _t = _retTree; ++ for (; _t != NULL;) { ++ tag_array_expr(_t, aD.get()); ++ _t = _retTree; + } ++ res= aD->Resolve(); ++ ++ _retTree = startNode->getNextSibling(); ++ return res; ++ + _retTree = _t; + return res; + } +@@ -4819,78 +6097,35 @@ + // _t =_t->getFirstChild(); + + // EnvT* newEnv=new EnvT( fl, fl->libFun);//libFunList[fl->funIx]); +- +- parameter_def(_t->getFirstChild(), newEnv); +- +- // push id.pro onto call stack +- callStack.push_back(newEnv); +- // make the call +- //BaseGDL* +- res=static_cast(newEnv->GetPro())->Fun()(newEnv); +- //*** MUST always return a defined expression +- +- _retTree = rTree; +- return res; +- +- +- ProgNodeP __t129 = _t; +- fll = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),FCALL_LIB_RETNEW); +- _t = _t->getFirstChild(); +- +- //EnvT* +- newEnv=new EnvT( fll, fll->libFun);//libFunList[fl->funIx]); +- +- parameter_def(_t, newEnv); +- _t = _retTree; +- +- // push id.pro onto call stack +- callStack.push_back(newEnv); +- // make the call +- res=static_cast(newEnv->GetPro())->Fun()(newEnv); +- //*** MUST always return a defined expression +- +- _t = __t129; +- _t = _t->getNextSibling(); +- _retTree = _t; +- return res; +-} +- +- BaseGDL* GDLInterpreter::lib_function_call(ProgNodeP _t) { +- BaseGDL* res; +- ProgNodeP lib_function_call_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP fll = ProgNodeP(antlr::nullAST); ++ static int n_elementsIx = LibFunIx("N_ELEMENTS"); ++ static DLibFun* n_elementsFun = libFunList[n_elementsIx]; + +- // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack +- StackGuard guard(callStack); +- +- ProgNodeP rTree = _t->getNextSibling(); +- // match(antlr::RefAST(_t),FCALL_LIB); ++ if( _t->libFun == n_elementsFun) ++ { ++ parameter_def_n_elements(_t->getFirstChild(), newEnv); ++ } ++ else ++ { ++ parameter_def(_t->getFirstChild(), newEnv); ++ } + +- // match(antlr::RefAST(_t),IDENTIFIER); + +- ProgNodeP& fl = _t; +- EnvT* newEnv=new EnvT( fl, fl->libFun);//libFunList[fl->funIx]); +- +- parameter_def(_t->getFirstChild(), newEnv); ++ // parameter_def(_t->getFirstChild(), newEnv); + + // push id.pro onto call stack + callStack.push_back(newEnv); + // make the call + //BaseGDL* + res=static_cast(newEnv->GetPro())->Fun()(newEnv); +- // *** MUST always return a defined expression +- // if( res == NULL) +- // throw GDLException( _t, ""); +- +- ++ //*** MUST always return a defined expression ++ + _retTree = rTree; + return res; + + +- ProgNodeP __t127 = _t; ++ ProgNodeP __t143 = _t; + fll = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- match(antlr::RefAST(_t),FCALL_LIB); ++ match(antlr::RefAST(_t),FCALL_LIB_RETNEW); + _t = _t->getFirstChild(); + + //EnvT* +@@ -4905,7 +6140,7 @@ + res=static_cast(newEnv->GetPro())->Fun()(newEnv); + //*** MUST always return a defined expression + +- _t = __t127; ++ _t = __t143; + _t = _t->getNextSibling(); + _retTree = _t; + return res; +@@ -4914,14 +6149,14 @@ + BaseGDL* GDLInterpreter::constant(ProgNodeP _t) { + BaseGDL* res; + ProgNodeP constant_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- ProgNodeP c = ProgNodeP(antlr::nullAST); + +- c = _t; +- match(antlr::RefAST(_t),CONSTANT); +- _t = _t->getNextSibling(); ++ _retTree = _t->getNextSibling(); ++ return _t->cData->Dup(); + +- res=c->cData->Dup(); + ++ ProgNodeP tmp84_AST_in = _t; ++ match(antlr::RefAST(_t),CONSTANT); ++ _t = _t->getNextSibling(); + _retTree = _t; + return res; + } +@@ -5032,228 +6267,60 @@ + return res; + } + +-void GDLInterpreter::parameter_def(ProgNodeP _t, +- EnvBaseT* actEnv ++BaseGDL** GDLInterpreter::l_arrayexpr_mfcall_as_arrayexpr(ProgNodeP _t, ++ BaseGDL* right + ) { +- ProgNodeP parameter_def_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; +- +- auto_ptr guard(actEnv); +- try{ +- +- _retTree = _t; +- while(_retTree != NULL) { +- static_cast(_retTree)->Parameter( actEnv); +- } +- +- actEnv->Extra(); // expand _EXTRA +- +- } +- catch( GDLException& e) +- { +- // update line number, currently set to caller->CallingNode() +- // because actEnv is not on the stack yet, +- // report caller->Pro()'s name is ok, because we are not inside +- // the call yet +- e.SetErrorNodeP( actEnv->CallingNode()); +- throw e; +- } +- +- guard.release(); +- +- return; +- +- // BaseGDL* kval = NULL; +- // BaseGDL* pval; +- // BaseGDL** kvalRef; +- // BaseGDL** pvalRef; +- +- // // while(_t != NULL) { +- // // switch ( _t->getType()) { +- // // case KEYDEF_REF: +- // // { +- // // ProgNodeP __t160 = _t; +- +- // // // match(antlr::RefAST(_t),KEYDEF_REF); +- // // _t = _t->getFirstChild(); +- // // knameR = _t; +- // // // match(antlr::RefAST(_t),IDENTIFIER); +- // // _t = _t->getNextSibling(); +- // // kvalRef=ref_parameter(_t); +- // // _t = _retTree; +- // // // pass reference +- // // actEnv->SetKeyword( knameR->getText(), kvalRef); +- +- // // _t = __t160; +- // // _t = _t->getNextSibling(); +- // // break; +- // // } +- // // case KEYDEF_REF_EXPR: +- // // { +- // // ProgNodeP __t161 = _t; +- +- // // // match(antlr::RefAST(_t),KEYDEF_REF_EXPR); +- // // _t = _t->getFirstChild(); +- // // knameE = _t; +- // // // match(antlr::RefAST(_t),IDENTIFIER); +- // // _t = _t->getNextSibling(); +- // // kval=expr(_t); +- // // _t = _retTree; +- // // kvalRef=ref_parameter(_t); +- // // _t = _retTree; +- // // // pass reference +- // // delete kval; +- // // actEnv->SetKeyword( knameE->getText(), kvalRef); +- +- // // _t = __t161; +- // // _t = _t->getNextSibling(); +- // // break; +- // // } +- // // case KEYDEF: +- // // { +- // // ProgNodeP __t162 = _t; +- +- // // // match(antlr::RefAST(_t),KEYDEF); +- // // _t = _t->getFirstChild(); +- // // kname = _t; +- // // // match(antlr::RefAST(_t),IDENTIFIER); +- // // _t = _t->getNextSibling(); +- // // kval=expr(_t); +- // // _t = _retTree; +- // // // pass value +- // // actEnv->SetKeyword( kname->getText(), kval); +- +- // // _t = __t162; +- // // _t = _t->getNextSibling(); +- // // break; +- // // } +- // // case REF: +- // // { +- // // ProgNodeP __t163 = _t; +- +- // // // match(antlr::RefAST(_t),REF); +- // // _t = _t->getFirstChild(); +- // // pvalRef=ref_parameter(_t); +- // // _t = _retTree; +- // // // pass reference +- // // actEnv->SetNextPar(pvalRef); +- +- // // _t = __t163; +- // // _t = _t->getNextSibling(); +- // // break; +- // // } +- // // case REF_EXPR: +- // // { +- // // ProgNodeP __t164 = _t; +- +- // // // match(antlr::RefAST(_t),REF_EXPR); +- // // _t = _t->getFirstChild(); +- // // pval=expr(_t); +- // // _t = _retTree; +- // // pvalRef=ref_parameter(_t); +- // // _t = _retTree; +- // // // pass reference +- // // delete pval; +- // // actEnv->SetNextPar(pvalRef); +- +- // // _t = __t164; +- // // _t = _t->getNextSibling(); +- // // break; +- // // } +- // // case KEYDEF_REF_CHECK: +- // // { +- // // ProgNodeP __t165 = _t; +- +- // // // match(antlr::RefAST(_t),KEYDEF_REF_CHECK); +- // // _t = _t->getFirstChild(); +- // // knameCk = _t; +- // // // match(antlr::RefAST(_t),IDENTIFIER); +- // // _t = _t->getNextSibling(); +- // // kval=check_expr(_t); +- // // _t = _retTree; +- +- // // kvalRef = callStack.back()->GetPtrTo( kval); +- // // if( kvalRef != NULL) +- // // { // pass reference +- // // actEnv->SetKeyword(knameCk->getText(), kvalRef); +- // // } +- // // else +- // // { // pass value +- // // actEnv->SetKeyword(knameCk->getText(), kval); +- // // } +- +- // // _t = __t165; +- // // _t = _t->getNextSibling(); +- // // break; +- // // } +- // // case REF_CHECK: +- // // { +- // // ProgNodeP __t166 = _t; +- +- // // // match(antlr::RefAST(_t),REF_CHECK); +- // // _t = _t->getFirstChild(); +- // // pval=check_expr(_t); +- // // _t = _retTree; +- +- // // pvalRef = callStack.back()->GetPtrTo( pval); +- // // if( pvalRef != NULL) +- // // { // pass reference +- // // actEnv->SetNextPar( pvalRef); +- // // } +- // // else +- // // { // pass value +- // // actEnv->SetNextPar( pval); +- // // } +- +- // // _t = __t166; +- // // _t = _t->getNextSibling(); +- // // break; +- // // } +- // // default: +- // // { +- // // pval=expr(_t); +- // // _t = _retTree; +- +- // // // pass value +- // // actEnv->SetNextPar(pval); +- +- // // break; +- // // } +- +- // // } // switch +- // // } // while +- +- +- // // actEnv->Extra(); // expand _EXTRA +- // // guard.release(); +- +- // // _retTree = _t; ++ BaseGDL** res; ++ ProgNodeP l_arrayexpr_mfcall_as_arrayexpr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ProgNodeP dot = ProgNodeP(antlr::nullAST); + +- // // return; ++ ProgNodeP __t156 = _t; ++ ProgNodeP tmp85_AST_in = _t; ++ match(antlr::RefAST(_t),ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ ProgNodeP __t157 = _t; ++ dot = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ match(antlr::RefAST(_t),DOT); ++ _t = _t->getFirstChild(); + ++ SizeT nDot=dot->nDot; ++ auto_ptr aD( new DotAccessDescT(nDot+1)); + +- { // ( ... )* ++ l_dot_array_expr(_t, aD.get()); ++ _t = _retTree; ++ { // ( ... )+ ++ int _cnt159=0; + for (;;) { + if (_t == ProgNodeP(antlr::nullAST) ) + _t = ASTNULL; +- if ((_t->getType() == KEYDEF_REF)) { +- ProgNodeP __t146 = _t; +- ProgNodeP tmp40_AST_in = _t; +- match(antlr::RefAST(_t),KEYDEF_REF); +- _t = _t->getFirstChild(); +- ProgNodeP tmp41_AST_in = _t; +- match(antlr::RefAST(_t),IDENTIFIER); +- _t = _t->getNextSibling(); +- _t = __t146; +- _t = _t->getNextSibling(); ++ if ((_t->getType() == ARRAYEXPR || _t->getType() == EXPR || _t->getType() == IDENTIFIER)) { ++ tag_array_expr(_t, aD.get()); ++ _t = _retTree; + } + else { +- goto _loop147; ++ if ( _cnt159>=1 ) { goto _loop159; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + ++ _cnt159++; + } +- _loop147:; +- } // ( ... )* ++ _loop159:; ++ } // ( ... )+ ++ _t = __t157; ++ _t = _t->getNextSibling(); ++ _t = __t156; ++ _t = _t->getNextSibling(); ++ ++ if( right == NULL) ++ throw GDLException( _t, ++ "Struct expression not allowed in this context.", ++ true,false); ++ ++ aD->Assign( right); ++ ++ res=NULL; ++ + _retTree = _t; ++ return res; + } + + BaseGDL** GDLInterpreter::ref_parameter(ProgNodeP _t) { +@@ -5305,6 +6372,71 @@ + return ret; + } + ++void GDLInterpreter::parameter_def_n_elements(ProgNodeP _t, ++ EnvBaseT* actEnv ++) { ++ ProgNodeP parameter_def_n_elements_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; ++ ++ auto_ptr guard(actEnv); ++ _retTree = _t; ++ // bool interruptEnableIn = interruptEnable; ++ if( _retTree != NULL) ++ { ++ if( _retTree->getType() == REF || ++ _retTree->getType() == REF_EXPR || ++ _retTree->getType() == REF_CHECK || ++ _retTree->getType() == PARAEXPR) ++ { ++ try{ ++ // interruptEnable = false; ++ static_cast(_retTree)->Parameter( actEnv); ++ // interruptEnable = interruptEnableIn; ++ } ++ catch( GDLException& e) ++ { ++ // interruptEnable = interruptEnableIn; ++ if( actEnv->NParam() == 0) ++ { ++ BaseGDL* nP = NULL; ++ actEnv->SetNextPar( nP); ++ } ++ } ++ } ++ } ++ try{ ++ while(_retTree != NULL) { ++ static_cast(_retTree)->Parameter( actEnv); ++ } ++ } ++ catch( GDLException& e) ++ { ++ // update line number, currently set to caller->CallingNode() ++ // because actEnv is not on the stack yet, ++ // report caller->Pro()'s name is ok, because we are not inside ++ // the call yet ++ e.SetErrorNodeP( actEnv->CallingNode()); ++ throw e; ++ } ++ ++ actEnv->Extra(); // expand _EXTRA ++ ++ guard.release(); ++ ++ return; ++ ++ ++ ProgNodeP __t171 = _t; ++ ProgNodeP tmp86_AST_in = _t; ++ match(antlr::RefAST(_t),KEYDEF_REF_EXPR); ++ _t = _t->getFirstChild(); ++ ProgNodeP tmp87_AST_in = _t; ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ _t = __t171; ++ _t = _t->getNextSibling(); ++ _retTree = _t; ++} ++ + void GDLInterpreter::initializeASTFactory( antlr::ASTFactory& ) + { + } +@@ -5317,6 +6449,7 @@ + "ASSIGN", + "ASSIGN_INPLACE", + "ASSIGN_REPLACE", ++ "ASSIGN_ARRAYEXPR_MFCALL", + "ARRAYDEF", + "ARRAYDEF_CONST", + "ARRAYIX", +@@ -5327,8 +6460,10 @@ + "ARRAYIX_RANGE_S", + "ARRAYEXPR", + "ARRAYEXPR_FN", ++ "ARRAYEXPR_MFCALL", + "BLOCK", + "BREAK", ++ "CSBLOCK", + "CONTINUE", + "COMMONDECL", + "COMMONDEF", +@@ -5336,7 +6471,12 @@ + "DEREF", + "ELSEBLK", + "EXPR", ++ "\"for\"", + "FOR_STEP", ++ "\"foreach\"", ++ "FOR_LOOP", ++ "FOR_STEP_LOOP", ++ "FOREACH_LOOP", + "FCALL", + "FCALL_LIB", + "FCALL_LIB_RETNEW", +@@ -5370,6 +6510,8 @@ + "REF", + "REF_CHECK", + "REF_EXPR", ++ "\"repeat\"", ++ "REPEAT_LOOP", + "RETURN", + "RETF", + "RETP", +@@ -5378,6 +6520,7 @@ + "UMINUS", + "VAR", + "VARPTR", ++ "\"while\"", + "IDENTIFIER", + "\"and\"", + "\"begin\"", +@@ -5390,12 +6533,12 @@ + "\"endcase\"", + "\"endelse\"", + "\"endfor\"", ++ "\"endforeach\"", + "\"endif\"", + "\"endrep\"", + "\"endswitch\"", + "\"endwhile\"", + "\"eq\"", +- "\"for\"", + "\"forward_function\"", + "\"function\"", + "\"ge\"", +@@ -5412,11 +6555,9 @@ + "\"on_ioerror\"", + "\"or\"", + "\"pro\"", +- "\"repeat\"", + "\"switch\"", + "\"then\"", + "\"until\"", +- "\"while\"", + "\"xor\"", + "METHOD", + "COMMA", +@@ -5528,20 +6669,17 @@ + 0 + }; + +-const unsigned long GDLInterpreter::_tokenSet_0_data_[] = { 2283536544UL, 3222143200UL, 339738880UL, 788880UL, 0UL, 0UL, 0UL, 0UL }; +-// ASSIGN ASSIGN_REPLACE BLOCK BREAK CONTINUE FOR_STEP IF_ELSE LABEL MPCALL +-// MPCALL_PARENT ON_IOERROR_NULL PCALL PCALL_LIB RETF RETP "case" "for" +-// "goto" "if" "on_ioerror" "repeat" "switch" "while" DEC INC ++const unsigned long GDLInterpreter::_tokenSet_0_data_[] = { 3232760224UL, 234938511UL, 557920UL, 402948256UL, 0UL, 0UL, 0UL, 0UL }; ++// ASSIGN ASSIGN_REPLACE ASSIGN_ARRAYEXPR_MFCALL BLOCK BREAK CONTINUE "for" ++// FOR_STEP "foreach" FOR_LOOP FOR_STEP_LOOP FOREACH_LOOP IF_ELSE LABEL ++// MPCALL MPCALL_PARENT ON_IOERROR_NULL PCALL PCALL_LIB "repeat" REPEAT_LOOP ++// RETF RETP "while" "case" "goto" "if" "on_ioerror" "switch" DEC INC + const antlr::BitSet GDLInterpreter::_tokenSet_0(_tokenSet_0_data_,8); +-const unsigned long GDLInterpreter::_tokenSet_1_data_[] = { 1971388832UL, 12683520UL, 27UL, 786432UL, 0UL, 16777216UL, 16UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// ASSIGN ASSIGN_REPLACE ARRAYDEF ARRAYEXPR CONSTANT DEREF EXPR FCALL FCALL_LIB +-// FCALL_LIB_RETNEW MFCALL MFCALL_PARENT NSTRUC NSTRUC_REF POSTDEC POSTINC +-// STRUC SYSVAR VAR VARPTR DEC INC DOT QUESTION ++const unsigned long GDLInterpreter::_tokenSet_1_data_[] = { 738853792UL, 3246981232UL, 27648UL, 402653184UL, 0UL, 0UL, 8194UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// ASSIGN ASSIGN_REPLACE ASSIGN_ARRAYEXPR_MFCALL ARRAYDEF ARRAYEXPR ARRAYEXPR_MFCALL ++// CONSTANT DEREF EXPR FCALL FCALL_LIB FCALL_LIB_RETNEW MFCALL MFCALL_PARENT ++// NSTRUC NSTRUC_REF POSTDEC POSTINC STRUC SYSVAR VAR VARPTR DEC INC DOT ++// QUESTION + const antlr::BitSet GDLInterpreter::_tokenSet_1(_tokenSet_1_data_,16); +-const unsigned long GDLInterpreter::_tokenSet_2_data_[] = { 897647008UL, 12683520UL, 27UL, 786432UL, 0UL, 16777216UL, 16UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// ASSIGN ASSIGN_REPLACE ARRAYDEF ARRAYEXPR CONSTANT DEREF EXPR FCALL FCALL_LIB +-// MFCALL MFCALL_PARENT NSTRUC NSTRUC_REF POSTDEC POSTINC STRUC SYSVAR +-// VAR VARPTR DEC INC DOT QUESTION +-const antlr::BitSet GDLInterpreter::_tokenSet_2(_tokenSet_2_data_,16); + + +Only in gdl-0.9rc4/src: GDLInterpreter.cvs.cpp +Only in gdl-0.9rc4/src: GDLInterpreterHack.cpp +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLInterpreter.hpp cvs/gdl/src/GDLInterpreter.hpp +--- gdl-0.9rc4/src/GDLInterpreter.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLInterpreter.hpp 2010-05-21 10:23:54.437967544 -0600 +@@ -33,6 +33,7 @@ + // print out AST tree + //#define GDL_DEBUG + //#undef GDL_DEBUG ++//#define GDL_DEBUG_HEAP + + + class CUSTOM_API GDLInterpreter : public antlr::TreeParser, public GDLInterpreterTokenTypes +@@ -50,23 +51,35 @@ + friend class NSTRUCNode; + friend class NSTRUC_REFNode; + friend class ASSIGNNode; ++ friend class ASSIGN_ARRAYEXPR_MFCALLNode; + friend class ASSIGN_REPLACENode; +-friend class PCALL_LIBNode;//: public CommandNode +-friend class MPCALLNode;//: public CommandNode +-friend class MPCALL_PARENTNode;//: public CommandNode +-friend class PCALLNode;//: public CommandNode +- +- friend class KEYDEFNode; +- friend class KEYDEF_REFNode; +- friend class KEYDEF_REF_CHECKNode; +- friend class KEYDEF_REF_EXPRNode; +- friend class REFNode; +- friend class REF_CHECKNode; +- friend class REF_EXPRNode; +- friend class ParameterNode; ++ friend class PCALL_LIBNode;//: public CommandNode ++ friend class MPCALLNode;//: public CommandNode ++ friend class MPCALL_PARENTNode;//: public CommandNode ++ friend class PCALLNode;//: public CommandNode ++ friend class RETFNode; ++ friend class RETPNode; ++ friend class FORNode; ++ friend class FOR_LOOPNode; ++ friend class FOREACHNode; ++ friend class FOREACH_LOOPNode; ++ friend class FOR_STEPNode; ++ friend class FOR_STEP_LOOPNode; ++ ++ friend class KEYDEFNode; ++ friend class KEYDEF_REFNode; ++ friend class KEYDEF_REF_CHECKNode; ++ friend class KEYDEF_REF_EXPRNode; ++ friend class REFNode; ++ friend class REF_CHECKNode; ++ friend class REF_EXPRNode; ++ friend class ParameterNode; + + public: ++ + // RetCode returnCode; ++ ProgNodeP GetNULLProgNodeP() const { return NULLProgNodeP;} ++ + + void SetRetTree( ProgNodeP rT) + { +@@ -77,13 +90,13 @@ + // this->returnCode = rC; + // } + +- enum RetCode { +- RC_OK=0, +- RC_BREAK, +- RC_CONTINUE, +- RC_RETURN, +- RC_ABORT, // checked as retCode >= RC_RETURN +- }; ++// enum RetCode { ++// RC_OK=0, ++// RC_BREAK, ++// RC_CONTINUE, ++// RC_RETURN, ++// RC_ABORT, // checked as retCode >= RC_RETURN ++// }; + + // code in: dinterpreter.cpp + static bool SearchCompilePro(const std::string& pro); +@@ -94,9 +107,12 @@ + DStructGDL* ObjectStruct( BaseGDL* self, ProgNodeP mp); + DStructGDL* ObjectStructCheckAccess( BaseGDL* self, ProgNodeP mp); + +-private: + // code in: dinterpreter.cpp + static void SetFunIx( ProgNodeP f); // triggers read/compile ++ ++ ++private: ++ + static void SetProIx( ProgNodeP f); // triggers read/compile + static void AdjustTypes( BaseGDL*&, BaseGDL*&); + +@@ -132,14 +148,24 @@ + + // code in: dinterpreter.cpp + // static bool CompleteFileName(std::string& fn); -> str.cpp +- static bool CompileFile(const std::string& f, const std::string& untilPro=""); ++ + BaseGDL* returnValue; // holding the return value for functions + BaseGDL** returnValueL; // holding the return value for l_functions + + bool interruptEnable; + +- typedef std::map HeapT; +- typedef std::map ObjHeapT; ++public: ++ static bool CompileFile(const std::string& f, const std::string& untilPro=""); ++ ++ typedef RefHeap RefBaseGDL; ++ typedef RefHeap RefDStructGDL; ++ ++ typedef std::map HeapT; ++ typedef std::map ObjHeapT; ++ ++protected: ++// typedef std::map HeapT; ++// typedef std::map ObjHeapT; + + // the following must be all static because several interpreter might be active + // the heap for all dynamic variables +@@ -168,7 +194,7 @@ + SizeT tmpIx=objHeapIx; + for( SizeT i=0; i( objHeapIx++, var)); ++ std::pair( objHeapIx++, (DStructGDL*)var)); + return tmpIx; + } + SizeT NewHeap( SizeT n=1, BaseGDL* var=NULL) +@@ -176,7 +202,7 @@ + SizeT tmpIx=heapIx; + for( SizeT i=0; i( heapIx++, var)); ++ std::pair( heapIx++, var)); + return tmpIx; + } + static void FreeObjHeap( DObj id) +@@ -186,11 +212,16 @@ + ObjHeapT::iterator it=objHeap.find( id); + if ( it != objHeap.end()) + { +- delete (*it).second; ++ delete (*it).second.get(); + objHeap.erase( id); + } + } + } ++ static void FreeObjHeapDirect( DObj id, ObjHeapT::iterator it) ++ { ++ delete (*it).second.get(); ++ objHeap.erase( id); ++ } + static void FreeHeap( DPtr id) + { + if( id != 0) +@@ -198,11 +229,16 @@ + HeapT::iterator it=heap.find( id); + if( it != heap.end()) + { +- delete (*it).second; ++ delete (*it).second.get(); + heap.erase( id); + } + } + } ++ static void FreeHeapDirect( DPtr id, HeapT::iterator it) ++ { ++ delete (*it).second.get(); ++ heap.erase( id); ++ } + + static void FreeHeap( DPtrGDL* p) + { +@@ -214,19 +250,176 @@ + } + } + ++ static void DecRef( DPtr id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++ std::cout << "-- " << std::endl; ++#endif ++ HeapT::iterator it=heap.find( id); ++ if( it != heap.end()) ++ { ++ if( (*it).second.Dec()) ++ { ++ std::cout << "Out of scope (garbage collected): " ++ << " at: " << callStack.back()->GetProName() ++ << " line: " << callStack.back()->GetLineNumber() ++ << std::endl; ++ FreeHeapDirect( id, it); ++ } ++#ifdef GDL_DEBUG_HEAP ++ else ++std::cout << " = " << (*it).second.Count() << std::endl; ++#endif ++ } ++ } ++ } ++ static void DecRef( DPtrGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DPtr id= (*p)[ix]; ++ DecRef( id); ++ } ++ } ++ static void DecRefObj( DObj id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << "-- " << std::endl; ++#endif ++ ObjHeapT::iterator it=objHeap.find( id); ++ if( it != objHeap.end()) ++ { ++ if( (*it).second.Dec()) ++ { ++ std::cout << "Out of scope (garbage collected): " ++ << " at: " << callStack.back()->GetProName() ++ << " line: " << callStack.back()->GetLineNumber() ++ << std::endl; ++ callStack.back()->ObjCleanup( id); ++// FreeObjHeapDirect( id, it); ++ } ++#ifdef GDL_DEBUG_HEAP ++ else ++std::cout << " = " << (*it).second.Count() << std::endl; ++#endif ++ ++ } ++ } ++ } ++ static void DecRefObj( DObjGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DObj id= (*p)[ix]; ++ DecRefObj( id); ++ } ++ } ++ static void IncRef( DPtr id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << "++ " << std::endl; ++#endif ++ HeapT::iterator it=heap.find( id); ++ if( it != heap.end()) ++ { ++ (*it).second.Inc(); ++#ifdef GDL_DEBUG_HEAP ++std::cout << " = " << (*it).second.Count() << std::endl; ++#endif ++ } ++ } ++ } ++ static void AddRef( DPtr id, SizeT add) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << add << " + " << std::endl; ++#endif ++ HeapT::iterator it=heap.find( id); ++ if( it != heap.end()) ++ { ++ (*it).second.Add(add); ++ } ++ } ++ } ++ static void IncRef( DPtrGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DPtr id= (*p)[ix]; ++ IncRef( id); ++ } ++ } ++ static void IncRefObj( DObj id) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << "++ " << std::endl; ++#endif ++ ObjHeapT::iterator it=objHeap.find( id); ++ if( it != objHeap.end()) ++ { ++ (*it).second.Inc(); ++ } ++ } ++ } ++ static void AddRefObj( DObj id, SizeT add) ++ { ++ if( id != 0) ++ { ++#ifdef GDL_DEBUG_HEAP ++std::cout << add << " + " << std::endl; ++#endif ++ ObjHeapT::iterator it=objHeap.find( id); ++ if( it != objHeap.end()) ++ { ++ (*it).second.Add(add); ++ } ++ } ++ } ++ static void IncRefObj( DObjGDL* p) ++ { ++ SizeT nEl=p->N_Elements(); ++ for( SizeT ix=0; ix < nEl; ix++) ++ { ++ DObj id= (*p)[ix]; ++ IncRefObj( id); ++ } ++ } ++ + class HeapException {}; + + static BaseGDL*& GetHeap( DPtr ID) + { + HeapT::iterator it=heap.find( ID); + if( it == heap.end()) throw HeapException(); +- return it->second; ++ return it->second.get(); + } + static DStructGDL*& GetObjHeap( DObj ID) + { + ObjHeapT::iterator it=objHeap.find( ID); + if( it == objHeap.end()) throw HeapException(); +- return it->second; ++ return it->second.get(); ++ } ++ static DStructGDL*& GetObjHeap( DObj ID, ObjHeapT::iterator& it) ++ { ++// ObjHeapT::iterator it=objHeap.find( ID); ++ it=objHeap.find( ID); ++ if( it == objHeap.end()) throw HeapException(); ++ return it->second.get(); + } + + static bool PtrValid( DPtr ID) +@@ -240,6 +433,15 @@ + return heap.size(); + } + ++ static DPtr FindInHeap( BaseGDL** p) ++ { ++ for( HeapT::iterator it=heap.begin(); it != heap.end(); ++it) ++ { ++ if( &it->second.get() == p) ++ return it->first; ++ } ++ return 0; ++ } + static DPtrGDL* GetAllHeap() + { + SizeT nEl = heap.size(); +@@ -248,6 +450,21 @@ + SizeT i=0; + for( HeapT::iterator it=heap.begin(); it != heap.end(); ++it) + { ++ IncRef( it->first); ++ (*ret)[ i++] = it->first; ++ } ++ return ret; ++ } ++ ++ // no ref counting here ++ static std::vector* GetAllHeapSTL() ++ { ++ SizeT nEl = heap.size(); ++ if( nEl == 0) return new std::vector(); ++ std::vector* ret = new std::vector( nEl); ++ SizeT i=0; ++ for( HeapT::iterator it=heap.begin(); it != heap.end(); ++it) ++ { + (*ret)[ i++] = it->first; + } + return ret; +@@ -264,6 +481,15 @@ + return objHeap.size(); + } + ++// static DObj FindInObjHeap( BaseGDL** p) ++// { ++// for( ObjHeapT::iterator it=objHeap.begin(); it != objHeap.end(); ++it) ++// { ++// if( &it->second == reinterpret_cast(p)) ++// return it->first; ++// } ++// return 0; ++// } + static DObjGDL* GetAllObjHeap() + { + SizeT nEl = objHeap.size(); +@@ -272,6 +498,21 @@ + SizeT i=0; + for( ObjHeapT::iterator it=objHeap.begin(); it != objHeap.end(); ++it) + { ++ IncRefObj( it->first); ++ (*ret)[ i++] = it->first; ++ } ++ return ret; ++ } ++ ++ // no ref counting here ++ static std::vector* GetAllObjHeapSTL() ++ { ++ SizeT nEl = objHeap.size(); ++ if( nEl == 0) return new std::vector(); ++ std::vector* ret = new std::vector( nEl); ++ SizeT i=0; ++ for( ObjHeapT::iterator it=objHeap.begin(); it != objHeap.end(); ++it) ++ { + (*ret)[ i++] = it->first; + } + return ret; +@@ -285,7 +526,12 @@ + + static const std::string Name( BaseGDL** p) // const + { +- return "<(Find name not implemented yet)>"; ++ assert( *p == NULL); ++ DPtr h = FindInHeap( p); ++ if( h != 0) return std::string(""; ++// DObj o = FindInObjHeap( p); ++// if( o != 0) return std::string(""; ++ return "<(ptr to undefined expression not found on the heap)>"; + } + + // compiler (lexer, parser, treeparser) def in dinterpreter.cpp +@@ -439,29 +685,30 @@ + { + return GDLInterpreter::tokenNames; + } +- public: GDLInterpreter::RetCode interactive(ProgNodeP _t); +- public: GDLInterpreter::RetCode statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode execute(ProgNodeP _t); +- public: GDLInterpreter::RetCode statement_list(ProgNodeP _t); ++ public: RetCode interactive(ProgNodeP _t); ++ public: RetCode statement(ProgNodeP _t); ++ public: RetCode execute(ProgNodeP _t); ++ public: RetCode statement_list(ProgNodeP _t); + public: BaseGDL* call_fun(ProgNodeP _t); + public: BaseGDL** call_lfun(ProgNodeP _t); + public: void call_pro(ProgNodeP _t); +- public: GDLInterpreter::RetCode for_statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode repeat_statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode while_statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode if_statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode if_else_statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode case_statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode switch_statement(ProgNodeP _t); +- public: GDLInterpreter::RetCode block(ProgNodeP _t); +- public: GDLInterpreter::RetCode jump_statement(ProgNodeP _t); ++ public: RetCode block(ProgNodeP _t); ++ public: RetCode switch_statement(ProgNodeP _t); + public: BaseGDL* expr(ProgNodeP _t); +- public: BaseGDL** l_simple_var(ProgNodeP _t); +- public: BaseGDL** l_ret_expr(ProgNodeP _t); ++ public: RetCode case_statement(ProgNodeP _t); ++ public: RetCode repeat_statement(ProgNodeP _t); ++ public: RetCode repeat_loop_statement(ProgNodeP _t); ++ public: RetCode while_statement(ProgNodeP _t); ++ public: RetCode for_statement(ProgNodeP _t); ++ public: RetCode foreach_statement(ProgNodeP _t); ++ public: RetCode if_statement(ProgNodeP _t); ++ public: RetCode if_else_statement(ProgNodeP _t); + public: BaseGDL** l_deref(ProgNodeP _t); ++ public: BaseGDL** l_ret_expr(ProgNodeP _t); ++ public: BaseGDL** l_arrayexpr_mfcall_as_mfcall(ProgNodeP _t); + public: BaseGDL** l_function_call(ProgNodeP _t); + public: BaseGDL* tmp_expr(ProgNodeP _t); +- public: BaseGDL* check_expr(ProgNodeP _t); ++ public: BaseGDL* lib_function_call(ProgNodeP _t); + public: BaseGDL* r_expr(ProgNodeP _t); + public: BaseGDL* constant_nocopy(ProgNodeP _t); + public: BaseGDL* l_decinc_indexable_expr(ProgNodeP _t, +@@ -490,10 +737,17 @@ + public: BaseGDL** l_expr(ProgNodeP _t, + BaseGDL* right + ); ++ public: BaseGDL** l_simple_var(ProgNodeP _t); ++ public: void parameter_def(ProgNodeP _t, ++ EnvBaseT* actEnv ++ ); + public: BaseGDL** l_indexable_expr(ProgNodeP _t); + public: BaseGDL** l_array_expr(ProgNodeP _t, + BaseGDL* right + ); ++ public: BaseGDL** l_arrayexpr_mfcall(ProgNodeP _t, ++ BaseGDL* right ++ ); + public: BaseGDL* array_expr(ProgNodeP _t); + public: void tag_expr(ProgNodeP _t, + DotAccessDescT* aD +@@ -509,14 +763,16 @@ + public: BaseGDL* assign_expr(ProgNodeP _t); + public: BaseGDL* function_call(ProgNodeP _t); + public: BaseGDL* lib_function_call_retnew(ProgNodeP _t); +- public: BaseGDL* lib_function_call(ProgNodeP _t); + public: BaseGDL* constant(ProgNodeP _t); + public: BaseGDL* simple_var(ProgNodeP _t); + public: BaseGDL* sys_var(ProgNodeP _t); +- public: void parameter_def(ProgNodeP _t, +- EnvBaseT* actEnv ++ public: BaseGDL** l_arrayexpr_mfcall_as_arrayexpr(ProgNodeP _t, ++ BaseGDL* right + ); + public: BaseGDL** ref_parameter(ProgNodeP _t); ++ public: void parameter_def_n_elements(ProgNodeP _t, ++ EnvBaseT* actEnv ++ ); + public: + antlr::RefAST getAST() + { +@@ -529,10 +785,10 @@ + private: + static const char* tokenNames[]; + #ifndef NO_STATIC_CONSTS +- static const int NUM_TOKENS = 216; ++ static const int NUM_TOKENS = 225; + #else + enum { +- NUM_TOKENS = 216 ++ NUM_TOKENS = 225 + }; + #endif + +@@ -540,8 +796,6 @@ + static const antlr::BitSet _tokenSet_0; + static const unsigned long _tokenSet_1_data_[]; + static const antlr::BitSet _tokenSet_1; +- static const unsigned long _tokenSet_2_data_[]; +- static const antlr::BitSet _tokenSet_2; + }; + + #endif /*INC_GDLInterpreter_hpp_*/ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLInterpreterTokenTypes.hpp cvs/gdl/src/GDLInterpreterTokenTypes.hpp +--- gdl-0.9rc4/src/GDLInterpreterTokenTypes.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLInterpreterTokenTypes.hpp 2010-04-22 09:50:40.000000000 -0600 +@@ -16,214 +16,223 @@ + ASSIGN = 5, + ASSIGN_INPLACE = 6, + ASSIGN_REPLACE = 7, +- ARRAYDEF = 8, +- ARRAYDEF_CONST = 9, +- ARRAYIX = 10, +- ARRAYIX_ALL = 11, +- ARRAYIX_ORANGE = 12, +- ARRAYIX_RANGE = 13, +- ARRAYIX_ORANGE_S = 14, +- ARRAYIX_RANGE_S = 15, +- ARRAYEXPR = 16, +- ARRAYEXPR_FN = 17, +- BLOCK = 18, +- BREAK = 19, +- CONTINUE = 20, +- COMMONDECL = 21, +- COMMONDEF = 22, +- CONSTANT = 23, +- DEREF = 24, +- ELSEBLK = 25, +- EXPR = 26, +- FOR_STEP = 27, +- FCALL = 28, +- FCALL_LIB = 29, +- FCALL_LIB_RETNEW = 30, +- IF_ELSE = 31, +- KEYDECL = 32, +- KEYDEF = 33, +- KEYDEF_REF = 34, +- KEYDEF_REF_CHECK = 35, +- KEYDEF_REF_EXPR = 36, +- LABEL = 37, +- MPCALL = 38, +- MPCALL_PARENT = 39, +- MFCALL = 40, +- MFCALL_LIB = 41, +- MFCALL_LIB_RETNEW = 42, +- MFCALL_PARENT = 43, +- MFCALL_PARENT_LIB = 44, +- MFCALL_PARENT_LIB_RETNEW = 45, +- NOP = 46, +- NSTRUC = 47, +- NSTRUC_REF = 48, +- ON_IOERROR_NULL = 49, +- PCALL = 50, +- PCALL_LIB = 51, +- PARADECL = 52, +- PARAEXPR = 53, +- POSTDEC = 54, +- POSTINC = 55, +- DECSTATEMENT = 56, +- INCSTATEMENT = 57, +- REF = 58, +- REF_CHECK = 59, +- REF_EXPR = 60, +- RETURN = 61, +- RETF = 62, +- RETP = 63, +- STRUC = 64, +- SYSVAR = 65, +- UMINUS = 66, +- VAR = 67, +- VARPTR = 68, +- IDENTIFIER = 69, +- AND_OP = 70, +- BEGIN = 71, +- CASE = 72, +- COMMON = 73, +- COMPILE_OPT = 74, +- DO = 75, +- ELSE = 76, +- END = 77, +- ENDCASE = 78, +- ENDELSE = 79, +- ENDFOR = 80, +- ENDIF = 81, +- ENDREP = 82, +- ENDSWITCH = 83, +- ENDWHILE = 84, +- EQ_OP = 85, +- FOR = 86, +- FORWARD = 87, +- FUNCTION = 88, +- GE_OP = 89, +- GOTO = 90, +- GT_OP = 91, +- IF = 92, +- INHERITS = 93, +- LE_OP = 94, +- LT_OP = 95, +- MOD_OP = 96, +- NE_OP = 97, +- NOT_OP = 98, +- OF = 99, +- ON_IOERROR = 100, +- OR_OP = 101, +- PRO = 102, +- REPEAT = 103, +- SWITCH = 104, +- THEN = 105, +- UNTIL = 106, +- WHILE = 107, +- XOR_OP = 108, +- METHOD = 109, +- COMMA = 110, +- COLON = 111, +- END_U = 112, +- EQUAL = 113, +- DEC = 114, +- INC = 115, +- AND_OP_EQ = 116, +- ASTERIX_EQ = 117, +- EQ_OP_EQ = 118, +- GE_OP_EQ = 119, +- GTMARK_EQ = 120, +- GT_OP_EQ = 121, +- LE_OP_EQ = 122, +- LTMARK_EQ = 123, +- LT_OP_EQ = 124, +- MATRIX_OP1_EQ = 125, +- MATRIX_OP2_EQ = 126, +- MINUS_EQ = 127, +- MOD_OP_EQ = 128, +- NE_OP_EQ = 129, +- OR_OP_EQ = 130, +- PLUS_EQ = 131, +- POW_EQ = 132, +- SLASH_EQ = 133, +- XOR_OP_EQ = 134, +- MEMBER = 135, +- LBRACE = 136, +- RBRACE = 137, +- SLASH = 138, +- LSQUARE = 139, +- RSQUARE = 140, +- SYSVARNAME = 141, +- EXCLAMATION = 142, +- LCURLY = 143, +- RCURLY = 144, +- CONSTANT_HEX_BYTE = 145, +- CONSTANT_HEX_LONG = 146, +- CONSTANT_HEX_LONG64 = 147, +- CONSTANT_HEX_INT = 148, +- CONSTANT_HEX_I = 149, +- CONSTANT_HEX_ULONG = 150, +- CONSTANT_HEX_ULONG64 = 151, +- CONSTANT_HEX_UI = 152, +- CONSTANT_HEX_UINT = 153, +- CONSTANT_BYTE = 154, +- CONSTANT_LONG = 155, +- CONSTANT_LONG64 = 156, +- CONSTANT_INT = 157, +- CONSTANT_I = 158, +- CONSTANT_ULONG = 159, +- CONSTANT_ULONG64 = 160, +- CONSTANT_UI = 161, +- CONSTANT_UINT = 162, +- CONSTANT_OCT_BYTE = 163, +- CONSTANT_OCT_LONG = 164, +- CONSTANT_OCT_LONG64 = 165, +- CONSTANT_OCT_INT = 166, +- CONSTANT_OCT_I = 167, +- CONSTANT_OCT_ULONG = 168, +- CONSTANT_OCT_ULONG64 = 169, +- CONSTANT_OCT_UI = 170, +- CONSTANT_OCT_UINT = 171, +- CONSTANT_FLOAT = 172, +- CONSTANT_DOUBLE = 173, +- CONSTANT_BIN_BYTE = 174, +- CONSTANT_BIN_LONG = 175, +- CONSTANT_BIN_LONG64 = 176, +- CONSTANT_BIN_INT = 177, +- CONSTANT_BIN_I = 178, +- CONSTANT_BIN_ULONG = 179, +- CONSTANT_BIN_ULONG64 = 180, +- CONSTANT_BIN_UI = 181, +- CONSTANT_BIN_UINT = 182, +- ASTERIX = 183, +- DOT = 184, +- STRING_LITERAL = 185, +- POW = 186, +- MATRIX_OP1 = 187, +- MATRIX_OP2 = 188, +- PLUS = 189, +- MINUS = 190, +- LTMARK = 191, +- GTMARK = 192, +- LOG_NEG = 193, +- LOG_AND = 194, +- LOG_OR = 195, +- QUESTION = 196, +- STRING = 197, +- INCLUDE = 198, +- EOL = 199, +- W = 200, +- D = 201, +- L = 202, +- H = 203, +- O = 204, +- B = 205, +- EXP = 206, +- DBL_E = 207, +- DBL = 208, +- CONSTANT_OR_STRING_LITERAL = 209, +- COMMENT = 210, +- END_MARKER = 211, +- WHITESPACE = 212, +- SKIP_LINES = 213, +- CONT_STATEMENT = 214, +- END_OF_LINE = 215, ++ ASSIGN_ARRAYEXPR_MFCALL = 8, ++ ARRAYDEF = 9, ++ ARRAYDEF_CONST = 10, ++ ARRAYIX = 11, ++ ARRAYIX_ALL = 12, ++ ARRAYIX_ORANGE = 13, ++ ARRAYIX_RANGE = 14, ++ ARRAYIX_ORANGE_S = 15, ++ ARRAYIX_RANGE_S = 16, ++ ARRAYEXPR = 17, ++ ARRAYEXPR_FN = 18, ++ ARRAYEXPR_MFCALL = 19, ++ BLOCK = 20, ++ BREAK = 21, ++ CSBLOCK = 22, ++ CONTINUE = 23, ++ COMMONDECL = 24, ++ COMMONDEF = 25, ++ CONSTANT = 26, ++ DEREF = 27, ++ ELSEBLK = 28, ++ EXPR = 29, ++ FOR = 30, ++ FOR_STEP = 31, ++ FOREACH = 32, ++ FOR_LOOP = 33, ++ FOR_STEP_LOOP = 34, ++ FOREACH_LOOP = 35, ++ FCALL = 36, ++ FCALL_LIB = 37, ++ FCALL_LIB_RETNEW = 38, ++ IF_ELSE = 39, ++ KEYDECL = 40, ++ KEYDEF = 41, ++ KEYDEF_REF = 42, ++ KEYDEF_REF_CHECK = 43, ++ KEYDEF_REF_EXPR = 44, ++ LABEL = 45, ++ MPCALL = 46, ++ MPCALL_PARENT = 47, ++ MFCALL = 48, ++ MFCALL_LIB = 49, ++ MFCALL_LIB_RETNEW = 50, ++ MFCALL_PARENT = 51, ++ MFCALL_PARENT_LIB = 52, ++ MFCALL_PARENT_LIB_RETNEW = 53, ++ NOP = 54, ++ NSTRUC = 55, ++ NSTRUC_REF = 56, ++ ON_IOERROR_NULL = 57, ++ PCALL = 58, ++ PCALL_LIB = 59, ++ PARADECL = 60, ++ PARAEXPR = 61, ++ POSTDEC = 62, ++ POSTINC = 63, ++ DECSTATEMENT = 64, ++ INCSTATEMENT = 65, ++ REF = 66, ++ REF_CHECK = 67, ++ REF_EXPR = 68, ++ REPEAT = 69, ++ REPEAT_LOOP = 70, ++ RETURN = 71, ++ RETF = 72, ++ RETP = 73, ++ STRUC = 74, ++ SYSVAR = 75, ++ UMINUS = 76, ++ VAR = 77, ++ VARPTR = 78, ++ WHILE = 79, ++ IDENTIFIER = 80, ++ AND_OP = 81, ++ BEGIN = 82, ++ CASE = 83, ++ COMMON = 84, ++ COMPILE_OPT = 85, ++ DO = 86, ++ ELSE = 87, ++ END = 88, ++ ENDCASE = 89, ++ ENDELSE = 90, ++ ENDFOR = 91, ++ ENDFOREACH = 92, ++ ENDIF = 93, ++ ENDREP = 94, ++ ENDSWITCH = 95, ++ ENDWHILE = 96, ++ EQ_OP = 97, ++ FORWARD = 98, ++ FUNCTION = 99, ++ GE_OP = 100, ++ GOTO = 101, ++ GT_OP = 102, ++ IF = 103, ++ INHERITS = 104, ++ LE_OP = 105, ++ LT_OP = 106, ++ MOD_OP = 107, ++ NE_OP = 108, ++ NOT_OP = 109, ++ OF = 110, ++ ON_IOERROR = 111, ++ OR_OP = 112, ++ PRO = 113, ++ SWITCH = 114, ++ THEN = 115, ++ UNTIL = 116, ++ XOR_OP = 117, ++ METHOD = 118, ++ COMMA = 119, ++ COLON = 120, ++ END_U = 121, ++ EQUAL = 122, ++ DEC = 123, ++ INC = 124, ++ AND_OP_EQ = 125, ++ ASTERIX_EQ = 126, ++ EQ_OP_EQ = 127, ++ GE_OP_EQ = 128, ++ GTMARK_EQ = 129, ++ GT_OP_EQ = 130, ++ LE_OP_EQ = 131, ++ LTMARK_EQ = 132, ++ LT_OP_EQ = 133, ++ MATRIX_OP1_EQ = 134, ++ MATRIX_OP2_EQ = 135, ++ MINUS_EQ = 136, ++ MOD_OP_EQ = 137, ++ NE_OP_EQ = 138, ++ OR_OP_EQ = 139, ++ PLUS_EQ = 140, ++ POW_EQ = 141, ++ SLASH_EQ = 142, ++ XOR_OP_EQ = 143, ++ MEMBER = 144, ++ LBRACE = 145, ++ RBRACE = 146, ++ SLASH = 147, ++ LSQUARE = 148, ++ RSQUARE = 149, ++ SYSVARNAME = 150, ++ EXCLAMATION = 151, ++ LCURLY = 152, ++ RCURLY = 153, ++ CONSTANT_HEX_BYTE = 154, ++ CONSTANT_HEX_LONG = 155, ++ CONSTANT_HEX_LONG64 = 156, ++ CONSTANT_HEX_INT = 157, ++ CONSTANT_HEX_I = 158, ++ CONSTANT_HEX_ULONG = 159, ++ CONSTANT_HEX_ULONG64 = 160, ++ CONSTANT_HEX_UI = 161, ++ CONSTANT_HEX_UINT = 162, ++ CONSTANT_BYTE = 163, ++ CONSTANT_LONG = 164, ++ CONSTANT_LONG64 = 165, ++ CONSTANT_INT = 166, ++ CONSTANT_I = 167, ++ CONSTANT_ULONG = 168, ++ CONSTANT_ULONG64 = 169, ++ CONSTANT_UI = 170, ++ CONSTANT_UINT = 171, ++ CONSTANT_OCT_BYTE = 172, ++ CONSTANT_OCT_LONG = 173, ++ CONSTANT_OCT_LONG64 = 174, ++ CONSTANT_OCT_INT = 175, ++ CONSTANT_OCT_I = 176, ++ CONSTANT_OCT_ULONG = 177, ++ CONSTANT_OCT_ULONG64 = 178, ++ CONSTANT_OCT_UI = 179, ++ CONSTANT_OCT_UINT = 180, ++ CONSTANT_FLOAT = 181, ++ CONSTANT_DOUBLE = 182, ++ CONSTANT_BIN_BYTE = 183, ++ CONSTANT_BIN_LONG = 184, ++ CONSTANT_BIN_LONG64 = 185, ++ CONSTANT_BIN_INT = 186, ++ CONSTANT_BIN_I = 187, ++ CONSTANT_BIN_ULONG = 188, ++ CONSTANT_BIN_ULONG64 = 189, ++ CONSTANT_BIN_UI = 190, ++ CONSTANT_BIN_UINT = 191, ++ ASTERIX = 192, ++ DOT = 193, ++ STRING_LITERAL = 194, ++ POW = 195, ++ MATRIX_OP1 = 196, ++ MATRIX_OP2 = 197, ++ PLUS = 198, ++ MINUS = 199, ++ LTMARK = 200, ++ GTMARK = 201, ++ LOG_NEG = 202, ++ LOG_AND = 203, ++ LOG_OR = 204, ++ QUESTION = 205, ++ STRING = 206, ++ INCLUDE = 207, ++ EOL = 208, ++ W = 209, ++ D = 210, ++ L = 211, ++ H = 212, ++ O = 213, ++ B = 214, ++ EXP = 215, ++ DBL_E = 216, ++ DBL = 217, ++ CONSTANT_OR_STRING_LITERAL = 218, ++ COMMENT = 219, ++ END_MARKER = 220, ++ WHITESPACE = 221, ++ SKIP_LINES = 222, ++ CONT_STATEMENT = 223, ++ END_OF_LINE = 224, + NULL_TREE_LOOKAHEAD = 3 + }; + #ifdef __cplusplus +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLInterpreterTokenTypes.txt cvs/gdl/src/GDLInterpreterTokenTypes.txt +--- gdl-0.9rc4/src/GDLInterpreterTokenTypes.txt 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLInterpreterTokenTypes.txt 2010-04-22 09:50:40.000000000 -0600 +@@ -4,211 +4,220 @@ + ASSIGN=5 + ASSIGN_INPLACE=6 + ASSIGN_REPLACE=7 +-ARRAYDEF=8 +-ARRAYDEF_CONST=9 +-ARRAYIX=10 +-ARRAYIX_ALL=11 +-ARRAYIX_ORANGE=12 +-ARRAYIX_RANGE=13 +-ARRAYIX_ORANGE_S=14 +-ARRAYIX_RANGE_S=15 +-ARRAYEXPR=16 +-ARRAYEXPR_FN=17 +-BLOCK=18 +-BREAK=19 +-CONTINUE=20 +-COMMONDECL=21 +-COMMONDEF=22 +-CONSTANT=23 +-DEREF=24 +-ELSEBLK=25 +-EXPR=26 +-FOR_STEP=27 +-FCALL=28 +-FCALL_LIB=29 +-FCALL_LIB_RETNEW=30 +-IF_ELSE=31 +-KEYDECL=32 +-KEYDEF=33 +-KEYDEF_REF=34 +-KEYDEF_REF_CHECK=35 +-KEYDEF_REF_EXPR=36 +-LABEL=37 +-MPCALL=38 +-MPCALL_PARENT=39 +-MFCALL=40 +-MFCALL_LIB=41 +-MFCALL_LIB_RETNEW=42 +-MFCALL_PARENT=43 +-MFCALL_PARENT_LIB=44 +-MFCALL_PARENT_LIB_RETNEW=45 +-NOP=46 +-NSTRUC=47 +-NSTRUC_REF=48 +-ON_IOERROR_NULL=49 +-PCALL=50 +-PCALL_LIB=51 +-PARADECL=52 +-PARAEXPR=53 +-POSTDEC=54 +-POSTINC=55 +-DECSTATEMENT=56 +-INCSTATEMENT=57 +-REF=58 +-REF_CHECK=59 +-REF_EXPR=60 +-RETURN=61 +-RETF=62 +-RETP=63 +-STRUC=64 +-SYSVAR=65 +-UMINUS=66 +-VAR=67 +-VARPTR=68 +-IDENTIFIER=69 +-AND_OP="and"=70 +-BEGIN="begin"=71 +-CASE="case"=72 +-COMMON="common"=73 +-COMPILE_OPT="compile_opt"=74 +-DO="do"=75 +-ELSE="else"=76 +-END="end"=77 +-ENDCASE="endcase"=78 +-ENDELSE="endelse"=79 +-ENDFOR="endfor"=80 +-ENDIF="endif"=81 +-ENDREP="endrep"=82 +-ENDSWITCH="endswitch"=83 +-ENDWHILE="endwhile"=84 +-EQ_OP="eq"=85 +-FOR="for"=86 +-FORWARD="forward_function"=87 +-FUNCTION="function"=88 +-GE_OP="ge"=89 +-GOTO="goto"=90 +-GT_OP="gt"=91 +-IF="if"=92 +-INHERITS="inherits"=93 +-LE_OP="le"=94 +-LT_OP="lt"=95 +-MOD_OP="mod"=96 +-NE_OP="ne"=97 +-NOT_OP="not"=98 +-OF="of"=99 +-ON_IOERROR="on_ioerror"=100 +-OR_OP="or"=101 +-PRO="pro"=102 +-REPEAT="repeat"=103 +-SWITCH="switch"=104 +-THEN="then"=105 +-UNTIL="until"=106 +-WHILE="while"=107 +-XOR_OP="xor"=108 +-METHOD=109 +-COMMA=110 +-COLON=111 +-END_U=112 +-EQUAL=113 +-DEC=114 +-INC=115 +-AND_OP_EQ=116 +-ASTERIX_EQ=117 +-EQ_OP_EQ=118 +-GE_OP_EQ=119 +-GTMARK_EQ=120 +-GT_OP_EQ=121 +-LE_OP_EQ=122 +-LTMARK_EQ=123 +-LT_OP_EQ=124 +-MATRIX_OP1_EQ=125 +-MATRIX_OP2_EQ=126 +-MINUS_EQ=127 +-MOD_OP_EQ=128 +-NE_OP_EQ=129 +-OR_OP_EQ=130 +-PLUS_EQ=131 +-POW_EQ=132 +-SLASH_EQ=133 +-XOR_OP_EQ=134 +-MEMBER=135 +-LBRACE=136 +-RBRACE=137 +-SLASH=138 +-LSQUARE=139 +-RSQUARE=140 +-SYSVARNAME=141 +-EXCLAMATION=142 +-LCURLY=143 +-RCURLY=144 +-CONSTANT_HEX_BYTE=145 +-CONSTANT_HEX_LONG=146 +-CONSTANT_HEX_LONG64=147 +-CONSTANT_HEX_INT=148 +-CONSTANT_HEX_I=149 +-CONSTANT_HEX_ULONG=150 +-CONSTANT_HEX_ULONG64=151 +-CONSTANT_HEX_UI=152 +-CONSTANT_HEX_UINT=153 +-CONSTANT_BYTE=154 +-CONSTANT_LONG=155 +-CONSTANT_LONG64=156 +-CONSTANT_INT=157 +-CONSTANT_I=158 +-CONSTANT_ULONG=159 +-CONSTANT_ULONG64=160 +-CONSTANT_UI=161 +-CONSTANT_UINT=162 +-CONSTANT_OCT_BYTE=163 +-CONSTANT_OCT_LONG=164 +-CONSTANT_OCT_LONG64=165 +-CONSTANT_OCT_INT=166 +-CONSTANT_OCT_I=167 +-CONSTANT_OCT_ULONG=168 +-CONSTANT_OCT_ULONG64=169 +-CONSTANT_OCT_UI=170 +-CONSTANT_OCT_UINT=171 +-CONSTANT_FLOAT=172 +-CONSTANT_DOUBLE=173 +-CONSTANT_BIN_BYTE=174 +-CONSTANT_BIN_LONG=175 +-CONSTANT_BIN_LONG64=176 +-CONSTANT_BIN_INT=177 +-CONSTANT_BIN_I=178 +-CONSTANT_BIN_ULONG=179 +-CONSTANT_BIN_ULONG64=180 +-CONSTANT_BIN_UI=181 +-CONSTANT_BIN_UINT=182 +-ASTERIX=183 +-DOT=184 +-STRING_LITERAL=185 +-POW=186 +-MATRIX_OP1=187 +-MATRIX_OP2=188 +-PLUS=189 +-MINUS=190 +-LTMARK=191 +-GTMARK=192 +-LOG_NEG=193 +-LOG_AND=194 +-LOG_OR=195 +-QUESTION=196 +-STRING=197 +-INCLUDE=198 +-EOL=199 +-W=200 +-D=201 +-L=202 +-H=203 +-O=204 +-B=205 +-EXP=206 +-DBL_E=207 +-DBL=208 +-CONSTANT_OR_STRING_LITERAL=209 +-COMMENT=210 +-END_MARKER=211 +-WHITESPACE=212 +-SKIP_LINES=213 +-CONT_STATEMENT=214 +-END_OF_LINE=215 ++ASSIGN_ARRAYEXPR_MFCALL=8 ++ARRAYDEF=9 ++ARRAYDEF_CONST=10 ++ARRAYIX=11 ++ARRAYIX_ALL=12 ++ARRAYIX_ORANGE=13 ++ARRAYIX_RANGE=14 ++ARRAYIX_ORANGE_S=15 ++ARRAYIX_RANGE_S=16 ++ARRAYEXPR=17 ++ARRAYEXPR_FN=18 ++ARRAYEXPR_MFCALL=19 ++BLOCK=20 ++BREAK=21 ++CSBLOCK=22 ++CONTINUE=23 ++COMMONDECL=24 ++COMMONDEF=25 ++CONSTANT=26 ++DEREF=27 ++ELSEBLK=28 ++EXPR=29 ++FOR="for"=30 ++FOR_STEP=31 ++FOREACH="foreach"=32 ++FOR_LOOP=33 ++FOR_STEP_LOOP=34 ++FOREACH_LOOP=35 ++FCALL=36 ++FCALL_LIB=37 ++FCALL_LIB_RETNEW=38 ++IF_ELSE=39 ++KEYDECL=40 ++KEYDEF=41 ++KEYDEF_REF=42 ++KEYDEF_REF_CHECK=43 ++KEYDEF_REF_EXPR=44 ++LABEL=45 ++MPCALL=46 ++MPCALL_PARENT=47 ++MFCALL=48 ++MFCALL_LIB=49 ++MFCALL_LIB_RETNEW=50 ++MFCALL_PARENT=51 ++MFCALL_PARENT_LIB=52 ++MFCALL_PARENT_LIB_RETNEW=53 ++NOP=54 ++NSTRUC=55 ++NSTRUC_REF=56 ++ON_IOERROR_NULL=57 ++PCALL=58 ++PCALL_LIB=59 ++PARADECL=60 ++PARAEXPR=61 ++POSTDEC=62 ++POSTINC=63 ++DECSTATEMENT=64 ++INCSTATEMENT=65 ++REF=66 ++REF_CHECK=67 ++REF_EXPR=68 ++REPEAT="repeat"=69 ++REPEAT_LOOP=70 ++RETURN=71 ++RETF=72 ++RETP=73 ++STRUC=74 ++SYSVAR=75 ++UMINUS=76 ++VAR=77 ++VARPTR=78 ++WHILE="while"=79 ++IDENTIFIER=80 ++AND_OP="and"=81 ++BEGIN="begin"=82 ++CASE="case"=83 ++COMMON="common"=84 ++COMPILE_OPT="compile_opt"=85 ++DO="do"=86 ++ELSE="else"=87 ++END="end"=88 ++ENDCASE="endcase"=89 ++ENDELSE="endelse"=90 ++ENDFOR="endfor"=91 ++ENDFOREACH="endforeach"=92 ++ENDIF="endif"=93 ++ENDREP="endrep"=94 ++ENDSWITCH="endswitch"=95 ++ENDWHILE="endwhile"=96 ++EQ_OP="eq"=97 ++FORWARD="forward_function"=98 ++FUNCTION="function"=99 ++GE_OP="ge"=100 ++GOTO="goto"=101 ++GT_OP="gt"=102 ++IF="if"=103 ++INHERITS="inherits"=104 ++LE_OP="le"=105 ++LT_OP="lt"=106 ++MOD_OP="mod"=107 ++NE_OP="ne"=108 ++NOT_OP="not"=109 ++OF="of"=110 ++ON_IOERROR="on_ioerror"=111 ++OR_OP="or"=112 ++PRO="pro"=113 ++SWITCH="switch"=114 ++THEN="then"=115 ++UNTIL="until"=116 ++XOR_OP="xor"=117 ++METHOD=118 ++COMMA=119 ++COLON=120 ++END_U=121 ++EQUAL=122 ++DEC=123 ++INC=124 ++AND_OP_EQ=125 ++ASTERIX_EQ=126 ++EQ_OP_EQ=127 ++GE_OP_EQ=128 ++GTMARK_EQ=129 ++GT_OP_EQ=130 ++LE_OP_EQ=131 ++LTMARK_EQ=132 ++LT_OP_EQ=133 ++MATRIX_OP1_EQ=134 ++MATRIX_OP2_EQ=135 ++MINUS_EQ=136 ++MOD_OP_EQ=137 ++NE_OP_EQ=138 ++OR_OP_EQ=139 ++PLUS_EQ=140 ++POW_EQ=141 ++SLASH_EQ=142 ++XOR_OP_EQ=143 ++MEMBER=144 ++LBRACE=145 ++RBRACE=146 ++SLASH=147 ++LSQUARE=148 ++RSQUARE=149 ++SYSVARNAME=150 ++EXCLAMATION=151 ++LCURLY=152 ++RCURLY=153 ++CONSTANT_HEX_BYTE=154 ++CONSTANT_HEX_LONG=155 ++CONSTANT_HEX_LONG64=156 ++CONSTANT_HEX_INT=157 ++CONSTANT_HEX_I=158 ++CONSTANT_HEX_ULONG=159 ++CONSTANT_HEX_ULONG64=160 ++CONSTANT_HEX_UI=161 ++CONSTANT_HEX_UINT=162 ++CONSTANT_BYTE=163 ++CONSTANT_LONG=164 ++CONSTANT_LONG64=165 ++CONSTANT_INT=166 ++CONSTANT_I=167 ++CONSTANT_ULONG=168 ++CONSTANT_ULONG64=169 ++CONSTANT_UI=170 ++CONSTANT_UINT=171 ++CONSTANT_OCT_BYTE=172 ++CONSTANT_OCT_LONG=173 ++CONSTANT_OCT_LONG64=174 ++CONSTANT_OCT_INT=175 ++CONSTANT_OCT_I=176 ++CONSTANT_OCT_ULONG=177 ++CONSTANT_OCT_ULONG64=178 ++CONSTANT_OCT_UI=179 ++CONSTANT_OCT_UINT=180 ++CONSTANT_FLOAT=181 ++CONSTANT_DOUBLE=182 ++CONSTANT_BIN_BYTE=183 ++CONSTANT_BIN_LONG=184 ++CONSTANT_BIN_LONG64=185 ++CONSTANT_BIN_INT=186 ++CONSTANT_BIN_I=187 ++CONSTANT_BIN_ULONG=188 ++CONSTANT_BIN_ULONG64=189 ++CONSTANT_BIN_UI=190 ++CONSTANT_BIN_UINT=191 ++ASTERIX=192 ++DOT=193 ++STRING_LITERAL=194 ++POW=195 ++MATRIX_OP1=196 ++MATRIX_OP2=197 ++PLUS=198 ++MINUS=199 ++LTMARK=200 ++GTMARK=201 ++LOG_NEG=202 ++LOG_AND=203 ++LOG_OR=204 ++QUESTION=205 ++STRING=206 ++INCLUDE=207 ++EOL=208 ++W=209 ++D=210 ++L=211 ++H=212 ++O=213 ++B=214 ++EXP=215 ++DBL_E=216 ++DBL=217 ++CONSTANT_OR_STRING_LITERAL=218 ++COMMENT=219 ++END_MARKER=220 ++WHITESPACE=221 ++SKIP_LINES=222 ++CONT_STATEMENT=223 ++END_OF_LINE=224 +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdljournal.cpp cvs/gdl/src/gdljournal.cpp +--- gdl-0.9rc4/src/gdljournal.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdljournal.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -87,12 +87,12 @@ + //message + DStructGDL* version = SysVar::Version(); + +- static unsigned releaseTag = version->Desc()->TagIndex( "RELEASE"); ++/* static unsigned releaseTag = version->Desc()->TagIndex( "RELEASE");*/ + static unsigned osTag = version->Desc()->TagIndex( "OS"); + static unsigned archTag = version->Desc()->TagIndex( "ARCH"); + static unsigned mTag = version->Desc()->TagIndex( "MEMORY_BITS"); +- DString release = +- (*static_cast( version->GetTag( releaseTag, 0)))[0]; ++/* DString release = ++ (*static_cast( version->GetTag( releaseTag, 0)))[0];*/ + DString os = + (*static_cast( version->GetTag( osTag, 0)))[0]; + DString arch = +@@ -100,7 +100,7 @@ + DInt m = + (*static_cast( version->GetTag( mTag, 0)))[0]; + +- write_journal_comment( "GDL Version "+release+" ("+os+" "+arch+" m"+ ++ write_journal_comment( string("GDL Version ")+VERSION/*release*/+" ("+os+" "+arch+" m"+ + i2s(m)+")"); + + string user = GetEnvString( "USER"); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLLexer.cpp cvs/gdl/src/GDLLexer.cpp +--- gdl-0.9rc4/src/GDLLexer.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLLexer.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -36,45 +36,47 @@ + + void GDLLexer::initLiterals() + { +- literals["endcase"] = 78; +- literals["case"] = 72; +- literals["repeat"] = 103; +- literals["ne"] = 97; +- literals["end"] = 77; +- literals["le"] = 94; +- literals["then"] = 105; +- literals["begin"] = 71; +- literals["endswitch"] = 83; +- literals["and"] = 70; +- literals["endrep"] = 82; +- literals["not"] = 98; +- literals["on_ioerror"] = 100; +- literals["mod"] = 96; +- literals["do"] = 75; +- literals["function"] = 88; +- literals["endfor"] = 80; +- literals["gt"] = 91; +- literals["inherits"] = 93; +- literals["of"] = 99; +- literals["or"] = 101; +- literals["if"] = 92; +- literals["pro"] = 102; +- literals["xor"] = 108; +- literals["compile_opt"] = 74; +- literals["ge"] = 89; +- literals["goto"] = 90; +- literals["for"] = 86; +- literals["eq"] = 85; +- literals["forward_function"] = 87; +- literals["endelse"] = 79; +- literals["until"] = 106; +- literals["else"] = 76; +- literals["lt"] = 95; +- literals["endwhile"] = 84; +- literals["switch"] = 104; +- literals["common"] = 73; +- literals["endif"] = 81; +- literals["while"] = 107; ++ literals["endcase"] = 89; ++ literals["case"] = 83; ++ literals["repeat"] = 69; ++ literals["endforeach"] = 92; ++ literals["ne"] = 108; ++ literals["end"] = 88; ++ literals["le"] = 105; ++ literals["then"] = 115; ++ literals["begin"] = 82; ++ literals["endswitch"] = 95; ++ literals["and"] = 81; ++ literals["endrep"] = 94; ++ literals["not"] = 109; ++ literals["on_ioerror"] = 111; ++ literals["mod"] = 107; ++ literals["do"] = 86; ++ literals["function"] = 99; ++ literals["endfor"] = 91; ++ literals["gt"] = 102; ++ literals["inherits"] = 104; ++ literals["of"] = 110; ++ literals["or"] = 112; ++ literals["if"] = 103; ++ literals["pro"] = 113; ++ literals["xor"] = 117; ++ literals["compile_opt"] = 85; ++ literals["ge"] = 100; ++ literals["goto"] = 101; ++ literals["for"] = 30; ++ literals["eq"] = 97; ++ literals["forward_function"] = 98; ++ literals["foreach"] = 32; ++ literals["endelse"] = 90; ++ literals["until"] = 116; ++ literals["else"] = 87; ++ literals["lt"] = 106; ++ literals["endwhile"] = 96; ++ literals["switch"] = 114; ++ literals["common"] = 84; ++ literals["endif"] = 93; ++ literals["while"] = 79; + } + + antlr::RefToken GDLLexer::nextToken() +@@ -398,11 +400,11 @@ + } + } + else { +- goto _loop228; ++ goto _loop259; + } + + } +- _loop228:; ++ _loop259:; + } // ( ... )* + if ( _createToken && _token==antlr::nullToken && _ttype!=antlr::Token::SKIP ) { + _token = makeToken(_ttype); +@@ -1150,10 +1152,10 @@ + std::string::size_type _saveIndex; + + { +- bool synPredMatched280 = false; ++ bool synPredMatched311 = false; + if (((LA(1) == 0xd /* '\r' */ ) && (LA(2) == 0xa /* '\n' */ ) && (true))) { +- int _m280 = mark(); +- synPredMatched280 = true; ++ int _m311 = mark(); ++ synPredMatched311 = true; + inputState->guessing++; + try { + { +@@ -1161,12 +1163,12 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched280 = false; ++ synPredMatched311 = false; + } +- rewind(_m280); ++ rewind(_m311); + inputState->guessing--; + } +- if ( synPredMatched280 ) { ++ if ( synPredMatched311 ) { + match("\r\n"); + } + else if ((LA(1) == 0xa /* '\n' */ )) { +@@ -1417,18 +1419,18 @@ + } + } + { // ( ... )+ +- int _cnt298=0; ++ int _cnt329=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt298>=1 ) { goto _loop298; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt329>=1 ) { goto _loop329; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt298++; ++ _cnt329++; + } +- _loop298:; ++ _loop329:; + } // ( ... )+ + } + else { +@@ -1502,18 +1504,18 @@ + } + } + { // ( ... )+ +- int _cnt305=0; ++ int _cnt336=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt305>=1 ) { goto _loop305; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt336>=1 ) { goto _loop336; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt305++; ++ _cnt336++; + } +- _loop305:; ++ _loop336:; + } // ( ... )+ + } + else { +@@ -1937,27 +1939,27 @@ + _ttype = CONSTANT_OR_STRING_LITERAL; + std::string::size_type _saveIndex; + +- bool synPredMatched351 = false; ++ bool synPredMatched382 = false; + if (((LA(1) == 0x27 /* '\'' */ ) && (_tokenSet_4.member(LA(2))) && (_tokenSet_5.member(LA(3))))) { +- int _m351 = mark(); +- synPredMatched351 = true; ++ int _m382 = mark(); ++ synPredMatched382 = true; + inputState->guessing++; + try { + { + match('\'' /* charlit */ ); + { // ( ... )+ +- int _cnt349=0; ++ int _cnt380=0; + for (;;) { + if ((_tokenSet_4.member(LA(1)))) { + mH(false); + } + else { +- if ( _cnt349>=1 ) { goto _loop349; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt380>=1 ) { goto _loop380; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt349++; ++ _cnt380++; + } +- _loop349:; ++ _loop380:; + } // ( ... )+ + match('\'' /* charlit */ ); + { +@@ -1993,29 +1995,29 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched351 = false; ++ synPredMatched382 = false; + } +- rewind(_m351); ++ rewind(_m382); + inputState->guessing--; + } +- if ( synPredMatched351 ) { ++ if ( synPredMatched382 ) { + { + _saveIndex = text.length(); + match('\'' /* charlit */ ); + text.erase(_saveIndex); + { // ( ... )+ +- int _cnt354=0; ++ int _cnt385=0; + for (;;) { + if ((_tokenSet_4.member(LA(1)))) { + mH(false); + } + else { +- if ( _cnt354>=1 ) { goto _loop354; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt385>=1 ) { goto _loop385; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt354++; ++ _cnt385++; + } +- _loop354:; ++ _loop385:; + } // ( ... )+ + _saveIndex = text.length(); + match('\'' /* charlit */ ); +@@ -2112,27 +2114,27 @@ + } + } + else { +- bool synPredMatched360 = false; ++ bool synPredMatched391 = false; + if (((LA(1) == 0x27 /* '\'' */ ) && ((LA(2) >= 0x30 /* '0' */ && LA(2) <= 0x37 /* '7' */ )) && (_tokenSet_6.member(LA(3))))) { +- int _m360 = mark(); +- synPredMatched360 = true; ++ int _m391 = mark(); ++ synPredMatched391 = true; + inputState->guessing++; + try { + { + match('\'' /* charlit */ ); + { // ( ... )+ +- int _cnt358=0; ++ int _cnt389=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ ))) { + mO(false); + } + else { +- if ( _cnt358>=1 ) { goto _loop358; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt389>=1 ) { goto _loop389; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt358++; ++ _cnt389++; + } +- _loop358:; ++ _loop389:; + } // ( ... )+ + match('\'' /* charlit */ ); + { +@@ -2159,29 +2161,29 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched360 = false; ++ synPredMatched391 = false; + } +- rewind(_m360); ++ rewind(_m391); + inputState->guessing--; + } +- if ( synPredMatched360 ) { ++ if ( synPredMatched391 ) { + { + _saveIndex = text.length(); + match('\'' /* charlit */ ); + text.erase(_saveIndex); + { // ( ... )+ +- int _cnt363=0; ++ int _cnt394=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ ))) { + mO(false); + } + else { +- if ( _cnt363>=1 ) { goto _loop363; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt394>=1 ) { goto _loop394; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt363++; ++ _cnt394++; + } +- _loop363:; ++ _loop394:; + } // ( ... )+ + _saveIndex = text.length(); + match('\'' /* charlit */ ); +@@ -2278,27 +2280,27 @@ + } + } + else { +- bool synPredMatched369 = false; ++ bool synPredMatched400 = false; + if (((LA(1) == 0x27 /* '\'' */ ) && (LA(2) == 0x30 /* '0' */ || LA(2) == 0x31 /* '1' */ ) && (LA(3) == 0x27 /* '\'' */ || LA(3) == 0x30 /* '0' */ || LA(3) == 0x31 /* '1' */ ))) { +- int _m369 = mark(); +- synPredMatched369 = true; ++ int _m400 = mark(); ++ synPredMatched400 = true; + inputState->guessing++; + try { + { + match('\'' /* charlit */ ); + { // ( ... )+ +- int _cnt367=0; ++ int _cnt398=0; + for (;;) { + if ((LA(1) == 0x30 /* '0' */ || LA(1) == 0x31 /* '1' */ )) { + mB(false); + } + else { +- if ( _cnt367>=1 ) { goto _loop367; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt398>=1 ) { goto _loop398; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt367++; ++ _cnt398++; + } +- _loop367:; ++ _loop398:; + } // ( ... )+ + match('\'' /* charlit */ ); + { +@@ -2325,29 +2327,29 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched369 = false; ++ synPredMatched400 = false; + } +- rewind(_m369); ++ rewind(_m400); + inputState->guessing--; + } +- if ( synPredMatched369 ) { ++ if ( synPredMatched400 ) { + { + _saveIndex = text.length(); + match('\'' /* charlit */ ); + text.erase(_saveIndex); + { // ( ... )+ +- int _cnt372=0; ++ int _cnt403=0; + for (;;) { + if ((LA(1) == 0x30 /* '0' */ || LA(1) == 0x31 /* '1' */ )) { + mB(false); + } + else { +- if ( _cnt372>=1 ) { goto _loop372; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt403>=1 ) { goto _loop403; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt372++; ++ _cnt403++; + } +- _loop372:; ++ _loop403:; + } // ( ... )+ + _saveIndex = text.length(); + match('\'' /* charlit */ ); +@@ -2444,27 +2446,27 @@ + } + } + else { +- bool synPredMatched342 = false; ++ bool synPredMatched373 = false; + if (((LA(1) == 0x22 /* '\"' */ ) && ((LA(2) >= 0x30 /* '0' */ && LA(2) <= 0x37 /* '7' */ )) && (true))) { +- int _m342 = mark(); +- synPredMatched342 = true; ++ int _m373 = mark(); ++ synPredMatched373 = true; + inputState->guessing++; + try { + { + match('\"' /* charlit */ ); + { // ( ... )+ +- int _cnt340=0; ++ int _cnt371=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ ))) { + mO(false); + } + else { +- if ( _cnt340>=1 ) { goto _loop340; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt371>=1 ) { goto _loop371; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt340++; ++ _cnt371++; + } +- _loop340:; ++ _loop371:; + } // ( ... )+ + { + switch ( LA(1)) { +@@ -2503,29 +2505,29 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched342 = false; ++ synPredMatched373 = false; + } +- rewind(_m342); ++ rewind(_m373); + inputState->guessing--; + } +- if ( synPredMatched342 ) { ++ if ( synPredMatched373 ) { + { + _saveIndex = text.length(); + match('\"' /* charlit */ ); + text.erase(_saveIndex); + { // ( ... )+ +- int _cnt345=0; ++ int _cnt376=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */ ))) { + mO(false); + } + else { +- if ( _cnt345>=1 ) { goto _loop345; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt376>=1 ) { goto _loop376; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt345++; ++ _cnt376++; + } +- _loop345:; ++ _loop376:; + } // ( ... )+ + if ( inputState->guessing==0 ) { + _ttype=CONSTANT_OCT_I; +@@ -2616,10 +2618,10 @@ + } + } + else { +- bool synPredMatched393 = false; ++ bool synPredMatched424 = false; + if (((_tokenSet_7.member(LA(1))) && (_tokenSet_8.member(LA(2))) && (true))) { +- int _m393 = mark(); +- synPredMatched393 = true; ++ int _m424 = mark(); ++ synPredMatched424 = true; + inputState->guessing++; + try { + { +@@ -2637,18 +2639,18 @@ + { + { + { // ( ... )+ +- int _cnt385=0; ++ int _cnt416=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt385>=1 ) { goto _loop385; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt416>=1 ) { goto _loop416; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt385++; ++ _cnt416++; + } +- _loop385:; ++ _loop416:; + } // ( ... )+ + { + switch ( LA(1)) { +@@ -2666,11 +2668,11 @@ + mD(false); + } + else { +- goto _loop388; ++ goto _loop419; + } + + } +- _loop388:; ++ _loop419:; + } // ( ... )* + { + mDBL(false); +@@ -2690,18 +2692,18 @@ + { + match('.' /* charlit */ ); + { // ( ... )+ +- int _cnt391=0; ++ int _cnt422=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt391>=1 ) { goto _loop391; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt422>=1 ) { goto _loop422; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt391++; ++ _cnt422++; + } +- _loop391:; ++ _loop422:; + } // ( ... )+ + { + mDBL(false); +@@ -2716,12 +2718,12 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched393 = false; ++ synPredMatched424 = false; + } +- rewind(_m393); ++ rewind(_m424); + inputState->guessing--; + } +- if ( synPredMatched393 ) { ++ if ( synPredMatched424 ) { + { + switch ( LA(1)) { + case 0x30 /* '0' */ : +@@ -2737,18 +2739,18 @@ + { + { + { // ( ... )+ +- int _cnt397=0; ++ int _cnt428=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt397>=1 ) { goto _loop397; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt428>=1 ) { goto _loop428; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt397++; ++ _cnt428++; + } +- _loop397:; ++ _loop428:; + } // ( ... )+ + { + switch ( LA(1)) { +@@ -2766,11 +2768,11 @@ + mD(false); + } + else { +- goto _loop400; ++ goto _loop431; + } + + } +- _loop400:; ++ _loop431:; + } // ( ... )* + { + mDBL(false); +@@ -2790,18 +2792,18 @@ + { + match('.' /* charlit */ ); + { // ( ... )+ +- int _cnt403=0; ++ int _cnt434=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt403>=1 ) { goto _loop403; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt434>=1 ) { goto _loop434; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt403++; ++ _cnt434++; + } +- _loop403:; ++ _loop434:; + } // ( ... )+ + { + mDBL(false); +@@ -2819,10 +2821,10 @@ + } + } + else { +- bool synPredMatched416 = false; ++ bool synPredMatched447 = false; + if (((_tokenSet_7.member(LA(1))) && (_tokenSet_9.member(LA(2))) && (true))) { +- int _m416 = mark(); +- synPredMatched416 = true; ++ int _m447 = mark(); ++ synPredMatched447 = true; + inputState->guessing++; + try { + { +@@ -2840,18 +2842,18 @@ + { + { + { // ( ... )+ +- int _cnt408=0; ++ int _cnt439=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt408>=1 ) { goto _loop408; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt439>=1 ) { goto _loop439; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt408++; ++ _cnt439++; + } +- _loop408:; ++ _loop439:; + } // ( ... )+ + { + switch ( LA(1)) { +@@ -2869,11 +2871,11 @@ + mD(false); + } + else { +- goto _loop411; ++ goto _loop442; + } + + } +- _loop411:; ++ _loop442:; + } // ( ... )* + { + if ((LA(1) == 0x65 /* 'e' */ )) { +@@ -2898,18 +2900,18 @@ + { + match('.' /* charlit */ ); + { // ( ... )+ +- int _cnt414=0; ++ int _cnt445=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt414>=1 ) { goto _loop414; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt445>=1 ) { goto _loop445; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt414++; ++ _cnt445++; + } +- _loop414:; ++ _loop445:; + } // ( ... )+ + { + if ((LA(1) == 0x65 /* 'e' */ )) { +@@ -2929,12 +2931,12 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched416 = false; ++ synPredMatched447 = false; + } +- rewind(_m416); ++ rewind(_m447); + inputState->guessing--; + } +- if ( synPredMatched416 ) { ++ if ( synPredMatched447 ) { + { + switch ( LA(1)) { + case 0x30 /* '0' */ : +@@ -2950,18 +2952,18 @@ + { + { + { // ( ... )+ +- int _cnt420=0; ++ int _cnt451=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt420>=1 ) { goto _loop420; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt451>=1 ) { goto _loop451; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt420++; ++ _cnt451++; + } +- _loop420:; ++ _loop451:; + } // ( ... )+ + { + switch ( LA(1)) { +@@ -2979,11 +2981,11 @@ + mD(false); + } + else { +- goto _loop423; ++ goto _loop454; + } + + } +- _loop423:; ++ _loop454:; + } // ( ... )* + { + if ((LA(1) == 0x65 /* 'e' */ )) { +@@ -3008,18 +3010,18 @@ + { + match('.' /* charlit */ ); + { // ( ... )+ +- int _cnt426=0; ++ int _cnt457=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt426>=1 ) { goto _loop426; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt457>=1 ) { goto _loop457; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt426++; ++ _cnt457++; + } +- _loop426:; ++ _loop457:; + } // ( ... )+ + { + if ((LA(1) == 0x65 /* 'e' */ )) { +@@ -3059,11 +3061,11 @@ + } + } + else { +- goto _loop376; ++ goto _loop407; + } + + } +- _loop376:; ++ _loop407:; + } // ( ... )* + { + if ((LA(1) == 0x22 /* '\"' */ )) { +@@ -3097,11 +3099,11 @@ + } + } + else { +- goto _loop380; ++ goto _loop411; + } + + } +- _loop380:; ++ _loop411:; + } // ( ... )* + { + if ((LA(1) == 0x27 /* '\'' */ )) { +@@ -3125,18 +3127,18 @@ + } + else if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ )) && (true) && (true)) { + { // ( ... )+ +- int _cnt429=0; ++ int _cnt460=0; + for (;;) { + if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { + mD(false); + } + else { +- if ( _cnt429>=1 ) { goto _loop429; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt460>=1 ) { goto _loop460; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt429++; ++ _cnt460++; + } +- _loop429:; ++ _loop460:; + } // ( ... )+ + if ( inputState->guessing==0 ) { + _ttype=CONSTANT_I; +@@ -3253,11 +3255,11 @@ + } + } + else { +- goto _loop435; ++ goto _loop466; + } + + } +- _loop435:; ++ _loop466:; + } // ( ... )* + if ( inputState->guessing==0 ) { + _ttype=antlr::Token::SKIP; +@@ -3333,11 +3335,11 @@ + } + default: + { +- goto _loop439; ++ goto _loop470; + } + } + } +- _loop439:; ++ _loop470:; + } // ( ... )* + if ( inputState->guessing==0 ) { + +@@ -3363,7 +3365,7 @@ + match('!' /* charlit */ ); + } + { // ( ... )+ +- int _cnt443=0; ++ int _cnt474=0; + for (;;) { + switch ( LA(1)) { + case 0x5f /* '_' */ : +@@ -3418,12 +3420,12 @@ + } + default: + { +- if ( _cnt443>=1 ) { goto _loop443; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt474>=1 ) { goto _loop474; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + } +- _cnt443++; ++ _cnt474++; + } +- _loop443:; ++ _loop474:; + } // ( ... )+ + if ( inputState->guessing==0 ) { + +@@ -3462,18 +3464,18 @@ + std::string::size_type _saveIndex; + + { // ( ... )+ +- int _cnt447=0; ++ int _cnt478=0; + for (;;) { + if ((LA(1) == 0x9 /* '\t' */ || LA(1) == 0xc /* '\14' */ || LA(1) == 0x20 /* ' ' */ )) { + mW(false); + } + else { +- if ( _cnt447>=1 ) { goto _loop447; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} ++ if ( _cnt478>=1 ) { goto _loop478; } else {throw antlr::NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} + } + +- _cnt447++; ++ _cnt478++; + } +- _loop447:; ++ _loop478:; + } // ( ... )+ + if ( inputState->guessing==0 ) { + _ttype=antlr::Token::SKIP; +@@ -3514,11 +3516,11 @@ + } + default: + { +- goto _loop450; ++ goto _loop481; + } + } + } +- _loop450:; ++ _loop481:; + } // ( ... )* + if ( _createToken && _token==antlr::nullToken && _ttype!=antlr::Token::SKIP ) { + _token = makeToken(_ttype); +@@ -3542,11 +3544,11 @@ + } + } + else { +- goto _loop454; ++ goto _loop485; + } + + } +- _loop454:; ++ _loop485:; + } // ( ... )* + mEOL(false); + mSKIP_LINES(false); +@@ -3602,6 +3604,7 @@ + // 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba 0xbb + // 0xbc 0xbd 0xbe 0xbf 0xc0 0xc1 0xc2 0xc3 0xc4 0xc5 0xc6 0xc7 0xc8 0xc9 + // 0xca 0xcb 0xcc 0xcd 0xce 0xcf 0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 ++// 0xd8 0xd9 0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 + const antlr::BitSet GDLLexer::_tokenSet_2(_tokenSet_2_data_,16); + const unsigned long GDLLexer::_tokenSet_3_data_[] = { 0UL, 67053568UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // + - 0 1 2 3 4 5 6 7 8 9 +@@ -3635,7 +3638,8 @@ + // 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac 0xad 0xae + // 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba 0xbb 0xbc + // 0xbd 0xbe 0xbf 0xc0 0xc1 0xc2 0xc3 0xc4 0xc5 0xc6 0xc7 0xc8 0xc9 0xca +-// 0xcb 0xcc 0xcd 0xce 0xcf 0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 ++// 0xcb 0xcc 0xcd 0xce 0xcf 0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 0xd8 ++// 0xd9 0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 + const antlr::BitSet GDLLexer::_tokenSet_10(_tokenSet_10_data_,16); + const unsigned long GDLLexer::_tokenSet_11_data_[] = { 4294958072UL, 4294967167UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12 0x13 0x14 +@@ -3648,6 +3652,7 @@ + // 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac 0xad 0xae + // 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba 0xbb 0xbc + // 0xbd 0xbe 0xbf 0xc0 0xc1 0xc2 0xc3 0xc4 0xc5 0xc6 0xc7 0xc8 0xc9 0xca +-// 0xcb 0xcc 0xcd 0xce 0xcf 0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 ++// 0xcb 0xcc 0xcd 0xce 0xcf 0xd0 0xd1 0xd2 0xd3 0xd4 0xd5 0xd6 0xd7 0xd8 ++// 0xd9 0xda 0xdb 0xdc 0xdd 0xde 0xdf 0xe0 + const antlr::BitSet GDLLexer::_tokenSet_11(_tokenSet_11_data_,16); + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLLexer.hpp cvs/gdl/src/GDLLexer.hpp +--- gdl-0.9rc4/src/GDLLexer.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLLexer.hpp 2010-04-22 09:50:40.000000000 -0600 +@@ -28,7 +28,7 @@ + //#include "dinterpreter.hpp" + + // defintion in dinterpreter.cpp +-void SetActualCompileOpt( unsigned int cOpt); ++//void SetActualCompileOpt( unsigned int cOpt); + + class CUSTOM_API GDLLexer : public antlr::CharScanner, public GDLTokenTypes + { +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLParser.cpp cvs/gdl/src/GDLParser.cpp +--- gdl-0.9rc4/src/GDLParser.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLParser.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -62,6 +62,8 @@ + RefDNode ende_AST = RefDNode(antlr::nullAST); + antlr::RefToken endf = antlr::nullToken; + RefDNode endf_AST = RefDNode(antlr::nullAST); ++ antlr::RefToken endfe = antlr::nullToken; ++ RefDNode endfe_AST = RefDNode(antlr::nullAST); + antlr::RefToken endi = antlr::nullToken; + RefDNode endi_AST = RefDNode(antlr::nullAST); + antlr::RefToken endr = antlr::nullToken; +@@ -74,6 +76,8 @@ + RefDNode eq_AST = RefDNode(antlr::nullAST); + antlr::RefToken f = antlr::nullToken; + RefDNode f_AST = RefDNode(antlr::nullAST); ++ antlr::RefToken fe = antlr::nullToken; ++ RefDNode fe_AST = RefDNode(antlr::nullAST); + antlr::RefToken fo = antlr::nullToken; + RefDNode fo_AST = RefDNode(antlr::nullAST); + antlr::RefToken fu = antlr::nullToken; +@@ -285,6 +289,20 @@ + identifier_AST = RefDNode(currentAST.root); + break; + } ++ case ENDFOREACH: ++ { ++ endfe = LT(1); ++ if ( inputState->guessing == 0 ) { ++ endfe_AST = astFactory->create(endfe); ++ astFactory->addASTChild(currentAST, antlr::RefAST(endfe_AST)); ++ } ++ match(ENDFOREACH); ++ if ( inputState->guessing==0 ) { ++ endf_AST->setType( IDENTIFIER); ++ } ++ identifier_AST = RefDNode(currentAST.root); ++ break; ++ } + case ENDIF: + { + endi = LT(1); +@@ -369,6 +387,20 @@ + identifier_AST = RefDNode(currentAST.root); + break; + } ++ case FOREACH: ++ { ++ fe = LT(1); ++ if ( inputState->guessing == 0 ) { ++ fe_AST = astFactory->create(fe); ++ astFactory->addASTChild(currentAST, antlr::RefAST(fe_AST)); ++ } ++ match(FOREACH); ++ if ( inputState->guessing==0 ) { ++ f_AST->setType( IDENTIFIER); ++ } ++ identifier_AST = RefDNode(currentAST.root); ++ break; ++ } + case FORWARD: + { + fo = LT(1); +@@ -758,20 +790,21 @@ + } // ( ... )* + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case BEGIN: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case END_U: + case DEC: + case INC: +@@ -998,20 +1031,21 @@ + } + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case BEGIN: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case END_U: + case DEC: + case INC: +@@ -1114,20 +1148,21 @@ + } + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case BEGIN: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case END_U: + case DEC: + case INC: +@@ -1177,13 +1212,16 @@ + { + switch ( LA(1)) { + case antlr::Token::EOF_TYPE: ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case BEGIN: + case CASE: + case COMMON: + case COMPILE_OPT: + case ELSE: +- case FOR: + case FORWARD: + case FUNCTION: + case GOTO: +@@ -1191,10 +1229,8 @@ + case INHERITS: + case ON_IOERROR: + case PRO: +- case REPEAT: + case SWITCH: + case UNTIL: +- case WHILE: + case END_U: + case DEC: + case INC: +@@ -1251,7 +1287,7 @@ + RefDNode statement_list_AST = RefDNode(antlr::nullAST); + + { // ( ... )+ +- int _cnt72=0; ++ int _cnt73=0; + for (;;) { + if ((LA(1) == END_U)) { + end_unit(); +@@ -1280,12 +1316,12 @@ + } + } + else { +- if ( _cnt72>=1 ) { goto _loop72; } else {throw antlr::NoViableAltException(LT(1), getFilename());} ++ if ( _cnt73>=1 ) { goto _loop73; } else {throw antlr::NoViableAltException(LT(1), getFilename());} + } + +- _cnt72++; ++ _cnt73++; + } +- _loop72:; ++ _loop73:; + } // ( ... )+ + statement_list_AST = RefDNode(currentAST.root); + returnAST = statement_list_AST; +@@ -1481,6 +1517,7 @@ + case ENDCASE: + case ENDELSE: + case ENDFOR: ++ case ENDFOREACH: + case ENDIF: + case ENDREP: + case ENDSWITCH: +@@ -1493,12 +1530,15 @@ + break; + } + case antlr::Token::EOF_TYPE: ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case BEGIN: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case FUNCTION: + case GOTO: +@@ -1506,9 +1546,7 @@ + case INHERITS: + case ON_IOERROR: + case PRO: +- case REPEAT: + case SWITCH: +- case WHILE: + case END_U: + case DEC: + case INC: +@@ -1526,20 +1564,21 @@ + } + break; + } ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case BEGIN: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -1696,21 +1735,30 @@ + match(ENDFOR); + break; + } +- case ENDWHILE: ++ case ENDFOREACH: + { + RefDNode tmp28_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { + tmp28_AST = astFactory->create(LT(1)); + } +- match(ENDWHILE); ++ match(ENDFOREACH); + break; + } +- case ENDREP: ++ case ENDWHILE: + { + RefDNode tmp29_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { + tmp29_AST = astFactory->create(LT(1)); + } ++ match(ENDWHILE); ++ break; ++ } ++ case ENDREP: ++ { ++ RefDNode tmp30_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp30_AST = astFactory->create(LT(1)); ++ } + match(ENDREP); + break; + } +@@ -1759,6 +1807,9 @@ + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode statement_AST = RefDNode(antlr::nullAST); ++ RefDNode d1_AST = RefDNode(antlr::nullAST); ++ RefDNode d2_AST = RefDNode(antlr::nullAST); ++ RefDNode d3_AST = RefDNode(antlr::nullAST); + + bool parent=false; + +@@ -1771,20 +1822,20 @@ + switch ( LA(1)) { + case DEC: + { +- RefDNode tmp33_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp34_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp33_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp33_AST)); ++ tmp34_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp34_AST)); + } + match(DEC); + break; + } + case INC: + { +- RefDNode tmp34_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp35_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp34_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp34_AST)); ++ tmp35_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp35_AST)); + } + match(INC); + break; +@@ -1811,6 +1862,15 @@ + statement_AST = RefDNode(currentAST.root); + break; + } ++ case FOREACH: ++ { ++ foreach_statement(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ statement_AST = RefDNode(currentAST.root); ++ break; ++ } + case REPEAT: + { + repeat_statement(); +@@ -1894,10 +1954,10 @@ + break; + } + default: +- bool synPredMatched82 = false; ++ bool synPredMatched83 = false; + if (((LA(1) == LBRACE) && (_tokenSet_4.member(LA(2))))) { +- int _m82 = mark(); +- synPredMatched82 = true; ++ int _m83 = mark(); ++ synPredMatched83 = true; + inputState->guessing++; + try { + { +@@ -1905,12 +1965,12 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched82 = false; ++ synPredMatched83 = false; + } +- rewind(_m82); ++ rewind(_m83); + inputState->guessing--; + } +- if ( synPredMatched82 ) { ++ if ( synPredMatched83 ) { + assign_expr(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -1919,20 +1979,20 @@ + switch ( LA(1)) { + case DEC: + { +- RefDNode tmp35_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp36_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp35_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp35_AST)); ++ tmp36_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp36_AST)); + } + match(DEC); + break; + } + case INC: + { +- RefDNode tmp36_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp37_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp36_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp36_AST)); ++ tmp37_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp37_AST)); + } + match(INC); + break; +@@ -1951,24 +2011,42 @@ + } + statement_AST = RefDNode(currentAST.root); + } +- else if ((_tokenSet_4.member(LA(1))) && (_tokenSet_5.member(LA(2)))) { +- { +- deref_expr(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ else { ++ bool synPredMatched86 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_5.member(LA(2))))) { ++ int _m86 = mark(); ++ synPredMatched86 = true; ++ inputState->guessing++; ++ try { ++ { ++ deref_dot_expr_keeplast(); ++ match(IDENTIFIER); ++ match(COMMA); ++ } ++ } ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched86 = false; ++ } ++ rewind(_m86); ++ inputState->guessing--; + } +- { +- switch ( LA(1)) { +- case EQUAL: +- { +- match(EQUAL); +- expr(); ++ if ( synPredMatched86 ) { ++ deref_dot_expr_keeplast(); ++ if (inputState->guessing==0) { ++ d1_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ formal_procedure_call(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + if ( inputState->guessing==0 ) { + statement_AST = RefDNode(currentAST.root); +- statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(statement_AST)))); ++ ++ statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MPCALL,"mpcall")))->add(antlr::RefAST(statement_AST)))); ++ statement_AST->SetLine( d1_AST->getLine()); ++ ++ + currentAST.root = statement_AST; + if ( statement_AST!=RefDNode(antlr::nullAST) && + statement_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +@@ -1977,327 +2055,567 @@ + currentAST.child = statement_AST; + currentAST.advanceChildToEnd(); + } +- break; ++ statement_AST = RefDNode(currentAST.root); + } +- case AND_OP_EQ: +- case ASTERIX_EQ: +- case EQ_OP_EQ: +- case GE_OP_EQ: +- case GTMARK_EQ: +- case GT_OP_EQ: +- case LE_OP_EQ: +- case LTMARK_EQ: +- case LT_OP_EQ: +- case MATRIX_OP1_EQ: +- case MATRIX_OP2_EQ: +- case MINUS_EQ: +- case MOD_OP_EQ: +- case NE_OP_EQ: +- case OR_OP_EQ: +- case PLUS_EQ: +- case POW_EQ: +- case SLASH_EQ: +- case XOR_OP_EQ: +- { +- { +- switch ( LA(1)) { +- case AND_OP_EQ: +- { +- RefDNode tmp38_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp38_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp38_AST)); +- } +- match(AND_OP_EQ); +- break; +- } +- case ASTERIX_EQ: +- { +- RefDNode tmp39_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp39_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp39_AST)); +- } +- match(ASTERIX_EQ); +- break; +- } +- case EQ_OP_EQ: +- { +- RefDNode tmp40_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp40_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp40_AST)); +- } +- match(EQ_OP_EQ); +- break; +- } +- case GE_OP_EQ: +- { +- RefDNode tmp41_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp41_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp41_AST)); +- } +- match(GE_OP_EQ); +- break; +- } +- case GTMARK_EQ: +- { +- RefDNode tmp42_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp42_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp42_AST)); +- } +- match(GTMARK_EQ); +- break; +- } +- case GT_OP_EQ: +- { +- RefDNode tmp43_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp43_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp43_AST)); +- } +- match(GT_OP_EQ); +- break; +- } +- case LE_OP_EQ: +- { +- RefDNode tmp44_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp44_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp44_AST)); +- } +- match(LE_OP_EQ); +- break; +- } +- case LTMARK_EQ: +- { +- RefDNode tmp45_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp45_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp45_AST)); +- } +- match(LTMARK_EQ); +- break; +- } +- case LT_OP_EQ: +- { +- RefDNode tmp46_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp46_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp46_AST)); +- } +- match(LT_OP_EQ); +- break; +- } +- case MATRIX_OP1_EQ: +- { +- RefDNode tmp47_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp47_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp47_AST)); +- } +- match(MATRIX_OP1_EQ); +- break; +- } +- case MATRIX_OP2_EQ: +- { +- RefDNode tmp48_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp48_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp48_AST)); +- } +- match(MATRIX_OP2_EQ); +- break; +- } +- case MINUS_EQ: +- { +- RefDNode tmp49_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp49_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp49_AST)); +- } +- match(MINUS_EQ); +- break; +- } +- case MOD_OP_EQ: +- { +- RefDNode tmp50_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp50_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp50_AST)); +- } +- match(MOD_OP_EQ); +- break; +- } +- case NE_OP_EQ: +- { +- RefDNode tmp51_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp51_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp51_AST)); +- } +- match(NE_OP_EQ); +- break; +- } +- case OR_OP_EQ: +- { +- RefDNode tmp52_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp52_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp52_AST)); +- } +- match(OR_OP_EQ); +- break; +- } +- case PLUS_EQ: +- { +- RefDNode tmp53_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp53_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp53_AST)); +- } +- match(PLUS_EQ); +- break; +- } +- case POW_EQ: +- { +- RefDNode tmp54_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp54_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp54_AST)); +- } +- match(POW_EQ); +- break; +- } +- case SLASH_EQ: +- { +- RefDNode tmp55_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp55_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp55_AST)); +- } +- match(SLASH_EQ); +- break; +- } +- case XOR_OP_EQ: +- { +- RefDNode tmp56_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp56_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp56_AST)); ++ else { ++ bool synPredMatched88 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_5.member(LA(2))))) { ++ int _m88 = mark(); ++ synPredMatched88 = true; ++ inputState->guessing++; ++ try { ++ { ++ deref_dot_expr_keeplast(); ++ baseclass_method(); ++ } + } +- match(XOR_OP_EQ); +- break; +- } +- default: +- { +- throw antlr::NoViableAltException(LT(1), getFilename()); +- } +- } +- } +- expr(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- break; +- } +- case DEC: +- case INC: +- { +- { +- switch ( LA(1)) { +- case DEC: +- { +- RefDNode tmp57_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp57_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp57_AST)); ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched88 = false; + } +- match(DEC); +- break; ++ rewind(_m88); ++ inputState->guessing--; + } +- case INC: +- { +- RefDNode tmp58_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp58_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp58_AST)); ++ if ( synPredMatched88 ) { ++ deref_dot_expr_keeplast(); ++ if (inputState->guessing==0) { ++ d2_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } +- match(INC); +- break; +- } +- default: +- { +- throw antlr::NoViableAltException(LT(1), getFilename()); +- } +- } +- } +- break; +- } +- case MEMBER: +- { +- match(MEMBER); +- { +- if ((LA(1) == IDENTIFIER) && (LA(2) == METHOD)) { + baseclass_method(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } ++ formal_procedure_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } + if ( inputState->guessing==0 ) { +- parent=true; ++ statement_AST = RefDNode(currentAST.root); ++ ++ statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MPCALL_PARENT,"mpcall::")))->add(antlr::RefAST(statement_AST)))); ++ statement_AST->SetLine( d2_AST->getLine()); ++ ++ currentAST.root = statement_AST; ++ if ( statement_AST!=RefDNode(antlr::nullAST) && ++ statement_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = statement_AST->getFirstChild(); ++ else ++ currentAST.child = statement_AST; ++ currentAST.advanceChildToEnd(); + } +- } +- else if ((LA(1) == IDENTIFIER) && (_tokenSet_6.member(LA(2)))) { ++ statement_AST = RefDNode(currentAST.root); + } + else { +- throw antlr::NoViableAltException(LT(1), getFilename()); +- } +- +- } +- formal_procedure_call(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- if ( inputState->guessing==0 ) { +- statement_AST = RefDNode(currentAST.root); +- +- if( parent) +- statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MPCALL_PARENT,"mpcall::")))->add(antlr::RefAST(statement_AST)))); +- else +- statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MPCALL,"mpcall")))->add(antlr::RefAST(statement_AST)))); +- +- currentAST.root = statement_AST; +- if ( statement_AST!=RefDNode(antlr::nullAST) && +- statement_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = statement_AST->getFirstChild(); +- else +- currentAST.child = statement_AST; +- currentAST.advanceChildToEnd(); +- } +- break; +- } +- default: +- { +- throw antlr::NoViableAltException(LT(1), getFilename()); +- } +- } +- } +- } +- statement_AST = RefDNode(currentAST.root); +- } +- else if ((LA(1) == IDENTIFIER) && (_tokenSet_6.member(LA(2)))) { +- procedure_call(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- statement_AST = RefDNode(currentAST.root); +- } ++ bool synPredMatched91 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_6.member(LA(2))))) { ++ int _m91 = mark(); ++ synPredMatched91 = true; ++ inputState->guessing++; ++ try { ++ { ++ deref_expr(); ++ { ++ switch ( LA(1)) { ++ case EQUAL: ++ { ++ match(EQUAL); ++ break; ++ } ++ case AND_OP_EQ: ++ { ++ match(AND_OP_EQ); ++ break; ++ } ++ case ASTERIX_EQ: ++ { ++ match(ASTERIX_EQ); ++ break; ++ } ++ case EQ_OP_EQ: ++ { ++ match(EQ_OP_EQ); ++ break; ++ } ++ case GE_OP_EQ: ++ { ++ match(GE_OP_EQ); ++ break; ++ } ++ case GTMARK_EQ: ++ { ++ match(GTMARK_EQ); ++ break; ++ } ++ case GT_OP_EQ: ++ { ++ match(GT_OP_EQ); ++ break; ++ } ++ case LE_OP_EQ: ++ { ++ match(LE_OP_EQ); ++ break; ++ } ++ case LTMARK_EQ: ++ { ++ match(LTMARK_EQ); ++ break; ++ } ++ case LT_OP_EQ: ++ { ++ match(LT_OP_EQ); ++ break; ++ } ++ case MATRIX_OP1_EQ: ++ { ++ match(MATRIX_OP1_EQ); ++ break; ++ } ++ case MATRIX_OP2_EQ: ++ { ++ match(MATRIX_OP2_EQ); ++ break; ++ } ++ case MINUS_EQ: ++ { ++ match(MINUS_EQ); ++ break; ++ } ++ case MOD_OP_EQ: ++ { ++ match(MOD_OP_EQ); ++ break; ++ } ++ case NE_OP_EQ: ++ { ++ match(NE_OP_EQ); ++ break; ++ } ++ case OR_OP_EQ: ++ { ++ match(OR_OP_EQ); ++ break; ++ } ++ case PLUS_EQ: ++ { ++ match(PLUS_EQ); ++ break; ++ } ++ case POW_EQ: ++ { ++ match(POW_EQ); ++ break; ++ } ++ case SLASH_EQ: ++ { ++ match(SLASH_EQ); ++ break; ++ } ++ case XOR_OP_EQ: ++ { ++ match(XOR_OP_EQ); ++ break; ++ } ++ case DEC: ++ { ++ match(DEC); ++ break; ++ } ++ case INC: ++ { ++ match(INC); ++ break; ++ } ++ case MEMBER: ++ { ++ match(MEMBER); ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ } ++ } ++ } ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched91 = false; ++ } ++ rewind(_m91); ++ inputState->guessing--; ++ } ++ if ( synPredMatched91 ) { ++ deref_expr(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ { ++ switch ( LA(1)) { ++ case EQUAL: ++ { ++ match(EQUAL); ++ expr(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ statement_AST = RefDNode(currentAST.root); ++ statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(statement_AST)))); ++ currentAST.root = statement_AST; ++ if ( statement_AST!=RefDNode(antlr::nullAST) && ++ statement_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = statement_AST->getFirstChild(); ++ else ++ currentAST.child = statement_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ break; ++ } ++ case AND_OP_EQ: ++ case ASTERIX_EQ: ++ case EQ_OP_EQ: ++ case GE_OP_EQ: ++ case GTMARK_EQ: ++ case GT_OP_EQ: ++ case LE_OP_EQ: ++ case LTMARK_EQ: ++ case LT_OP_EQ: ++ case MATRIX_OP1_EQ: ++ case MATRIX_OP2_EQ: ++ case MINUS_EQ: ++ case MOD_OP_EQ: ++ case NE_OP_EQ: ++ case OR_OP_EQ: ++ case PLUS_EQ: ++ case POW_EQ: ++ case SLASH_EQ: ++ case XOR_OP_EQ: ++ { ++ { ++ switch ( LA(1)) { ++ case AND_OP_EQ: ++ { ++ RefDNode tmp39_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp39_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp39_AST)); ++ } ++ match(AND_OP_EQ); ++ break; ++ } ++ case ASTERIX_EQ: ++ { ++ RefDNode tmp40_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp40_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp40_AST)); ++ } ++ match(ASTERIX_EQ); ++ break; ++ } ++ case EQ_OP_EQ: ++ { ++ RefDNode tmp41_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp41_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp41_AST)); ++ } ++ match(EQ_OP_EQ); ++ break; ++ } ++ case GE_OP_EQ: ++ { ++ RefDNode tmp42_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp42_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp42_AST)); ++ } ++ match(GE_OP_EQ); ++ break; ++ } ++ case GTMARK_EQ: ++ { ++ RefDNode tmp43_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp43_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp43_AST)); ++ } ++ match(GTMARK_EQ); ++ break; ++ } ++ case GT_OP_EQ: ++ { ++ RefDNode tmp44_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp44_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp44_AST)); ++ } ++ match(GT_OP_EQ); ++ break; ++ } ++ case LE_OP_EQ: ++ { ++ RefDNode tmp45_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp45_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp45_AST)); ++ } ++ match(LE_OP_EQ); ++ break; ++ } ++ case LTMARK_EQ: ++ { ++ RefDNode tmp46_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp46_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp46_AST)); ++ } ++ match(LTMARK_EQ); ++ break; ++ } ++ case LT_OP_EQ: ++ { ++ RefDNode tmp47_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp47_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp47_AST)); ++ } ++ match(LT_OP_EQ); ++ break; ++ } ++ case MATRIX_OP1_EQ: ++ { ++ RefDNode tmp48_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp48_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp48_AST)); ++ } ++ match(MATRIX_OP1_EQ); ++ break; ++ } ++ case MATRIX_OP2_EQ: ++ { ++ RefDNode tmp49_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp49_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp49_AST)); ++ } ++ match(MATRIX_OP2_EQ); ++ break; ++ } ++ case MINUS_EQ: ++ { ++ RefDNode tmp50_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp50_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp50_AST)); ++ } ++ match(MINUS_EQ); ++ break; ++ } ++ case MOD_OP_EQ: ++ { ++ RefDNode tmp51_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp51_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp51_AST)); ++ } ++ match(MOD_OP_EQ); ++ break; ++ } ++ case NE_OP_EQ: ++ { ++ RefDNode tmp52_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp52_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp52_AST)); ++ } ++ match(NE_OP_EQ); ++ break; ++ } ++ case OR_OP_EQ: ++ { ++ RefDNode tmp53_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp53_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp53_AST)); ++ } ++ match(OR_OP_EQ); ++ break; ++ } ++ case PLUS_EQ: ++ { ++ RefDNode tmp54_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp54_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp54_AST)); ++ } ++ match(PLUS_EQ); ++ break; ++ } ++ case POW_EQ: ++ { ++ RefDNode tmp55_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp55_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp55_AST)); ++ } ++ match(POW_EQ); ++ break; ++ } ++ case SLASH_EQ: ++ { ++ RefDNode tmp56_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp56_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp56_AST)); ++ } ++ match(SLASH_EQ); ++ break; ++ } ++ case XOR_OP_EQ: ++ { ++ RefDNode tmp57_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp57_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp57_AST)); ++ } ++ match(XOR_OP_EQ); ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ } ++ expr(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ break; ++ } ++ case DEC: ++ case INC: ++ { ++ { ++ switch ( LA(1)) { ++ case DEC: ++ { ++ RefDNode tmp58_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp58_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp58_AST)); ++ } ++ match(DEC); ++ break; ++ } ++ case INC: ++ { ++ RefDNode tmp59_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp59_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp59_AST)); ++ } ++ match(INC); ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ } ++ break; ++ } ++ case MEMBER: ++ { ++ match(MEMBER); ++ { ++ if ((LA(1) == IDENTIFIER) && (LA(2) == METHOD)) { ++ baseclass_method(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ parent=true; ++ } ++ } ++ else if ((LA(1) == IDENTIFIER) && (_tokenSet_7.member(LA(2)))) { ++ } ++ else { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ ++ } ++ formal_procedure_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ statement_AST = RefDNode(currentAST.root); ++ ++ if( parent) ++ statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MPCALL_PARENT,"mpcall::")))->add(antlr::RefAST(statement_AST)))); ++ else ++ statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MPCALL,"mpcall")))->add(antlr::RefAST(statement_AST)))); ++ ++ currentAST.root = statement_AST; ++ if ( statement_AST!=RefDNode(antlr::nullAST) && ++ statement_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = statement_AST->getFirstChild(); ++ else ++ currentAST.child = statement_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ } ++ statement_AST = RefDNode(currentAST.root); ++ } ++ else if ((_tokenSet_4.member(LA(1))) && (_tokenSet_5.member(LA(2)))) { ++ deref_dot_expr_keeplast(); ++ if (inputState->guessing==0) { ++ d3_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ formal_procedure_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ statement_AST = RefDNode(currentAST.root); ++ ++ statement_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MPCALL,"mpcall")))->add(antlr::RefAST(statement_AST)))); ++ statement_AST->SetLine( d3_AST->getLine()); ++ ++ currentAST.root = statement_AST; ++ if ( statement_AST!=RefDNode(antlr::nullAST) && ++ statement_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = statement_AST->getFirstChild(); ++ else ++ currentAST.child = statement_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ statement_AST = RefDNode(currentAST.root); ++ } ++ else if ((LA(1) == IDENTIFIER) && (_tokenSet_7.member(LA(2)))) { ++ procedure_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ statement_AST = RefDNode(currentAST.root); ++ } + else { + throw antlr::NoViableAltException(LT(1), getFilename()); + } +- } ++ }}}} + returnAST = statement_AST; + } + +@@ -2309,10 +2627,10 @@ + int numBranch=0; + + +- RefDNode tmp60_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp61_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp60_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp60_AST)); ++ tmp61_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp61_AST)); + } + match(SWITCH); + expr(); +@@ -2396,7 +2714,7 @@ + } + { // ( ... )* + for (;;) { +- if ((_tokenSet_7.member(LA(1)))) { ++ if ((_tokenSet_8.member(LA(1)))) { + switch_body(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -2420,7 +2738,7 @@ + } + if ( inputState->guessing==0 ) { + +- tmp60_AST->SetNumBranch(numBranch); ++ tmp61_AST->SetNumBranch(numBranch); + + } + switch_statement_AST = RefDNode(currentAST.root); +@@ -2440,10 +2758,10 @@ + switch ( LA(1)) { + case QUESTION: + { +- RefDNode tmp62_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp63_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp62_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp62_AST)); ++ tmp63_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp63_AST)); + } + match(QUESTION); + expr(); +@@ -2548,19 +2866,20 @@ + match(COLON); + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -2620,19 +2939,20 @@ + match(COLON); + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -2702,18 +3022,18 @@ + switch ( LA(1)) { + case ENDSWITCH: + { +- RefDNode tmp69_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp70_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp69_AST = astFactory->create(LT(1)); ++ tmp70_AST = astFactory->create(LT(1)); + } + match(ENDSWITCH); + break; + } + case END: + { +- RefDNode tmp70_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp71_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp70_AST = astFactory->create(LT(1)); ++ tmp71_AST = astFactory->create(LT(1)); + } + match(END); + break; +@@ -2740,9 +3060,9 @@ + } + case ENDELSE: + { +- RefDNode tmp71_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp72_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp71_AST = astFactory->create(LT(1)); ++ tmp72_AST = astFactory->create(LT(1)); + } + match(ENDELSE); + break; +@@ -2763,10 +3083,10 @@ + int numBranch=0; + + +- RefDNode tmp72_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp73_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp72_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp72_AST)); ++ tmp73_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp73_AST)); + } + match(CASE); + expr(); +@@ -2850,7 +3170,7 @@ + } + { // ( ... )* + for (;;) { +- if ((_tokenSet_7.member(LA(1)))) { ++ if ((_tokenSet_8.member(LA(1)))) { + case_body(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -2874,7 +3194,7 @@ + } + if ( inputState->guessing==0 ) { + +- tmp72_AST->SetNumBranch(numBranch); ++ tmp73_AST->SetNumBranch(numBranch); + + } + case_statement_AST = RefDNode(currentAST.root); +@@ -2947,19 +3267,20 @@ + match(COLON); + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -3019,19 +3340,20 @@ + match(COLON); + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -3101,18 +3423,18 @@ + switch ( LA(1)) { + case ENDCASE: + { +- RefDNode tmp79_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp80_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp79_AST = astFactory->create(LT(1)); ++ tmp80_AST = astFactory->create(LT(1)); + } + match(ENDCASE); + break; + } + case END: + { +- RefDNode tmp80_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp81_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp80_AST = astFactory->create(LT(1)); ++ tmp81_AST = astFactory->create(LT(1)); + } + match(END); + break; +@@ -3139,9 +3461,9 @@ + } + case ENDELSE: + { +- RefDNode tmp81_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp82_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp81_AST = astFactory->create(LT(1)); ++ tmp82_AST = astFactory->create(LT(1)); + } + match(ENDELSE); + break; +@@ -3159,20 +3481,20 @@ + antlr::ASTPair currentAST; + RefDNode identifier_list_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp82_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp83_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp82_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp82_AST)); ++ tmp83_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp83_AST)); + } + match(IDENTIFIER); + { // ( ... )* + for (;;) { + if ((LA(1) == COMMA)) { + match(COMMA); +- RefDNode tmp84_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp85_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp84_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp84_AST)); ++ tmp85_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp85_AST)); + } + match(IDENTIFIER); + } +@@ -3192,17 +3514,17 @@ + antlr::ASTPair currentAST; + RefDNode keyword_declaration_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp85_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp86_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp85_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp85_AST)); ++ tmp86_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp86_AST)); + } + match(IDENTIFIER); + match(EQUAL); +- RefDNode tmp87_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp88_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp87_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp87_AST)); ++ tmp88_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp88_AST)); + } + match(IDENTIFIER); + if ( inputState->guessing==0 ) { +@@ -3275,9 +3597,9 @@ + antlr::RefToken ii = antlr::nullToken; + RefDNode ii_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp88_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp89_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp88_AST = astFactory->create(LT(1)); ++ tmp89_AST = astFactory->create(LT(1)); + } + match(COMPILE_OPT); + i = LT(1); +@@ -3293,9 +3615,9 @@ + { // ( ... )* + for (;;) { + if ((LA(1) == COMMA)) { +- RefDNode tmp89_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp90_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp89_AST = astFactory->create(LT(1)); ++ tmp90_AST = astFactory->create(LT(1)); + } + match(COMMA); + ii = LT(1); +@@ -3319,26 +3641,35 @@ + returnAST = compile_opt_AST; + } + +-void GDLParser::endfor_mark() { ++void GDLParser::endforeach_mark() { + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; +- RefDNode endfor_mark_AST = RefDNode(antlr::nullAST); ++ RefDNode endforeach_mark_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { ++ case ENDFOREACH: ++ { ++ RefDNode tmp91_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp91_AST = astFactory->create(LT(1)); ++ } ++ match(ENDFOREACH); ++ break; ++ } + case ENDFOR: + { +- RefDNode tmp90_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp92_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp90_AST = astFactory->create(LT(1)); ++ tmp92_AST = astFactory->create(LT(1)); + } + match(ENDFOR); + break; + } + case END: + { +- RefDNode tmp91_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp93_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp91_AST = astFactory->create(LT(1)); ++ tmp93_AST = astFactory->create(LT(1)); + } + match(END); + break; +@@ -3348,29 +3679,61 @@ + throw antlr::NoViableAltException(LT(1), getFilename()); + } + } +- returnAST = endfor_mark_AST; ++ returnAST = endforeach_mark_AST; + } + +-void GDLParser::endrep_mark() { ++void GDLParser::endfor_mark() { + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; +- RefDNode endrep_mark_AST = RefDNode(antlr::nullAST); ++ RefDNode endfor_mark_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { +- case ENDREP: ++ case ENDFOR: + { +- RefDNode tmp92_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp94_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp92_AST = astFactory->create(LT(1)); ++ tmp94_AST = astFactory->create(LT(1)); + } +- match(ENDREP); ++ match(ENDFOR); + break; + } + case END: + { +- RefDNode tmp93_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp95_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp93_AST = astFactory->create(LT(1)); ++ tmp95_AST = astFactory->create(LT(1)); ++ } ++ match(END); ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ returnAST = endfor_mark_AST; ++} ++ ++void GDLParser::endrep_mark() { ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode endrep_mark_AST = RefDNode(antlr::nullAST); ++ ++ switch ( LA(1)) { ++ case ENDREP: ++ { ++ RefDNode tmp96_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp96_AST = astFactory->create(LT(1)); ++ } ++ match(ENDREP); ++ break; ++ } ++ case END: ++ { ++ RefDNode tmp97_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp97_AST = astFactory->create(LT(1)); + } + match(END); + break; +@@ -3391,18 +3754,18 @@ + switch ( LA(1)) { + case ENDWHILE: + { +- RefDNode tmp94_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp98_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp94_AST = astFactory->create(LT(1)); ++ tmp98_AST = astFactory->create(LT(1)); + } + match(ENDWHILE); + break; + } + case END: + { +- RefDNode tmp95_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp99_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp95_AST = astFactory->create(LT(1)); ++ tmp99_AST = astFactory->create(LT(1)); + } + match(END); + break; +@@ -3423,18 +3786,18 @@ + switch ( LA(1)) { + case ENDIF: + { +- RefDNode tmp96_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp100_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp96_AST = astFactory->create(LT(1)); ++ tmp100_AST = astFactory->create(LT(1)); + } + match(ENDIF); + break; + } + case END: + { +- RefDNode tmp97_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp101_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp97_AST = astFactory->create(LT(1)); ++ tmp101_AST = astFactory->create(LT(1)); + } + match(END); + break; +@@ -3455,18 +3818,18 @@ + switch ( LA(1)) { + case ENDELSE: + { +- RefDNode tmp98_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp102_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp98_AST = astFactory->create(LT(1)); ++ tmp102_AST = astFactory->create(LT(1)); + } + match(ENDELSE); + break; + } + case END: + { +- RefDNode tmp99_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp103_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp99_AST = astFactory->create(LT(1)); ++ tmp103_AST = astFactory->create(LT(1)); + } + match(END); + break; +@@ -3485,19 +3848,20 @@ + RefDNode compound_statement_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -3550,7 +3914,7 @@ + RefDNode label_statement_AST = RefDNode(antlr::nullAST); + + { // ( ... )+ +- int _cnt76=0; ++ int _cnt77=0; + for (;;) { + if ((LA(1) == IDENTIFIER) && (LA(2) == COLON)) { + label(); +@@ -3559,29 +3923,30 @@ + } + } + else { +- if ( _cnt76>=1 ) { goto _loop76; } else {throw antlr::NoViableAltException(LT(1), getFilename());} ++ if ( _cnt77>=1 ) { goto _loop77; } else {throw antlr::NoViableAltException(LT(1), getFilename());} + } + +- _cnt76++; ++ _cnt77++; + } +- _loop76:; ++ _loop77:; + } // ( ... )+ + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case BEGIN: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -3613,16 +3978,16 @@ + antlr::ASTPair currentAST; + RefDNode label_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp101_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp105_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp101_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp101_AST)); ++ tmp105_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp105_AST)); + } + match(IDENTIFIER); +- RefDNode tmp102_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp106_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp102_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp102_AST)); ++ tmp106_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp106_AST)); + } + match(COLON); + label_AST = RefDNode(currentAST.root); +@@ -3634,10 +3999,10 @@ + antlr::ASTPair currentAST; + RefDNode baseclass_method_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp103_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp107_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp103_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp103_AST)); ++ tmp107_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp107_AST)); + } + match(IDENTIFIER); + match(METHOD); +@@ -3676,6 +4041,123 @@ + returnAST = assign_expr_AST; + } + ++void GDLParser::deref_dot_expr_keeplast() { ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode deref_dot_expr_keeplast_AST = RefDNode(antlr::nullAST); ++ RefDNode a1_AST = RefDNode(antlr::nullAST); ++ ++ RefDNode dot; ++ int nDot; ++ ++ ++ switch ( LA(1)) { ++ case IDENTIFIER: ++ case INHERITS: ++ case LBRACE: ++ case SYSVARNAME: ++ { ++ array_expr_1st(); ++ if (inputState->guessing==0) { ++ a1_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ { ++ nDot=tag_access_keeplast(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ deref_dot_expr_keeplast_AST = RefDNode(currentAST.root); ++ ++ if( --nDot > 0) ++ { ++ dot=astFactory->create(DOT,"."); ++ dot->SetNDot( nDot); ++ dot->SetLine( a1_AST->getLine()); ++ deref_dot_expr_keeplast_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(dot))->add(antlr::RefAST(deref_dot_expr_keeplast_AST)))); ++ } ++ ++ currentAST.root = deref_dot_expr_keeplast_AST; ++ if ( deref_dot_expr_keeplast_AST!=RefDNode(antlr::nullAST) && ++ deref_dot_expr_keeplast_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = deref_dot_expr_keeplast_AST->getFirstChild(); ++ else ++ currentAST.child = deref_dot_expr_keeplast_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ } ++ deref_dot_expr_keeplast_AST = RefDNode(currentAST.root); ++ break; ++ } ++ case ASTERIX: ++ { ++ match(ASTERIX); ++ deref_dot_expr_keeplast(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ deref_dot_expr_keeplast_AST = RefDNode(currentAST.root); ++ deref_dot_expr_keeplast_AST = ++ RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(DEREF,"deref")))->add(antlr::RefAST(deref_dot_expr_keeplast_AST)))); ++ currentAST.root = deref_dot_expr_keeplast_AST; ++ if ( deref_dot_expr_keeplast_AST!=RefDNode(antlr::nullAST) && ++ deref_dot_expr_keeplast_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = deref_dot_expr_keeplast_AST->getFirstChild(); ++ else ++ currentAST.child = deref_dot_expr_keeplast_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ deref_dot_expr_keeplast_AST = RefDNode(currentAST.root); ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ returnAST = deref_dot_expr_keeplast_AST; ++} ++ ++void GDLParser::formal_procedure_call() { ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode formal_procedure_call_AST = RefDNode(antlr::nullAST); ++ ++ RefDNode tmp113_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp113_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp113_AST)); ++ } ++ match(IDENTIFIER); ++ { ++ switch ( LA(1)) { ++ case COMMA: ++ { ++ match(COMMA); ++ parameter_def_list(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ break; ++ } ++ case ELSE: ++ case UNTIL: ++ case END_U: ++ { ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ } ++ formal_procedure_call_AST = RefDNode(currentAST.root); ++ returnAST = formal_procedure_call_AST; ++} ++ + void GDLParser::deref_expr() { + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; +@@ -3835,44 +4317,6 @@ + returnAST = deref_expr_AST; + } + +-void GDLParser::formal_procedure_call() { +- returnAST = RefDNode(antlr::nullAST); +- antlr::ASTPair currentAST; +- RefDNode formal_procedure_call_AST = RefDNode(antlr::nullAST); +- +- RefDNode tmp109_AST = RefDNode(antlr::nullAST); +- if ( inputState->guessing == 0 ) { +- tmp109_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp109_AST)); +- } +- match(IDENTIFIER); +- { +- switch ( LA(1)) { +- case COMMA: +- { +- match(COMMA); +- parameter_def_list(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- break; +- } +- case ELSE: +- case UNTIL: +- case END_U: +- { +- break; +- } +- default: +- { +- throw antlr::NoViableAltException(LT(1), getFilename()); +- } +- } +- } +- formal_procedure_call_AST = RefDNode(currentAST.root); +- returnAST = formal_procedure_call_AST; +-} +- + void GDLParser::procedure_call() { + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; +@@ -3888,7 +4332,7 @@ + } + match(IDENTIFIER); + { +- if (((_tokenSet_6.member(LA(1))) && (_tokenSet_1.member(LA(2))))&&(id->getText() == "RETURN")) { ++ if (((_tokenSet_7.member(LA(1))) && (_tokenSet_1.member(LA(2))))&&(id->getText() == "RETURN")) { + { + switch ( LA(1)) { + case COMMA: +@@ -3959,7 +4403,7 @@ + currentAST.advanceChildToEnd(); + } + } +- else if ((_tokenSet_6.member(LA(1))) && (_tokenSet_8.member(LA(2)))) { ++ else if ((_tokenSet_7.member(LA(1))) && (_tokenSet_9.member(LA(2)))) { + { + switch ( LA(1)) { + case COMMA: +@@ -4011,16 +4455,16 @@ + antlr::ASTPair currentAST; + RefDNode for_statement_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp113_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp118_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp113_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp113_AST)); ++ tmp118_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp118_AST)); + } + match(FOR); +- RefDNode tmp114_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp119_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp114_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp114_AST)); ++ tmp119_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp119_AST)); + } + match(IDENTIFIER); + match(EQUAL); +@@ -4063,15 +4507,46 @@ + returnAST = for_statement_AST; + } + ++void GDLParser::foreach_statement() { ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode foreach_statement_AST = RefDNode(antlr::nullAST); ++ ++ RefDNode tmp124_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp124_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp124_AST)); ++ } ++ match(FOREACH); ++ RefDNode tmp125_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp125_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp125_AST)); ++ } ++ match(IDENTIFIER); ++ match(OF); ++ expr(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ match(DO); ++ foreach_block(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ foreach_statement_AST = RefDNode(currentAST.root); ++ returnAST = foreach_statement_AST; ++} ++ + void GDLParser::repeat_statement() { + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode repeat_statement_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp119_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp128_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp119_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp119_AST)); ++ tmp128_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp128_AST)); + } + match(REPEAT); + repeat_block(); +@@ -4092,10 +4567,10 @@ + antlr::ASTPair currentAST; + RefDNode while_statement_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp121_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp130_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp121_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp121_AST)); ++ tmp130_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp130_AST)); + } + match(WHILE); + expr(); +@@ -4119,17 +4594,17 @@ + switch ( LA(1)) { + case GOTO: + { +- RefDNode tmp123_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp132_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp123_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp123_AST)); ++ tmp132_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp132_AST)); + } + match(GOTO); + match(COMMA); +- RefDNode tmp125_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp134_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp125_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp125_AST)); ++ tmp134_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp134_AST)); + } + match(IDENTIFIER); + jump_statement_AST = RefDNode(currentAST.root); +@@ -4137,17 +4612,17 @@ + } + case ON_IOERROR: + { +- RefDNode tmp126_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp135_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp126_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp126_AST)); ++ tmp135_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp135_AST)); + } + match(ON_IOERROR); + match(COMMA); +- RefDNode tmp128_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp137_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp128_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp128_AST)); ++ tmp137_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp137_AST)); + } + match(IDENTIFIER); + jump_statement_AST = RefDNode(currentAST.root); +@@ -4166,10 +4641,10 @@ + antlr::ASTPair currentAST; + RefDNode if_statement_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp129_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp138_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp129_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp129_AST)); ++ tmp138_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp138_AST)); + } + match(IF); + expr(); +@@ -4208,19 +4683,20 @@ + RefDNode stl_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -4286,19 +4762,20 @@ + RefDNode while_block_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -4353,19 +4830,101 @@ + RefDNode stl_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: ++ case IDENTIFIER: ++ case CASE: ++ case COMMON: ++ case COMPILE_OPT: ++ case FORWARD: ++ case GOTO: ++ case IF: ++ case INHERITS: ++ case ON_IOERROR: ++ case SWITCH: ++ case DEC: ++ case INC: ++ case LBRACE: ++ case SYSVARNAME: ++ case ASTERIX: ++ { ++ statement(); ++ if (inputState->guessing==0) { ++ st_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ for_block_AST = RefDNode(currentAST.root); ++ for_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(BLOCK,"block")))->add(antlr::RefAST(st_AST)))); ++ currentAST.root = for_block_AST; ++ if ( for_block_AST!=RefDNode(antlr::nullAST) && ++ for_block_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = for_block_AST->getFirstChild(); ++ else ++ currentAST.child = for_block_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ for_block_AST = RefDNode(currentAST.root); ++ break; ++ } ++ case BEGIN: ++ { ++ match(BEGIN); ++ statement_list(); ++ if (inputState->guessing==0) { ++ stl_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ endfor_mark(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ for_block_AST = RefDNode(currentAST.root); ++ for_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(BLOCK,"block")))->add(antlr::RefAST(stl_AST)))); ++ currentAST.root = for_block_AST; ++ if ( for_block_AST!=RefDNode(antlr::nullAST) && ++ for_block_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = for_block_AST->getFirstChild(); ++ else ++ currentAST.child = for_block_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ for_block_AST = RefDNode(currentAST.root); ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ returnAST = for_block_AST; ++} ++ ++void GDLParser::foreach_block() { ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode foreach_block_AST = RefDNode(antlr::nullAST); ++ RefDNode st_AST = RefDNode(antlr::nullAST); ++ RefDNode stl_AST = RefDNode(antlr::nullAST); ++ ++ switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -4378,17 +4937,17 @@ + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + if ( inputState->guessing==0 ) { +- for_block_AST = RefDNode(currentAST.root); +- for_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(BLOCK,"block")))->add(antlr::RefAST(st_AST)))); +- currentAST.root = for_block_AST; +- if ( for_block_AST!=RefDNode(antlr::nullAST) && +- for_block_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = for_block_AST->getFirstChild(); ++ foreach_block_AST = RefDNode(currentAST.root); ++ foreach_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(BLOCK,"block")))->add(antlr::RefAST(st_AST)))); ++ currentAST.root = foreach_block_AST; ++ if ( foreach_block_AST!=RefDNode(antlr::nullAST) && ++ foreach_block_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = foreach_block_AST->getFirstChild(); + else +- currentAST.child = for_block_AST; ++ currentAST.child = foreach_block_AST; + currentAST.advanceChildToEnd(); + } +- for_block_AST = RefDNode(currentAST.root); ++ foreach_block_AST = RefDNode(currentAST.root); + break; + } + case BEGIN: +@@ -4399,22 +4958,22 @@ + stl_AST = returnAST; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } +- endfor_mark(); ++ endforeach_mark(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + if ( inputState->guessing==0 ) { +- for_block_AST = RefDNode(currentAST.root); +- for_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(BLOCK,"block")))->add(antlr::RefAST(stl_AST)))); +- currentAST.root = for_block_AST; +- if ( for_block_AST!=RefDNode(antlr::nullAST) && +- for_block_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = for_block_AST->getFirstChild(); ++ foreach_block_AST = RefDNode(currentAST.root); ++ foreach_block_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(BLOCK,"block")))->add(antlr::RefAST(stl_AST)))); ++ currentAST.root = foreach_block_AST; ++ if ( foreach_block_AST!=RefDNode(antlr::nullAST) && ++ foreach_block_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = foreach_block_AST->getFirstChild(); + else +- currentAST.child = for_block_AST; ++ currentAST.child = foreach_block_AST; + currentAST.advanceChildToEnd(); + } +- for_block_AST = RefDNode(currentAST.root); ++ foreach_block_AST = RefDNode(currentAST.root); + break; + } + default: +@@ -4422,7 +4981,7 @@ + throw antlr::NoViableAltException(LT(1), getFilename()); + } + } +- returnAST = for_block_AST; ++ returnAST = foreach_block_AST; + } + + void GDLParser::if_block() { +@@ -4431,19 +4990,20 @@ + RefDNode if_block_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -4496,19 +5056,20 @@ + RefDNode else_block_AST = RefDNode(antlr::nullAST); + + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case CASE: + case COMMON: + case COMPILE_OPT: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case INHERITS: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case LBRACE: +@@ -4574,11 +5135,11 @@ + } + } + else { +- goto _loop113; ++ goto _loop122; + } + + } +- _loop113:; ++ _loop122:; + } // ( ... )* + parameter_def_list_AST = RefDNode(currentAST.root); + returnAST = parameter_def_list_AST; +@@ -4589,15 +5150,19 @@ + antlr::ASTPair currentAST; + RefDNode formal_function_call_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp138_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp148_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp138_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp138_AST)); ++ tmp148_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp148_AST)); + } + match(IDENTIFIER); + match(LBRACE); + { + switch ( LA(1)) { ++ case FOR: ++ case FOREACH: ++ case REPEAT: ++ case WHILE: + case IDENTIFIER: + case AND_OP: + case BEGIN: +@@ -4610,12 +5175,12 @@ + case ENDCASE: + case ENDELSE: + case ENDFOR: ++ case ENDFOREACH: + case ENDIF: + case ENDREP: + case ENDSWITCH: + case ENDWHILE: + case EQ_OP: +- case FOR: + case FORWARD: + case FUNCTION: + case GE_OP: +@@ -4632,11 +5197,9 @@ + case ON_IOERROR: + case OR_OP: + case PRO: +- case REPEAT: + case SWITCH: + case THEN: + case UNTIL: +- case WHILE: + case XOR_OP: + case DEC: + case INC: +@@ -4716,7 +5279,7 @@ + RefDNode parameter_def_AST = RefDNode(antlr::nullAST); + RefDNode id_AST = RefDNode(antlr::nullAST); + +- if (((LA(1) >= IDENTIFIER && LA(1) <= XOR_OP)) && (LA(2) == EQUAL)) { ++ if ((_tokenSet_10.member(LA(1))) && (LA(2) == EQUAL)) { + identifier(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -4740,7 +5303,7 @@ + } + parameter_def_AST = RefDNode(currentAST.root); + } +- else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_10.member(LA(2)))) { ++ else if ((_tokenSet_11.member(LA(1))) && (_tokenSet_12.member(LA(2)))) { + expr(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -4814,11 +5377,11 @@ + } + } + else { +- goto _loop116; ++ goto _loop125; + } + + } +- _loop116:; ++ _loop125:; + } // ( ... )* + match(RSQUARE); + if ( inputState->guessing==0 ) { +@@ -4856,10 +5419,10 @@ + switch ( LA(1)) { + case IDENTIFIER: + { +- RefDNode tmp146_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp156_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp146_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp146_AST)); ++ tmp156_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp156_AST)); + } + match(IDENTIFIER); + break; +@@ -4920,7 +5483,7 @@ + + match(LCURLY); + { +- if ((_tokenSet_11.member(LA(1))) && (LA(2) == COMMA || LA(2) == RCURLY)) { ++ if ((_tokenSet_13.member(LA(1))) && (LA(2) == COMMA || LA(2) == RCURLY)) { + struct_identifier(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -4960,7 +5523,7 @@ + currentAST.advanceChildToEnd(); + } + } +- else if ((_tokenSet_11.member(LA(1))) && (LA(2) == COLON)) { ++ else if ((_tokenSet_13.member(LA(1))) && (LA(2) == COLON)) { + tag_def_list(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -5007,11 +5570,11 @@ + } + } + else { +- goto _loop136; ++ goto _loop145; + } + + } +- _loop136:; ++ _loop145:; + } // ( ... )* + named_tag_def_list_AST = RefDNode(currentAST.root); + returnAST = named_tag_def_list_AST; +@@ -5036,11 +5599,11 @@ + } + } + else { +- goto _loop125; ++ goto _loop134; + } + + } +- _loop125:; ++ _loop134:; + } // ( ... )* + tag_def_list_AST = RefDNode(currentAST.root); + returnAST = tag_def_list_AST; +@@ -5069,14 +5632,14 @@ + antlr::ASTPair currentAST; + RefDNode ntag_def_AST = RefDNode(antlr::nullAST); + +- if ((_tokenSet_11.member(LA(1))) && (LA(2) == COLON)) { ++ if ((_tokenSet_13.member(LA(1))) && (LA(2) == COLON)) { + tag_def(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + ntag_def_AST = RefDNode(currentAST.root); + } +- else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_12.member(LA(2)))) { ++ else if ((_tokenSet_11.member(LA(1))) && (_tokenSet_14.member(LA(2)))) { + expr(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -5109,11 +5672,11 @@ + } + } + else { +- goto _loop129; ++ goto _loop138; + } + + } +- _loop129:; ++ _loop138:; + } // ( ... )* + ntag_defs_AST = RefDNode(currentAST.root); + returnAST = ntag_defs_AST; +@@ -5125,10 +5688,10 @@ + RefDNode named_tag_def_entry_AST = RefDNode(antlr::nullAST); + + { +- bool synPredMatched133 = false; +- if (((LA(1) == INHERITS) && (_tokenSet_11.member(LA(2))))) { +- int _m133 = mark(); +- synPredMatched133 = true; ++ bool synPredMatched142 = false; ++ if (((LA(1) == INHERITS) && (_tokenSet_13.member(LA(2))))) { ++ int _m142 = mark(); ++ synPredMatched142 = true; + inputState->guessing++; + try { + { +@@ -5136,16 +5699,16 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched133 = false; ++ synPredMatched142 = false; + } +- rewind(_m133); ++ rewind(_m142); + inputState->guessing--; + } +- if ( synPredMatched133 ) { +- RefDNode tmp155_AST = RefDNode(antlr::nullAST); ++ if ( synPredMatched142 ) { ++ RefDNode tmp165_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp155_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp155_AST)); ++ tmp165_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp165_AST)); + } + match(INHERITS); + struct_identifier(); +@@ -5153,7 +5716,7 @@ + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + } +- else if ((_tokenSet_13.member(LA(1))) && (_tokenSet_14.member(LA(2)))) { ++ else if ((_tokenSet_15.member(LA(1))) && (_tokenSet_16.member(LA(2)))) { + ntag_def(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -6179,11 +6742,11 @@ + } + } + else { +- goto _loop140; ++ goto _loop149; + } + + } +- _loop140:; ++ _loop149:; + } // ( ... )* + match(RSQUARE); + arrayindex_list_AST = RefDNode(currentAST.root); +@@ -6206,11 +6769,11 @@ + } + } + else { +- goto _loop142; ++ goto _loop151; + } + + } +- _loop142:; ++ _loop151:; + } // ( ... )* + match(RBRACE); + arrayindex_list_AST = RefDNode(currentAST.root); +@@ -6230,10 +6793,10 @@ + RefDNode arrayindex_AST = RefDNode(antlr::nullAST); + + { +- bool synPredMatched148 = false; ++ bool synPredMatched157 = false; + if (((LA(1) == ASTERIX) && (LA(2) == COMMA || LA(2) == RBRACE || LA(2) == RSQUARE))) { +- int _m148 = mark(); +- synPredMatched148 = true; ++ int _m157 = mark(); ++ synPredMatched157 = true; + inputState->guessing++; + try { + { +@@ -6264,18 +6827,18 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched148 = false; ++ synPredMatched157 = false; + } +- rewind(_m148); ++ rewind(_m157); + inputState->guessing--; + } +- if ( synPredMatched148 ) { ++ if ( synPredMatched157 ) { + all(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + } +- else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_15.member(LA(2)))) { ++ else if ((_tokenSet_11.member(LA(1))) && (_tokenSet_17.member(LA(2)))) { + expr(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -6286,10 +6849,10 @@ + { + match(COLON); + { +- bool synPredMatched153 = false; +- if (((LA(1) == ASTERIX) && (_tokenSet_16.member(LA(2))))) { +- int _m153 = mark(); +- synPredMatched153 = true; ++ bool synPredMatched162 = false; ++ if (((LA(1) == ASTERIX) && (_tokenSet_18.member(LA(2))))) { ++ int _m162 = mark(); ++ synPredMatched162 = true; + inputState->guessing++; + try { + { +@@ -6325,18 +6888,18 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched153 = false; ++ synPredMatched162 = false; + } +- rewind(_m153); ++ rewind(_m162); + inputState->guessing--; + } +- if ( synPredMatched153 ) { ++ if ( synPredMatched162 ) { + all(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + } +- else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_15.member(LA(2)))) { ++ else if ((_tokenSet_11.member(LA(1))) && (_tokenSet_17.member(LA(2)))) { + expr(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -6353,10 +6916,10 @@ + { + match(COLON); + { +- bool synPredMatched158 = false; ++ bool synPredMatched167 = false; + if (((LA(1) == ASTERIX) && (LA(2) == COMMA || LA(2) == RBRACE || LA(2) == RSQUARE))) { +- int _m158 = mark(); +- synPredMatched158 = true; ++ int _m167 = mark(); ++ synPredMatched167 = true; + inputState->guessing++; + try { + { +@@ -6387,12 +6950,12 @@ + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched158 = false; ++ synPredMatched167 = false; + } +- rewind(_m158); ++ rewind(_m167); + inputState->guessing--; + } +- if ( synPredMatched158 ) { ++ if ( synPredMatched167 ) { + match(ASTERIX); + if ( inputState->guessing==0 ) { + +@@ -6401,7 +6964,7 @@ + + } + } +- else if ((_tokenSet_9.member(LA(1))) && (_tokenSet_17.member(LA(2)))) { ++ else if ((_tokenSet_11.member(LA(1))) && (_tokenSet_19.member(LA(2)))) { + expr(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -6466,9 +7029,9 @@ + antlr::ASTPair currentAST; + RefDNode all_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp165_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp175_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp165_AST = astFactory->create(LT(1)); ++ tmp175_AST = astFactory->create(LT(1)); + } + match(ASTERIX); + if ( inputState->guessing==0 ) { +@@ -6490,10 +7053,10 @@ + antlr::ASTPair currentAST; + RefDNode sysvar_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp166_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp176_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp166_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp166_AST)); ++ tmp176_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp176_AST)); + } + match(SYSVARNAME); + if ( inputState->guessing==0 ) { +@@ -6768,10 +7331,10 @@ + switch ( LA(1)) { + case IDENTIFIER: + { +- RefDNode tmp169_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp179_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp169_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp169_AST)); ++ tmp179_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp179_AST)); + } + match(IDENTIFIER); + array_expr_nth_sub_AST = RefDNode(currentAST.root); +@@ -6864,10 +7427,10 @@ + switch ( LA(1)) { + case IDENTIFIER: + { +- RefDNode tmp170_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp180_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp170_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp170_AST)); ++ tmp180_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp180_AST)); + } + match(IDENTIFIER); + tag_array_expr_nth_sub_AST = RefDNode(currentAST.root); +@@ -7033,6 +7596,63 @@ + returnAST = tag_array_expr_nth_AST; + } + ++int GDLParser::tag_access_keeplast() { ++ int nDot; ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode tag_access_keeplast_AST = RefDNode(antlr::nullAST); ++ ++ int t; ++ bool parent = false; ++ nDot=1; ++ ++ ++ match(DOT); ++ { ++ bool synPredMatched184 = false; ++ if (((_tokenSet_20.member(LA(1))) && (_tokenSet_5.member(LA(2))))) { ++ int _m184 = mark(); ++ synPredMatched184 = true; ++ inputState->guessing++; ++ try { ++ { ++ tag_array_expr_nth(); ++ tag_access_keeplast(); ++ } ++ } ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched184 = false; ++ } ++ rewind(_m184); ++ inputState->guessing--; ++ } ++ if ( synPredMatched184 ) { ++ { ++ tag_array_expr_nth(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ t=tag_access_keeplast(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ nDot += t; ++ } ++ } ++ } ++ else if ((LA(1) == IDENTIFIER) && (_tokenSet_21.member(LA(2)))) { ++ } ++ else { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ ++ } ++ tag_access_keeplast_AST = RefDNode(currentAST.root); ++ returnAST = tag_access_keeplast_AST; ++ return nDot; ++} ++ + SizeT GDLParser::tag_access() { + SizeT nDot; + returnAST = RefDNode(antlr::nullAST); +@@ -7043,12 +7663,12 @@ + + + { // ( ... )+ +- int _cnt174=0; ++ int _cnt190=0; + for (;;) { + if ((LA(1) == DOT)) { + match(DOT); + if ( inputState->guessing==0 ) { +- nDot++; ++ ++nDot; + } + tag_array_expr_nth(); + if (inputState->guessing==0) { +@@ -7056,113 +7676,86 @@ + } + } + else { +- if ( _cnt174>=1 ) { goto _loop174; } else {throw antlr::NoViableAltException(LT(1), getFilename());} ++ if ( _cnt190>=1 ) { goto _loop190; } else {throw antlr::NoViableAltException(LT(1), getFilename());} + } + +- _cnt174++; ++ _cnt190++; + } +- _loop174:; ++ _loop190:; + } // ( ... )+ + tag_access_AST = RefDNode(currentAST.root); + returnAST = tag_access_AST; + return nDot; + } + +-void GDLParser::array_expr_fn() { ++void GDLParser::deref_dot_expr() { + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; +- RefDNode array_expr_fn_AST = RefDNode(antlr::nullAST); +- RefDNode v_AST = RefDNode(antlr::nullAST); +- RefDNode al_AST = RefDNode(antlr::nullAST); ++ RefDNode deref_dot_expr_AST = RefDNode(antlr::nullAST); ++ RefDNode a1_AST = RefDNode(antlr::nullAST); + +- RefDNode dot, t; ++ RefDNode dot; + SizeT nDot; + + +- var(); +- if (inputState->guessing==0) { +- v_AST = returnAST; +- } +- arrayindex_list(); +- if (inputState->guessing==0) { +- al_AST = returnAST; +- } +- { + switch ( LA(1)) { +- case DOT: ++ case IDENTIFIER: ++ case INHERITS: ++ case LBRACE: ++ case SYSVARNAME: + { ++ array_expr_1st(); ++ if (inputState->guessing==0) { ++ a1_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ { + nDot=tag_access(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } + if ( inputState->guessing==0 ) { +- array_expr_fn_AST = RefDNode(currentAST.root); +- // -> do so +- t= RefDNode(returnAST); ++ deref_dot_expr_AST = RefDNode(currentAST.root); ++ + + dot=astFactory->create(DOT,"."); + dot->SetNDot( nDot); +- dot->SetLine( al_AST->getLine()); ++ dot->SetLine( a1_AST->getLine()); + +- array_expr_fn_AST = +- RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(dot))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ARRAYEXPR,"arrayexpr")))->add(antlr::RefAST(v_AST))->add(antlr::RefAST(al_AST))))))->add(antlr::RefAST(t)))); +- currentAST.root = array_expr_fn_AST; +- if ( array_expr_fn_AST!=RefDNode(antlr::nullAST) && +- array_expr_fn_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = array_expr_fn_AST->getFirstChild(); ++ deref_dot_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(dot))->add(antlr::RefAST(deref_dot_expr_AST)))); ++ ++ currentAST.root = deref_dot_expr_AST; ++ if ( deref_dot_expr_AST!=RefDNode(antlr::nullAST) && ++ deref_dot_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = deref_dot_expr_AST->getFirstChild(); + else +- currentAST.child = array_expr_fn_AST; ++ currentAST.child = deref_dot_expr_AST; + currentAST.advanceChildToEnd(); + } ++ } ++ deref_dot_expr_AST = RefDNode(currentAST.root); + break; + } +- case antlr::Token::EOF_TYPE: +- case AND_OP: +- case DO: +- case ELSE: +- case EQ_OP: +- case GE_OP: +- case GT_OP: +- case LE_OP: +- case LT_OP: +- case MOD_OP: +- case NE_OP: +- case OF: +- case OR_OP: +- case THEN: +- case UNTIL: +- case XOR_OP: +- case COMMA: +- case COLON: +- case END_U: +- case DEC: +- case INC: +- case MEMBER: +- case RBRACE: +- case SLASH: +- case RSQUARE: +- case RCURLY: + case ASTERIX: +- case POW: +- case MATRIX_OP1: +- case MATRIX_OP2: +- case PLUS: +- case MINUS: +- case LTMARK: +- case GTMARK: +- case LOG_AND: +- case LOG_OR: +- case QUESTION: + { ++ match(ASTERIX); ++ deref_dot_expr(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } + if ( inputState->guessing==0 ) { +- array_expr_fn_AST = RefDNode(currentAST.root); +- array_expr_fn_AST = +- RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ARRAYEXPR_FN,"arrayexpr_fn")))->add(antlr::RefAST(v_AST))->add(antlr::RefAST(al_AST)))); +- currentAST.root = array_expr_fn_AST; +- if ( array_expr_fn_AST!=RefDNode(antlr::nullAST) && +- array_expr_fn_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = array_expr_fn_AST->getFirstChild(); ++ deref_dot_expr_AST = RefDNode(currentAST.root); ++ deref_dot_expr_AST = ++ RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(DEREF,"deref")))->add(antlr::RefAST(deref_dot_expr_AST)))); ++ currentAST.root = deref_dot_expr_AST; ++ if ( deref_dot_expr_AST!=RefDNode(antlr::nullAST) && ++ deref_dot_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = deref_dot_expr_AST->getFirstChild(); + else +- currentAST.child = array_expr_fn_AST; ++ currentAST.child = deref_dot_expr_AST; + currentAST.advanceChildToEnd(); + } ++ deref_dot_expr_AST = RefDNode(currentAST.root); + break; + } + default: +@@ -7170,8 +7763,7 @@ + throw antlr::NoViableAltException(LT(1), getFilename()); + } + } +- } +- returnAST = array_expr_fn_AST; ++ returnAST = deref_dot_expr_AST; + } + + bool GDLParser::member_function_call() { +@@ -7186,10 +7778,10 @@ + match(MEMBER); + { + if ((LA(1) == IDENTIFIER) && (LA(2) == METHOD)) { +- RefDNode tmp173_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp185_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp173_AST = astFactory->create(LT(1)); +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp173_AST)); ++ tmp185_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp185_AST)); + } + match(IDENTIFIER); + match(METHOD); +@@ -7213,10 +7805,36 @@ + return parent; + } + ++void GDLParser::member_function_call_dot() { ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode member_function_call_dot_AST = RefDNode(antlr::nullAST); ++ ++ match(DOT); ++ { ++ RefDNode tmp188_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp188_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp188_AST)); ++ } ++ match(IDENTIFIER); ++ match(METHOD); ++ } ++ formal_function_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ member_function_call_dot_AST = RefDNode(currentAST.root); ++ returnAST = member_function_call_dot_AST; ++} ++ + void GDLParser::primary_expr() { + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode primary_expr_AST = RefDNode(antlr::nullAST); ++ RefDNode d1_AST = RefDNode(antlr::nullAST); ++ RefDNode d2_AST = RefDNode(antlr::nullAST); ++ RefDNode d3_AST = RefDNode(antlr::nullAST); + antlr::RefToken sl = antlr::nullToken; + RefDNode sl_AST = RefDNode(antlr::nullAST); + +@@ -7288,196 +7906,131 @@ + { + numeric_constant(); + if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- primary_expr_AST = RefDNode(currentAST.root); +- break; +- } +- case LSQUARE: +- { +- array_def(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- primary_expr_AST = RefDNode(currentAST.root); +- break; +- } +- case LCURLY: +- { +- struct_def(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- primary_expr_AST = RefDNode(currentAST.root); +- break; +- } +- default: +- bool synPredMatched186 = false; +- if (((LA(1) == IDENTIFIER || LA(1) == INHERITS) && (LA(2) == LBRACE || LA(2) == LSQUARE))) { +- int _m186 = mark(); +- synPredMatched186 = true; +- inputState->guessing++; +- try { +- { +- match(IDENTIFIER); +- match(LBRACE); +- expr(); +- { // ( ... )* +- for (;;) { +- if ((LA(1) == COMMA)) { +- match(COMMA); +- expr(); +- } +- else { +- goto _loop185; +- } +- +- } +- _loop185:; +- } // ( ... )* +- match(RBRACE); +- } +- } +- catch (antlr::RecognitionException& pe) { +- synPredMatched186 = false; +- } +- rewind(_m186); +- inputState->guessing--; +- } +- if ( synPredMatched186 ) { +- { +- if (((LA(1) == IDENTIFIER) && (LA(2) == LBRACE))&&( IsFun(LT(1)))) { +- formal_function_call(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- if ( inputState->guessing==0 ) { +- primary_expr_AST = RefDNode(currentAST.root); +- primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(FCALL,"fcall")))->add(antlr::RefAST(primary_expr_AST)))); +- currentAST.root = primary_expr_AST; +- if ( primary_expr_AST!=RefDNode(antlr::nullAST) && +- primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = primary_expr_AST->getFirstChild(); +- else +- currentAST.child = primary_expr_AST; +- currentAST.advanceChildToEnd(); +- } +- } +- else if ((LA(1) == IDENTIFIER || LA(1) == INHERITS) && (LA(2) == LBRACE || LA(2) == LSQUARE)) { +- array_expr_fn(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- { +- switch ( LA(1)) { +- case MEMBER: +- { +- parent=member_function_call(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- if ( inputState->guessing==0 ) { +- primary_expr_AST = RefDNode(currentAST.root); +- +- if( parent) +- { +- primary_expr_AST = +- RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL_PARENT,"mfcall::")))->add(antlr::RefAST(primary_expr_AST)))); +- } +- else +- { +- primary_expr_AST = +- RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL,"mfcall")))->add(antlr::RefAST(primary_expr_AST)))); +- } +- +- currentAST.root = primary_expr_AST; +- if ( primary_expr_AST!=RefDNode(antlr::nullAST) && +- primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = primary_expr_AST->getFirstChild(); +- else +- currentAST.child = primary_expr_AST; +- currentAST.advanceChildToEnd(); +- } +- break; +- } +- case antlr::Token::EOF_TYPE: +- case AND_OP: +- case DO: +- case ELSE: +- case EQ_OP: +- case GE_OP: +- case GT_OP: +- case LE_OP: +- case LT_OP: +- case MOD_OP: +- case NE_OP: +- case OF: +- case OR_OP: +- case THEN: +- case UNTIL: +- case XOR_OP: +- case COMMA: +- case COLON: +- case END_U: +- case DEC: +- case INC: +- case RBRACE: +- case SLASH: +- case RSQUARE: +- case RCURLY: +- case ASTERIX: +- case POW: +- case MATRIX_OP1: +- case MATRIX_OP2: +- case PLUS: +- case MINUS: +- case LTMARK: +- case GTMARK: +- case LOG_AND: +- case LOG_OR: +- case QUESTION: +- { +- break; +- } +- default: ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ break; ++ } ++ case LSQUARE: ++ { ++ array_def(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ break; ++ } ++ case LCURLY: ++ { ++ struct_def(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ break; ++ } ++ default: ++ bool synPredMatched204 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_5.member(LA(2))))) { ++ int _m204 = mark(); ++ synPredMatched204 = true; ++ inputState->guessing++; ++ try { + { +- throw antlr::NoViableAltException(LT(1), getFilename()); +- } +- } ++ deref_dot_expr_keeplast(); ++ baseclass_method(); + } + } +- else { +- throw antlr::NoViableAltException(LT(1), getFilename()); ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched204 = false; + } +- ++ rewind(_m204); ++ inputState->guessing--; ++ } ++ if ( synPredMatched204 ) { ++ deref_dot_expr_keeplast(); ++ if (inputState->guessing==0) { ++ d1_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ baseclass_method(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ formal_function_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ primary_expr_AST = RefDNode(currentAST.root); ++ ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL_PARENT,"mfcall::")))->add(antlr::RefAST(primary_expr_AST)))); ++ ++ currentAST.root = primary_expr_AST; ++ if ( primary_expr_AST!=RefDNode(antlr::nullAST) && ++ primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = primary_expr_AST->getFirstChild(); ++ else ++ currentAST.child = primary_expr_AST; ++ currentAST.advanceChildToEnd(); + } + primary_expr_AST = RefDNode(currentAST.root); + } + else { +- bool synPredMatched190 = false; +- if (((LA(1) == IDENTIFIER) && (LA(2) == LBRACE))) { +- int _m190 = mark(); +- synPredMatched190 = true; ++ bool synPredMatched209 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_5.member(LA(2))))) { ++ int _m209 = mark(); ++ synPredMatched209 = true; + inputState->guessing++; + try { + { +- formal_function_call(); ++ deref_dot_expr_keeplast(); ++ { ++ match(IDENTIFIER); ++ match(LBRACE); ++ expr(); ++ { // ( ... )* ++ for (;;) { ++ if ((LA(1) == COMMA)) { ++ match(COMMA); ++ expr(); ++ } ++ else { ++ goto _loop208; ++ } ++ ++ } ++ _loop208:; ++ } // ( ... )* ++ match(RBRACE); ++ } + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched190 = false; ++ synPredMatched209 = false; + } +- rewind(_m190); ++ rewind(_m209); + inputState->guessing--; + } +- if ( synPredMatched190 ) { +- formal_function_call(); ++ if ( synPredMatched209 ) { ++ deref_dot_expr_keeplast(); ++ if (inputState->guessing==0) { ++ d2_AST = returnAST; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ RefDNode tmp190_AST = RefDNode(antlr::nullAST); ++ if ( inputState->guessing == 0 ) { ++ tmp190_AST = astFactory->create(LT(1)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp190_AST)); ++ } ++ match(IDENTIFIER); ++ arrayindex_list(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + if ( inputState->guessing==0 ) { + primary_expr_AST = RefDNode(currentAST.root); +- primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(FCALL,"fcall")))->add(antlr::RefAST(primary_expr_AST)))); ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(ARRAYEXPR_MFCALL,"arrayexpr_mfcall")))->add(antlr::RefAST(primary_expr_AST)))); + currentAST.root = primary_expr_AST; + if ( primary_expr_AST!=RefDNode(antlr::nullAST) && + primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +@@ -7489,115 +8042,375 @@ + primary_expr_AST = RefDNode(currentAST.root); + } + else { +- bool synPredMatched192 = false; +- if (((_tokenSet_4.member(LA(1))) && (_tokenSet_18.member(LA(2))))) { +- int _m192 = mark(); +- synPredMatched192 = true; ++ bool synPredMatched211 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_5.member(LA(2))))) { ++ int _m211 = mark(); ++ synPredMatched211 = true; + inputState->guessing++; + try { + { +- deref_expr(); ++ deref_dot_expr_keeplast(); ++ formal_function_call(); + } + } + catch (antlr::RecognitionException& pe) { +- synPredMatched192 = false; ++ synPredMatched211 = false; + } +- rewind(_m192); ++ rewind(_m211); + inputState->guessing--; + } +- if ( synPredMatched192 ) { +- deref_expr(); ++ if ( synPredMatched211 ) { ++ deref_dot_expr_keeplast(); + if (inputState->guessing==0) { ++ d3_AST = returnAST; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } +- { +- switch ( LA(1)) { +- case MEMBER: +- { +- parent=member_function_call(); ++ formal_function_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ primary_expr_AST = RefDNode(currentAST.root); ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL,"mfcall")))->add(antlr::RefAST(primary_expr_AST)))); ++ currentAST.root = primary_expr_AST; ++ if ( primary_expr_AST!=RefDNode(antlr::nullAST) && ++ primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = primary_expr_AST->getFirstChild(); ++ else ++ currentAST.child = primary_expr_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ } ++ else { ++ bool synPredMatched213 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_22.member(LA(2))))) { ++ int _m213 = mark(); ++ synPredMatched213 = true; ++ inputState->guessing++; ++ try { ++ { ++ deref_dot_expr(); ++ } ++ } ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched213 = false; ++ } ++ rewind(_m213); ++ inputState->guessing--; ++ } ++ if ( synPredMatched213 ) { ++ deref_expr(); + if (inputState->guessing==0) { + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } +- if ( inputState->guessing==0 ) { +- primary_expr_AST = RefDNode(currentAST.root); +- +- if( parent) +- { +- primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL_PARENT,"mfcall::")))->add(antlr::RefAST(primary_expr_AST)))); ++ { ++ switch ( LA(1)) { ++ case MEMBER: ++ { ++ parent=member_function_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } +- else ++ if ( inputState->guessing==0 ) { ++ primary_expr_AST = RefDNode(currentAST.root); ++ ++ if( parent) ++ { ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL_PARENT,"mfcall::")))->add(antlr::RefAST(primary_expr_AST)))); ++ } ++ else ++ { ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL,"mfcall")))->add(antlr::RefAST(primary_expr_AST)))); ++ } ++ ++ currentAST.root = primary_expr_AST; ++ if ( primary_expr_AST!=RefDNode(antlr::nullAST) && ++ primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = primary_expr_AST->getFirstChild(); ++ else ++ currentAST.child = primary_expr_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ break; ++ } ++ case antlr::Token::EOF_TYPE: ++ case AND_OP: ++ case DO: ++ case ELSE: ++ case EQ_OP: ++ case GE_OP: ++ case GT_OP: ++ case LE_OP: ++ case LT_OP: ++ case MOD_OP: ++ case NE_OP: ++ case OF: ++ case OR_OP: ++ case THEN: ++ case UNTIL: ++ case XOR_OP: ++ case COMMA: ++ case COLON: ++ case END_U: ++ case DEC: ++ case INC: ++ case RBRACE: ++ case SLASH: ++ case RSQUARE: ++ case RCURLY: ++ case ASTERIX: ++ case POW: ++ case MATRIX_OP1: ++ case MATRIX_OP2: ++ case PLUS: ++ case MINUS: ++ case LTMARK: ++ case GTMARK: ++ case LOG_AND: ++ case LOG_OR: ++ case QUESTION: ++ { ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ } ++ else { ++ bool synPredMatched218 = false; ++ if (((LA(1) == IDENTIFIER || LA(1) == INHERITS) && (LA(2) == LBRACE || LA(2) == LSQUARE))) { ++ int _m218 = mark(); ++ synPredMatched218 = true; ++ inputState->guessing++; ++ try { ++ { ++ match(IDENTIFIER); ++ match(LBRACE); ++ expr(); ++ { // ( ... )* ++ for (;;) { ++ if ((LA(1) == COMMA)) { ++ match(COMMA); ++ expr(); ++ } ++ else { ++ goto _loop217; ++ } ++ ++ } ++ _loop217:; ++ } // ( ... )* ++ match(RBRACE); ++ } ++ } ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched218 = false; ++ } ++ rewind(_m218); ++ inputState->guessing--; ++ } ++ if ( synPredMatched218 ) { + { +- primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL,"mfcall")))->add(antlr::RefAST(primary_expr_AST)))); ++ if (((LA(1) == IDENTIFIER) && (LA(2) == LBRACE))&&( IsFun(LT(1)))) { ++ formal_function_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ primary_expr_AST = RefDNode(currentAST.root); ++ ++ // if( StrUpCase(#i->getText) == "N_ELEMENTS") ++ // #primary_expr = #([FCALL_LIB_N_ELEMENTS, "fcall_n_elements"], #primary_expr); ++ // else ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(FCALL,"fcall")))->add(antlr::RefAST(primary_expr_AST)))); ++ ++ currentAST.root = primary_expr_AST; ++ if ( primary_expr_AST!=RefDNode(antlr::nullAST) && ++ primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = primary_expr_AST->getFirstChild(); ++ else ++ currentAST.child = primary_expr_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ } ++ else if ((LA(1) == IDENTIFIER || LA(1) == INHERITS) && (LA(2) == LBRACE || LA(2) == LSQUARE)) { ++ var(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ arrayindex_list(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ primary_expr_AST = RefDNode(currentAST.root); ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(ARRAYEXPR_FN,"arrayexpr_fn")))->add(antlr::RefAST(primary_expr_AST)))); ++ currentAST.root = primary_expr_AST; ++ if ( primary_expr_AST!=RefDNode(antlr::nullAST) && ++ primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = primary_expr_AST->getFirstChild(); ++ else ++ currentAST.child = primary_expr_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ } ++ else { ++ throw antlr::NoViableAltException(LT(1), getFilename()); + } + +- currentAST.root = primary_expr_AST; +- if ( primary_expr_AST!=RefDNode(antlr::nullAST) && +- primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = primary_expr_AST->getFirstChild(); +- else +- currentAST.child = primary_expr_AST; +- currentAST.advanceChildToEnd(); ++ } ++ primary_expr_AST = RefDNode(currentAST.root); + } +- break; +- } +- case antlr::Token::EOF_TYPE: +- case AND_OP: +- case DO: +- case ELSE: +- case EQ_OP: +- case GE_OP: +- case GT_OP: +- case LE_OP: +- case LT_OP: +- case MOD_OP: +- case NE_OP: +- case OF: +- case OR_OP: +- case THEN: +- case UNTIL: +- case XOR_OP: +- case COMMA: +- case COLON: +- case END_U: +- case DEC: +- case INC: +- case RBRACE: +- case SLASH: +- case RSQUARE: +- case RCURLY: +- case ASTERIX: +- case POW: +- case MATRIX_OP1: +- case MATRIX_OP2: +- case PLUS: +- case MINUS: +- case LTMARK: +- case GTMARK: +- case LOG_AND: +- case LOG_OR: +- case QUESTION: +- { +- break; +- } +- default: +- { +- throw antlr::NoViableAltException(LT(1), getFilename()); +- } +- } +- } +- primary_expr_AST = RefDNode(currentAST.root); +- } +- else if ((LA(1) == LBRACE) && (_tokenSet_4.member(LA(2)))) { +- assign_expr(); +- if (inputState->guessing==0) { +- astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- } +- primary_expr_AST = RefDNode(currentAST.root); +- } ++ else { ++ bool synPredMatched221 = false; ++ if (((LA(1) == IDENTIFIER) && (LA(2) == LBRACE))) { ++ int _m221 = mark(); ++ synPredMatched221 = true; ++ inputState->guessing++; ++ try { ++ { ++ formal_function_call(); ++ } ++ } ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched221 = false; ++ } ++ rewind(_m221); ++ inputState->guessing--; ++ } ++ if ( synPredMatched221 ) { ++ formal_function_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ primary_expr_AST = RefDNode(currentAST.root); ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(FCALL,"fcall")))->add(antlr::RefAST(primary_expr_AST)))); ++ currentAST.root = primary_expr_AST; ++ if ( primary_expr_AST!=RefDNode(antlr::nullAST) && ++ primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = primary_expr_AST->getFirstChild(); ++ else ++ currentAST.child = primary_expr_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ } ++ else { ++ bool synPredMatched223 = false; ++ if (((_tokenSet_4.member(LA(1))) && (_tokenSet_22.member(LA(2))))) { ++ int _m223 = mark(); ++ synPredMatched223 = true; ++ inputState->guessing++; ++ try { ++ { ++ deref_expr(); ++ } ++ } ++ catch (antlr::RecognitionException& pe) { ++ synPredMatched223 = false; ++ } ++ rewind(_m223); ++ inputState->guessing--; ++ } ++ if ( synPredMatched223 ) { ++ deref_expr(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ { ++ switch ( LA(1)) { ++ case MEMBER: ++ { ++ parent=member_function_call(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ if ( inputState->guessing==0 ) { ++ primary_expr_AST = RefDNode(currentAST.root); ++ ++ if( parent) ++ { ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL_PARENT,"mfcall::")))->add(antlr::RefAST(primary_expr_AST)))); ++ } ++ else ++ { ++ primary_expr_AST = RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(MFCALL,"mfcall")))->add(antlr::RefAST(primary_expr_AST)))); ++ } ++ ++ currentAST.root = primary_expr_AST; ++ if ( primary_expr_AST!=RefDNode(antlr::nullAST) && ++ primary_expr_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = primary_expr_AST->getFirstChild(); ++ else ++ currentAST.child = primary_expr_AST; ++ currentAST.advanceChildToEnd(); ++ } ++ break; ++ } ++ case antlr::Token::EOF_TYPE: ++ case AND_OP: ++ case DO: ++ case ELSE: ++ case EQ_OP: ++ case GE_OP: ++ case GT_OP: ++ case LE_OP: ++ case LT_OP: ++ case MOD_OP: ++ case NE_OP: ++ case OF: ++ case OR_OP: ++ case THEN: ++ case UNTIL: ++ case XOR_OP: ++ case COMMA: ++ case COLON: ++ case END_U: ++ case DEC: ++ case INC: ++ case RBRACE: ++ case SLASH: ++ case RSQUARE: ++ case RCURLY: ++ case ASTERIX: ++ case POW: ++ case MATRIX_OP1: ++ case MATRIX_OP2: ++ case PLUS: ++ case MINUS: ++ case LTMARK: ++ case GTMARK: ++ case LOG_AND: ++ case LOG_OR: ++ case QUESTION: ++ { ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(LT(1), getFilename()); ++ } ++ } ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ } ++ else if ((LA(1) == LBRACE) && (_tokenSet_4.member(LA(2)))) { ++ assign_expr(); ++ if (inputState->guessing==0) { ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ } ++ primary_expr_AST = RefDNode(currentAST.root); ++ } + else { + throw antlr::NoViableAltException(LT(1), getFilename()); + } +- }}} ++ }}}}}}} + returnAST = primary_expr_AST; + } + +@@ -7738,10 +8551,10 @@ + } + case INC: + { +- RefDNode tmp175_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp191_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp175_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp175_AST)); ++ tmp191_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp191_AST)); + } + match(INC); + primary_expr(); +@@ -7753,10 +8566,10 @@ + } + case DEC: + { +- RefDNode tmp176_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp192_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp176_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp176_AST)); ++ tmp192_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp192_AST)); + } + match(DEC); + primary_expr(); +@@ -7786,10 +8599,10 @@ + { // ( ... )* + for (;;) { + if ((LA(1) == POW)) { +- RefDNode tmp177_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp193_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp177_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp177_AST)); ++ tmp193_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp193_AST)); + } + match(POW); + decinc_expr(); +@@ -7798,11 +8611,11 @@ + } + } + else { +- goto _loop198; ++ goto _loop229; + } + + } +- _loop198:; ++ _loop229:; + } // ( ... )* + exponential_expr_AST = RefDNode(currentAST.root); + returnAST = exponential_expr_AST; +@@ -7819,55 +8632,55 @@ + } + { // ( ... )* + for (;;) { +- if ((_tokenSet_19.member(LA(1)))) { ++ if ((_tokenSet_23.member(LA(1)))) { + { + switch ( LA(1)) { + case ASTERIX: + { +- RefDNode tmp178_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp194_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp178_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp178_AST)); ++ tmp194_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp194_AST)); + } + match(ASTERIX); + break; + } + case MATRIX_OP1: + { +- RefDNode tmp179_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp195_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp179_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp179_AST)); ++ tmp195_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp195_AST)); + } + match(MATRIX_OP1); + break; + } + case MATRIX_OP2: + { +- RefDNode tmp180_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp196_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp180_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp180_AST)); ++ tmp196_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp196_AST)); + } + match(MATRIX_OP2); + break; + } + case SLASH: + { +- RefDNode tmp181_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp197_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp181_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp181_AST)); ++ tmp197_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp197_AST)); + } + match(SLASH); + break; + } + case MOD_OP: + { +- RefDNode tmp182_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp198_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp182_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp182_AST)); ++ tmp198_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp198_AST)); + } + match(MOD_OP); + break; +@@ -7884,11 +8697,11 @@ + } + } + else { +- goto _loop202; ++ goto _loop233; + } + + } +- _loop202:; ++ _loop233:; + } // ( ... )* + multiplicative_expr_AST = RefDNode(currentAST.root); + returnAST = multiplicative_expr_AST; +@@ -8083,40 +8896,40 @@ + switch ( LA(1)) { + case PLUS: + { +- RefDNode tmp184_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp200_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp184_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp184_AST)); ++ tmp200_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp200_AST)); + } + match(PLUS); + break; + } + case MINUS: + { +- RefDNode tmp185_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp201_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp185_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp185_AST)); ++ tmp201_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp201_AST)); + } + match(MINUS); + break; + } + case LTMARK: + { +- RefDNode tmp186_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp202_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp186_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp186_AST)); ++ tmp202_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp202_AST)); + } + match(LTMARK); + break; + } + case GTMARK: + { +- RefDNode tmp187_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp203_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp187_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp187_AST)); ++ tmp203_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp203_AST)); + } + match(GTMARK); + break; +@@ -8201,11 +9014,11 @@ + } + } + else { +- goto _loop209; ++ goto _loop240; + } + + } +- _loop209:; ++ _loop240:; + } // ( ... )* + additive_expr_AST = RefDNode(currentAST.root); + returnAST = additive_expr_AST; +@@ -8219,10 +9032,10 @@ + switch ( LA(1)) { + case NOT_OP: + { +- RefDNode tmp188_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp204_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp188_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp188_AST)); ++ tmp204_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp204_AST)); + } + match(NOT_OP); + multiplicative_expr(); +@@ -8234,10 +9047,10 @@ + } + case LOG_NEG: + { +- RefDNode tmp189_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp205_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp189_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp189_AST)); ++ tmp205_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp205_AST)); + } + match(LOG_NEG); + multiplicative_expr(); +@@ -8266,65 +9079,65 @@ + } + { // ( ... )* + for (;;) { +- if ((_tokenSet_20.member(LA(1)))) { ++ if ((_tokenSet_24.member(LA(1)))) { + { + switch ( LA(1)) { + case EQ_OP: + { +- RefDNode tmp190_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp206_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp190_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp190_AST)); ++ tmp206_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp206_AST)); + } + match(EQ_OP); + break; + } + case NE_OP: + { +- RefDNode tmp191_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp207_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp191_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp191_AST)); ++ tmp207_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp207_AST)); + } + match(NE_OP); + break; + } + case LE_OP: + { +- RefDNode tmp192_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp208_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp192_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp192_AST)); ++ tmp208_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp208_AST)); + } + match(LE_OP); + break; + } + case LT_OP: + { +- RefDNode tmp193_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp209_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp193_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp193_AST)); ++ tmp209_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp209_AST)); + } + match(LT_OP); + break; + } + case GE_OP: + { +- RefDNode tmp194_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp210_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp194_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp194_AST)); ++ tmp210_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp210_AST)); + } + match(GE_OP); + break; + } + case GT_OP: + { +- RefDNode tmp195_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp211_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp195_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp195_AST)); ++ tmp211_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp211_AST)); + } + match(GT_OP); + break; +@@ -8341,11 +9154,11 @@ + } + } + else { +- goto _loop214; ++ goto _loop245; + } + + } +- _loop214:; ++ _loop245:; + } // ( ... )* + relational_expr_AST = RefDNode(currentAST.root); + returnAST = relational_expr_AST; +@@ -8367,30 +9180,30 @@ + switch ( LA(1)) { + case AND_OP: + { +- RefDNode tmp196_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp212_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp196_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp196_AST)); ++ tmp212_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp212_AST)); + } + match(AND_OP); + break; + } + case OR_OP: + { +- RefDNode tmp197_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp213_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp197_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp197_AST)); ++ tmp213_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp213_AST)); + } + match(OR_OP); + break; + } + case XOR_OP: + { +- RefDNode tmp198_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp214_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp198_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp198_AST)); ++ tmp214_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp214_AST)); + } + match(XOR_OP); + break; +@@ -8407,11 +9220,11 @@ + } + } + else { +- goto _loop218; ++ goto _loop249; + } + + } +- _loop218:; ++ _loop249:; + } // ( ... )* + boolean_expr_AST = RefDNode(currentAST.root); + returnAST = boolean_expr_AST; +@@ -8433,20 +9246,20 @@ + switch ( LA(1)) { + case LOG_AND: + { +- RefDNode tmp199_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp215_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp199_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp199_AST)); ++ tmp215_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp215_AST)); + } + match(LOG_AND); + break; + } + case LOG_OR: + { +- RefDNode tmp200_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp216_AST = RefDNode(antlr::nullAST); + if ( inputState->guessing == 0 ) { +- tmp200_AST = astFactory->create(LT(1)); +- astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp200_AST)); ++ tmp216_AST = astFactory->create(LT(1)); ++ astFactory->makeASTRoot(currentAST, antlr::RefAST(tmp216_AST)); + } + match(LOG_OR); + break; +@@ -8463,11 +9276,11 @@ + } + } + else { +- goto _loop222; ++ goto _loop253; + } + + } +- _loop222:; ++ _loop253:; + } // ( ... )* + logical_expr_AST = RefDNode(currentAST.root); + returnAST = logical_expr_AST; +@@ -8475,7 +9288,7 @@ + + void GDLParser::initializeASTFactory( antlr::ASTFactory& factory ) + { +- factory.setMaxNodeType(215); ++ factory.setMaxNodeType(224); + } + const char* GDLParser::tokenNames[] = { + "<0>", +@@ -8486,6 +9299,7 @@ + "ASSIGN", + "ASSIGN_INPLACE", + "ASSIGN_REPLACE", ++ "ASSIGN_ARRAYEXPR_MFCALL", + "ARRAYDEF", + "ARRAYDEF_CONST", + "ARRAYIX", +@@ -8496,8 +9310,10 @@ + "ARRAYIX_RANGE_S", + "ARRAYEXPR", + "ARRAYEXPR_FN", ++ "ARRAYEXPR_MFCALL", + "BLOCK", + "BREAK", ++ "CSBLOCK", + "CONTINUE", + "COMMONDECL", + "COMMONDEF", +@@ -8505,7 +9321,12 @@ + "DEREF", + "ELSEBLK", + "EXPR", ++ "\"for\"", + "FOR_STEP", ++ "\"foreach\"", ++ "FOR_LOOP", ++ "FOR_STEP_LOOP", ++ "FOREACH_LOOP", + "FCALL", + "FCALL_LIB", + "FCALL_LIB_RETNEW", +@@ -8539,6 +9360,8 @@ + "REF", + "REF_CHECK", + "REF_EXPR", ++ "\"repeat\"", ++ "REPEAT_LOOP", + "RETURN", + "RETF", + "RETP", +@@ -8547,6 +9370,7 @@ + "UMINUS", + "VAR", + "VARPTR", ++ "\"while\"", + "IDENTIFIER", + "\"and\"", + "\"begin\"", +@@ -8559,12 +9383,12 @@ + "\"endcase\"", + "\"endelse\"", + "\"endfor\"", ++ "\"endforeach\"", + "\"endif\"", + "\"endrep\"", + "\"endswitch\"", + "\"endwhile\"", + "\"eq\"", +- "\"for\"", + "\"forward_function\"", + "\"function\"", + "\"ge\"", +@@ -8581,11 +9405,9 @@ + "\"on_ioerror\"", + "\"or\"", + "\"pro\"", +- "\"repeat\"", + "\"switch\"", + "\"then\"", + "\"until\"", +- "\"while\"", + "\"xor\"", + "METHOD", + "COMMA", +@@ -8697,39 +9519,40 @@ + 0 + }; + +-const unsigned long GDLParser::_tokenSet_0_data_[] = { 2UL, 0UL, 901777312UL, 854480UL, 8448UL, 8388608UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// EOF IDENTIFIER "begin" "case" "common" "compile_opt" "for" "forward_function" +-// "function" "goto" "if" "inherits" "on_ioerror" "pro" "repeat" "switch" +-// "while" END_U DEC INC LBRACE SYSVARNAME ASTERIX +-const antlr::BitSet GDLParser::_tokenSet_0(_tokenSet_0_data_,12); +-const unsigned long GDLParser::_tokenSet_1_data_[] = { 2UL, 0UL, 903870368UL, 854484UL, 4294879488UL, 1660944383UL, 2UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// EOF IDENTIFIER "begin" "case" "common" "compile_opt" "else" "end" "endcase" +-// "endelse" "endfor" "endif" "endrep" "endswitch" "endwhile" "for" "forward_function" +-// "function" "goto" "if" "inherits" "not" "on_ioerror" "pro" "repeat" +-// "switch" "while" END_U DEC INC LBRACE LSQUARE SYSVARNAME LCURLY CONSTANT_HEX_BYTE +-// CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 CONSTANT_HEX_INT CONSTANT_HEX_I +-// CONSTANT_HEX_ULONG CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI CONSTANT_HEX_UINT +-// CONSTANT_BYTE CONSTANT_LONG CONSTANT_LONG64 CONSTANT_INT CONSTANT_I +-// CONSTANT_ULONG CONSTANT_ULONG64 CONSTANT_UI CONSTANT_UINT CONSTANT_OCT_BYTE +-// CONSTANT_OCT_LONG CONSTANT_OCT_LONG64 CONSTANT_OCT_INT CONSTANT_OCT_I +-// CONSTANT_OCT_ULONG CONSTANT_OCT_ULONG64 CONSTANT_OCT_UI CONSTANT_OCT_UINT +-// CONSTANT_FLOAT CONSTANT_DOUBLE CONSTANT_BIN_BYTE CONSTANT_BIN_LONG CONSTANT_BIN_LONG64 ++const unsigned long GDLParser::_tokenSet_0_data_[] = { 1073741826UL, 1UL, 4030496UL, 436634028UL, 4325376UL, 0UL, 1UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// EOF "for" "foreach" "repeat" "while" IDENTIFIER "begin" "case" "common" ++// "compile_opt" "forward_function" "function" "goto" "if" "inherits" "on_ioerror" ++// "pro" "switch" END_U DEC INC LBRACE SYSVARNAME ASTERIX ++const antlr::BitSet GDLParser::_tokenSet_0(_tokenSet_0_data_,16); ++const unsigned long GDLParser::_tokenSet_1_data_[] = { 1073741826UL, 1UL, 4290609184UL, 436642221UL, 4250009600UL, 4294967295UL, 1221UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// EOF "for" "foreach" "repeat" "while" IDENTIFIER "begin" "case" "common" ++// "compile_opt" "else" "end" "endcase" "endelse" "endfor" "endforeach" ++// "endif" "endrep" "endswitch" "endwhile" "forward_function" "function" ++// "goto" "if" "inherits" "not" "on_ioerror" "pro" "switch" END_U DEC INC ++// LBRACE LSQUARE SYSVARNAME LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG ++// CONSTANT_HEX_LONG64 CONSTANT_HEX_INT CONSTANT_HEX_I CONSTANT_HEX_ULONG ++// CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI CONSTANT_HEX_UINT CONSTANT_BYTE ++// CONSTANT_LONG CONSTANT_LONG64 CONSTANT_INT CONSTANT_I CONSTANT_ULONG ++// CONSTANT_ULONG64 CONSTANT_UI CONSTANT_UINT CONSTANT_OCT_BYTE CONSTANT_OCT_LONG ++// CONSTANT_OCT_LONG64 CONSTANT_OCT_INT CONSTANT_OCT_I CONSTANT_OCT_ULONG ++// CONSTANT_OCT_ULONG64 CONSTANT_OCT_UI CONSTANT_OCT_UINT CONSTANT_FLOAT ++// CONSTANT_DOUBLE CONSTANT_BIN_BYTE CONSTANT_BIN_LONG CONSTANT_BIN_LONG64 + // CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 + // CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX STRING_LITERAL PLUS MINUS + // LOG_NEG + const antlr::BitSet GDLParser::_tokenSet_1(_tokenSet_1_data_,16); +-const unsigned long GDLParser::_tokenSet_2_data_[] = { 0UL, 0UL, 885000096UL, 788880UL, 8448UL, 8388608UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// IDENTIFIER "begin" "case" "common" "compile_opt" "for" "forward_function" +-// "goto" "if" "inherits" "on_ioerror" "repeat" "switch" "while" DEC INC +-// LBRACE SYSVARNAME ASTERIX +-const antlr::BitSet GDLParser::_tokenSet_2(_tokenSet_2_data_,12); +-const unsigned long GDLParser::_tokenSet_3_data_[] = { 0UL, 0UL, 885000096UL, 4294920596UL, 4294879743UL, 1677721599UL, 2UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// IDENTIFIER "begin" "case" "common" "compile_opt" "for" "forward_function" +-// "goto" "if" "inherits" "not" "on_ioerror" "repeat" "switch" "while" +-// COMMA END_U EQUAL DEC INC AND_OP_EQ ASTERIX_EQ EQ_OP_EQ GE_OP_EQ GTMARK_EQ +-// GT_OP_EQ LE_OP_EQ LTMARK_EQ LT_OP_EQ MATRIX_OP1_EQ MATRIX_OP2_EQ MINUS_EQ +-// MOD_OP_EQ NE_OP_EQ OR_OP_EQ PLUS_EQ POW_EQ SLASH_EQ XOR_OP_EQ MEMBER +-// LBRACE LSQUARE SYSVARNAME LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG ++const unsigned long GDLParser::_tokenSet_2_data_[] = { 1073741824UL, 1UL, 4030496UL, 402948516UL, 4325376UL, 0UL, 1UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// "for" "foreach" "repeat" "while" IDENTIFIER "begin" "case" "common" ++// "compile_opt" "forward_function" "goto" "if" "inherits" "on_ioerror" ++// "switch" DEC INC LBRACE SYSVARNAME ASTERIX ++const antlr::BitSet GDLParser::_tokenSet_2(_tokenSet_2_data_,16); ++const unsigned long GDLParser::_tokenSet_3_data_[] = { 1073741824UL, 1UL, 4030496UL, 4270104996UL, 4250140671UL, 4294967295UL, 1223UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// "for" "foreach" "repeat" "while" IDENTIFIER "begin" "case" "common" ++// "compile_opt" "forward_function" "goto" "if" "inherits" "not" "on_ioerror" ++// "switch" COMMA END_U EQUAL DEC INC AND_OP_EQ ASTERIX_EQ EQ_OP_EQ GE_OP_EQ ++// GTMARK_EQ GT_OP_EQ LE_OP_EQ LTMARK_EQ LT_OP_EQ MATRIX_OP1_EQ MATRIX_OP2_EQ ++// MINUS_EQ MOD_OP_EQ NE_OP_EQ OR_OP_EQ PLUS_EQ POW_EQ SLASH_EQ XOR_OP_EQ ++// MEMBER LBRACE LSQUARE SYSVARNAME LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG + // CONSTANT_HEX_LONG64 CONSTANT_HEX_INT CONSTANT_HEX_I CONSTANT_HEX_ULONG + // CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI CONSTANT_HEX_UINT CONSTANT_BYTE + // CONSTANT_LONG CONSTANT_LONG64 CONSTANT_INT CONSTANT_I CONSTANT_ULONG +@@ -8741,10 +9564,23 @@ + // CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX DOT STRING_LITERAL PLUS MINUS + // LOG_NEG + const antlr::BitSet GDLParser::_tokenSet_3(_tokenSet_3_data_,16); +-const unsigned long GDLParser::_tokenSet_4_data_[] = { 0UL, 0UL, 536870944UL, 0UL, 8448UL, 8388608UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const unsigned long GDLParser::_tokenSet_4_data_[] = { 0UL, 0UL, 65536UL, 256UL, 4325376UL, 0UL, 1UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "inherits" LBRACE SYSVARNAME ASTERIX +-const antlr::BitSet GDLParser::_tokenSet_4(_tokenSet_4_data_,12); +-const unsigned long GDLParser::_tokenSet_5_data_[] = { 0UL, 0UL, 536870944UL, 4294836228UL, 4294879743UL, 1677721599UL, 2UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_4(_tokenSet_4_data_,16); ++const unsigned long GDLParser::_tokenSet_5_data_[] = { 0UL, 0UL, 65536UL, 402661632UL, 4250009600UL, 4294967295UL, 1223UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// IDENTIFIER "inherits" "not" DEC INC LBRACE LSQUARE SYSVARNAME LCURLY ++// CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 CONSTANT_HEX_INT ++// CONSTANT_HEX_I CONSTANT_HEX_ULONG CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI ++// CONSTANT_HEX_UINT CONSTANT_BYTE CONSTANT_LONG CONSTANT_LONG64 CONSTANT_INT ++// CONSTANT_I CONSTANT_ULONG CONSTANT_ULONG64 CONSTANT_UI CONSTANT_UINT ++// CONSTANT_OCT_BYTE CONSTANT_OCT_LONG CONSTANT_OCT_LONG64 CONSTANT_OCT_INT ++// CONSTANT_OCT_I CONSTANT_OCT_ULONG CONSTANT_OCT_ULONG64 CONSTANT_OCT_UI ++// CONSTANT_OCT_UINT CONSTANT_FLOAT CONSTANT_DOUBLE CONSTANT_BIN_BYTE CONSTANT_BIN_LONG ++// CONSTANT_BIN_LONG64 CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG ++// CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX DOT STRING_LITERAL ++// PLUS MINUS LOG_NEG ++const antlr::BitSet GDLParser::_tokenSet_5(_tokenSet_5_data_,16); ++const unsigned long GDLParser::_tokenSet_6_data_[] = { 0UL, 0UL, 65536UL, 4227866880UL, 4250140671UL, 4294967295UL, 1223UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "inherits" "not" EQUAL DEC INC AND_OP_EQ ASTERIX_EQ EQ_OP_EQ + // GE_OP_EQ GTMARK_EQ GT_OP_EQ LE_OP_EQ LTMARK_EQ LT_OP_EQ MATRIX_OP1_EQ + // MATRIX_OP2_EQ MINUS_EQ MOD_OP_EQ NE_OP_EQ OR_OP_EQ PLUS_EQ POW_EQ SLASH_EQ +@@ -8759,11 +9595,11 @@ + // CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 + // CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX DOT STRING_LITERAL PLUS MINUS + // LOG_NEG +-const antlr::BitSet GDLParser::_tokenSet_5(_tokenSet_5_data_,16); +-const unsigned long GDLParser::_tokenSet_6_data_[] = { 0UL, 0UL, 4096UL, 82944UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_6(_tokenSet_6_data_,16); ++const unsigned long GDLParser::_tokenSet_7_data_[] = { 0UL, 0UL, 8388608UL, 42991616UL, 0UL, 0UL, 0UL, 0UL }; + // "else" "until" COMMA END_U +-const antlr::BitSet GDLParser::_tokenSet_6(_tokenSet_6_data_,8); +-const unsigned long GDLParser::_tokenSet_7_data_[] = { 0UL, 0UL, 536875040UL, 786436UL, 4294879488UL, 1660944383UL, 2UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_7(_tokenSet_7_data_,8); ++const unsigned long GDLParser::_tokenSet_8_data_[] = { 0UL, 0UL, 8454144UL, 402661632UL, 4250009600UL, 4294967295UL, 1221UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "else" "inherits" "not" DEC INC LBRACE LSQUARE SYSVARNAME + // LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 CONSTANT_HEX_INT + // CONSTANT_HEX_I CONSTANT_HEX_ULONG CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI +@@ -8775,25 +9611,33 @@ + // CONSTANT_BIN_LONG64 CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG + // CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX STRING_LITERAL + // PLUS MINUS LOG_NEG +-const antlr::BitSet GDLParser::_tokenSet_7(_tokenSet_7_data_,16); +-const unsigned long GDLParser::_tokenSet_8_data_[] = { 2UL, 0UL, 4294967264UL, 860159UL, 4294880512UL, 1660944383UL, 2UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// EOF IDENTIFIER "and" "begin" "case" "common" "compile_opt" "do" "else" +-// "end" "endcase" "endelse" "endfor" "endif" "endrep" "endswitch" "endwhile" +-// "eq" "for" "forward_function" "function" "ge" "goto" "gt" "if" "inherits" +-// "le" "lt" "mod" "ne" "not" "of" "on_ioerror" "or" "pro" "repeat" "switch" +-// "then" "until" "while" "xor" END_U DEC INC LBRACE SLASH LSQUARE SYSVARNAME +-// LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 CONSTANT_HEX_INT +-// CONSTANT_HEX_I CONSTANT_HEX_ULONG CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI +-// CONSTANT_HEX_UINT CONSTANT_BYTE CONSTANT_LONG CONSTANT_LONG64 CONSTANT_INT +-// CONSTANT_I CONSTANT_ULONG CONSTANT_ULONG64 CONSTANT_UI CONSTANT_UINT +-// CONSTANT_OCT_BYTE CONSTANT_OCT_LONG CONSTANT_OCT_LONG64 CONSTANT_OCT_INT +-// CONSTANT_OCT_I CONSTANT_OCT_ULONG CONSTANT_OCT_ULONG64 CONSTANT_OCT_UI +-// CONSTANT_OCT_UINT CONSTANT_FLOAT CONSTANT_DOUBLE CONSTANT_BIN_BYTE CONSTANT_BIN_LONG +-// CONSTANT_BIN_LONG64 CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG +-// CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX STRING_LITERAL +-// PLUS MINUS LOG_NEG + const antlr::BitSet GDLParser::_tokenSet_8(_tokenSet_8_data_,16); +-const unsigned long GDLParser::_tokenSet_9_data_[] = { 0UL, 0UL, 536870944UL, 786436UL, 4294879488UL, 1660944383UL, 2UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const unsigned long GDLParser::_tokenSet_9_data_[] = { 1073741826UL, 1UL, 4294934560UL, 440401919UL, 4250533888UL, 4294967295UL, 1221UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// EOF "for" "foreach" "repeat" "while" IDENTIFIER "and" "begin" "case" ++// "common" "compile_opt" "do" "else" "end" "endcase" "endelse" "endfor" ++// "endforeach" "endif" "endrep" "endswitch" "endwhile" "eq" "forward_function" ++// "function" "ge" "goto" "gt" "if" "inherits" "le" "lt" "mod" "ne" "not" ++// "of" "on_ioerror" "or" "pro" "switch" "then" "until" "xor" END_U DEC ++// INC LBRACE SLASH LSQUARE SYSVARNAME LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG ++// CONSTANT_HEX_LONG64 CONSTANT_HEX_INT CONSTANT_HEX_I CONSTANT_HEX_ULONG ++// CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI CONSTANT_HEX_UINT CONSTANT_BYTE ++// CONSTANT_LONG CONSTANT_LONG64 CONSTANT_INT CONSTANT_I CONSTANT_ULONG ++// CONSTANT_ULONG64 CONSTANT_UI CONSTANT_UINT CONSTANT_OCT_BYTE CONSTANT_OCT_LONG ++// CONSTANT_OCT_LONG64 CONSTANT_OCT_INT CONSTANT_OCT_I CONSTANT_OCT_ULONG ++// CONSTANT_OCT_ULONG64 CONSTANT_OCT_UI CONSTANT_OCT_UINT CONSTANT_FLOAT ++// CONSTANT_DOUBLE CONSTANT_BIN_BYTE CONSTANT_BIN_LONG CONSTANT_BIN_LONG64 ++// CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 ++// CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX STRING_LITERAL PLUS MINUS ++// LOG_NEG ++const antlr::BitSet GDLParser::_tokenSet_9(_tokenSet_9_data_,16); ++const unsigned long GDLParser::_tokenSet_10_data_[] = { 1073741824UL, 1UL, 4294934560UL, 4194303UL, 0UL, 0UL, 0UL, 0UL }; ++// "for" "foreach" "repeat" "while" IDENTIFIER "and" "begin" "case" "common" ++// "compile_opt" "do" "else" "end" "endcase" "endelse" "endfor" "endforeach" ++// "endif" "endrep" "endswitch" "endwhile" "eq" "forward_function" "function" ++// "ge" "goto" "gt" "if" "inherits" "le" "lt" "mod" "ne" "not" "of" "on_ioerror" ++// "or" "pro" "switch" "then" "until" "xor" ++const antlr::BitSet GDLParser::_tokenSet_10(_tokenSet_10_data_,8); ++const unsigned long GDLParser::_tokenSet_11_data_[] = { 0UL, 0UL, 65536UL, 402661632UL, 4250009600UL, 4294967295UL, 1221UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "inherits" "not" DEC INC LBRACE LSQUARE SYSVARNAME LCURLY + // CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 CONSTANT_HEX_INT + // CONSTANT_HEX_I CONSTANT_HEX_ULONG CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI +@@ -8805,8 +9649,8 @@ + // CONSTANT_BIN_LONG64 CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG + // CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX STRING_LITERAL + // PLUS MINUS LOG_NEG +-const antlr::BitSet GDLParser::_tokenSet_9(_tokenSet_9_data_,16); +-const unsigned long GDLParser::_tokenSet_10_data_[] = { 0UL, 0UL, 3927969888UL, 873511UL, 4294897536UL, 4294967295UL, 31UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_11(_tokenSet_11_data_,16); ++const unsigned long GDLParser::_tokenSet_12_data_[] = { 0UL, 0UL, 8585216UL, 447823698UL, 4259250176UL, 4294967295UL, 16383UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "and" "else" "eq" "ge" "gt" "inherits" "le" "lt" "mod" "ne" + // "not" "or" "until" "xor" COMMA END_U DEC INC MEMBER LBRACE RBRACE SLASH + // LSQUARE SYSVARNAME EXCLAMATION LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG +@@ -8820,11 +9664,11 @@ + // CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 + // CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX DOT STRING_LITERAL POW MATRIX_OP1 + // MATRIX_OP2 PLUS MINUS LTMARK GTMARK LOG_NEG LOG_AND LOG_OR QUESTION +-const antlr::BitSet GDLParser::_tokenSet_10(_tokenSet_10_data_,16); +-const unsigned long GDLParser::_tokenSet_11_data_[] = { 0UL, 0UL, 536870944UL, 0UL, 24576UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_12(_tokenSet_12_data_,16); ++const unsigned long GDLParser::_tokenSet_13_data_[] = { 0UL, 0UL, 65536UL, 256UL, 12582912UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "inherits" SYSVARNAME EXCLAMATION +-const antlr::BitSet GDLParser::_tokenSet_11(_tokenSet_11_data_,12); +-const unsigned long GDLParser::_tokenSet_12_data_[] = { 2UL, 0UL, 3927965792UL, 806951UL, 4294962560UL, 4294967295UL, 31UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_13(_tokenSet_13_data_,12); ++const unsigned long GDLParser::_tokenSet_14_data_[] = { 2UL, 0UL, 196608UL, 413220690UL, 4292542464UL, 4294967295UL, 16383UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // EOF IDENTIFIER "and" "eq" "ge" "gt" "inherits" "le" "lt" "mod" "ne" + // "not" "or" "xor" COMMA DEC INC MEMBER LBRACE SLASH LSQUARE SYSVARNAME + // EXCLAMATION LCURLY RCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 +@@ -8838,8 +9682,8 @@ + // CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT + // ASTERIX DOT STRING_LITERAL POW MATRIX_OP1 MATRIX_OP2 PLUS MINUS LTMARK + // GTMARK LOG_NEG LOG_AND LOG_OR QUESTION +-const antlr::BitSet GDLParser::_tokenSet_12(_tokenSet_12_data_,16); +-const unsigned long GDLParser::_tokenSet_13_data_[] = { 0UL, 0UL, 536870944UL, 786436UL, 4294895872UL, 1660944383UL, 2UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_14(_tokenSet_14_data_,16); ++const unsigned long GDLParser::_tokenSet_15_data_[] = { 0UL, 0UL, 65536UL, 402661632UL, 4258398208UL, 4294967295UL, 1221UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "inherits" "not" DEC INC LBRACE LSQUARE SYSVARNAME EXCLAMATION + // LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 CONSTANT_HEX_INT + // CONSTANT_HEX_I CONSTANT_HEX_ULONG CONSTANT_HEX_ULONG64 CONSTANT_HEX_UI +@@ -8851,8 +9695,8 @@ + // CONSTANT_BIN_LONG64 CONSTANT_BIN_INT CONSTANT_BIN_I CONSTANT_BIN_ULONG + // CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX STRING_LITERAL + // PLUS MINUS LOG_NEG +-const antlr::BitSet GDLParser::_tokenSet_13(_tokenSet_13_data_,16); +-const unsigned long GDLParser::_tokenSet_14_data_[] = { 0UL, 0UL, 3927965792UL, 839719UL, 4294962560UL, 4294967295UL, 31UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_15(_tokenSet_15_data_,16); ++const unsigned long GDLParser::_tokenSet_16_data_[] = { 0UL, 0UL, 196608UL, 429997906UL, 4292542464UL, 4294967295UL, 16383UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "and" "eq" "ge" "gt" "inherits" "le" "lt" "mod" "ne" "not" + // "or" "xor" COMMA COLON DEC INC MEMBER LBRACE SLASH LSQUARE SYSVARNAME + // EXCLAMATION LCURLY RCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 +@@ -8866,8 +9710,8 @@ + // CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT + // ASTERIX DOT STRING_LITERAL POW MATRIX_OP1 MATRIX_OP2 PLUS MINUS LTMARK + // GTMARK LOG_NEG LOG_AND LOG_OR QUESTION +-const antlr::BitSet GDLParser::_tokenSet_14(_tokenSet_14_data_,16); +-const unsigned long GDLParser::_tokenSet_15_data_[] = { 0UL, 0UL, 3927965792UL, 839719UL, 4294901632UL, 4294967295UL, 31UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_16(_tokenSet_16_data_,16); ++const unsigned long GDLParser::_tokenSet_17_data_[] = { 0UL, 0UL, 196608UL, 429997906UL, 4261347328UL, 4294967295UL, 16383UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "and" "eq" "ge" "gt" "inherits" "le" "lt" "mod" "ne" "not" + // "or" "xor" COMMA COLON DEC INC MEMBER LBRACE RBRACE SLASH LSQUARE RSQUARE + // SYSVARNAME EXCLAMATION LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 +@@ -8881,11 +9725,11 @@ + // CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT + // ASTERIX DOT STRING_LITERAL POW MATRIX_OP1 MATRIX_OP2 PLUS MINUS LTMARK + // GTMARK LOG_NEG LOG_AND LOG_OR QUESTION +-const antlr::BitSet GDLParser::_tokenSet_15(_tokenSet_15_data_,16); +-const unsigned long GDLParser::_tokenSet_16_data_[] = { 0UL, 0UL, 0UL, 49152UL, 4608UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_17(_tokenSet_17_data_,16); ++const unsigned long GDLParser::_tokenSet_18_data_[] = { 0UL, 0UL, 0UL, 25165824UL, 2359296UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // COMMA COLON RBRACE RSQUARE +-const antlr::BitSet GDLParser::_tokenSet_16(_tokenSet_16_data_,12); +-const unsigned long GDLParser::_tokenSet_17_data_[] = { 0UL, 0UL, 3927965792UL, 806951UL, 4294901632UL, 4294967295UL, 31UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_18(_tokenSet_18_data_,12); ++const unsigned long GDLParser::_tokenSet_19_data_[] = { 0UL, 0UL, 196608UL, 413220690UL, 4261347328UL, 4294967295UL, 16383UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // IDENTIFIER "and" "eq" "ge" "gt" "inherits" "le" "lt" "mod" "ne" "not" + // "or" "xor" COMMA DEC INC MEMBER LBRACE RBRACE SLASH LSQUARE RSQUARE + // SYSVARNAME EXCLAMATION LCURLY CONSTANT_HEX_BYTE CONSTANT_HEX_LONG CONSTANT_HEX_LONG64 +@@ -8899,8 +9743,14 @@ + // CONSTANT_BIN_ULONG CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT + // ASTERIX DOT STRING_LITERAL POW MATRIX_OP1 MATRIX_OP2 PLUS MINUS LTMARK + // GTMARK LOG_NEG LOG_AND LOG_OR QUESTION +-const antlr::BitSet GDLParser::_tokenSet_17(_tokenSet_17_data_,16); +-const unsigned long GDLParser::_tokenSet_18_data_[] = { 2UL, 0UL, 3927971936UL, 906799UL, 4294950784UL, 4294967295UL, 31UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_19(_tokenSet_19_data_,16); ++const unsigned long GDLParser::_tokenSet_20_data_[] = { 0UL, 0UL, 65536UL, 0UL, 12713984UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// IDENTIFIER LBRACE SYSVARNAME EXCLAMATION ++const antlr::BitSet GDLParser::_tokenSet_20(_tokenSet_20_data_,12); ++const unsigned long GDLParser::_tokenSet_21_data_[] = { 0UL, 0UL, 8388608UL, 47185920UL, 1179648UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// "else" "until" METHOD COMMA END_U LBRACE LSQUARE ++const antlr::BitSet GDLParser::_tokenSet_21(_tokenSet_21_data_,12); ++const unsigned long GDLParser::_tokenSet_22_data_[] = { 2UL, 0UL, 12779520UL, 465141586UL, 4286513152UL, 4294967295UL, 16383UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // EOF IDENTIFIER "and" "do" "else" "eq" "ge" "gt" "inherits" "le" "lt" + // "mod" "ne" "not" "of" "or" "then" "until" "xor" COMMA COLON END_U DEC + // INC MEMBER LBRACE RBRACE SLASH LSQUARE RSQUARE SYSVARNAME LCURLY RCURLY +@@ -8915,12 +9765,12 @@ + // CONSTANT_BIN_ULONG64 CONSTANT_BIN_UI CONSTANT_BIN_UINT ASTERIX DOT STRING_LITERAL + // POW MATRIX_OP1 MATRIX_OP2 PLUS MINUS LTMARK GTMARK LOG_NEG LOG_AND LOG_OR + // QUESTION +-const antlr::BitSet GDLParser::_tokenSet_18(_tokenSet_18_data_,16); +-const unsigned long GDLParser::_tokenSet_19_data_[] = { 0UL, 0UL, 0UL, 1UL, 1024UL, 411041792UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_22(_tokenSet_22_data_,16); ++const unsigned long GDLParser::_tokenSet_23_data_[] = { 0UL, 0UL, 0UL, 2048UL, 524288UL, 0UL, 49UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; + // "mod" SLASH ASTERIX MATRIX_OP1 MATRIX_OP2 +-const antlr::BitSet GDLParser::_tokenSet_19(_tokenSet_19_data_,12); +-const unsigned long GDLParser::_tokenSet_20_data_[] = { 0UL, 0UL, 3391094784UL, 2UL, 0UL, 0UL, 0UL, 0UL }; ++const antlr::BitSet GDLParser::_tokenSet_23(_tokenSet_23_data_,16); ++const unsigned long GDLParser::_tokenSet_24_data_[] = { 0UL, 0UL, 0UL, 5714UL, 0UL, 0UL, 0UL, 0UL }; + // "eq" "ge" "gt" "le" "lt" "ne" +-const antlr::BitSet GDLParser::_tokenSet_20(_tokenSet_20_data_,8); ++const antlr::BitSet GDLParser::_tokenSet_24(_tokenSet_24_data_,8); + + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLParser.hpp cvs/gdl/src/GDLParser.hpp +--- gdl-0.9rc4/src/GDLParser.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLParser.hpp 2010-04-22 09:50:40.000000000 -0600 +@@ -28,7 +28,7 @@ + //#include "dinterpreter.hpp" + + // defintion in dinterpreter.cpp +-void SetActualCompileOpt( unsigned int cOpt); ++//void SetActualCompileOpt( unsigned int cOpt); + + class CUSTOM_API GDLParser : public antlr::LLkParser, public GDLTokenTypes + { +@@ -61,7 +61,7 @@ + else if( opt == "IDL2") compileOpt |= IDL2; + else if( opt == "STRICTARRSUBS") compileOpt |= STRICTARRSUBS; + else throw GDLException("Unrecognised COMPILE_OPT option: "+opt); +- SetActualCompileOpt( compileOpt); ++// SetActualCompileOpt( compileOpt); + } + + std::string subName; // name of procedure function to be compiled ("" -> all file) +@@ -132,6 +132,7 @@ + public: void keyword_declaration(); + public: std::string object_name(); + public: void compile_opt(); ++ public: void endforeach_mark(); + public: void endfor_mark(); + public: void endrep_mark(); + public: void endwhile_mark(); +@@ -142,10 +143,12 @@ + public: void label(); + public: void baseclass_method(); + public: void assign_expr(); +- public: void deref_expr(); ++ public: void deref_dot_expr_keeplast(); + public: void formal_procedure_call(); ++ public: void deref_expr(); + public: void procedure_call(); + public: void for_statement(); ++ public: void foreach_statement(); + public: void repeat_statement(); + public: void while_statement(); + public: void jump_statement(); +@@ -153,6 +156,7 @@ + public: void repeat_block(); + public: void while_block(); + public: void for_block(); ++ public: void foreach_block(); + public: void if_block(); + public: void else_block(); + public: void parameter_def_list(); +@@ -180,9 +184,11 @@ + public: void array_expr_nth(); + public: void tag_array_expr_nth_sub(); + public: void tag_array_expr_nth(); ++ public: int tag_access_keeplast(); + public: SizeT tag_access(); +- public: void array_expr_fn(); ++ public: void deref_dot_expr(); + public: bool member_function_call(); ++ public: void member_function_call_dot(); + public: void primary_expr(); + public: void decinc_expr(); + public: void exponential_expr(); +@@ -204,10 +210,10 @@ + private: + static const char* tokenNames[]; + #ifndef NO_STATIC_CONSTS +- static const int NUM_TOKENS = 216; ++ static const int NUM_TOKENS = 225; + #else + enum { +- NUM_TOKENS = 216 ++ NUM_TOKENS = 225 + }; + #endif + +@@ -253,6 +259,14 @@ + static const antlr::BitSet _tokenSet_19; + static const unsigned long _tokenSet_20_data_[]; + static const antlr::BitSet _tokenSet_20; ++ static const unsigned long _tokenSet_21_data_[]; ++ static const antlr::BitSet _tokenSet_21; ++ static const unsigned long _tokenSet_22_data_[]; ++ static const antlr::BitSet _tokenSet_22; ++ static const unsigned long _tokenSet_23_data_[]; ++ static const antlr::BitSet _tokenSet_23; ++ static const unsigned long _tokenSet_24_data_[]; ++ static const antlr::BitSet _tokenSet_24; + }; + + #endif /*INC_GDLParser_hpp_*/ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlpsstream.cpp cvs/gdl/src/gdlpsstream.cpp +--- gdl-0.9rc4/src/gdlpsstream.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlpsstream.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -25,6 +25,6 @@ + + void GDLPSStream::Init() + { +- plstream::init(); ++ plstream::init(); + } + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlpsstream.hpp cvs/gdl/src/gdlpsstream.hpp +--- gdl-0.9rc4/src/gdlpsstream.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlpsstream.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -29,8 +29,7 @@ + } + + ~GDLPSStream() +- { +- } ++ {} + + // void eop() {}; + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlpython.cpp cvs/gdl/src/gdlpython.cpp +--- gdl-0.9rc4/src/gdlpython.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlpython.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -20,7 +20,7 @@ + //#include "includefirst.hpp" + + // this part contains variable conversion stuff +-// used by both GDL embedded in pythjon and python embedded in GDL ++// used by both GDL embedded in python and python embedded in GDL + //#if defined(USE_PYTHON) || defined(PYTHON_MODULE) + + //#include +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlsvgstream.cpp cvs/gdl/src/gdlsvgstream.cpp +--- gdl-0.9rc4/src/gdlsvgstream.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlsvgstream.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -22,5 +22,5 @@ + + void GDLSVGStream::Init() + { +- plstream::init(); ++ plstream::init(); + } +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLTokenTypes.hpp cvs/gdl/src/GDLTokenTypes.hpp +--- gdl-0.9rc4/src/GDLTokenTypes.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLTokenTypes.hpp 2010-04-22 09:50:40.000000000 -0600 +@@ -16,214 +16,223 @@ + ASSIGN = 5, + ASSIGN_INPLACE = 6, + ASSIGN_REPLACE = 7, +- ARRAYDEF = 8, +- ARRAYDEF_CONST = 9, +- ARRAYIX = 10, +- ARRAYIX_ALL = 11, +- ARRAYIX_ORANGE = 12, +- ARRAYIX_RANGE = 13, +- ARRAYIX_ORANGE_S = 14, +- ARRAYIX_RANGE_S = 15, +- ARRAYEXPR = 16, +- ARRAYEXPR_FN = 17, +- BLOCK = 18, +- BREAK = 19, +- CONTINUE = 20, +- COMMONDECL = 21, +- COMMONDEF = 22, +- CONSTANT = 23, +- DEREF = 24, +- ELSEBLK = 25, +- EXPR = 26, +- FOR_STEP = 27, +- FCALL = 28, +- FCALL_LIB = 29, +- FCALL_LIB_RETNEW = 30, +- IF_ELSE = 31, +- KEYDECL = 32, +- KEYDEF = 33, +- KEYDEF_REF = 34, +- KEYDEF_REF_CHECK = 35, +- KEYDEF_REF_EXPR = 36, +- LABEL = 37, +- MPCALL = 38, +- MPCALL_PARENT = 39, +- MFCALL = 40, +- MFCALL_LIB = 41, +- MFCALL_LIB_RETNEW = 42, +- MFCALL_PARENT = 43, +- MFCALL_PARENT_LIB = 44, +- MFCALL_PARENT_LIB_RETNEW = 45, +- NOP = 46, +- NSTRUC = 47, +- NSTRUC_REF = 48, +- ON_IOERROR_NULL = 49, +- PCALL = 50, +- PCALL_LIB = 51, +- PARADECL = 52, +- PARAEXPR = 53, +- POSTDEC = 54, +- POSTINC = 55, +- DECSTATEMENT = 56, +- INCSTATEMENT = 57, +- REF = 58, +- REF_CHECK = 59, +- REF_EXPR = 60, +- RETURN = 61, +- RETF = 62, +- RETP = 63, +- STRUC = 64, +- SYSVAR = 65, +- UMINUS = 66, +- VAR = 67, +- VARPTR = 68, +- IDENTIFIER = 69, +- AND_OP = 70, +- BEGIN = 71, +- CASE = 72, +- COMMON = 73, +- COMPILE_OPT = 74, +- DO = 75, +- ELSE = 76, +- END = 77, +- ENDCASE = 78, +- ENDELSE = 79, +- ENDFOR = 80, +- ENDIF = 81, +- ENDREP = 82, +- ENDSWITCH = 83, +- ENDWHILE = 84, +- EQ_OP = 85, +- FOR = 86, +- FORWARD = 87, +- FUNCTION = 88, +- GE_OP = 89, +- GOTO = 90, +- GT_OP = 91, +- IF = 92, +- INHERITS = 93, +- LE_OP = 94, +- LT_OP = 95, +- MOD_OP = 96, +- NE_OP = 97, +- NOT_OP = 98, +- OF = 99, +- ON_IOERROR = 100, +- OR_OP = 101, +- PRO = 102, +- REPEAT = 103, +- SWITCH = 104, +- THEN = 105, +- UNTIL = 106, +- WHILE = 107, +- XOR_OP = 108, +- METHOD = 109, +- COMMA = 110, +- COLON = 111, +- END_U = 112, +- EQUAL = 113, +- DEC = 114, +- INC = 115, +- AND_OP_EQ = 116, +- ASTERIX_EQ = 117, +- EQ_OP_EQ = 118, +- GE_OP_EQ = 119, +- GTMARK_EQ = 120, +- GT_OP_EQ = 121, +- LE_OP_EQ = 122, +- LTMARK_EQ = 123, +- LT_OP_EQ = 124, +- MATRIX_OP1_EQ = 125, +- MATRIX_OP2_EQ = 126, +- MINUS_EQ = 127, +- MOD_OP_EQ = 128, +- NE_OP_EQ = 129, +- OR_OP_EQ = 130, +- PLUS_EQ = 131, +- POW_EQ = 132, +- SLASH_EQ = 133, +- XOR_OP_EQ = 134, +- MEMBER = 135, +- LBRACE = 136, +- RBRACE = 137, +- SLASH = 138, +- LSQUARE = 139, +- RSQUARE = 140, +- SYSVARNAME = 141, +- EXCLAMATION = 142, +- LCURLY = 143, +- RCURLY = 144, +- CONSTANT_HEX_BYTE = 145, +- CONSTANT_HEX_LONG = 146, +- CONSTANT_HEX_LONG64 = 147, +- CONSTANT_HEX_INT = 148, +- CONSTANT_HEX_I = 149, +- CONSTANT_HEX_ULONG = 150, +- CONSTANT_HEX_ULONG64 = 151, +- CONSTANT_HEX_UI = 152, +- CONSTANT_HEX_UINT = 153, +- CONSTANT_BYTE = 154, +- CONSTANT_LONG = 155, +- CONSTANT_LONG64 = 156, +- CONSTANT_INT = 157, +- CONSTANT_I = 158, +- CONSTANT_ULONG = 159, +- CONSTANT_ULONG64 = 160, +- CONSTANT_UI = 161, +- CONSTANT_UINT = 162, +- CONSTANT_OCT_BYTE = 163, +- CONSTANT_OCT_LONG = 164, +- CONSTANT_OCT_LONG64 = 165, +- CONSTANT_OCT_INT = 166, +- CONSTANT_OCT_I = 167, +- CONSTANT_OCT_ULONG = 168, +- CONSTANT_OCT_ULONG64 = 169, +- CONSTANT_OCT_UI = 170, +- CONSTANT_OCT_UINT = 171, +- CONSTANT_FLOAT = 172, +- CONSTANT_DOUBLE = 173, +- CONSTANT_BIN_BYTE = 174, +- CONSTANT_BIN_LONG = 175, +- CONSTANT_BIN_LONG64 = 176, +- CONSTANT_BIN_INT = 177, +- CONSTANT_BIN_I = 178, +- CONSTANT_BIN_ULONG = 179, +- CONSTANT_BIN_ULONG64 = 180, +- CONSTANT_BIN_UI = 181, +- CONSTANT_BIN_UINT = 182, +- ASTERIX = 183, +- DOT = 184, +- STRING_LITERAL = 185, +- POW = 186, +- MATRIX_OP1 = 187, +- MATRIX_OP2 = 188, +- PLUS = 189, +- MINUS = 190, +- LTMARK = 191, +- GTMARK = 192, +- LOG_NEG = 193, +- LOG_AND = 194, +- LOG_OR = 195, +- QUESTION = 196, +- STRING = 197, +- INCLUDE = 198, +- EOL = 199, +- W = 200, +- D = 201, +- L = 202, +- H = 203, +- O = 204, +- B = 205, +- EXP = 206, +- DBL_E = 207, +- DBL = 208, +- CONSTANT_OR_STRING_LITERAL = 209, +- COMMENT = 210, +- END_MARKER = 211, +- WHITESPACE = 212, +- SKIP_LINES = 213, +- CONT_STATEMENT = 214, +- END_OF_LINE = 215, ++ ASSIGN_ARRAYEXPR_MFCALL = 8, ++ ARRAYDEF = 9, ++ ARRAYDEF_CONST = 10, ++ ARRAYIX = 11, ++ ARRAYIX_ALL = 12, ++ ARRAYIX_ORANGE = 13, ++ ARRAYIX_RANGE = 14, ++ ARRAYIX_ORANGE_S = 15, ++ ARRAYIX_RANGE_S = 16, ++ ARRAYEXPR = 17, ++ ARRAYEXPR_FN = 18, ++ ARRAYEXPR_MFCALL = 19, ++ BLOCK = 20, ++ BREAK = 21, ++ CSBLOCK = 22, ++ CONTINUE = 23, ++ COMMONDECL = 24, ++ COMMONDEF = 25, ++ CONSTANT = 26, ++ DEREF = 27, ++ ELSEBLK = 28, ++ EXPR = 29, ++ FOR = 30, ++ FOR_STEP = 31, ++ FOREACH = 32, ++ FOR_LOOP = 33, ++ FOR_STEP_LOOP = 34, ++ FOREACH_LOOP = 35, ++ FCALL = 36, ++ FCALL_LIB = 37, ++ FCALL_LIB_RETNEW = 38, ++ IF_ELSE = 39, ++ KEYDECL = 40, ++ KEYDEF = 41, ++ KEYDEF_REF = 42, ++ KEYDEF_REF_CHECK = 43, ++ KEYDEF_REF_EXPR = 44, ++ LABEL = 45, ++ MPCALL = 46, ++ MPCALL_PARENT = 47, ++ MFCALL = 48, ++ MFCALL_LIB = 49, ++ MFCALL_LIB_RETNEW = 50, ++ MFCALL_PARENT = 51, ++ MFCALL_PARENT_LIB = 52, ++ MFCALL_PARENT_LIB_RETNEW = 53, ++ NOP = 54, ++ NSTRUC = 55, ++ NSTRUC_REF = 56, ++ ON_IOERROR_NULL = 57, ++ PCALL = 58, ++ PCALL_LIB = 59, ++ PARADECL = 60, ++ PARAEXPR = 61, ++ POSTDEC = 62, ++ POSTINC = 63, ++ DECSTATEMENT = 64, ++ INCSTATEMENT = 65, ++ REF = 66, ++ REF_CHECK = 67, ++ REF_EXPR = 68, ++ REPEAT = 69, ++ REPEAT_LOOP = 70, ++ RETURN = 71, ++ RETF = 72, ++ RETP = 73, ++ STRUC = 74, ++ SYSVAR = 75, ++ UMINUS = 76, ++ VAR = 77, ++ VARPTR = 78, ++ WHILE = 79, ++ IDENTIFIER = 80, ++ AND_OP = 81, ++ BEGIN = 82, ++ CASE = 83, ++ COMMON = 84, ++ COMPILE_OPT = 85, ++ DO = 86, ++ ELSE = 87, ++ END = 88, ++ ENDCASE = 89, ++ ENDELSE = 90, ++ ENDFOR = 91, ++ ENDFOREACH = 92, ++ ENDIF = 93, ++ ENDREP = 94, ++ ENDSWITCH = 95, ++ ENDWHILE = 96, ++ EQ_OP = 97, ++ FORWARD = 98, ++ FUNCTION = 99, ++ GE_OP = 100, ++ GOTO = 101, ++ GT_OP = 102, ++ IF = 103, ++ INHERITS = 104, ++ LE_OP = 105, ++ LT_OP = 106, ++ MOD_OP = 107, ++ NE_OP = 108, ++ NOT_OP = 109, ++ OF = 110, ++ ON_IOERROR = 111, ++ OR_OP = 112, ++ PRO = 113, ++ SWITCH = 114, ++ THEN = 115, ++ UNTIL = 116, ++ XOR_OP = 117, ++ METHOD = 118, ++ COMMA = 119, ++ COLON = 120, ++ END_U = 121, ++ EQUAL = 122, ++ DEC = 123, ++ INC = 124, ++ AND_OP_EQ = 125, ++ ASTERIX_EQ = 126, ++ EQ_OP_EQ = 127, ++ GE_OP_EQ = 128, ++ GTMARK_EQ = 129, ++ GT_OP_EQ = 130, ++ LE_OP_EQ = 131, ++ LTMARK_EQ = 132, ++ LT_OP_EQ = 133, ++ MATRIX_OP1_EQ = 134, ++ MATRIX_OP2_EQ = 135, ++ MINUS_EQ = 136, ++ MOD_OP_EQ = 137, ++ NE_OP_EQ = 138, ++ OR_OP_EQ = 139, ++ PLUS_EQ = 140, ++ POW_EQ = 141, ++ SLASH_EQ = 142, ++ XOR_OP_EQ = 143, ++ MEMBER = 144, ++ LBRACE = 145, ++ RBRACE = 146, ++ SLASH = 147, ++ LSQUARE = 148, ++ RSQUARE = 149, ++ SYSVARNAME = 150, ++ EXCLAMATION = 151, ++ LCURLY = 152, ++ RCURLY = 153, ++ CONSTANT_HEX_BYTE = 154, ++ CONSTANT_HEX_LONG = 155, ++ CONSTANT_HEX_LONG64 = 156, ++ CONSTANT_HEX_INT = 157, ++ CONSTANT_HEX_I = 158, ++ CONSTANT_HEX_ULONG = 159, ++ CONSTANT_HEX_ULONG64 = 160, ++ CONSTANT_HEX_UI = 161, ++ CONSTANT_HEX_UINT = 162, ++ CONSTANT_BYTE = 163, ++ CONSTANT_LONG = 164, ++ CONSTANT_LONG64 = 165, ++ CONSTANT_INT = 166, ++ CONSTANT_I = 167, ++ CONSTANT_ULONG = 168, ++ CONSTANT_ULONG64 = 169, ++ CONSTANT_UI = 170, ++ CONSTANT_UINT = 171, ++ CONSTANT_OCT_BYTE = 172, ++ CONSTANT_OCT_LONG = 173, ++ CONSTANT_OCT_LONG64 = 174, ++ CONSTANT_OCT_INT = 175, ++ CONSTANT_OCT_I = 176, ++ CONSTANT_OCT_ULONG = 177, ++ CONSTANT_OCT_ULONG64 = 178, ++ CONSTANT_OCT_UI = 179, ++ CONSTANT_OCT_UINT = 180, ++ CONSTANT_FLOAT = 181, ++ CONSTANT_DOUBLE = 182, ++ CONSTANT_BIN_BYTE = 183, ++ CONSTANT_BIN_LONG = 184, ++ CONSTANT_BIN_LONG64 = 185, ++ CONSTANT_BIN_INT = 186, ++ CONSTANT_BIN_I = 187, ++ CONSTANT_BIN_ULONG = 188, ++ CONSTANT_BIN_ULONG64 = 189, ++ CONSTANT_BIN_UI = 190, ++ CONSTANT_BIN_UINT = 191, ++ ASTERIX = 192, ++ DOT = 193, ++ STRING_LITERAL = 194, ++ POW = 195, ++ MATRIX_OP1 = 196, ++ MATRIX_OP2 = 197, ++ PLUS = 198, ++ MINUS = 199, ++ LTMARK = 200, ++ GTMARK = 201, ++ LOG_NEG = 202, ++ LOG_AND = 203, ++ LOG_OR = 204, ++ QUESTION = 205, ++ STRING = 206, ++ INCLUDE = 207, ++ EOL = 208, ++ W = 209, ++ D = 210, ++ L = 211, ++ H = 212, ++ O = 213, ++ B = 214, ++ EXP = 215, ++ DBL_E = 216, ++ DBL = 217, ++ CONSTANT_OR_STRING_LITERAL = 218, ++ COMMENT = 219, ++ END_MARKER = 220, ++ WHITESPACE = 221, ++ SKIP_LINES = 222, ++ CONT_STATEMENT = 223, ++ END_OF_LINE = 224, + NULL_TREE_LOOKAHEAD = 3 + }; + #ifdef __cplusplus +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLTokenTypes.txt cvs/gdl/src/GDLTokenTypes.txt +--- gdl-0.9rc4/src/GDLTokenTypes.txt 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLTokenTypes.txt 2010-04-22 09:50:40.000000000 -0600 +@@ -4,211 +4,220 @@ + ASSIGN=5 + ASSIGN_INPLACE=6 + ASSIGN_REPLACE=7 +-ARRAYDEF=8 +-ARRAYDEF_CONST=9 +-ARRAYIX=10 +-ARRAYIX_ALL=11 +-ARRAYIX_ORANGE=12 +-ARRAYIX_RANGE=13 +-ARRAYIX_ORANGE_S=14 +-ARRAYIX_RANGE_S=15 +-ARRAYEXPR=16 +-ARRAYEXPR_FN=17 +-BLOCK=18 +-BREAK=19 +-CONTINUE=20 +-COMMONDECL=21 +-COMMONDEF=22 +-CONSTANT=23 +-DEREF=24 +-ELSEBLK=25 +-EXPR=26 +-FOR_STEP=27 +-FCALL=28 +-FCALL_LIB=29 +-FCALL_LIB_RETNEW=30 +-IF_ELSE=31 +-KEYDECL=32 +-KEYDEF=33 +-KEYDEF_REF=34 +-KEYDEF_REF_CHECK=35 +-KEYDEF_REF_EXPR=36 +-LABEL=37 +-MPCALL=38 +-MPCALL_PARENT=39 +-MFCALL=40 +-MFCALL_LIB=41 +-MFCALL_LIB_RETNEW=42 +-MFCALL_PARENT=43 +-MFCALL_PARENT_LIB=44 +-MFCALL_PARENT_LIB_RETNEW=45 +-NOP=46 +-NSTRUC=47 +-NSTRUC_REF=48 +-ON_IOERROR_NULL=49 +-PCALL=50 +-PCALL_LIB=51 +-PARADECL=52 +-PARAEXPR=53 +-POSTDEC=54 +-POSTINC=55 +-DECSTATEMENT=56 +-INCSTATEMENT=57 +-REF=58 +-REF_CHECK=59 +-REF_EXPR=60 +-RETURN=61 +-RETF=62 +-RETP=63 +-STRUC=64 +-SYSVAR=65 +-UMINUS=66 +-VAR=67 +-VARPTR=68 +-IDENTIFIER=69 +-AND_OP="and"=70 +-BEGIN="begin"=71 +-CASE="case"=72 +-COMMON="common"=73 +-COMPILE_OPT="compile_opt"=74 +-DO="do"=75 +-ELSE="else"=76 +-END="end"=77 +-ENDCASE="endcase"=78 +-ENDELSE="endelse"=79 +-ENDFOR="endfor"=80 +-ENDIF="endif"=81 +-ENDREP="endrep"=82 +-ENDSWITCH="endswitch"=83 +-ENDWHILE="endwhile"=84 +-EQ_OP="eq"=85 +-FOR="for"=86 +-FORWARD="forward_function"=87 +-FUNCTION="function"=88 +-GE_OP="ge"=89 +-GOTO="goto"=90 +-GT_OP="gt"=91 +-IF="if"=92 +-INHERITS="inherits"=93 +-LE_OP="le"=94 +-LT_OP="lt"=95 +-MOD_OP="mod"=96 +-NE_OP="ne"=97 +-NOT_OP="not"=98 +-OF="of"=99 +-ON_IOERROR="on_ioerror"=100 +-OR_OP="or"=101 +-PRO="pro"=102 +-REPEAT="repeat"=103 +-SWITCH="switch"=104 +-THEN="then"=105 +-UNTIL="until"=106 +-WHILE="while"=107 +-XOR_OP="xor"=108 +-METHOD=109 +-COMMA=110 +-COLON=111 +-END_U=112 +-EQUAL=113 +-DEC=114 +-INC=115 +-AND_OP_EQ=116 +-ASTERIX_EQ=117 +-EQ_OP_EQ=118 +-GE_OP_EQ=119 +-GTMARK_EQ=120 +-GT_OP_EQ=121 +-LE_OP_EQ=122 +-LTMARK_EQ=123 +-LT_OP_EQ=124 +-MATRIX_OP1_EQ=125 +-MATRIX_OP2_EQ=126 +-MINUS_EQ=127 +-MOD_OP_EQ=128 +-NE_OP_EQ=129 +-OR_OP_EQ=130 +-PLUS_EQ=131 +-POW_EQ=132 +-SLASH_EQ=133 +-XOR_OP_EQ=134 +-MEMBER=135 +-LBRACE=136 +-RBRACE=137 +-SLASH=138 +-LSQUARE=139 +-RSQUARE=140 +-SYSVARNAME=141 +-EXCLAMATION=142 +-LCURLY=143 +-RCURLY=144 +-CONSTANT_HEX_BYTE=145 +-CONSTANT_HEX_LONG=146 +-CONSTANT_HEX_LONG64=147 +-CONSTANT_HEX_INT=148 +-CONSTANT_HEX_I=149 +-CONSTANT_HEX_ULONG=150 +-CONSTANT_HEX_ULONG64=151 +-CONSTANT_HEX_UI=152 +-CONSTANT_HEX_UINT=153 +-CONSTANT_BYTE=154 +-CONSTANT_LONG=155 +-CONSTANT_LONG64=156 +-CONSTANT_INT=157 +-CONSTANT_I=158 +-CONSTANT_ULONG=159 +-CONSTANT_ULONG64=160 +-CONSTANT_UI=161 +-CONSTANT_UINT=162 +-CONSTANT_OCT_BYTE=163 +-CONSTANT_OCT_LONG=164 +-CONSTANT_OCT_LONG64=165 +-CONSTANT_OCT_INT=166 +-CONSTANT_OCT_I=167 +-CONSTANT_OCT_ULONG=168 +-CONSTANT_OCT_ULONG64=169 +-CONSTANT_OCT_UI=170 +-CONSTANT_OCT_UINT=171 +-CONSTANT_FLOAT=172 +-CONSTANT_DOUBLE=173 +-CONSTANT_BIN_BYTE=174 +-CONSTANT_BIN_LONG=175 +-CONSTANT_BIN_LONG64=176 +-CONSTANT_BIN_INT=177 +-CONSTANT_BIN_I=178 +-CONSTANT_BIN_ULONG=179 +-CONSTANT_BIN_ULONG64=180 +-CONSTANT_BIN_UI=181 +-CONSTANT_BIN_UINT=182 +-ASTERIX=183 +-DOT=184 +-STRING_LITERAL=185 +-POW=186 +-MATRIX_OP1=187 +-MATRIX_OP2=188 +-PLUS=189 +-MINUS=190 +-LTMARK=191 +-GTMARK=192 +-LOG_NEG=193 +-LOG_AND=194 +-LOG_OR=195 +-QUESTION=196 +-STRING=197 +-INCLUDE=198 +-EOL=199 +-W=200 +-D=201 +-L=202 +-H=203 +-O=204 +-B=205 +-EXP=206 +-DBL_E=207 +-DBL=208 +-CONSTANT_OR_STRING_LITERAL=209 +-COMMENT=210 +-END_MARKER=211 +-WHITESPACE=212 +-SKIP_LINES=213 +-CONT_STATEMENT=214 +-END_OF_LINE=215 ++ASSIGN_ARRAYEXPR_MFCALL=8 ++ARRAYDEF=9 ++ARRAYDEF_CONST=10 ++ARRAYIX=11 ++ARRAYIX_ALL=12 ++ARRAYIX_ORANGE=13 ++ARRAYIX_RANGE=14 ++ARRAYIX_ORANGE_S=15 ++ARRAYIX_RANGE_S=16 ++ARRAYEXPR=17 ++ARRAYEXPR_FN=18 ++ARRAYEXPR_MFCALL=19 ++BLOCK=20 ++BREAK=21 ++CSBLOCK=22 ++CONTINUE=23 ++COMMONDECL=24 ++COMMONDEF=25 ++CONSTANT=26 ++DEREF=27 ++ELSEBLK=28 ++EXPR=29 ++FOR="for"=30 ++FOR_STEP=31 ++FOREACH="foreach"=32 ++FOR_LOOP=33 ++FOR_STEP_LOOP=34 ++FOREACH_LOOP=35 ++FCALL=36 ++FCALL_LIB=37 ++FCALL_LIB_RETNEW=38 ++IF_ELSE=39 ++KEYDECL=40 ++KEYDEF=41 ++KEYDEF_REF=42 ++KEYDEF_REF_CHECK=43 ++KEYDEF_REF_EXPR=44 ++LABEL=45 ++MPCALL=46 ++MPCALL_PARENT=47 ++MFCALL=48 ++MFCALL_LIB=49 ++MFCALL_LIB_RETNEW=50 ++MFCALL_PARENT=51 ++MFCALL_PARENT_LIB=52 ++MFCALL_PARENT_LIB_RETNEW=53 ++NOP=54 ++NSTRUC=55 ++NSTRUC_REF=56 ++ON_IOERROR_NULL=57 ++PCALL=58 ++PCALL_LIB=59 ++PARADECL=60 ++PARAEXPR=61 ++POSTDEC=62 ++POSTINC=63 ++DECSTATEMENT=64 ++INCSTATEMENT=65 ++REF=66 ++REF_CHECK=67 ++REF_EXPR=68 ++REPEAT="repeat"=69 ++REPEAT_LOOP=70 ++RETURN=71 ++RETF=72 ++RETP=73 ++STRUC=74 ++SYSVAR=75 ++UMINUS=76 ++VAR=77 ++VARPTR=78 ++WHILE="while"=79 ++IDENTIFIER=80 ++AND_OP="and"=81 ++BEGIN="begin"=82 ++CASE="case"=83 ++COMMON="common"=84 ++COMPILE_OPT="compile_opt"=85 ++DO="do"=86 ++ELSE="else"=87 ++END="end"=88 ++ENDCASE="endcase"=89 ++ENDELSE="endelse"=90 ++ENDFOR="endfor"=91 ++ENDFOREACH="endforeach"=92 ++ENDIF="endif"=93 ++ENDREP="endrep"=94 ++ENDSWITCH="endswitch"=95 ++ENDWHILE="endwhile"=96 ++EQ_OP="eq"=97 ++FORWARD="forward_function"=98 ++FUNCTION="function"=99 ++GE_OP="ge"=100 ++GOTO="goto"=101 ++GT_OP="gt"=102 ++IF="if"=103 ++INHERITS="inherits"=104 ++LE_OP="le"=105 ++LT_OP="lt"=106 ++MOD_OP="mod"=107 ++NE_OP="ne"=108 ++NOT_OP="not"=109 ++OF="of"=110 ++ON_IOERROR="on_ioerror"=111 ++OR_OP="or"=112 ++PRO="pro"=113 ++SWITCH="switch"=114 ++THEN="then"=115 ++UNTIL="until"=116 ++XOR_OP="xor"=117 ++METHOD=118 ++COMMA=119 ++COLON=120 ++END_U=121 ++EQUAL=122 ++DEC=123 ++INC=124 ++AND_OP_EQ=125 ++ASTERIX_EQ=126 ++EQ_OP_EQ=127 ++GE_OP_EQ=128 ++GTMARK_EQ=129 ++GT_OP_EQ=130 ++LE_OP_EQ=131 ++LTMARK_EQ=132 ++LT_OP_EQ=133 ++MATRIX_OP1_EQ=134 ++MATRIX_OP2_EQ=135 ++MINUS_EQ=136 ++MOD_OP_EQ=137 ++NE_OP_EQ=138 ++OR_OP_EQ=139 ++PLUS_EQ=140 ++POW_EQ=141 ++SLASH_EQ=142 ++XOR_OP_EQ=143 ++MEMBER=144 ++LBRACE=145 ++RBRACE=146 ++SLASH=147 ++LSQUARE=148 ++RSQUARE=149 ++SYSVARNAME=150 ++EXCLAMATION=151 ++LCURLY=152 ++RCURLY=153 ++CONSTANT_HEX_BYTE=154 ++CONSTANT_HEX_LONG=155 ++CONSTANT_HEX_LONG64=156 ++CONSTANT_HEX_INT=157 ++CONSTANT_HEX_I=158 ++CONSTANT_HEX_ULONG=159 ++CONSTANT_HEX_ULONG64=160 ++CONSTANT_HEX_UI=161 ++CONSTANT_HEX_UINT=162 ++CONSTANT_BYTE=163 ++CONSTANT_LONG=164 ++CONSTANT_LONG64=165 ++CONSTANT_INT=166 ++CONSTANT_I=167 ++CONSTANT_ULONG=168 ++CONSTANT_ULONG64=169 ++CONSTANT_UI=170 ++CONSTANT_UINT=171 ++CONSTANT_OCT_BYTE=172 ++CONSTANT_OCT_LONG=173 ++CONSTANT_OCT_LONG64=174 ++CONSTANT_OCT_INT=175 ++CONSTANT_OCT_I=176 ++CONSTANT_OCT_ULONG=177 ++CONSTANT_OCT_ULONG64=178 ++CONSTANT_OCT_UI=179 ++CONSTANT_OCT_UINT=180 ++CONSTANT_FLOAT=181 ++CONSTANT_DOUBLE=182 ++CONSTANT_BIN_BYTE=183 ++CONSTANT_BIN_LONG=184 ++CONSTANT_BIN_LONG64=185 ++CONSTANT_BIN_INT=186 ++CONSTANT_BIN_I=187 ++CONSTANT_BIN_ULONG=188 ++CONSTANT_BIN_ULONG64=189 ++CONSTANT_BIN_UI=190 ++CONSTANT_BIN_UINT=191 ++ASTERIX=192 ++DOT=193 ++STRING_LITERAL=194 ++POW=195 ++MATRIX_OP1=196 ++MATRIX_OP2=197 ++PLUS=198 ++MINUS=199 ++LTMARK=200 ++GTMARK=201 ++LOG_NEG=202 ++LOG_AND=203 ++LOG_OR=204 ++QUESTION=205 ++STRING=206 ++INCLUDE=207 ++EOL=208 ++W=209 ++D=210 ++L=211 ++H=212 ++O=213 ++B=214 ++EXP=215 ++DBL_E=216 ++DBL=217 ++CONSTANT_OR_STRING_LITERAL=218 ++COMMENT=219 ++END_MARKER=220 ++WHITESPACE=221 ++SKIP_LINES=222 ++CONT_STATEMENT=223 ++END_OF_LINE=224 +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLTreeParser.cpp cvs/gdl/src/GDLTreeParser.cpp +--- gdl-0.9rc4/src/GDLTreeParser.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLTreeParser.cpp 2010-04-22 09:50:40.000000000 -0600 +@@ -103,20 +103,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -254,21 +255,22 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: + case PARADECL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -319,20 +321,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -373,20 +376,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -491,21 +495,22 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: + case PARADECL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -556,20 +561,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -610,20 +616,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -825,7 +832,7 @@ + RefDNode statement_list_AST = RefDNode(antlr::nullAST); + + { // ( ... )+ +- int _cnt54=0; ++ int _cnt57=0; + for (;;) { + if (_t == RefDNode(antlr::nullAST) ) + _t = ASTNULL; +@@ -836,19 +843,20 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -885,12 +893,12 @@ + } + default: + { +- if ( _cnt54>=1 ) { goto _loop54; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt57>=1 ) { goto _loop57; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + } +- _cnt54++; ++ _cnt57++; + } +- _loop54:; ++ _loop57:; + } // ( ... )+ + statement_list_AST = RefDNode(currentAST.root); + returnAST = statement_list_AST; +@@ -1007,6 +1015,14 @@ + statement_AST = RefDNode(currentAST.root); + break; + } ++ case FOREACH: ++ { ++ foreach_statement(_t); ++ _t = _retTree; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ statement_AST = RefDNode(currentAST.root); ++ break; ++ } + case REPEAT: + { + repeat_statement(_t); +@@ -1084,13 +1100,13 @@ + } + case DEC: + { +- RefDNode __t56 = _t; ++ RefDNode __t59 = _t; + RefDNode tmp6_AST = RefDNode(antlr::nullAST); + RefDNode tmp6_AST_in = RefDNode(antlr::nullAST); + tmp6_AST = astFactory->create(antlr::RefAST(_t)); + tmp6_AST_in = _t; + astFactory->addASTChild(currentAST, antlr::RefAST(tmp6_AST)); +- antlr::ASTPair __currentAST56 = currentAST; ++ antlr::ASTPair __currentAST59 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),DEC); +@@ -1098,21 +1114,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST56; +- _t = __t56; ++ currentAST = __currentAST59; ++ _t = __t59; + _t = _t->getNextSibling(); + statement_AST = RefDNode(currentAST.root); + break; + } + case INC: + { +- RefDNode __t57 = _t; ++ RefDNode __t60 = _t; + RefDNode tmp7_AST = RefDNode(antlr::nullAST); + RefDNode tmp7_AST_in = RefDNode(antlr::nullAST); + tmp7_AST = astFactory->create(antlr::RefAST(_t)); + tmp7_AST_in = _t; + astFactory->addASTChild(currentAST, antlr::RefAST(tmp7_AST)); +- antlr::ASTPair __currentAST57 = currentAST; ++ antlr::ASTPair __currentAST60 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),INC); +@@ -1120,8 +1136,8 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST57; +- _t = __t57; ++ currentAST = __currentAST60; ++ _t = __t60; + _t = _t->getNextSibling(); + statement_AST = RefDNode(currentAST.root); + break; +@@ -1262,6 +1278,8 @@ + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode caseswitch_body_AST = RefDNode(antlr::nullAST); ++ RefDNode b = RefDNode(antlr::nullAST); ++ RefDNode b_AST = RefDNode(antlr::nullAST); + + if (_t == RefDNode(antlr::nullAST) ) + _t = ASTNULL; +@@ -1269,16 +1287,16 @@ + case BLOCK: + { + RefDNode __t34 = _t; +- RefDNode tmp12_AST = RefDNode(antlr::nullAST); +- RefDNode tmp12_AST_in = RefDNode(antlr::nullAST); +- tmp12_AST = astFactory->create(antlr::RefAST(_t)); +- tmp12_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp12_AST)); ++ b = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode b_AST_in = RefDNode(antlr::nullAST); ++ b_AST = astFactory->create(antlr::RefAST(b)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(b_AST)); + antlr::ASTPair __currentAST34 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),BLOCK); + _t = _t->getFirstChild(); ++ b_AST->setType(CSBLOCK);b_AST->setText("csblock"); + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +@@ -1292,20 +1310,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -1352,11 +1371,11 @@ + case ELSEBLK: + { + RefDNode __t36 = _t; +- RefDNode tmp13_AST = RefDNode(antlr::nullAST); +- RefDNode tmp13_AST_in = RefDNode(antlr::nullAST); +- tmp13_AST = astFactory->create(antlr::RefAST(_t)); +- tmp13_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp13_AST)); ++ RefDNode tmp12_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp12_AST_in = RefDNode(antlr::nullAST); ++ tmp12_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp12_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp12_AST)); + antlr::ASTPair __currentAST36 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); +@@ -1372,20 +1391,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -1460,13 +1480,13 @@ + } + case DOT: + { +- RefDNode __t199 = _t; +- RefDNode tmp14_AST = RefDNode(antlr::nullAST); +- RefDNode tmp14_AST_in = RefDNode(antlr::nullAST); +- tmp14_AST = astFactory->create(antlr::RefAST(_t)); +- tmp14_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp14_AST)); +- antlr::ASTPair __currentAST199 = currentAST; ++ RefDNode __t206 = _t; ++ RefDNode tmp13_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp13_AST_in = RefDNode(antlr::nullAST); ++ tmp13_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp13_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp13_AST)); ++ antlr::ASTPair __currentAST206 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),DOT); +@@ -1475,7 +1495,7 @@ + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + { // ( ... )+ +- int _cnt201=0; ++ int _cnt208=0; + for (;;) { + if (_t == RefDNode(antlr::nullAST) ) + _t = ASTNULL; +@@ -1485,28 +1505,28 @@ + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + else { +- if ( _cnt201>=1 ) { goto _loop201; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt208>=1 ) { goto _loop208; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + +- _cnt201++; ++ _cnt208++; + } +- _loop201:; ++ _loop208:; + } // ( ... )+ +- currentAST = __currentAST199; +- _t = __t199; ++ currentAST = __currentAST206; ++ _t = __t206; + _t = _t->getNextSibling(); + expr_AST = RefDNode(currentAST.root); + break; + } + case DEREF: + { +- RefDNode __t202 = _t; +- RefDNode tmp15_AST = RefDNode(antlr::nullAST); +- RefDNode tmp15_AST_in = RefDNode(antlr::nullAST); +- tmp15_AST = astFactory->create(antlr::RefAST(_t)); +- tmp15_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp15_AST)); +- antlr::ASTPair __currentAST202 = currentAST; ++ RefDNode __t209 = _t; ++ RefDNode tmp14_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp14_AST_in = RefDNode(antlr::nullAST); ++ tmp14_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp14_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp14_AST)); ++ antlr::ASTPair __currentAST209 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),DEREF); +@@ -1514,8 +1534,8 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST202; +- _t = __t202; ++ currentAST = __currentAST209; ++ _t = __t209; + _t = _t->getNextSibling(); + expr_AST = RefDNode(currentAST.root); + break; +@@ -1524,6 +1544,7 @@ + case ARRAYDEF: + case ARRAYDEF_CONST: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case FCALL: + case MFCALL: +@@ -1701,13 +1722,17 @@ + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode block_AST = RefDNode(antlr::nullAST); ++ RefDNode b = RefDNode(antlr::nullAST); ++ RefDNode b_AST = RefDNode(antlr::nullAST); ++ ++ // int labelStart = comp.NDefLabel(); ++ + + RefDNode __t47 = _t; +- RefDNode tmp16_AST = RefDNode(antlr::nullAST); +- RefDNode tmp16_AST_in = RefDNode(antlr::nullAST); +- tmp16_AST = astFactory->create(antlr::RefAST(_t)); +- tmp16_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp16_AST)); ++ b = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode b_AST_in = RefDNode(antlr::nullAST); ++ b_AST = astFactory->create(antlr::RefAST(b)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(b_AST)); + antlr::ASTPair __currentAST47 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); +@@ -1723,20 +1748,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -1777,6 +1803,9 @@ + currentAST = __currentAST47; + _t = __t47; + _t = _t->getNextSibling(); ++ ++ // #b->SetLabelRange( labelStart, comp.NDefLabel()); ++ + block_AST = RefDNode(currentAST.root); + returnAST = block_AST; + _retTree = _t; +@@ -1787,14 +1816,15 @@ + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode unblock_AST = RefDNode(antlr::nullAST); ++ RefDNode b = RefDNode(antlr::nullAST); ++ RefDNode b_AST = RefDNode(antlr::nullAST); + RefDNode s_AST = RefDNode(antlr::nullAST); + RefDNode s = RefDNode(antlr::nullAST); + + RefDNode __t50 = _t; +- RefDNode tmp17_AST = RefDNode(antlr::nullAST); +- RefDNode tmp17_AST_in = RefDNode(antlr::nullAST); +- tmp17_AST = astFactory->create(antlr::RefAST(_t)); +- tmp17_AST_in = _t; ++ b = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode b_AST_in = RefDNode(antlr::nullAST); ++ b_AST = astFactory->create(antlr::RefAST(b)); + antlr::ASTPair __currentAST50 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); +@@ -1810,20 +1840,21 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case IDENTIFIER: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -1863,6 +1894,15 @@ + } + case 3: + { ++ unblock_AST = RefDNode(currentAST.root); ++ unblock_AST = b_AST; ++ currentAST.root = unblock_AST; ++ if ( unblock_AST!=RefDNode(antlr::nullAST) && ++ unblock_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = unblock_AST->getFirstChild(); ++ else ++ currentAST.child = unblock_AST; ++ currentAST.advanceChildToEnd(); + break; + } + default: +@@ -1878,6 +1918,104 @@ + _retTree = _t; + } + ++void GDLTreeParser::unblock_empty(RefDNode _t) { ++ RefDNode unblock_empty_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode unblock_empty_AST = RefDNode(antlr::nullAST); ++ RefDNode b = RefDNode(antlr::nullAST); ++ RefDNode b_AST = RefDNode(antlr::nullAST); ++ RefDNode s_AST = RefDNode(antlr::nullAST); ++ RefDNode s = RefDNode(antlr::nullAST); ++ ++ RefDNode __t53 = _t; ++ b = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode b_AST_in = RefDNode(antlr::nullAST); ++ b_AST = astFactory->create(antlr::RefAST(b)); ++ antlr::ASTPair __currentAST53 = currentAST; ++ currentAST.root = currentAST.child; ++ currentAST.child = RefDNode(antlr::nullAST); ++ match(antlr::RefAST(_t),BLOCK); ++ _t = _t->getFirstChild(); ++ { ++ if (_t == RefDNode(antlr::nullAST) ) ++ _t = ASTNULL; ++ switch ( _t->getType()) { ++ case ASSIGN: ++ case BLOCK: ++ case BREAK: ++ case CONTINUE: ++ case COMMONDECL: ++ case COMMONDEF: ++ case FOR: ++ case FOREACH: ++ case MPCALL: ++ case MPCALL_PARENT: ++ case PCALL: ++ case REPEAT: ++ case RETURN: ++ case WHILE: ++ case IDENTIFIER: ++ case CASE: ++ case FORWARD: ++ case GOTO: ++ case IF: ++ case ON_IOERROR: ++ case SWITCH: ++ case DEC: ++ case INC: ++ case AND_OP_EQ: ++ case ASTERIX_EQ: ++ case EQ_OP_EQ: ++ case GE_OP_EQ: ++ case GTMARK_EQ: ++ case GT_OP_EQ: ++ case LE_OP_EQ: ++ case LTMARK_EQ: ++ case LT_OP_EQ: ++ case MATRIX_OP1_EQ: ++ case MATRIX_OP2_EQ: ++ case MINUS_EQ: ++ case MOD_OP_EQ: ++ case NE_OP_EQ: ++ case OR_OP_EQ: ++ case PLUS_EQ: ++ case POW_EQ: ++ case SLASH_EQ: ++ case XOR_OP_EQ: ++ { ++ s = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t; ++ statement_list(_t); ++ _t = _retTree; ++ s_AST = returnAST; ++ unblock_empty_AST = RefDNode(currentAST.root); ++ unblock_empty_AST = s_AST; ++ currentAST.root = unblock_empty_AST; ++ if ( unblock_empty_AST!=RefDNode(antlr::nullAST) && ++ unblock_empty_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = unblock_empty_AST->getFirstChild(); ++ else ++ currentAST.child = unblock_empty_AST; ++ currentAST.advanceChildToEnd(); ++ break; ++ } ++ case 3: ++ { ++ break; ++ } ++ default: ++ { ++ throw antlr::NoViableAltException(antlr::RefAST(_t)); ++ } ++ } ++ } ++ currentAST = __currentAST53; ++ _t = __t53; ++ _t = _t->getNextSibling(); ++ returnAST = unblock_empty_AST; ++ _retTree = _t; ++} ++ + void GDLTreeParser::label(RefDNode _t) { + RefDNode label_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + returnAST = RefDNode(antlr::nullAST); +@@ -1886,23 +2024,23 @@ + RefDNode i = RefDNode(antlr::nullAST); + RefDNode i_AST = RefDNode(antlr::nullAST); + +- RefDNode __t66 = _t; ++ RefDNode __t71 = _t; + i = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode i_AST_in = RefDNode(antlr::nullAST); + i_AST = astFactory->create(antlr::RefAST(i)); +- antlr::ASTPair __currentAST66 = currentAST; ++ antlr::ASTPair __currentAST71 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getFirstChild(); +- RefDNode tmp18_AST = RefDNode(antlr::nullAST); +- RefDNode tmp18_AST_in = RefDNode(antlr::nullAST); +- tmp18_AST = astFactory->create(antlr::RefAST(_t)); +- tmp18_AST_in = _t; ++ RefDNode tmp15_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp15_AST_in = RefDNode(antlr::nullAST); ++ tmp15_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp15_AST_in = _t; + match(antlr::RefAST(_t),COLON); + _t = _t->getNextSibling(); +- currentAST = __currentAST66; +- _t = __t66; ++ currentAST = __currentAST71; ++ _t = __t71; + _t = _t->getNextSibling(); + label_AST = RefDNode(currentAST.root); + +@@ -1933,11 +2071,11 @@ + RefDNode r_AST = RefDNode(antlr::nullAST); + RefDNode r = RefDNode(antlr::nullAST); + +- RefDNode __t116 = _t; ++ RefDNode __t121 = _t; + a = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a_AST_in = RefDNode(antlr::nullAST); + a_AST = astFactory->create(antlr::RefAST(a)); +- antlr::ASTPair __currentAST116 = currentAST; ++ antlr::ASTPair __currentAST121 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ASSIGN); +@@ -1950,8 +2088,8 @@ + expr(_t); + _t = _retTree; + r_AST = returnAST; +- currentAST = __currentAST116; +- _t = __t116; ++ currentAST = __currentAST121; ++ _t = __t121; + _t = _t->getNextSibling(); + assign_expr_statement_AST = RefDNode(currentAST.root); + +@@ -2108,11 +2246,11 @@ + switch ( _t->getType()) { + case AND_OP_EQ: + { +- RefDNode __t119 = _t; ++ RefDNode __t124 = _t; + a1 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a1_AST_in = RefDNode(antlr::nullAST); + a1_AST = astFactory->create(antlr::RefAST(a1)); +- antlr::ASTPair __currentAST119 = currentAST; ++ antlr::ASTPair __currentAST124 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),AND_OP_EQ); +@@ -2125,8 +2263,8 @@ + expr(_t); + _t = _retTree; + r1_AST = returnAST; +- currentAST = __currentAST119; +- _t = __t119; ++ currentAST = __currentAST124; ++ _t = __t124; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l1_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(AND_OP,"and")))->add(antlr::RefAST(l1_AST))->add(antlr::RefAST(r1_AST))))))->add(antlr::RefAST(RemoveNextSibling(l1_AST))))); +@@ -2141,11 +2279,11 @@ + } + case ASTERIX_EQ: + { +- RefDNode __t120 = _t; ++ RefDNode __t125 = _t; + a2 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a2_AST_in = RefDNode(antlr::nullAST); + a2_AST = astFactory->create(antlr::RefAST(a2)); +- antlr::ASTPair __currentAST120 = currentAST; ++ antlr::ASTPair __currentAST125 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ASTERIX_EQ); +@@ -2158,8 +2296,8 @@ + expr(_t); + _t = _retTree; + r2_AST = returnAST; +- currentAST = __currentAST120; +- _t = __t120; ++ currentAST = __currentAST125; ++ _t = __t125; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l2_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASTERIX,"*")))->add(antlr::RefAST(l2_AST))->add(antlr::RefAST(r2_AST))))))->add(antlr::RefAST(RemoveNextSibling(l2_AST))))); +@@ -2174,11 +2312,11 @@ + } + case EQ_OP_EQ: + { +- RefDNode __t121 = _t; ++ RefDNode __t126 = _t; + a3 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a3_AST_in = RefDNode(antlr::nullAST); + a3_AST = astFactory->create(antlr::RefAST(a3)); +- antlr::ASTPair __currentAST121 = currentAST; ++ antlr::ASTPair __currentAST126 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),EQ_OP_EQ); +@@ -2191,8 +2329,8 @@ + expr(_t); + _t = _retTree; + r3_AST = returnAST; +- currentAST = __currentAST121; +- _t = __t121; ++ currentAST = __currentAST126; ++ _t = __t126; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l3_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(EQ_OP,"eq")))->add(antlr::RefAST(l3_AST))->add(antlr::RefAST(r3_AST))))))->add(antlr::RefAST(RemoveNextSibling(l3_AST))))); +@@ -2207,11 +2345,11 @@ + } + case GE_OP_EQ: + { +- RefDNode __t122 = _t; ++ RefDNode __t127 = _t; + a4 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a4_AST_in = RefDNode(antlr::nullAST); + a4_AST = astFactory->create(antlr::RefAST(a4)); +- antlr::ASTPair __currentAST122 = currentAST; ++ antlr::ASTPair __currentAST127 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),GE_OP_EQ); +@@ -2224,8 +2362,8 @@ + expr(_t); + _t = _retTree; + r4_AST = returnAST; +- currentAST = __currentAST122; +- _t = __t122; ++ currentAST = __currentAST127; ++ _t = __t127; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l4_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(GE_OP,"ge")))->add(antlr::RefAST(l4_AST))->add(antlr::RefAST(r4_AST))))))->add(antlr::RefAST(RemoveNextSibling(l4_AST))))); +@@ -2240,11 +2378,11 @@ + } + case GTMARK_EQ: + { +- RefDNode __t123 = _t; ++ RefDNode __t128 = _t; + a5 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a5_AST_in = RefDNode(antlr::nullAST); + a5_AST = astFactory->create(antlr::RefAST(a5)); +- antlr::ASTPair __currentAST123 = currentAST; ++ antlr::ASTPair __currentAST128 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),GTMARK_EQ); +@@ -2257,8 +2395,8 @@ + expr(_t); + _t = _retTree; + r5_AST = returnAST; +- currentAST = __currentAST123; +- _t = __t123; ++ currentAST = __currentAST128; ++ _t = __t128; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l5_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(GTMARK,">")))->add(antlr::RefAST(l5_AST))->add(antlr::RefAST(r5_AST))))))->add(antlr::RefAST(RemoveNextSibling(l5_AST))))); +@@ -2273,11 +2411,11 @@ + } + case GT_OP_EQ: + { +- RefDNode __t124 = _t; ++ RefDNode __t129 = _t; + a6 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a6_AST_in = RefDNode(antlr::nullAST); + a6_AST = astFactory->create(antlr::RefAST(a6)); +- antlr::ASTPair __currentAST124 = currentAST; ++ antlr::ASTPair __currentAST129 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),GT_OP_EQ); +@@ -2290,8 +2428,8 @@ + expr(_t); + _t = _retTree; + r6_AST = returnAST; +- currentAST = __currentAST124; +- _t = __t124; ++ currentAST = __currentAST129; ++ _t = __t129; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l6_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(GT_OP,"gt")))->add(antlr::RefAST(l6_AST))->add(antlr::RefAST(r6_AST))))))->add(antlr::RefAST(RemoveNextSibling(l6_AST))))); +@@ -2306,11 +2444,11 @@ + } + case LE_OP_EQ: + { +- RefDNode __t125 = _t; ++ RefDNode __t130 = _t; + a7 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a7_AST_in = RefDNode(antlr::nullAST); + a7_AST = astFactory->create(antlr::RefAST(a7)); +- antlr::ASTPair __currentAST125 = currentAST; ++ antlr::ASTPair __currentAST130 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LE_OP_EQ); +@@ -2323,8 +2461,8 @@ + expr(_t); + _t = _retTree; + r7_AST = returnAST; +- currentAST = __currentAST125; +- _t = __t125; ++ currentAST = __currentAST130; ++ _t = __t130; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l7_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(LE_OP,"le")))->add(antlr::RefAST(l7_AST))->add(antlr::RefAST(r7_AST))))))->add(antlr::RefAST(RemoveNextSibling(l7_AST))))); +@@ -2339,11 +2477,11 @@ + } + case LTMARK_EQ: + { +- RefDNode __t126 = _t; ++ RefDNode __t131 = _t; + a8 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a8_AST_in = RefDNode(antlr::nullAST); + a8_AST = astFactory->create(antlr::RefAST(a8)); +- antlr::ASTPair __currentAST126 = currentAST; ++ antlr::ASTPair __currentAST131 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LTMARK_EQ); +@@ -2356,8 +2494,8 @@ + expr(_t); + _t = _retTree; + r8_AST = returnAST; +- currentAST = __currentAST126; +- _t = __t126; ++ currentAST = __currentAST131; ++ _t = __t131; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l8_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(LTMARK,"<")))->add(antlr::RefAST(l8_AST))->add(antlr::RefAST(r8_AST))))))->add(antlr::RefAST(RemoveNextSibling(l8_AST))))); +@@ -2372,11 +2510,11 @@ + } + case LT_OP_EQ: + { +- RefDNode __t127 = _t; ++ RefDNode __t132 = _t; + a9 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a9_AST_in = RefDNode(antlr::nullAST); + a9_AST = astFactory->create(antlr::RefAST(a9)); +- antlr::ASTPair __currentAST127 = currentAST; ++ antlr::ASTPair __currentAST132 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LT_OP_EQ); +@@ -2389,8 +2527,8 @@ + expr(_t); + _t = _retTree; + r9_AST = returnAST; +- currentAST = __currentAST127; +- _t = __t127; ++ currentAST = __currentAST132; ++ _t = __t132; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l9_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(LT_OP,"lt")))->add(antlr::RefAST(l9_AST))->add(antlr::RefAST(r9_AST))))))->add(antlr::RefAST(RemoveNextSibling(l9_AST))))); +@@ -2405,11 +2543,11 @@ + } + case MATRIX_OP1_EQ: + { +- RefDNode __t128 = _t; ++ RefDNode __t133 = _t; + a10 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a10_AST_in = RefDNode(antlr::nullAST); + a10_AST = astFactory->create(antlr::RefAST(a10)); +- antlr::ASTPair __currentAST128 = currentAST; ++ antlr::ASTPair __currentAST133 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MATRIX_OP1_EQ); +@@ -2422,8 +2560,8 @@ + expr(_t); + _t = _retTree; + r10_AST = returnAST; +- currentAST = __currentAST128; +- _t = __t128; ++ currentAST = __currentAST133; ++ _t = __t133; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l10_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MATRIX_OP1,"#")))->add(antlr::RefAST(l10_AST))->add(antlr::RefAST(r10_AST))))))->add(antlr::RefAST(RemoveNextSibling(l10_AST))))); +@@ -2438,11 +2576,11 @@ + } + case MATRIX_OP2_EQ: + { +- RefDNode __t129 = _t; ++ RefDNode __t134 = _t; + a11 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a11_AST_in = RefDNode(antlr::nullAST); + a11_AST = astFactory->create(antlr::RefAST(a11)); +- antlr::ASTPair __currentAST129 = currentAST; ++ antlr::ASTPair __currentAST134 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MATRIX_OP2_EQ); +@@ -2455,8 +2593,8 @@ + expr(_t); + _t = _retTree; + r11_AST = returnAST; +- currentAST = __currentAST129; +- _t = __t129; ++ currentAST = __currentAST134; ++ _t = __t134; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l11_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MATRIX_OP2,"##")))->add(antlr::RefAST(l11_AST))->add(antlr::RefAST(r11_AST))))))->add(antlr::RefAST(RemoveNextSibling(l11_AST))))); +@@ -2471,11 +2609,11 @@ + } + case MINUS_EQ: + { +- RefDNode __t130 = _t; ++ RefDNode __t135 = _t; + a12 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a12_AST_in = RefDNode(antlr::nullAST); + a12_AST = astFactory->create(antlr::RefAST(a12)); +- antlr::ASTPair __currentAST130 = currentAST; ++ antlr::ASTPair __currentAST135 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MINUS_EQ); +@@ -2488,8 +2626,8 @@ + expr(_t); + _t = _retTree; + r12_AST = returnAST; +- currentAST = __currentAST130; +- _t = __t130; ++ currentAST = __currentAST135; ++ _t = __t135; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l12_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MINUS,"-")))->add(antlr::RefAST(l12_AST))->add(antlr::RefAST(r12_AST))))))->add(antlr::RefAST(RemoveNextSibling(l12_AST))))); +@@ -2504,11 +2642,11 @@ + } + case MOD_OP_EQ: + { +- RefDNode __t131 = _t; ++ RefDNode __t136 = _t; + a13 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a13_AST_in = RefDNode(antlr::nullAST); + a13_AST = astFactory->create(antlr::RefAST(a13)); +- antlr::ASTPair __currentAST131 = currentAST; ++ antlr::ASTPair __currentAST136 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MOD_OP_EQ); +@@ -2521,8 +2659,8 @@ + expr(_t); + _t = _retTree; + r13_AST = returnAST; +- currentAST = __currentAST131; +- _t = __t131; ++ currentAST = __currentAST136; ++ _t = __t136; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l13_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(MOD_OP,"mod")))->add(antlr::RefAST(l13_AST))->add(antlr::RefAST(r13_AST))))))->add(antlr::RefAST(RemoveNextSibling(l13_AST))))); +@@ -2537,11 +2675,11 @@ + } + case NE_OP_EQ: + { +- RefDNode __t132 = _t; ++ RefDNode __t137 = _t; + a14 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a14_AST_in = RefDNode(antlr::nullAST); + a14_AST = astFactory->create(antlr::RefAST(a14)); +- antlr::ASTPair __currentAST132 = currentAST; ++ antlr::ASTPair __currentAST137 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),NE_OP_EQ); +@@ -2554,8 +2692,8 @@ + expr(_t); + _t = _retTree; + r14_AST = returnAST; +- currentAST = __currentAST132; +- _t = __t132; ++ currentAST = __currentAST137; ++ _t = __t137; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l14_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(NE_OP,"ne")))->add(antlr::RefAST(l14_AST))->add(antlr::RefAST(r14_AST))))))->add(antlr::RefAST(RemoveNextSibling(l14_AST))))); +@@ -2570,11 +2708,11 @@ + } + case OR_OP_EQ: + { +- RefDNode __t133 = _t; ++ RefDNode __t138 = _t; + a15 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a15_AST_in = RefDNode(antlr::nullAST); + a15_AST = astFactory->create(antlr::RefAST(a15)); +- antlr::ASTPair __currentAST133 = currentAST; ++ antlr::ASTPair __currentAST138 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),OR_OP_EQ); +@@ -2587,8 +2725,8 @@ + expr(_t); + _t = _retTree; + r15_AST = returnAST; +- currentAST = __currentAST133; +- _t = __t133; ++ currentAST = __currentAST138; ++ _t = __t138; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l15_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(OR_OP,"or")))->add(antlr::RefAST(l15_AST))->add(antlr::RefAST(r15_AST))))))->add(antlr::RefAST(RemoveNextSibling(l15_AST))))); +@@ -2603,11 +2741,11 @@ + } + case PLUS_EQ: + { +- RefDNode __t134 = _t; ++ RefDNode __t139 = _t; + a16 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a16_AST_in = RefDNode(antlr::nullAST); + a16_AST = astFactory->create(antlr::RefAST(a16)); +- antlr::ASTPair __currentAST134 = currentAST; ++ antlr::ASTPair __currentAST139 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),PLUS_EQ); +@@ -2620,8 +2758,8 @@ + expr(_t); + _t = _retTree; + r16_AST = returnAST; +- currentAST = __currentAST134; +- _t = __t134; ++ currentAST = __currentAST139; ++ _t = __t139; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l16_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(PLUS,"+")))->add(antlr::RefAST(l16_AST))->add(antlr::RefAST(r16_AST))))))->add(antlr::RefAST(RemoveNextSibling(l16_AST))))); +@@ -2636,11 +2774,11 @@ + } + case POW_EQ: + { +- RefDNode __t135 = _t; ++ RefDNode __t140 = _t; + a17 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a17_AST_in = RefDNode(antlr::nullAST); + a17_AST = astFactory->create(antlr::RefAST(a17)); +- antlr::ASTPair __currentAST135 = currentAST; ++ antlr::ASTPair __currentAST140 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),POW_EQ); +@@ -2653,8 +2791,8 @@ + expr(_t); + _t = _retTree; + r17_AST = returnAST; +- currentAST = __currentAST135; +- _t = __t135; ++ currentAST = __currentAST140; ++ _t = __t140; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l17_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(POW,"^")))->add(antlr::RefAST(l17_AST))->add(antlr::RefAST(r17_AST))))))->add(antlr::RefAST(RemoveNextSibling(l17_AST))))); +@@ -2669,11 +2807,11 @@ + } + case SLASH_EQ: + { +- RefDNode __t136 = _t; ++ RefDNode __t141 = _t; + a18 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a18_AST_in = RefDNode(antlr::nullAST); + a18_AST = astFactory->create(antlr::RefAST(a18)); +- antlr::ASTPair __currentAST136 = currentAST; ++ antlr::ASTPair __currentAST141 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),SLASH_EQ); +@@ -2686,8 +2824,8 @@ + expr(_t); + _t = _retTree; + r18_AST = returnAST; +- currentAST = __currentAST136; +- _t = __t136; ++ currentAST = __currentAST141; ++ _t = __t141; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l18_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(SLASH,"/")))->add(antlr::RefAST(l18_AST))->add(antlr::RefAST(r18_AST))))))->add(antlr::RefAST(RemoveNextSibling(l18_AST))))); +@@ -2702,11 +2840,11 @@ + } + case XOR_OP_EQ: + { +- RefDNode __t137 = _t; ++ RefDNode __t142 = _t; + a19 = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a19_AST_in = RefDNode(antlr::nullAST); + a19_AST = astFactory->create(antlr::RefAST(a19)); +- antlr::ASTPair __currentAST137 = currentAST; ++ antlr::ASTPair __currentAST142 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),XOR_OP_EQ); +@@ -2719,8 +2857,8 @@ + expr(_t); + _t = _retTree; + r19_AST = returnAST; +- currentAST = __currentAST137; +- _t = __t137; ++ currentAST = __currentAST142; ++ _t = __t142; + _t = _t->getNextSibling(); + comp_assign_expr_AST = RefDNode(currentAST.root); + l=l19_AST; comp_assign_expr_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ASSIGN,":=")))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(XOR_OP,"xor")))->add(antlr::RefAST(l19_AST))->add(antlr::RefAST(r19_AST))))))->add(antlr::RefAST(RemoveNextSibling(l19_AST))))); +@@ -2762,13 +2900,13 @@ + switch ( _t->getType()) { + case MPCALL: + { +- RefDNode __t76 = _t; +- RefDNode tmp19_AST = RefDNode(antlr::nullAST); +- RefDNode tmp19_AST_in = RefDNode(antlr::nullAST); +- tmp19_AST = astFactory->create(antlr::RefAST(_t)); +- tmp19_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp19_AST)); +- antlr::ASTPair __currentAST76 = currentAST; ++ RefDNode __t81 = _t; ++ RefDNode tmp16_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp16_AST_in = RefDNode(antlr::nullAST); ++ tmp16_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp16_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp16_AST)); ++ antlr::ASTPair __currentAST81 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MPCALL); +@@ -2776,31 +2914,31 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- RefDNode tmp20_AST = RefDNode(antlr::nullAST); +- RefDNode tmp20_AST_in = RefDNode(antlr::nullAST); +- tmp20_AST = astFactory->create(antlr::RefAST(_t)); +- tmp20_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp20_AST)); ++ RefDNode tmp17_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp17_AST_in = RefDNode(antlr::nullAST); ++ tmp17_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp17_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp17_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + parameter_def(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST76; +- _t = __t76; ++ currentAST = __currentAST81; ++ _t = __t81; + _t = _t->getNextSibling(); + procedure_call_AST = RefDNode(currentAST.root); + break; + } + case MPCALL_PARENT: + { +- RefDNode __t77 = _t; +- RefDNode tmp21_AST = RefDNode(antlr::nullAST); +- RefDNode tmp21_AST_in = RefDNode(antlr::nullAST); +- tmp21_AST = astFactory->create(antlr::RefAST(_t)); +- tmp21_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp21_AST)); +- antlr::ASTPair __currentAST77 = currentAST; ++ RefDNode __t82 = _t; ++ RefDNode tmp18_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp18_AST_in = RefDNode(antlr::nullAST); ++ tmp18_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp18_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp18_AST)); ++ antlr::ASTPair __currentAST82 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MPCALL_PARENT); +@@ -2808,37 +2946,37 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- RefDNode tmp22_AST = RefDNode(antlr::nullAST); +- RefDNode tmp22_AST_in = RefDNode(antlr::nullAST); +- tmp22_AST = astFactory->create(antlr::RefAST(_t)); +- tmp22_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp22_AST)); ++ RefDNode tmp19_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp19_AST_in = RefDNode(antlr::nullAST); ++ tmp19_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp19_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp19_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); +- RefDNode tmp23_AST = RefDNode(antlr::nullAST); +- RefDNode tmp23_AST_in = RefDNode(antlr::nullAST); +- tmp23_AST = astFactory->create(antlr::RefAST(_t)); +- tmp23_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp23_AST)); ++ RefDNode tmp20_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp20_AST_in = RefDNode(antlr::nullAST); ++ tmp20_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp20_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp20_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + parameter_def(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST77; +- _t = __t77; ++ currentAST = __currentAST82; ++ _t = __t82; + _t = _t->getNextSibling(); + procedure_call_AST = RefDNode(currentAST.root); + break; + } + case PCALL: + { +- RefDNode __t78 = _t; ++ RefDNode __t83 = _t; + p = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode p_AST_in = RefDNode(antlr::nullAST); + p_AST = astFactory->create(antlr::RefAST(p)); + astFactory->addASTChild(currentAST, antlr::RefAST(p_AST)); +- antlr::ASTPair __currentAST78 = currentAST; ++ antlr::ASTPair __currentAST83 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),PCALL); +@@ -2868,8 +3006,8 @@ + id_AST->SetProIx(i); + } + +- currentAST = __currentAST78; +- _t = __t78; ++ currentAST = __currentAST83; ++ _t = __t83; + _t = _t->getNextSibling(); + procedure_call_AST = RefDNode(currentAST.root); + break; +@@ -2897,12 +3035,12 @@ + int labelStart = comp.NDefLabel(); + + +- RefDNode __t63 = _t; ++ RefDNode __t66 = _t; + f = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode f_AST_in = RefDNode(antlr::nullAST); + f_AST = astFactory->create(antlr::RefAST(f)); + astFactory->addASTChild(currentAST, antlr::RefAST(f_AST)); +- antlr::ASTPair __currentAST63 = currentAST; ++ antlr::ASTPair __currentAST66 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),FOR); +@@ -2934,6 +3072,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -3013,11 +3152,11 @@ + } + } + } +- unblock(_t); ++ unblock_empty(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST63; +- _t = __t63; ++ currentAST = __currentAST66; ++ _t = __t66; + _t = _t->getNextSibling(); + + f_AST->SetLabelRange( labelStart, comp.NDefLabel()); +@@ -3027,6 +3166,59 @@ + _retTree = _t; + } + ++void GDLTreeParser::foreach_statement(RefDNode _t) { ++ RefDNode foreach_statement_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode foreach_statement_AST = RefDNode(antlr::nullAST); ++ RefDNode f = RefDNode(antlr::nullAST); ++ RefDNode f_AST = RefDNode(antlr::nullAST); ++ RefDNode i = RefDNode(antlr::nullAST); ++ RefDNode i_AST = RefDNode(antlr::nullAST); ++ ++ StackSizeGuard guard( loopVarStack); ++ int labelStart = comp.NDefLabel(); ++ ++ ++ RefDNode __t69 = _t; ++ f = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode f_AST_in = RefDNode(antlr::nullAST); ++ f_AST = astFactory->create(antlr::RefAST(f)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(f_AST)); ++ antlr::ASTPair __currentAST69 = currentAST; ++ currentAST.root = currentAST.child; ++ currentAST.child = RefDNode(antlr::nullAST); ++ match(antlr::RefAST(_t),FOREACH); ++ _t = _t->getFirstChild(); ++ i = _t; ++ RefDNode i_AST_in = RefDNode(antlr::nullAST); ++ i_AST = astFactory->create(antlr::RefAST(i)); ++ astFactory->addASTChild(currentAST, antlr::RefAST(i_AST)); ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ++ i_AST->setType(VAR); ++ comp.Var(i_AST); ++ ++ loopVarStack.push_back(i_AST->getText()); ++ ++ expr(_t); ++ _t = _retTree; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ unblock_empty(_t); ++ _t = _retTree; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ currentAST = __currentAST69; ++ _t = __t69; ++ _t = _t->getNextSibling(); ++ ++ f_AST->SetLabelRange( labelStart, comp.NDefLabel()); ++ ++ foreach_statement_AST = RefDNode(currentAST.root); ++ returnAST = foreach_statement_AST; ++ _retTree = _t; ++} ++ + void GDLTreeParser::repeat_statement(RefDNode _t) { + RefDNode repeat_statement_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + returnAST = RefDNode(antlr::nullAST); +@@ -3042,25 +3234,25 @@ + int labelStart = comp.NDefLabel(); + + +- RefDNode __t59 = _t; ++ RefDNode __t62 = _t; + r = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode r_AST_in = RefDNode(antlr::nullAST); + r_AST = astFactory->create(antlr::RefAST(r)); +- antlr::ASTPair __currentAST59 = currentAST; ++ antlr::ASTPair __currentAST62 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),REPEAT); + _t = _t->getFirstChild(); + b = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t; +- unblock(_t); ++ unblock_empty(_t); + _t = _retTree; + b_AST = returnAST; + e = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t; + expr(_t); + _t = _retTree; + e_AST = returnAST; +- currentAST = __currentAST59; +- _t = __t59; ++ currentAST = __currentAST62; ++ _t = __t62; + _t = _t->getNextSibling(); + repeat_statement_AST = RefDNode(currentAST.root); + +@@ -3095,11 +3287,11 @@ + int labelStart = comp.NDefLabel(); + + +- RefDNode __t61 = _t; ++ RefDNode __t64 = _t; + w = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode w_AST_in = RefDNode(antlr::nullAST); + w_AST = astFactory->create(antlr::RefAST(w)); +- antlr::ASTPair __currentAST61 = currentAST; ++ antlr::ASTPair __currentAST64 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),WHILE); +@@ -3112,8 +3304,8 @@ + statement(_t); + _t = _retTree; + s_AST = returnAST; +- currentAST = __currentAST61; +- _t = __t61; ++ currentAST = __currentAST64; ++ _t = __t64; + _t = _t->getNextSibling(); + while_statement_AST = RefDNode(currentAST.root); + +@@ -3156,11 +3348,11 @@ + switch ( _t->getType()) { + case GOTO: + { +- RefDNode __t68 = _t; ++ RefDNode __t73 = _t; + g = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode g_AST_in = RefDNode(antlr::nullAST); + g_AST = astFactory->create(antlr::RefAST(g)); +- antlr::ASTPair __currentAST68 = currentAST; ++ antlr::ASTPair __currentAST73 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),GOTO); +@@ -3170,8 +3362,8 @@ + i1_AST = astFactory->create(antlr::RefAST(i1)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); +- currentAST = __currentAST68; +- _t = __t68; ++ currentAST = __currentAST73; ++ _t = __t73; + _t = _t->getNextSibling(); + jump_statement_AST = RefDNode(currentAST.root); + +@@ -3191,11 +3383,11 @@ + } + case RETURN: + { +- RefDNode __t69 = _t; ++ RefDNode __t74 = _t; + r = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode r_AST_in = RefDNode(antlr::nullAST); + r_AST = astFactory->create(antlr::RefAST(r)); +- antlr::ASTPair __currentAST69 = currentAST; ++ antlr::ASTPair __currentAST74 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),RETURN); +@@ -3210,6 +3402,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -3287,16 +3480,29 @@ + } + } + } +- currentAST = __currentAST69; +- _t = __t69; ++ currentAST = __currentAST74; ++ _t = __t74; + _t = _t->getNextSibling(); + jump_statement_AST = RefDNode(currentAST.root); + + if( comp.IsFun()) + { +- if( !exprThere) throw GDLException( _t, ++ if( !exprThere) throw GDLException( r, + "Return statement in functions " + "must have 1 value."); ++ ++ // // wrong: this is only true for l_function as return value ++ // // a ARRAYEXPR_MFCALL can only be a MFCALL here -> change tree ++ // if( #e->getType() == ARRAYEXPR_MFCALL) ++ // { ++ // #e->setType( MFCALL); ++ // #e->setText( "mfcall"); ++ // RefDNode mfc; ++ // mfc = #e->getFirstChild(); ++ // mfc = mfc->getNextSibling(); ++ // #e->setFirstChild( antlr::RefAST(mfc)); ++ // } ++ + jump_statement_AST=RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(RETF,"retf")))->add(antlr::RefAST(e_AST)))); + jump_statement_AST->SetLine(r->getLine()); + } +@@ -3320,11 +3526,11 @@ + } + case ON_IOERROR: + { +- RefDNode __t71 = _t; ++ RefDNode __t76 = _t; + o = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode o_AST_in = RefDNode(antlr::nullAST); + o_AST = astFactory->create(antlr::RefAST(o)); +- antlr::ASTPair __currentAST71 = currentAST; ++ antlr::ASTPair __currentAST76 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ON_IOERROR); +@@ -3334,8 +3540,8 @@ + i2_AST = astFactory->create(antlr::RefAST(i2)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); +- currentAST = __currentAST71; +- _t = __t71; ++ currentAST = __currentAST76; ++ _t = __t76; + _t = _t->getNextSibling(); + jump_statement_AST = RefDNode(currentAST.root); + +@@ -3385,14 +3591,15 @@ + RefDNode s2_AST = RefDNode(antlr::nullAST); + RefDNode s2 = RefDNode(antlr::nullAST); + +- int labelStart = comp.NDefLabel(); ++ // int labelStart = comp.NDefLabel(); ++ RefDNode block; + + +- RefDNode __t73 = _t; ++ RefDNode __t78 = _t; + i = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode i_AST_in = RefDNode(antlr::nullAST); + i_AST = astFactory->create(antlr::RefAST(i)); +- antlr::ASTPair __currentAST73 = currentAST; ++ antlr::ASTPair __currentAST78 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),IF); +@@ -3413,7 +3620,7 @@ + { + if_statement_AST = RefDNode(currentAST.root); + +- i_AST->SetLabelRange( labelStart, comp.NDefLabel()); ++ // #i->SetLabelRange( labelStart, comp.NDefLabel()); + if_statement_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(i_AST))->add(antlr::RefAST(e_AST))->add(antlr::RefAST(s1_AST)))); + + currentAST.root = if_statement_AST; +@@ -3431,19 +3638,20 @@ + case CONTINUE: + case COMMONDECL: + case COMMONDEF: ++ case FOR: ++ case FOREACH: + case MPCALL: + case MPCALL_PARENT: + case PCALL: ++ case REPEAT: + case RETURN: ++ case WHILE: + case CASE: +- case FOR: + case FORWARD: + case GOTO: + case IF: + case ON_IOERROR: +- case REPEAT: + case SWITCH: +- case WHILE: + case DEC: + case INC: + case AND_OP_EQ: +@@ -3474,7 +3682,14 @@ + + i_AST->setText( "if_else"); + i_AST->setType( IF_ELSE); +- i_AST->SetLabelRange( labelStart, comp.NDefLabel()); ++ // #i->SetLabelRange( labelStart, comp.NDefLabel()); ++ if( s1_AST->getType() != BLOCK) ++ { ++ block = astFactory->create(BLOCK,"block"); ++ block->SetLine( s1_AST->getLine()); ++ if_statement_AST=RefDNode(astFactory->make((new antlr::ASTArray(4))->add(antlr::RefAST(i_AST))->add(antlr::RefAST(e_AST))->add(antlr::RefAST(RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(block))->add(antlr::RefAST(s1_AST))))))->add(antlr::RefAST(s2_AST)))); ++ } ++ else + if_statement_AST=RefDNode(astFactory->make((new antlr::ASTArray(4))->add(antlr::RefAST(i_AST))->add(antlr::RefAST(e_AST))->add(antlr::RefAST(s1_AST))->add(antlr::RefAST(s2_AST)))); + + currentAST.root = if_statement_AST; +@@ -3492,8 +3707,8 @@ + } + } + } +- currentAST = __currentAST73; +- _t = __t73; ++ currentAST = __currentAST78; ++ _t = __t78; + _t = _t->getNextSibling(); + returnAST = if_statement_AST; + _retTree = _t; +@@ -3522,6 +3737,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -3589,11 +3805,11 @@ + } + default: + { +- goto _loop81; ++ goto _loop86; + } + } + } +- _loop81:; ++ _loop86:; + } // ( ... )* + parameter_def_AST = RefDNode(currentAST.root); + returnAST = parameter_def_AST; +@@ -3615,11 +3831,11 @@ + RefDNode variable; + + +- RefDNode __t83 = _t; ++ RefDNode __t88 = _t; + d = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode d_AST_in = RefDNode(antlr::nullAST); + d_AST = astFactory->create(antlr::RefAST(d)); +- antlr::ASTPair __currentAST83 = currentAST; ++ antlr::ASTPair __currentAST88 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),KEYDEF); +@@ -3652,10 +3868,13 @@ + else + { + int t = k_AST->getType(); +- if( t == FCALL_LIB || t == MFCALL_LIB || +- t == MFCALL_PARENT_LIB || +- t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || +- t == MFCALL_PARENT_LIB_RETNEW) ++ if( t == FCALL_LIB || t == MFCALL_LIB || //t == FCALL_LIB_N_ELEMENTS || ++ ++ t == MFCALL_PARENT_LIB //|| ++ // t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || ++ // t == MFCALL_PARENT_LIB_RETNEW //|| ++ // t == ARRARYEXPR_MFCALL_LIB // MFCALL_LIB or VAR or DEREF ++ ) + { + d_AST=astFactory->create(KEYDEF_REF_CHECK,"keydef_ref_check"); + key_parameter_AST=RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(d_AST))->add(antlr::RefAST(i_AST))->add(antlr::RefAST(k_AST)))); +@@ -3678,8 +3897,8 @@ + else + currentAST.child = key_parameter_AST; + currentAST.advanceChildToEnd(); +- currentAST = __currentAST83; +- _t = __t83; ++ currentAST = __currentAST88; ++ _t = __t88; + _t = _t->getNextSibling(); + returnAST = key_parameter_AST; + _retTree = _t; +@@ -3717,10 +3936,12 @@ + else + { + int t = e_AST->getType(); +- if( t == FCALL_LIB || t == MFCALL_LIB || +- t == MFCALL_PARENT_LIB || +- t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || +- t == MFCALL_PARENT_LIB_RETNEW) ++ if( t == FCALL_LIB || t == MFCALL_LIB || //t == FCALL_LIB_N_ELEMENTS || ++ t == MFCALL_PARENT_LIB //|| ++ // t == FCALL_LIB_RETNEW || t == MFCALL_LIB_RETNEW || ++ // t == MFCALL_PARENT_LIB_RETNEW ++ // t == ARRARYEXPR_MFCALL_LIB // MFCALL_LIB or VAR or DEREF ++ ) + { + // something like: CALLAPRO,reform(a,/OVERWRITE) + pos_parameter_AST=RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(astFactory->create(REF_CHECK,"ref_check")))->add(antlr::RefAST(e_AST)))); +@@ -3761,12 +3982,12 @@ + switch ( _t->getType()) { + case ARRAYDEF: + { +- RefDNode __t86 = _t; ++ RefDNode __t91 = _t; + a = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a_AST_in = RefDNode(antlr::nullAST); + a_AST = astFactory->create(antlr::RefAST(a)); + astFactory->addASTChild(currentAST, antlr::RefAST(a_AST)); +- antlr::ASTPair __currentAST86 = currentAST; ++ antlr::ASTPair __currentAST91 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYDEF); +@@ -3783,14 +4004,14 @@ + /*check for constant expression*/ + } + else { +- goto _loop88; ++ goto _loop93; + } + + } +- _loop88:; ++ _loop93:; + } // ( ... )* +- currentAST = __currentAST86; +- _t = __t86; ++ currentAST = __currentAST91; ++ _t = __t91; + _t = _t->getNextSibling(); + + // better check here as then CONSTANT is propagated +@@ -3831,12 +4052,12 @@ + } + case ARRAYDEF_CONST: + { +- RefDNode __t89 = _t; ++ RefDNode __t94 = _t; + aa = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode aa_AST_in = RefDNode(antlr::nullAST); + aa_AST = astFactory->create(antlr::RefAST(aa)); + astFactory->addASTChild(currentAST, antlr::RefAST(aa_AST)); +- antlr::ASTPair __currentAST89 = currentAST; ++ antlr::ASTPair __currentAST94 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYDEF_CONST); +@@ -3852,14 +4073,14 @@ + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + else { +- goto _loop91; ++ goto _loop96; + } + + } +- _loop91:; ++ _loop96:; + } // ( ... )* +- currentAST = __currentAST89; +- _t = __t89; ++ currentAST = __currentAST94; ++ _t = __t94; + _t = _t->getNextSibling(); + + depth=0; +@@ -3917,21 +4138,21 @@ + switch ( _t->getType()) { + case NSTRUC_REF: + { +- RefDNode __t93 = _t; ++ RefDNode __t98 = _t; + n = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode n_AST_in = RefDNode(antlr::nullAST); + n_AST = astFactory->create(antlr::RefAST(n)); + astFactory->addASTChild(currentAST, antlr::RefAST(n_AST)); +- antlr::ASTPair __currentAST93 = currentAST; ++ antlr::ASTPair __currentAST98 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),NSTRUC_REF); + _t = _t->getFirstChild(); +- RefDNode tmp24_AST = RefDNode(antlr::nullAST); +- RefDNode tmp24_AST_in = RefDNode(antlr::nullAST); +- tmp24_AST = astFactory->create(antlr::RefAST(_t)); +- tmp24_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp24_AST)); ++ RefDNode tmp21_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp21_AST_in = RefDNode(antlr::nullAST); ++ tmp21_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp21_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp21_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + { +@@ -3943,6 +4164,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4006,7 +4228,7 @@ + case QUESTION: + { + { // ( ... )+ +- int _cnt96=0; ++ int _cnt101=0; + for (;;) { + if (_t == RefDNode(antlr::nullAST) ) + _t = ASTNULL; +@@ -4016,6 +4238,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4084,11 +4307,11 @@ + } + case IDENTIFIER: + { +- RefDNode tmp25_AST = RefDNode(antlr::nullAST); +- RefDNode tmp25_AST_in = RefDNode(antlr::nullAST); +- tmp25_AST = astFactory->create(antlr::RefAST(_t)); +- tmp25_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp25_AST)); ++ RefDNode tmp22_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp22_AST_in = RefDNode(antlr::nullAST); ++ tmp22_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp22_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp22_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + expr(_t); +@@ -4098,30 +4321,30 @@ + } + case INHERITS: + { +- RefDNode tmp26_AST = RefDNode(antlr::nullAST); +- RefDNode tmp26_AST_in = RefDNode(antlr::nullAST); +- tmp26_AST = astFactory->create(antlr::RefAST(_t)); +- tmp26_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp26_AST)); ++ RefDNode tmp23_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp23_AST_in = RefDNode(antlr::nullAST); ++ tmp23_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp23_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp23_AST)); + match(antlr::RefAST(_t),INHERITS); + _t = _t->getNextSibling(); +- RefDNode tmp27_AST = RefDNode(antlr::nullAST); +- RefDNode tmp27_AST_in = RefDNode(antlr::nullAST); +- tmp27_AST = astFactory->create(antlr::RefAST(_t)); +- tmp27_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp27_AST)); ++ RefDNode tmp24_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp24_AST_in = RefDNode(antlr::nullAST); ++ tmp24_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp24_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp24_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + break; + } + default: + { +- if ( _cnt96>=1 ) { goto _loop96; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt101>=1 ) { goto _loop101; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + } +- _cnt96++; ++ _cnt101++; + } +- _loop96:; ++ _loop101:; + } // ( ... )+ + + // set to nstruct if defined here +@@ -4141,27 +4364,27 @@ + } + } + } +- currentAST = __currentAST93; +- _t = __t93; ++ currentAST = __currentAST98; ++ _t = __t98; + _t = _t->getNextSibling(); + struct_def_AST = RefDNode(currentAST.root); + break; + } + case STRUC: + { +- RefDNode __t97 = _t; +- RefDNode tmp28_AST = RefDNode(antlr::nullAST); +- RefDNode tmp28_AST_in = RefDNode(antlr::nullAST); +- tmp28_AST = astFactory->create(antlr::RefAST(_t)); +- tmp28_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp28_AST)); +- antlr::ASTPair __currentAST97 = currentAST; ++ RefDNode __t102 = _t; ++ RefDNode tmp25_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp25_AST_in = RefDNode(antlr::nullAST); ++ tmp25_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp25_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp25_AST)); ++ antlr::ASTPair __currentAST102 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),STRUC); + _t = _t->getFirstChild(); + { // ( ... )+ +- int _cnt99=0; ++ int _cnt104=0; + for (;;) { + if (_t == RefDNode(antlr::nullAST) ) + _t = ASTNULL; +@@ -4171,15 +4394,15 @@ + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + else { +- if ( _cnt99>=1 ) { goto _loop99; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt104>=1 ) { goto _loop104; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + +- _cnt99++; ++ _cnt104++; + } +- _loop99:; ++ _loop104:; + } // ( ... )+ +- currentAST = __currentAST97; +- _t = __t97; ++ currentAST = __currentAST102; ++ _t = __t102; + _t = _t->getNextSibling(); + struct_def_AST = RefDNode(currentAST.root); + break; +@@ -4199,11 +4422,11 @@ + antlr::ASTPair currentAST; + RefDNode tag_def_AST = RefDNode(antlr::nullAST); + +- RefDNode tmp29_AST = RefDNode(antlr::nullAST); +- RefDNode tmp29_AST_in = RefDNode(antlr::nullAST); +- tmp29_AST = astFactory->create(antlr::RefAST(_t)); +- tmp29_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp29_AST)); ++ RefDNode tmp26_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp26_AST_in = RefDNode(antlr::nullAST); ++ tmp26_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp26_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp26_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + expr(_t); +@@ -4234,12 +4457,12 @@ + + + { +- RefDNode __t103 = _t; +- RefDNode tmp30_AST = RefDNode(antlr::nullAST); +- RefDNode tmp30_AST_in = RefDNode(antlr::nullAST); +- tmp30_AST = astFactory->create(antlr::RefAST(_t)); +- tmp30_AST_in = _t; +- antlr::ASTPair __currentAST103 = currentAST; ++ RefDNode __t108 = _t; ++ RefDNode tmp27_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp27_AST_in = RefDNode(antlr::nullAST); ++ tmp27_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp27_AST_in = _t; ++ antlr::ASTPair __currentAST108 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYIX); +@@ -4250,10 +4473,10 @@ + switch ( _t->getType()) { + case ALL: + { +- RefDNode tmp31_AST = RefDNode(antlr::nullAST); +- RefDNode tmp31_AST_in = RefDNode(antlr::nullAST); +- tmp31_AST = astFactory->create(antlr::RefAST(_t)); +- tmp31_AST_in = _t; ++ RefDNode tmp28_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp28_AST_in = RefDNode(antlr::nullAST); ++ tmp28_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp28_AST_in = _t; + match(antlr::RefAST(_t),ALL); + _t = _t->getNextSibling(); + +@@ -4266,6 +4489,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4380,10 +4604,10 @@ + } + case ALL: + { +- RefDNode tmp32_AST = RefDNode(antlr::nullAST); +- RefDNode tmp32_AST_in = RefDNode(antlr::nullAST); +- tmp32_AST = astFactory->create(antlr::RefAST(_t)); +- tmp32_AST_in = _t; ++ RefDNode tmp29_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp29_AST_in = RefDNode(antlr::nullAST); ++ tmp29_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp29_AST_in = _t; + match(antlr::RefAST(_t),ALL); + _t = _t->getNextSibling(); + { +@@ -4419,6 +4643,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4521,6 +4746,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4620,6 +4846,7 @@ + case ARRAYDEF_CONST: + case ARRAYEXPR: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case DEREF: + case EXPR: +@@ -4731,8 +4958,8 @@ + } + } + } +- currentAST = __currentAST103; +- _t = __t103; ++ currentAST = __currentAST108; ++ _t = __t108; + _t = _t->getNextSibling(); + } + returnAST = arrayindex_AST; +@@ -4751,7 +4978,7 @@ + + + { // ( ... )+ +- int _cnt111=0; ++ int _cnt116=0; + for (;;) { + if (_t == RefDNode(antlr::nullAST) ) + _t = ASTNULL; +@@ -4761,12 +4988,12 @@ + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); + } + else { +- if ( _cnt111>=1 ) { goto _loop111; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt116>=1 ) { goto _loop116; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + +- _cnt111++; ++ _cnt116++; + } +- _loop111:; ++ _loop116:; + } // ( ... )+ + arrayindex_list_AST = RefDNode(currentAST.root); + +@@ -4854,11 +5081,11 @@ + RefDNode r_AST = RefDNode(antlr::nullAST); + RefDNode r = RefDNode(antlr::nullAST); + +- RefDNode __t114 = _t; ++ RefDNode __t119 = _t; + a = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode a_AST_in = RefDNode(antlr::nullAST); + a_AST = astFactory->create(antlr::RefAST(a)); +- antlr::ASTPair __currentAST114 = currentAST; ++ antlr::ASTPair __currentAST119 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ASSIGN); +@@ -4871,8 +5098,8 @@ + expr(_t); + _t = _retTree; + r_AST = returnAST; +- currentAST = __currentAST114; +- _t = __t114; ++ currentAST = __currentAST119; ++ _t = __t119; + _t = _t->getNextSibling(); + assign_expr_AST = RefDNode(currentAST.root); + +@@ -4909,15 +5136,16 @@ + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode sysvar_AST = RefDNode(antlr::nullAST); ++ RefDNode s = RefDNode(antlr::nullAST); ++ RefDNode s_AST = RefDNode(antlr::nullAST); + RefDNode i = RefDNode(antlr::nullAST); + RefDNode i_AST = RefDNode(antlr::nullAST); + +- RefDNode __t139 = _t; +- RefDNode tmp33_AST = RefDNode(antlr::nullAST); +- RefDNode tmp33_AST_in = RefDNode(antlr::nullAST); +- tmp33_AST = astFactory->create(antlr::RefAST(_t)); +- tmp33_AST_in = _t; +- antlr::ASTPair __currentAST139 = currentAST; ++ RefDNode __t144 = _t; ++ s = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode s_AST_in = RefDNode(antlr::nullAST); ++ s_AST = astFactory->create(antlr::RefAST(s)); ++ antlr::ASTPair __currentAST144 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),SYSVAR); +@@ -4927,14 +5155,15 @@ + i_AST = astFactory->create(antlr::RefAST(i)); + match(antlr::RefAST(_t),SYSVARNAME); + _t = _t->getNextSibling(); +- currentAST = __currentAST139; +- _t = __t139; ++ currentAST = __currentAST144; ++ _t = __t144; + _t = _t->getNextSibling(); + sysvar_AST = RefDNode(currentAST.root); + + std::string sysVarName = i->getText(); + // here we create the real sysvar node + sysvar_AST=astFactory->create(SYSVAR, sysVarName.substr(1)); ++ sysvar_AST->SetLine(s->getLine()); + // #sysvar=#[SYSVAR,i->getText()]; + comp.SysVar(sysvar_AST); // sets var to NULL + +@@ -4954,15 +5183,16 @@ + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; + RefDNode var_AST = RefDNode(antlr::nullAST); ++ RefDNode v = RefDNode(antlr::nullAST); ++ RefDNode v_AST = RefDNode(antlr::nullAST); + RefDNode i = RefDNode(antlr::nullAST); + RefDNode i_AST = RefDNode(antlr::nullAST); + +- RefDNode __t141 = _t; +- RefDNode tmp34_AST = RefDNode(antlr::nullAST); +- RefDNode tmp34_AST_in = RefDNode(antlr::nullAST); +- tmp34_AST = astFactory->create(antlr::RefAST(_t)); +- tmp34_AST_in = _t; +- antlr::ASTPair __currentAST141 = currentAST; ++ RefDNode __t146 = _t; ++ v = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode v_AST_in = RefDNode(antlr::nullAST); ++ v_AST = astFactory->create(antlr::RefAST(v)); ++ antlr::ASTPair __currentAST146 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),VAR); +@@ -4972,12 +5202,13 @@ + i_AST = astFactory->create(antlr::RefAST(i)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); +- currentAST = __currentAST141; +- _t = __t141; ++ currentAST = __currentAST146; ++ _t = __t146; + _t = _t->getNextSibling(); + var_AST = RefDNode(currentAST.root); + + var_AST=astFactory->create(VAR,i->getText()); ++ var_AST->SetLine(v->getLine()); + // #var=#[VAR,i->getText()]; + comp.Var(var_AST); + +@@ -4992,26 +5223,26 @@ + _retTree = _t; + } + +-void GDLTreeParser::arrayindex_list_to_expression_list(RefDNode _t) { +- RefDNode arrayindex_list_to_expression_list_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++void GDLTreeParser::arrayindex_list_to_parameter_list(RefDNode _t) { ++ RefDNode arrayindex_list_to_parameter_list_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + returnAST = RefDNode(antlr::nullAST); + antlr::ASTPair currentAST; +- RefDNode arrayindex_list_to_expression_list_AST = RefDNode(antlr::nullAST); ++ RefDNode arrayindex_list_to_parameter_list_AST = RefDNode(antlr::nullAST); + RefDNode e_AST = RefDNode(antlr::nullAST); + RefDNode e = RefDNode(antlr::nullAST); + + { // ( ... )+ +- int _cnt145=0; ++ int _cnt150=0; + for (;;) { + if (_t == RefDNode(antlr::nullAST) ) + _t = ASTNULL; + if ((_t->getType() == ARRAYIX)) { +- RefDNode __t144 = _t; +- RefDNode tmp35_AST = RefDNode(antlr::nullAST); +- RefDNode tmp35_AST_in = RefDNode(antlr::nullAST); +- tmp35_AST = astFactory->create(antlr::RefAST(_t)); +- tmp35_AST_in = _t; +- antlr::ASTPair __currentAST144 = currentAST; ++ RefDNode __t149 = _t; ++ RefDNode tmp30_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp30_AST_in = RefDNode(antlr::nullAST); ++ tmp30_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp30_AST_in = _t; ++ antlr::ASTPair __currentAST149 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYIX); +@@ -5020,31 +5251,31 @@ + pos_parameter(_t); + _t = _retTree; + e_AST = returnAST; +- currentAST = __currentAST144; +- _t = __t144; ++ currentAST = __currentAST149; ++ _t = __t149; + _t = _t->getNextSibling(); +- arrayindex_list_to_expression_list_AST = RefDNode(currentAST.root); ++ arrayindex_list_to_parameter_list_AST = RefDNode(currentAST.root); + +- arrayindex_list_to_expression_list_AST= +- RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(NULL))->add(antlr::RefAST(arrayindex_list_to_expression_list_AST))->add(antlr::RefAST(e_AST)))); ++ arrayindex_list_to_parameter_list_AST= ++ RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(NULL))->add(antlr::RefAST(arrayindex_list_to_parameter_list_AST))->add(antlr::RefAST(e_AST)))); + +- currentAST.root = arrayindex_list_to_expression_list_AST; +- if ( arrayindex_list_to_expression_list_AST!=RefDNode(antlr::nullAST) && +- arrayindex_list_to_expression_list_AST->getFirstChild() != RefDNode(antlr::nullAST) ) +- currentAST.child = arrayindex_list_to_expression_list_AST->getFirstChild(); ++ currentAST.root = arrayindex_list_to_parameter_list_AST; ++ if ( arrayindex_list_to_parameter_list_AST!=RefDNode(antlr::nullAST) && ++ arrayindex_list_to_parameter_list_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = arrayindex_list_to_parameter_list_AST->getFirstChild(); + else +- currentAST.child = arrayindex_list_to_expression_list_AST; ++ currentAST.child = arrayindex_list_to_parameter_list_AST; + currentAST.advanceChildToEnd(); + } + else { +- if ( _cnt145>=1 ) { goto _loop145; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} ++ if ( _cnt150>=1 ) { goto _loop150; } else {throw antlr::NoViableAltException(antlr::RefAST(_t));} + } + +- _cnt145++; ++ _cnt150++; + } +- _loop145:; ++ _loop150:; + } // ( ... )+ +- returnAST = arrayindex_list_to_expression_list_AST; ++ returnAST = arrayindex_list_to_parameter_list_AST; + _retTree = _t; + } + +@@ -5066,21 +5297,21 @@ + bool isVar; + + +- RefDNode __t147 = _t; +- RefDNode tmp36_AST = RefDNode(antlr::nullAST); +- RefDNode tmp36_AST_in = RefDNode(antlr::nullAST); +- tmp36_AST = astFactory->create(antlr::RefAST(_t)); +- tmp36_AST_in = _t; +- antlr::ASTPair __currentAST147 = currentAST; ++ RefDNode __t152 = _t; ++ RefDNode tmp31_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp31_AST_in = RefDNode(antlr::nullAST); ++ tmp31_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp31_AST_in = _t; ++ antlr::ASTPair __currentAST152 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYEXPR_FN); + _t = _t->getFirstChild(); +- RefDNode __t148 = _t; ++ RefDNode __t153 = _t; + va = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode va_AST_in = RefDNode(antlr::nullAST); + va_AST = astFactory->create(antlr::RefAST(va)); +- antlr::ASTPair __currentAST148 = currentAST; ++ antlr::ASTPair __currentAST153 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),VAR); +@@ -5090,8 +5321,8 @@ + id_AST = astFactory->create(antlr::RefAST(id)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); +- currentAST = __currentAST148; +- _t = __t148; ++ currentAST = __currentAST153; ++ _t = __t153; + _t = _t->getNextSibling(); + + id_text=id_AST->getText(); +@@ -5110,7 +5341,7 @@ + } + else if ((_t->getType() == ARRAYIX)) { + el = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t; +- arrayindex_list_to_expression_list(_t); ++ arrayindex_list_to_parameter_list(_t); + _t = _retTree; + el_AST = returnAST; + } +@@ -5132,16 +5363,16 @@ + if( libFunList[ i]->RetNew()) + { + id_AST->setType( FCALL_LIB_RETNEW); +- arrayexpr_fn_AST= ++ arrayexpr_fn_AST = + RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(id_AST))->add(antlr::RefAST(el_AST)))); +- // #([/*FCALL_LIB_RETNEW,"fcall_lib_retnew"],*/ id, el); ++ // #([/*FCALL_LIB_RETNEW,"fcall_lib_retnew"],*/ id, el); + } + else + { + id_AST->setType( FCALL_LIB); +- arrayexpr_fn_AST= ++ arrayexpr_fn_AST = + RefDNode(astFactory->make((new antlr::ASTArray(2))->add(antlr::RefAST(id_AST))->add(antlr::RefAST(el_AST)))); +- // #(/*[FCALL_LIB,"fcall_lib"],*/ id, el); ++ // #(/*[FCALL_LIB,"fcall_lib"],*/ id, el); + } + } + else +@@ -5175,13 +5406,125 @@ + else + currentAST.child = arrayexpr_fn_AST; + currentAST.advanceChildToEnd(); +- currentAST = __currentAST147; +- _t = __t147; ++ currentAST = __currentAST152; ++ _t = __t152; + _t = _t->getNextSibling(); + returnAST = arrayexpr_fn_AST; + _retTree = _t; + } + ++void GDLTreeParser::arrayexpr_mfcall(RefDNode _t) { ++ RefDNode arrayexpr_mfcall_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ returnAST = RefDNode(antlr::nullAST); ++ antlr::ASTPair currentAST; ++ RefDNode arrayexpr_mfcall_AST = RefDNode(antlr::nullAST); ++ RefDNode a = RefDNode(antlr::nullAST); ++ RefDNode a_AST = RefDNode(antlr::nullAST); ++ RefDNode e_AST = RefDNode(antlr::nullAST); ++ RefDNode e = RefDNode(antlr::nullAST); ++ RefDNode i = RefDNode(antlr::nullAST); ++ RefDNode i_AST = RefDNode(antlr::nullAST); ++ RefDNode e2_AST = RefDNode(antlr::nullAST); ++ RefDNode e2 = RefDNode(antlr::nullAST); ++ RefDNode i2 = RefDNode(antlr::nullAST); ++ RefDNode i2_AST = RefDNode(antlr::nullAST); ++ RefDNode a2_AST = RefDNode(antlr::nullAST); ++ RefDNode a2 = RefDNode(antlr::nullAST); ++ ++ RefDNode __t156 = _t; ++ a = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; ++ RefDNode a_AST_in = RefDNode(antlr::nullAST); ++ a_AST = astFactory->create(antlr::RefAST(a)); ++ antlr::ASTPair __currentAST156 = currentAST; ++ currentAST.root = currentAST.child; ++ currentAST.child = RefDNode(antlr::nullAST); ++ match(antlr::RefAST(_t),ARRAYEXPR_MFCALL); ++ _t = _t->getFirstChild(); ++ ++ RefDNode mark = _t; // mark ++ ++ e = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t; ++ expr(_t); ++ _t = _retTree; ++ e_AST = returnAST; ++ i = _t; ++ RefDNode i_AST_in = RefDNode(antlr::nullAST); ++ i_AST = astFactory->create(antlr::RefAST(i)); ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ++ bool success = true; ++ RefDNode first; ++ try { ++ arrayindex_list(_t); ++ ++ RefDNode al = returnAST; ++ RefDNode ae = RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(ARRAYEXPR,"arrayexpr")))->add(antlr::RefAST(i_AST))->add(antlr::RefAST(al)))); ++ ++ if( e->getType() == DOT) ++ { ++ int nDot = e_AST->GetNDot(); ++ e_AST->SetNDot( ++nDot); ++ ++ e_AST->addChild( ae); ++ ++ first = e_AST; ++ } ++ else ++ { ++ RefDNode dot = RefDNode(astFactory->make((new antlr::ASTArray(3))->add(antlr::RefAST(astFactory->create(DOT,".")))->add(antlr::RefAST(e_AST))->add(antlr::RefAST(ae)))); ++ dot->SetNDot( 1); ++ ++ first = dot; ++ } ++ } ++ catch( GDLException& ex) ++ { ++ Message( "Ambiguity resolved: member function call " ++ "due to invalid array index."); ++ ++ success = false; ++ ++ a_AST->setType( MFCALL); ++ a_AST->setText( "mfcall"); ++ } ++ ++ _t = mark; // rewind to parse again ++ ++ e2 = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t; ++ expr(_t); ++ _t = _retTree; ++ e2_AST = returnAST; ++ i2 = _t; ++ RefDNode i2_AST_in = RefDNode(antlr::nullAST); ++ i2_AST = astFactory->create(antlr::RefAST(i2)); ++ match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ a2 = (_t == ASTNULL) ? RefDNode(antlr::nullAST) : _t; ++ arrayindex_list_to_parameter_list(_t); ++ _t = _retTree; ++ a2_AST = returnAST; ++ arrayexpr_mfcall_AST = RefDNode(currentAST.root); ++ ++ if( success) ++ arrayexpr_mfcall_AST = RefDNode(astFactory->make((new antlr::ASTArray(5))->add(antlr::RefAST(a_AST))->add(antlr::RefAST(first))->add(antlr::RefAST(e2_AST))->add(antlr::RefAST(i2_AST))->add(antlr::RefAST(a2_AST)))); ++ else ++ arrayexpr_mfcall_AST = RefDNode(astFactory->make((new antlr::ASTArray(4))->add(antlr::RefAST(a_AST))->add(antlr::RefAST(e2_AST))->add(antlr::RefAST(i2_AST))->add(antlr::RefAST(a2_AST)))); ++ ++ currentAST.root = arrayexpr_mfcall_AST; ++ if ( arrayexpr_mfcall_AST!=RefDNode(antlr::nullAST) && ++ arrayexpr_mfcall_AST->getFirstChild() != RefDNode(antlr::nullAST) ) ++ currentAST.child = arrayexpr_mfcall_AST->getFirstChild(); ++ else ++ currentAST.child = arrayexpr_mfcall_AST; ++ currentAST.advanceChildToEnd(); ++ currentAST = __currentAST156; ++ _t = __t156; ++ _t = _t->getNextSibling(); ++ returnAST = arrayexpr_mfcall_AST; ++ _retTree = _t; ++} ++ + void GDLTreeParser::primary_expr(RefDNode _t) { + RefDNode primary_expr_AST_in = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + returnAST = RefDNode(antlr::nullAST); +@@ -5193,6 +5536,7 @@ + RefDNode id_AST = RefDNode(antlr::nullAST); + + int dummy; ++ RefDNode mark; + + + if (_t == RefDNode(antlr::nullAST) ) +@@ -5232,15 +5576,23 @@ + primary_expr_AST = RefDNode(currentAST.root); + break; + } ++ case ARRAYEXPR_MFCALL: ++ { ++ arrayexpr_mfcall(_t); ++ _t = _retTree; ++ astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); ++ primary_expr_AST = RefDNode(currentAST.root); ++ break; ++ } + case MFCALL: + { +- RefDNode __t151 = _t; +- RefDNode tmp37_AST = RefDNode(antlr::nullAST); +- RefDNode tmp37_AST_in = RefDNode(antlr::nullAST); +- tmp37_AST = astFactory->create(antlr::RefAST(_t)); +- tmp37_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp37_AST)); +- antlr::ASTPair __currentAST151 = currentAST; ++ RefDNode __t158 = _t; ++ RefDNode tmp32_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp32_AST_in = RefDNode(antlr::nullAST); ++ tmp32_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp32_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp32_AST)); ++ antlr::ASTPair __currentAST158 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MFCALL); +@@ -5248,31 +5600,31 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- RefDNode tmp38_AST = RefDNode(antlr::nullAST); +- RefDNode tmp38_AST_in = RefDNode(antlr::nullAST); +- tmp38_AST = astFactory->create(antlr::RefAST(_t)); +- tmp38_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp38_AST)); ++ RefDNode tmp33_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp33_AST_in = RefDNode(antlr::nullAST); ++ tmp33_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp33_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp33_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + parameter_def(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST151; +- _t = __t151; ++ currentAST = __currentAST158; ++ _t = __t158; + _t = _t->getNextSibling(); + primary_expr_AST = RefDNode(currentAST.root); + break; + } + case MFCALL_PARENT: + { +- RefDNode __t152 = _t; +- RefDNode tmp39_AST = RefDNode(antlr::nullAST); +- RefDNode tmp39_AST_in = RefDNode(antlr::nullAST); +- tmp39_AST = astFactory->create(antlr::RefAST(_t)); +- tmp39_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp39_AST)); +- antlr::ASTPair __currentAST152 = currentAST; ++ RefDNode __t159 = _t; ++ RefDNode tmp34_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp34_AST_in = RefDNode(antlr::nullAST); ++ tmp34_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp34_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp34_AST)); ++ antlr::ASTPair __currentAST159 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MFCALL_PARENT); +@@ -5280,37 +5632,37 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- RefDNode tmp40_AST = RefDNode(antlr::nullAST); +- RefDNode tmp40_AST_in = RefDNode(antlr::nullAST); +- tmp40_AST = astFactory->create(antlr::RefAST(_t)); +- tmp40_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp40_AST)); ++ RefDNode tmp35_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp35_AST_in = RefDNode(antlr::nullAST); ++ tmp35_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp35_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp35_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); +- RefDNode tmp41_AST = RefDNode(antlr::nullAST); +- RefDNode tmp41_AST_in = RefDNode(antlr::nullAST); +- tmp41_AST = astFactory->create(antlr::RefAST(_t)); +- tmp41_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp41_AST)); ++ RefDNode tmp36_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp36_AST_in = RefDNode(antlr::nullAST); ++ tmp36_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp36_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp36_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + parameter_def(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST152; +- _t = __t152; ++ currentAST = __currentAST159; ++ _t = __t159; + _t = _t->getNextSibling(); + primary_expr_AST = RefDNode(currentAST.root); + break; + } + case FCALL: + { +- RefDNode __t153 = _t; ++ RefDNode __t160 = _t; + f = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode f_AST_in = RefDNode(antlr::nullAST); + f_AST = astFactory->create(antlr::RefAST(f)); + astFactory->addASTChild(currentAST, antlr::RefAST(f_AST)); +- antlr::ASTPair __currentAST153 = currentAST; ++ antlr::ASTPair __currentAST160 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),FCALL); +@@ -5328,6 +5680,16 @@ + int i=LibFunIx(id->getText()); + if( i != -1) + { ++ // N_ELEMENTS must handle exceptions during parameter evaluation ++ // if( StrUpCase( #id->getText()) == "N_ELEMENTS") ++ // { ++ // #f->setType(FCALL_LIB_N_ELEMENTS); ++ // #f->setText(#id->getText()); ++ // #f->SetLibFun( libFunList[i]); ++ // // #id->SetFunIx(i); ++ // } ++ // else ++ { + if( libFunList[ i]->RetNew()) + { + f_AST->setType(FCALL_LIB_RETNEW); +@@ -5343,6 +5705,7 @@ + // #id->SetFunIx(i); + } + } ++ } + else + { + // then search user defined functions +@@ -5352,8 +5715,8 @@ + f_AST->SetFunIx(i); + } + +- currentAST = __currentAST153; +- _t = __t153; ++ currentAST = __currentAST160; ++ _t = __t160; + _t = _t->getNextSibling(); + primary_expr_AST = RefDNode(currentAST.root); + break; +@@ -5368,11 +5731,11 @@ + } + case CONSTANT: + { +- RefDNode tmp42_AST = RefDNode(antlr::nullAST); +- RefDNode tmp42_AST_in = RefDNode(antlr::nullAST); +- tmp42_AST = astFactory->create(antlr::RefAST(_t)); +- tmp42_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp42_AST)); ++ RefDNode tmp37_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp37_AST_in = RefDNode(antlr::nullAST); ++ tmp37_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp37_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp37_AST)); + match(antlr::RefAST(_t),CONSTANT); + _t = _t->getNextSibling(); + primary_expr_AST = RefDNode(currentAST.root); +@@ -5416,13 +5779,13 @@ + switch ( _t->getType()) { + case QUESTION: + { +- RefDNode __t155 = _t; +- RefDNode tmp43_AST = RefDNode(antlr::nullAST); +- RefDNode tmp43_AST_in = RefDNode(antlr::nullAST); +- tmp43_AST = astFactory->create(antlr::RefAST(_t)); +- tmp43_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp43_AST)); +- antlr::ASTPair __currentAST155 = currentAST; ++ RefDNode __t162 = _t; ++ RefDNode tmp38_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp38_AST_in = RefDNode(antlr::nullAST); ++ tmp38_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp38_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp38_AST)); ++ antlr::ASTPair __currentAST162 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),QUESTION); +@@ -5436,21 +5799,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST155; +- _t = __t155; ++ currentAST = __currentAST162; ++ _t = __t162; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case AND_OP: + { +- RefDNode __t156 = _t; +- RefDNode tmp44_AST = RefDNode(antlr::nullAST); +- RefDNode tmp44_AST_in = RefDNode(antlr::nullAST); +- tmp44_AST = astFactory->create(antlr::RefAST(_t)); +- tmp44_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp44_AST)); +- antlr::ASTPair __currentAST156 = currentAST; ++ RefDNode __t163 = _t; ++ RefDNode tmp39_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp39_AST_in = RefDNode(antlr::nullAST); ++ tmp39_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp39_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp39_AST)); ++ antlr::ASTPair __currentAST163 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),AND_OP); +@@ -5461,21 +5824,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST156; +- _t = __t156; ++ currentAST = __currentAST163; ++ _t = __t163; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case OR_OP: + { +- RefDNode __t157 = _t; +- RefDNode tmp45_AST = RefDNode(antlr::nullAST); +- RefDNode tmp45_AST_in = RefDNode(antlr::nullAST); +- tmp45_AST = astFactory->create(antlr::RefAST(_t)); +- tmp45_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp45_AST)); +- antlr::ASTPair __currentAST157 = currentAST; ++ RefDNode __t164 = _t; ++ RefDNode tmp40_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp40_AST_in = RefDNode(antlr::nullAST); ++ tmp40_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp40_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp40_AST)); ++ antlr::ASTPair __currentAST164 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),OR_OP); +@@ -5486,21 +5849,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST157; +- _t = __t157; ++ currentAST = __currentAST164; ++ _t = __t164; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case XOR_OP: + { +- RefDNode __t158 = _t; +- RefDNode tmp46_AST = RefDNode(antlr::nullAST); +- RefDNode tmp46_AST_in = RefDNode(antlr::nullAST); +- tmp46_AST = astFactory->create(antlr::RefAST(_t)); +- tmp46_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp46_AST)); +- antlr::ASTPair __currentAST158 = currentAST; ++ RefDNode __t165 = _t; ++ RefDNode tmp41_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp41_AST_in = RefDNode(antlr::nullAST); ++ tmp41_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp41_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp41_AST)); ++ antlr::ASTPair __currentAST165 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),XOR_OP); +@@ -5511,21 +5874,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST158; +- _t = __t158; ++ currentAST = __currentAST165; ++ _t = __t165; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case LOG_AND: + { +- RefDNode __t159 = _t; +- RefDNode tmp47_AST = RefDNode(antlr::nullAST); +- RefDNode tmp47_AST_in = RefDNode(antlr::nullAST); +- tmp47_AST = astFactory->create(antlr::RefAST(_t)); +- tmp47_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp47_AST)); +- antlr::ASTPair __currentAST159 = currentAST; ++ RefDNode __t166 = _t; ++ RefDNode tmp42_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp42_AST_in = RefDNode(antlr::nullAST); ++ tmp42_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp42_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp42_AST)); ++ antlr::ASTPair __currentAST166 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LOG_AND); +@@ -5536,21 +5899,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST159; +- _t = __t159; ++ currentAST = __currentAST166; ++ _t = __t166; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case LOG_OR: + { +- RefDNode __t160 = _t; +- RefDNode tmp48_AST = RefDNode(antlr::nullAST); +- RefDNode tmp48_AST_in = RefDNode(antlr::nullAST); +- tmp48_AST = astFactory->create(antlr::RefAST(_t)); +- tmp48_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp48_AST)); +- antlr::ASTPair __currentAST160 = currentAST; ++ RefDNode __t167 = _t; ++ RefDNode tmp43_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp43_AST_in = RefDNode(antlr::nullAST); ++ tmp43_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp43_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp43_AST)); ++ antlr::ASTPair __currentAST167 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LOG_OR); +@@ -5561,21 +5924,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST160; +- _t = __t160; ++ currentAST = __currentAST167; ++ _t = __t167; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case EQ_OP: + { +- RefDNode __t161 = _t; +- RefDNode tmp49_AST = RefDNode(antlr::nullAST); +- RefDNode tmp49_AST_in = RefDNode(antlr::nullAST); +- tmp49_AST = astFactory->create(antlr::RefAST(_t)); +- tmp49_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp49_AST)); +- antlr::ASTPair __currentAST161 = currentAST; ++ RefDNode __t168 = _t; ++ RefDNode tmp44_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp44_AST_in = RefDNode(antlr::nullAST); ++ tmp44_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp44_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp44_AST)); ++ antlr::ASTPair __currentAST168 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),EQ_OP); +@@ -5586,21 +5949,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST161; +- _t = __t161; ++ currentAST = __currentAST168; ++ _t = __t168; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case NE_OP: + { +- RefDNode __t162 = _t; +- RefDNode tmp50_AST = RefDNode(antlr::nullAST); +- RefDNode tmp50_AST_in = RefDNode(antlr::nullAST); +- tmp50_AST = astFactory->create(antlr::RefAST(_t)); +- tmp50_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp50_AST)); +- antlr::ASTPair __currentAST162 = currentAST; ++ RefDNode __t169 = _t; ++ RefDNode tmp45_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp45_AST_in = RefDNode(antlr::nullAST); ++ tmp45_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp45_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp45_AST)); ++ antlr::ASTPair __currentAST169 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),NE_OP); +@@ -5611,21 +5974,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST162; +- _t = __t162; ++ currentAST = __currentAST169; ++ _t = __t169; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case LE_OP: + { +- RefDNode __t163 = _t; +- RefDNode tmp51_AST = RefDNode(antlr::nullAST); +- RefDNode tmp51_AST_in = RefDNode(antlr::nullAST); +- tmp51_AST = astFactory->create(antlr::RefAST(_t)); +- tmp51_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp51_AST)); +- antlr::ASTPair __currentAST163 = currentAST; ++ RefDNode __t170 = _t; ++ RefDNode tmp46_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp46_AST_in = RefDNode(antlr::nullAST); ++ tmp46_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp46_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp46_AST)); ++ antlr::ASTPair __currentAST170 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LE_OP); +@@ -5636,21 +5999,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST163; +- _t = __t163; ++ currentAST = __currentAST170; ++ _t = __t170; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case LT_OP: + { +- RefDNode __t164 = _t; +- RefDNode tmp52_AST = RefDNode(antlr::nullAST); +- RefDNode tmp52_AST_in = RefDNode(antlr::nullAST); +- tmp52_AST = astFactory->create(antlr::RefAST(_t)); +- tmp52_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp52_AST)); +- antlr::ASTPair __currentAST164 = currentAST; ++ RefDNode __t171 = _t; ++ RefDNode tmp47_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp47_AST_in = RefDNode(antlr::nullAST); ++ tmp47_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp47_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp47_AST)); ++ antlr::ASTPair __currentAST171 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LT_OP); +@@ -5661,21 +6024,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST164; +- _t = __t164; ++ currentAST = __currentAST171; ++ _t = __t171; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case GE_OP: + { +- RefDNode __t165 = _t; +- RefDNode tmp53_AST = RefDNode(antlr::nullAST); +- RefDNode tmp53_AST_in = RefDNode(antlr::nullAST); +- tmp53_AST = astFactory->create(antlr::RefAST(_t)); +- tmp53_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp53_AST)); +- antlr::ASTPair __currentAST165 = currentAST; ++ RefDNode __t172 = _t; ++ RefDNode tmp48_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp48_AST_in = RefDNode(antlr::nullAST); ++ tmp48_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp48_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp48_AST)); ++ antlr::ASTPair __currentAST172 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),GE_OP); +@@ -5686,21 +6049,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST165; +- _t = __t165; ++ currentAST = __currentAST172; ++ _t = __t172; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case GT_OP: + { +- RefDNode __t166 = _t; +- RefDNode tmp54_AST = RefDNode(antlr::nullAST); +- RefDNode tmp54_AST_in = RefDNode(antlr::nullAST); +- tmp54_AST = astFactory->create(antlr::RefAST(_t)); +- tmp54_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp54_AST)); +- antlr::ASTPair __currentAST166 = currentAST; ++ RefDNode __t173 = _t; ++ RefDNode tmp49_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp49_AST_in = RefDNode(antlr::nullAST); ++ tmp49_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp49_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp49_AST)); ++ antlr::ASTPair __currentAST173 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),GT_OP); +@@ -5711,21 +6074,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST166; +- _t = __t166; ++ currentAST = __currentAST173; ++ _t = __t173; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case NOT_OP: + { +- RefDNode __t167 = _t; +- RefDNode tmp55_AST = RefDNode(antlr::nullAST); +- RefDNode tmp55_AST_in = RefDNode(antlr::nullAST); +- tmp55_AST = astFactory->create(antlr::RefAST(_t)); +- tmp55_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp55_AST)); +- antlr::ASTPair __currentAST167 = currentAST; ++ RefDNode __t174 = _t; ++ RefDNode tmp50_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp50_AST_in = RefDNode(antlr::nullAST); ++ tmp50_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp50_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp50_AST)); ++ antlr::ASTPair __currentAST174 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),NOT_OP); +@@ -5733,21 +6096,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST167; +- _t = __t167; ++ currentAST = __currentAST174; ++ _t = __t174; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case PLUS: + { +- RefDNode __t168 = _t; +- RefDNode tmp56_AST = RefDNode(antlr::nullAST); +- RefDNode tmp56_AST_in = RefDNode(antlr::nullAST); +- tmp56_AST = astFactory->create(antlr::RefAST(_t)); +- tmp56_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp56_AST)); +- antlr::ASTPair __currentAST168 = currentAST; ++ RefDNode __t175 = _t; ++ RefDNode tmp51_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp51_AST_in = RefDNode(antlr::nullAST); ++ tmp51_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp51_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp51_AST)); ++ antlr::ASTPair __currentAST175 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),PLUS); +@@ -5758,21 +6121,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST168; +- _t = __t168; ++ currentAST = __currentAST175; ++ _t = __t175; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case MINUS: + { +- RefDNode __t169 = _t; +- RefDNode tmp57_AST = RefDNode(antlr::nullAST); +- RefDNode tmp57_AST_in = RefDNode(antlr::nullAST); +- tmp57_AST = astFactory->create(antlr::RefAST(_t)); +- tmp57_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp57_AST)); +- antlr::ASTPair __currentAST169 = currentAST; ++ RefDNode __t176 = _t; ++ RefDNode tmp52_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp52_AST_in = RefDNode(antlr::nullAST); ++ tmp52_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp52_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp52_AST)); ++ antlr::ASTPair __currentAST176 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MINUS); +@@ -5783,21 +6146,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST169; +- _t = __t169; ++ currentAST = __currentAST176; ++ _t = __t176; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case LTMARK: + { +- RefDNode __t170 = _t; +- RefDNode tmp58_AST = RefDNode(antlr::nullAST); +- RefDNode tmp58_AST_in = RefDNode(antlr::nullAST); +- tmp58_AST = astFactory->create(antlr::RefAST(_t)); +- tmp58_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp58_AST)); +- antlr::ASTPair __currentAST170 = currentAST; ++ RefDNode __t177 = _t; ++ RefDNode tmp53_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp53_AST_in = RefDNode(antlr::nullAST); ++ tmp53_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp53_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp53_AST)); ++ antlr::ASTPair __currentAST177 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LTMARK); +@@ -5808,21 +6171,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST170; +- _t = __t170; ++ currentAST = __currentAST177; ++ _t = __t177; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case GTMARK: + { +- RefDNode __t171 = _t; +- RefDNode tmp59_AST = RefDNode(antlr::nullAST); +- RefDNode tmp59_AST_in = RefDNode(antlr::nullAST); +- tmp59_AST = astFactory->create(antlr::RefAST(_t)); +- tmp59_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp59_AST)); +- antlr::ASTPair __currentAST171 = currentAST; ++ RefDNode __t178 = _t; ++ RefDNode tmp54_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp54_AST_in = RefDNode(antlr::nullAST); ++ tmp54_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp54_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp54_AST)); ++ antlr::ASTPair __currentAST178 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),GTMARK); +@@ -5833,8 +6196,8 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST171; +- _t = __t171; ++ currentAST = __currentAST178; ++ _t = __t178; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; +@@ -5849,13 +6212,13 @@ + } + case LOG_NEG: + { +- RefDNode __t172 = _t; +- RefDNode tmp60_AST = RefDNode(antlr::nullAST); +- RefDNode tmp60_AST_in = RefDNode(antlr::nullAST); +- tmp60_AST = astFactory->create(antlr::RefAST(_t)); +- tmp60_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp60_AST)); +- antlr::ASTPair __currentAST172 = currentAST; ++ RefDNode __t179 = _t; ++ RefDNode tmp55_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp55_AST_in = RefDNode(antlr::nullAST); ++ tmp55_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp55_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp55_AST)); ++ antlr::ASTPair __currentAST179 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),LOG_NEG); +@@ -5863,21 +6226,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST172; +- _t = __t172; ++ currentAST = __currentAST179; ++ _t = __t179; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case ASTERIX: + { +- RefDNode __t173 = _t; +- RefDNode tmp61_AST = RefDNode(antlr::nullAST); +- RefDNode tmp61_AST_in = RefDNode(antlr::nullAST); +- tmp61_AST = astFactory->create(antlr::RefAST(_t)); +- tmp61_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp61_AST)); +- antlr::ASTPair __currentAST173 = currentAST; ++ RefDNode __t180 = _t; ++ RefDNode tmp56_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp56_AST_in = RefDNode(antlr::nullAST); ++ tmp56_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp56_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp56_AST)); ++ antlr::ASTPair __currentAST180 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ASTERIX); +@@ -5888,21 +6251,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST173; +- _t = __t173; ++ currentAST = __currentAST180; ++ _t = __t180; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case MATRIX_OP1: + { +- RefDNode __t174 = _t; +- RefDNode tmp62_AST = RefDNode(antlr::nullAST); +- RefDNode tmp62_AST_in = RefDNode(antlr::nullAST); +- tmp62_AST = astFactory->create(antlr::RefAST(_t)); +- tmp62_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp62_AST)); +- antlr::ASTPair __currentAST174 = currentAST; ++ RefDNode __t181 = _t; ++ RefDNode tmp57_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp57_AST_in = RefDNode(antlr::nullAST); ++ tmp57_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp57_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp57_AST)); ++ antlr::ASTPair __currentAST181 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MATRIX_OP1); +@@ -5913,21 +6276,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST174; +- _t = __t174; ++ currentAST = __currentAST181; ++ _t = __t181; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case MATRIX_OP2: + { +- RefDNode __t175 = _t; +- RefDNode tmp63_AST = RefDNode(antlr::nullAST); +- RefDNode tmp63_AST_in = RefDNode(antlr::nullAST); +- tmp63_AST = astFactory->create(antlr::RefAST(_t)); +- tmp63_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp63_AST)); +- antlr::ASTPair __currentAST175 = currentAST; ++ RefDNode __t182 = _t; ++ RefDNode tmp58_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp58_AST_in = RefDNode(antlr::nullAST); ++ tmp58_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp58_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp58_AST)); ++ antlr::ASTPair __currentAST182 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MATRIX_OP2); +@@ -5938,21 +6301,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST175; +- _t = __t175; ++ currentAST = __currentAST182; ++ _t = __t182; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case SLASH: + { +- RefDNode __t176 = _t; +- RefDNode tmp64_AST = RefDNode(antlr::nullAST); +- RefDNode tmp64_AST_in = RefDNode(antlr::nullAST); +- tmp64_AST = astFactory->create(antlr::RefAST(_t)); +- tmp64_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp64_AST)); +- antlr::ASTPair __currentAST176 = currentAST; ++ RefDNode __t183 = _t; ++ RefDNode tmp59_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp59_AST_in = RefDNode(antlr::nullAST); ++ tmp59_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp59_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp59_AST)); ++ antlr::ASTPair __currentAST183 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),SLASH); +@@ -5963,21 +6326,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST176; +- _t = __t176; ++ currentAST = __currentAST183; ++ _t = __t183; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case MOD_OP: + { +- RefDNode __t177 = _t; +- RefDNode tmp65_AST = RefDNode(antlr::nullAST); +- RefDNode tmp65_AST_in = RefDNode(antlr::nullAST); +- tmp65_AST = astFactory->create(antlr::RefAST(_t)); +- tmp65_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp65_AST)); +- antlr::ASTPair __currentAST177 = currentAST; ++ RefDNode __t184 = _t; ++ RefDNode tmp60_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp60_AST_in = RefDNode(antlr::nullAST); ++ tmp60_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp60_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp60_AST)); ++ antlr::ASTPair __currentAST184 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),MOD_OP); +@@ -5988,21 +6351,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST177; +- _t = __t177; ++ currentAST = __currentAST184; ++ _t = __t184; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case POW: + { +- RefDNode __t178 = _t; +- RefDNode tmp66_AST = RefDNode(antlr::nullAST); +- RefDNode tmp66_AST_in = RefDNode(antlr::nullAST); +- tmp66_AST = astFactory->create(antlr::RefAST(_t)); +- tmp66_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp66_AST)); +- antlr::ASTPair __currentAST178 = currentAST; ++ RefDNode __t185 = _t; ++ RefDNode tmp61_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp61_AST_in = RefDNode(antlr::nullAST); ++ tmp61_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp61_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp61_AST)); ++ antlr::ASTPair __currentAST185 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),POW); +@@ -6013,21 +6376,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST178; +- _t = __t178; ++ currentAST = __currentAST185; ++ _t = __t185; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case DEC: + { +- RefDNode __t179 = _t; +- RefDNode tmp67_AST = RefDNode(antlr::nullAST); +- RefDNode tmp67_AST_in = RefDNode(antlr::nullAST); +- tmp67_AST = astFactory->create(antlr::RefAST(_t)); +- tmp67_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp67_AST)); +- antlr::ASTPair __currentAST179 = currentAST; ++ RefDNode __t186 = _t; ++ RefDNode tmp62_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp62_AST_in = RefDNode(antlr::nullAST); ++ tmp62_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp62_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp62_AST)); ++ antlr::ASTPair __currentAST186 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),DEC); +@@ -6035,21 +6398,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST179; +- _t = __t179; ++ currentAST = __currentAST186; ++ _t = __t186; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case INC: + { +- RefDNode __t180 = _t; +- RefDNode tmp68_AST = RefDNode(antlr::nullAST); +- RefDNode tmp68_AST_in = RefDNode(antlr::nullAST); +- tmp68_AST = astFactory->create(antlr::RefAST(_t)); +- tmp68_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp68_AST)); +- antlr::ASTPair __currentAST180 = currentAST; ++ RefDNode __t187 = _t; ++ RefDNode tmp63_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp63_AST_in = RefDNode(antlr::nullAST); ++ tmp63_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp63_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp63_AST)); ++ antlr::ASTPair __currentAST187 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),INC); +@@ -6057,21 +6420,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST180; +- _t = __t180; ++ currentAST = __currentAST187; ++ _t = __t187; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case POSTDEC: + { +- RefDNode __t181 = _t; +- RefDNode tmp69_AST = RefDNode(antlr::nullAST); +- RefDNode tmp69_AST_in = RefDNode(antlr::nullAST); +- tmp69_AST = astFactory->create(antlr::RefAST(_t)); +- tmp69_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp69_AST)); +- antlr::ASTPair __currentAST181 = currentAST; ++ RefDNode __t188 = _t; ++ RefDNode tmp64_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp64_AST_in = RefDNode(antlr::nullAST); ++ tmp64_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp64_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp64_AST)); ++ antlr::ASTPair __currentAST188 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),POSTDEC); +@@ -6079,21 +6442,21 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST181; +- _t = __t181; ++ currentAST = __currentAST188; ++ _t = __t188; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; + } + case POSTINC: + { +- RefDNode __t182 = _t; +- RefDNode tmp70_AST = RefDNode(antlr::nullAST); +- RefDNode tmp70_AST_in = RefDNode(antlr::nullAST); +- tmp70_AST = astFactory->create(antlr::RefAST(_t)); +- tmp70_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp70_AST)); +- antlr::ASTPair __currentAST182 = currentAST; ++ RefDNode __t189 = _t; ++ RefDNode tmp65_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp65_AST_in = RefDNode(antlr::nullAST); ++ tmp65_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp65_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp65_AST)); ++ antlr::ASTPair __currentAST189 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),POSTINC); +@@ -6101,8 +6464,8 @@ + expr(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST182; +- _t = __t182; ++ currentAST = __currentAST189; ++ _t = __t189; + _t = _t->getNextSibling(); + op_expr_AST = RefDNode(currentAST.root); + break; +@@ -6111,6 +6474,7 @@ + case ARRAYDEF: + case ARRAYDEF_CONST: + case ARRAYEXPR_FN: ++ case ARRAYEXPR_MFCALL: + case CONSTANT: + case FCALL: + case MFCALL: +@@ -6162,12 +6526,12 @@ + RefDNode e_AST = RefDNode(antlr::nullAST); + RefDNode e = RefDNode(antlr::nullAST); + +- RefDNode __t184 = _t; ++ RefDNode __t191 = _t; + u = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode u_AST_in = RefDNode(antlr::nullAST); + u_AST = astFactory->create(antlr::RefAST(u)); + astFactory->addASTChild(currentAST, antlr::RefAST(u_AST)); +- antlr::ASTPair __currentAST184 = currentAST; ++ antlr::ASTPair __currentAST191 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),UMINUS); +@@ -6177,8 +6541,8 @@ + _t = _retTree; + e_AST = returnAST; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST184; +- _t = __t184; ++ currentAST = __currentAST191; ++ _t = __t191; + _t = _t->getNextSibling(); + uminus_AST = RefDNode(currentAST.root); + +@@ -6216,11 +6580,11 @@ + RefDNode ex_AST = RefDNode(antlr::nullAST); + RefDNode ex = RefDNode(antlr::nullAST); + +- RefDNode __t186 = _t; ++ RefDNode __t193 = _t; + e = (_t == RefDNode(ASTNULL)) ? RefDNode(antlr::nullAST) : _t; + RefDNode e_AST_in = RefDNode(antlr::nullAST); + e_AST = astFactory->create(antlr::RefAST(e)); +- antlr::ASTPair __currentAST186 = currentAST; ++ antlr::ASTPair __currentAST193 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),EXPR); +@@ -6229,8 +6593,8 @@ + expr(_t); + _t = _retTree; + ex_AST = returnAST; +- currentAST = __currentAST186; +- _t = __t186; ++ currentAST = __currentAST193; ++ _t = __t193; + _t = _t->getNextSibling(); + brace_expr_AST = RefDNode(currentAST.root); + +@@ -6257,12 +6621,12 @@ + RefDNode ex_AST = RefDNode(antlr::nullAST); + RefDNode ex = RefDNode(antlr::nullAST); + +- RefDNode __t188 = _t; +- RefDNode tmp71_AST = RefDNode(antlr::nullAST); +- RefDNode tmp71_AST_in = RefDNode(antlr::nullAST); +- tmp71_AST = astFactory->create(antlr::RefAST(_t)); +- tmp71_AST_in = _t; +- antlr::ASTPair __currentAST188 = currentAST; ++ RefDNode __t195 = _t; ++ RefDNode tmp66_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp66_AST_in = RefDNode(antlr::nullAST); ++ tmp66_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp66_AST_in = _t; ++ antlr::ASTPair __currentAST195 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),EXPR); +@@ -6271,8 +6635,8 @@ + expr(_t); + _t = _retTree; + ex_AST = returnAST; +- currentAST = __currentAST188; +- _t = __t188; ++ currentAST = __currentAST195; ++ _t = __t195; + _t = _t->getNextSibling(); + unbrace_expr_AST = RefDNode(currentAST.root); + +@@ -6344,13 +6708,13 @@ + switch ( _t->getType()) { + case ARRAYEXPR: + { +- RefDNode __t191 = _t; +- RefDNode tmp72_AST = RefDNode(antlr::nullAST); +- RefDNode tmp72_AST_in = RefDNode(antlr::nullAST); +- tmp72_AST = astFactory->create(antlr::RefAST(_t)); +- tmp72_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp72_AST)); +- antlr::ASTPair __currentAST191 = currentAST; ++ RefDNode __t198 = _t; ++ RefDNode tmp67_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp67_AST_in = RefDNode(antlr::nullAST); ++ tmp67_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp67_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp67_AST)); ++ antlr::ASTPair __currentAST198 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYEXPR); +@@ -6361,8 +6725,8 @@ + arrayindex_list(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST191; +- _t = __t191; ++ currentAST = __currentAST198; ++ _t = __t198; + _t = _t->getNextSibling(); + array_expr_AST = RefDNode(currentAST.root); + break; +@@ -6439,13 +6803,13 @@ + switch ( _t->getType()) { + case ARRAYEXPR: + { +- RefDNode __t194 = _t; +- RefDNode tmp73_AST = RefDNode(antlr::nullAST); +- RefDNode tmp73_AST_in = RefDNode(antlr::nullAST); +- tmp73_AST = astFactory->create(antlr::RefAST(_t)); +- tmp73_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp73_AST)); +- antlr::ASTPair __currentAST194 = currentAST; ++ RefDNode __t201 = _t; ++ RefDNode tmp68_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp68_AST_in = RefDNode(antlr::nullAST); ++ tmp68_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp68_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp68_AST)); ++ antlr::ASTPair __currentAST201 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYEXPR); +@@ -6456,8 +6820,8 @@ + arrayindex_list(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST194; +- _t = __t194; ++ currentAST = __currentAST201; ++ _t = __t201; + _t = _t->getNextSibling(); + tag_array_expr_1st_AST = RefDNode(currentAST.root); + break; +@@ -6500,11 +6864,11 @@ + } + case IDENTIFIER: + { +- RefDNode tmp74_AST = RefDNode(antlr::nullAST); +- RefDNode tmp74_AST_in = RefDNode(antlr::nullAST); +- tmp74_AST = astFactory->create(antlr::RefAST(_t)); +- tmp74_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp74_AST)); ++ RefDNode tmp69_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp69_AST_in = RefDNode(antlr::nullAST); ++ tmp69_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp69_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp69_AST)); + match(antlr::RefAST(_t),IDENTIFIER); + _t = _t->getNextSibling(); + tag_expr_AST = RefDNode(currentAST.root); +@@ -6530,13 +6894,13 @@ + switch ( _t->getType()) { + case ARRAYEXPR: + { +- RefDNode __t197 = _t; +- RefDNode tmp75_AST = RefDNode(antlr::nullAST); +- RefDNode tmp75_AST_in = RefDNode(antlr::nullAST); +- tmp75_AST = astFactory->create(antlr::RefAST(_t)); +- tmp75_AST_in = _t; +- astFactory->addASTChild(currentAST, antlr::RefAST(tmp75_AST)); +- antlr::ASTPair __currentAST197 = currentAST; ++ RefDNode __t204 = _t; ++ RefDNode tmp70_AST = RefDNode(antlr::nullAST); ++ RefDNode tmp70_AST_in = RefDNode(antlr::nullAST); ++ tmp70_AST = astFactory->create(antlr::RefAST(_t)); ++ tmp70_AST_in = _t; ++ astFactory->addASTChild(currentAST, antlr::RefAST(tmp70_AST)); ++ antlr::ASTPair __currentAST204 = currentAST; + currentAST.root = currentAST.child; + currentAST.child = RefDNode(antlr::nullAST); + match(antlr::RefAST(_t),ARRAYEXPR); +@@ -6547,8 +6911,8 @@ + arrayindex_list(_t); + _t = _retTree; + astFactory->addASTChild(currentAST, antlr::RefAST(returnAST)); +- currentAST = __currentAST197; +- _t = __t197; ++ currentAST = __currentAST204; ++ _t = __t204; + _t = _t->getNextSibling(); + tag_array_expr_AST = RefDNode(currentAST.root); + break; +@@ -6573,7 +6937,7 @@ + + void GDLTreeParser::initializeASTFactory( antlr::ASTFactory& factory ) + { +- factory.setMaxNodeType(215); ++ factory.setMaxNodeType(224); + } + const char* GDLTreeParser::tokenNames[] = { + "<0>", +@@ -6584,6 +6948,7 @@ + "ASSIGN", + "ASSIGN_INPLACE", + "ASSIGN_REPLACE", ++ "ASSIGN_ARRAYEXPR_MFCALL", + "ARRAYDEF", + "ARRAYDEF_CONST", + "ARRAYIX", +@@ -6594,8 +6959,10 @@ + "ARRAYIX_RANGE_S", + "ARRAYEXPR", + "ARRAYEXPR_FN", ++ "ARRAYEXPR_MFCALL", + "BLOCK", + "BREAK", ++ "CSBLOCK", + "CONTINUE", + "COMMONDECL", + "COMMONDEF", +@@ -6603,7 +6970,12 @@ + "DEREF", + "ELSEBLK", + "EXPR", ++ "\"for\"", + "FOR_STEP", ++ "\"foreach\"", ++ "FOR_LOOP", ++ "FOR_STEP_LOOP", ++ "FOREACH_LOOP", + "FCALL", + "FCALL_LIB", + "FCALL_LIB_RETNEW", +@@ -6637,6 +7009,8 @@ + "REF", + "REF_CHECK", + "REF_EXPR", ++ "\"repeat\"", ++ "REPEAT_LOOP", + "RETURN", + "RETF", + "RETP", +@@ -6645,6 +7019,7 @@ + "UMINUS", + "VAR", + "VARPTR", ++ "\"while\"", + "IDENTIFIER", + "\"and\"", + "\"begin\"", +@@ -6657,12 +7032,12 @@ + "\"endcase\"", + "\"endelse\"", + "\"endfor\"", ++ "\"endforeach\"", + "\"endif\"", + "\"endrep\"", + "\"endswitch\"", + "\"endwhile\"", + "\"eq\"", +- "\"for\"", + "\"forward_function\"", + "\"function\"", + "\"ge\"", +@@ -6679,11 +7054,9 @@ + "\"on_ioerror\"", + "\"or\"", + "\"pro\"", +- "\"repeat\"", + "\"switch\"", + "\"then\"", + "\"until\"", +- "\"while\"", + "\"xor\"", + "METHOD", + "COMMA", +@@ -6795,21 +7168,23 @@ + 0 + }; + +-const unsigned long GDLTreeParser::_tokenSet_0_data_[] = { 8126496UL, 537133248UL, 348127488UL, 4294707600UL, 127UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// ASSIGN BLOCK BREAK CONTINUE COMMONDECL COMMONDEF MPCALL MPCALL_PARENT +-// PCALL RETURN "case" "for" "forward_function" "goto" "if" "on_ioerror" +-// "repeat" "switch" "while" DEC INC AND_OP_EQ ASTERIX_EQ EQ_OP_EQ GE_OP_EQ +-// GTMARK_EQ GT_OP_EQ LE_OP_EQ LTMARK_EQ LT_OP_EQ MATRIX_OP1_EQ MATRIX_OP2_EQ +-// MINUS_EQ MOD_OP_EQ NE_OP_EQ OR_OP_EQ PLUS_EQ POW_EQ SLASH_EQ XOR_OP_EQ ++const unsigned long GDLTreeParser::_tokenSet_0_data_[] = { 1135607840UL, 67158017UL, 557216UL, 4161044644UL, 65535UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// ASSIGN BLOCK BREAK CONTINUE COMMONDECL COMMONDEF "for" "foreach" MPCALL ++// MPCALL_PARENT PCALL "repeat" RETURN "while" "case" "forward_function" ++// "goto" "if" "on_ioerror" "switch" DEC INC AND_OP_EQ ASTERIX_EQ EQ_OP_EQ ++// GE_OP_EQ GTMARK_EQ GT_OP_EQ LE_OP_EQ LTMARK_EQ LT_OP_EQ MATRIX_OP1_EQ ++// MATRIX_OP2_EQ MINUS_EQ MOD_OP_EQ NE_OP_EQ OR_OP_EQ PLUS_EQ POW_EQ SLASH_EQ ++// XOR_OP_EQ + const antlr::BitSet GDLTreeParser::_tokenSet_0(_tokenSet_0_data_,12); +-const unsigned long GDLTreeParser::_tokenSet_1_data_[] = { 360907552UL, 12650752UL, 3391094863UL, 4294709287UL, 1151UL, 4253024256UL, 31UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; +-// ASSIGN ARRAYDEF ARRAYDEF_CONST ARRAYEXPR ARRAYEXPR_FN CONSTANT DEREF +-// EXPR FCALL MFCALL MFCALL_PARENT NSTRUC_REF POSTDEC POSTINC STRUC SYSVAR +-// UMINUS VAR "and" "eq" "ge" "gt" "le" "lt" "mod" "ne" "not" "or" "xor" +-// DEC INC AND_OP_EQ ASTERIX_EQ EQ_OP_EQ GE_OP_EQ GTMARK_EQ GT_OP_EQ LE_OP_EQ +-// LTMARK_EQ LT_OP_EQ MATRIX_OP1_EQ MATRIX_OP2_EQ MINUS_EQ MOD_OP_EQ NE_OP_EQ +-// OR_OP_EQ PLUS_EQ POW_EQ SLASH_EQ XOR_OP_EQ SLASH ASTERIX DOT POW MATRIX_OP1 +-// MATRIX_OP2 PLUS MINUS LTMARK GTMARK LOG_NEG LOG_AND LOG_OR QUESTION ++const unsigned long GDLTreeParser::_tokenSet_1_data_[] = { 739116576UL, 3238592528UL, 146432UL, 4162928210UL, 589823UL, 0UL, 16379UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; ++// ASSIGN ARRAYDEF ARRAYDEF_CONST ARRAYEXPR ARRAYEXPR_FN ARRAYEXPR_MFCALL ++// CONSTANT DEREF EXPR FCALL MFCALL MFCALL_PARENT NSTRUC_REF POSTDEC POSTINC ++// STRUC SYSVAR UMINUS VAR "and" "eq" "ge" "gt" "le" "lt" "mod" "ne" "not" ++// "or" "xor" DEC INC AND_OP_EQ ASTERIX_EQ EQ_OP_EQ GE_OP_EQ GTMARK_EQ ++// GT_OP_EQ LE_OP_EQ LTMARK_EQ LT_OP_EQ MATRIX_OP1_EQ MATRIX_OP2_EQ MINUS_EQ ++// MOD_OP_EQ NE_OP_EQ OR_OP_EQ PLUS_EQ POW_EQ SLASH_EQ XOR_OP_EQ SLASH ++// ASTERIX DOT POW MATRIX_OP1 MATRIX_OP2 PLUS MINUS LTMARK GTMARK LOG_NEG ++// LOG_AND LOG_OR QUESTION + const antlr::BitSet GDLTreeParser::_tokenSet_1(_tokenSet_1_data_,16); + + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLTreeParser.hpp cvs/gdl/src/GDLTreeParser.hpp +--- gdl-0.9rc4/src/GDLTreeParser.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLTreeParser.hpp 2010-04-22 09:50:40.000000000 -0600 +@@ -67,21 +67,29 @@ + { + if( LoopVar( lN)) + { +- Warning( "Warning: Assignment to FOR loop variable detected."); ++ Warning( "Warning: Assignment to loop variable detected."); + } + int lT = lN->getType(); + if( lT == FCALL || lT == MFCALL || lT == MFCALL_PARENT || +- lT == FCALL_LIB || ++ lT == FCALL_LIB || ++// lT == FCALL_LIB_N_ELEMENTS || + lT == FCALL_LIB_RETNEW || + lT == MFCALL_LIB || + lT == MFCALL_LIB_RETNEW || + lT == MFCALL_PARENT_LIB || + lT == MFCALL_PARENT_LIB_RETNEW || +- lT == DEREF || lT == VAR || lT == VARPTR) ++ lT == DEREF || lT == VAR || lT == VARPTR ++ ) + { + aN->setType( ASSIGN_REPLACE); + aN->setText( "r="); + } ++ if( lT == ARRAYEXPR_MFCALL) // is MFCALL or DOT ++ { ++ aN->setType( ASSIGN_ARRAYEXPR_MFCALL); ++ aN->setText( "?="); ++ } ++ + } + + bool SelfAssignment( RefDNode& lN, RefDNode& rN) +@@ -160,11 +168,13 @@ + public: void case_statement(RefDNode _t); + public: void block(RefDNode _t); + public: void unblock(RefDNode _t); ++ public: void unblock_empty(RefDNode _t); + public: void label(RefDNode _t); + public: void assign_expr_statement(RefDNode _t); + public: void comp_assign_expr(RefDNode _t); + public: void procedure_call(RefDNode _t); + public: void for_statement(RefDNode _t); ++ public: void foreach_statement(RefDNode _t); + public: void repeat_statement(RefDNode _t); + public: void while_statement(RefDNode _t); + public: void jump_statement(RefDNode _t); +@@ -183,8 +193,9 @@ + public: void assign_expr(RefDNode _t); + public: void sysvar(RefDNode _t); + public: void var(RefDNode _t); +- public: void arrayindex_list_to_expression_list(RefDNode _t); ++ public: void arrayindex_list_to_parameter_list(RefDNode _t); + public: void arrayexpr_fn(RefDNode _t); ++ public: void arrayexpr_mfcall(RefDNode _t); + public: void primary_expr(RefDNode _t); + public: void op_expr(RefDNode _t); + public: void uminus(RefDNode _t); +@@ -208,10 +219,10 @@ + private: + static const char* tokenNames[]; + #ifndef NO_STATIC_CONSTS +- static const int NUM_TOKENS = 216; ++ static const int NUM_TOKENS = 225; + #else + enum { +- NUM_TOKENS = 216 ++ NUM_TOKENS = 225 + }; + #endif + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLTreeParserTokenTypes.hpp cvs/gdl/src/GDLTreeParserTokenTypes.hpp +--- gdl-0.9rc4/src/GDLTreeParserTokenTypes.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLTreeParserTokenTypes.hpp 2010-04-22 09:50:40.000000000 -0600 +@@ -16,214 +16,223 @@ + ASSIGN = 5, + ASSIGN_INPLACE = 6, + ASSIGN_REPLACE = 7, +- ARRAYDEF = 8, +- ARRAYDEF_CONST = 9, +- ARRAYIX = 10, +- ARRAYIX_ALL = 11, +- ARRAYIX_ORANGE = 12, +- ARRAYIX_RANGE = 13, +- ARRAYIX_ORANGE_S = 14, +- ARRAYIX_RANGE_S = 15, +- ARRAYEXPR = 16, +- ARRAYEXPR_FN = 17, +- BLOCK = 18, +- BREAK = 19, +- CONTINUE = 20, +- COMMONDECL = 21, +- COMMONDEF = 22, +- CONSTANT = 23, +- DEREF = 24, +- ELSEBLK = 25, +- EXPR = 26, +- FOR_STEP = 27, +- FCALL = 28, +- FCALL_LIB = 29, +- FCALL_LIB_RETNEW = 30, +- IF_ELSE = 31, +- KEYDECL = 32, +- KEYDEF = 33, +- KEYDEF_REF = 34, +- KEYDEF_REF_CHECK = 35, +- KEYDEF_REF_EXPR = 36, +- LABEL = 37, +- MPCALL = 38, +- MPCALL_PARENT = 39, +- MFCALL = 40, +- MFCALL_LIB = 41, +- MFCALL_LIB_RETNEW = 42, +- MFCALL_PARENT = 43, +- MFCALL_PARENT_LIB = 44, +- MFCALL_PARENT_LIB_RETNEW = 45, +- NOP = 46, +- NSTRUC = 47, +- NSTRUC_REF = 48, +- ON_IOERROR_NULL = 49, +- PCALL = 50, +- PCALL_LIB = 51, +- PARADECL = 52, +- PARAEXPR = 53, +- POSTDEC = 54, +- POSTINC = 55, +- DECSTATEMENT = 56, +- INCSTATEMENT = 57, +- REF = 58, +- REF_CHECK = 59, +- REF_EXPR = 60, +- RETURN = 61, +- RETF = 62, +- RETP = 63, +- STRUC = 64, +- SYSVAR = 65, +- UMINUS = 66, +- VAR = 67, +- VARPTR = 68, +- IDENTIFIER = 69, +- AND_OP = 70, +- BEGIN = 71, +- CASE = 72, +- COMMON = 73, +- COMPILE_OPT = 74, +- DO = 75, +- ELSE = 76, +- END = 77, +- ENDCASE = 78, +- ENDELSE = 79, +- ENDFOR = 80, +- ENDIF = 81, +- ENDREP = 82, +- ENDSWITCH = 83, +- ENDWHILE = 84, +- EQ_OP = 85, +- FOR = 86, +- FORWARD = 87, +- FUNCTION = 88, +- GE_OP = 89, +- GOTO = 90, +- GT_OP = 91, +- IF = 92, +- INHERITS = 93, +- LE_OP = 94, +- LT_OP = 95, +- MOD_OP = 96, +- NE_OP = 97, +- NOT_OP = 98, +- OF = 99, +- ON_IOERROR = 100, +- OR_OP = 101, +- PRO = 102, +- REPEAT = 103, +- SWITCH = 104, +- THEN = 105, +- UNTIL = 106, +- WHILE = 107, +- XOR_OP = 108, +- METHOD = 109, +- COMMA = 110, +- COLON = 111, +- END_U = 112, +- EQUAL = 113, +- DEC = 114, +- INC = 115, +- AND_OP_EQ = 116, +- ASTERIX_EQ = 117, +- EQ_OP_EQ = 118, +- GE_OP_EQ = 119, +- GTMARK_EQ = 120, +- GT_OP_EQ = 121, +- LE_OP_EQ = 122, +- LTMARK_EQ = 123, +- LT_OP_EQ = 124, +- MATRIX_OP1_EQ = 125, +- MATRIX_OP2_EQ = 126, +- MINUS_EQ = 127, +- MOD_OP_EQ = 128, +- NE_OP_EQ = 129, +- OR_OP_EQ = 130, +- PLUS_EQ = 131, +- POW_EQ = 132, +- SLASH_EQ = 133, +- XOR_OP_EQ = 134, +- MEMBER = 135, +- LBRACE = 136, +- RBRACE = 137, +- SLASH = 138, +- LSQUARE = 139, +- RSQUARE = 140, +- SYSVARNAME = 141, +- EXCLAMATION = 142, +- LCURLY = 143, +- RCURLY = 144, +- CONSTANT_HEX_BYTE = 145, +- CONSTANT_HEX_LONG = 146, +- CONSTANT_HEX_LONG64 = 147, +- CONSTANT_HEX_INT = 148, +- CONSTANT_HEX_I = 149, +- CONSTANT_HEX_ULONG = 150, +- CONSTANT_HEX_ULONG64 = 151, +- CONSTANT_HEX_UI = 152, +- CONSTANT_HEX_UINT = 153, +- CONSTANT_BYTE = 154, +- CONSTANT_LONG = 155, +- CONSTANT_LONG64 = 156, +- CONSTANT_INT = 157, +- CONSTANT_I = 158, +- CONSTANT_ULONG = 159, +- CONSTANT_ULONG64 = 160, +- CONSTANT_UI = 161, +- CONSTANT_UINT = 162, +- CONSTANT_OCT_BYTE = 163, +- CONSTANT_OCT_LONG = 164, +- CONSTANT_OCT_LONG64 = 165, +- CONSTANT_OCT_INT = 166, +- CONSTANT_OCT_I = 167, +- CONSTANT_OCT_ULONG = 168, +- CONSTANT_OCT_ULONG64 = 169, +- CONSTANT_OCT_UI = 170, +- CONSTANT_OCT_UINT = 171, +- CONSTANT_FLOAT = 172, +- CONSTANT_DOUBLE = 173, +- CONSTANT_BIN_BYTE = 174, +- CONSTANT_BIN_LONG = 175, +- CONSTANT_BIN_LONG64 = 176, +- CONSTANT_BIN_INT = 177, +- CONSTANT_BIN_I = 178, +- CONSTANT_BIN_ULONG = 179, +- CONSTANT_BIN_ULONG64 = 180, +- CONSTANT_BIN_UI = 181, +- CONSTANT_BIN_UINT = 182, +- ASTERIX = 183, +- DOT = 184, +- STRING_LITERAL = 185, +- POW = 186, +- MATRIX_OP1 = 187, +- MATRIX_OP2 = 188, +- PLUS = 189, +- MINUS = 190, +- LTMARK = 191, +- GTMARK = 192, +- LOG_NEG = 193, +- LOG_AND = 194, +- LOG_OR = 195, +- QUESTION = 196, +- STRING = 197, +- INCLUDE = 198, +- EOL = 199, +- W = 200, +- D = 201, +- L = 202, +- H = 203, +- O = 204, +- B = 205, +- EXP = 206, +- DBL_E = 207, +- DBL = 208, +- CONSTANT_OR_STRING_LITERAL = 209, +- COMMENT = 210, +- END_MARKER = 211, +- WHITESPACE = 212, +- SKIP_LINES = 213, +- CONT_STATEMENT = 214, +- END_OF_LINE = 215, ++ ASSIGN_ARRAYEXPR_MFCALL = 8, ++ ARRAYDEF = 9, ++ ARRAYDEF_CONST = 10, ++ ARRAYIX = 11, ++ ARRAYIX_ALL = 12, ++ ARRAYIX_ORANGE = 13, ++ ARRAYIX_RANGE = 14, ++ ARRAYIX_ORANGE_S = 15, ++ ARRAYIX_RANGE_S = 16, ++ ARRAYEXPR = 17, ++ ARRAYEXPR_FN = 18, ++ ARRAYEXPR_MFCALL = 19, ++ BLOCK = 20, ++ BREAK = 21, ++ CSBLOCK = 22, ++ CONTINUE = 23, ++ COMMONDECL = 24, ++ COMMONDEF = 25, ++ CONSTANT = 26, ++ DEREF = 27, ++ ELSEBLK = 28, ++ EXPR = 29, ++ FOR = 30, ++ FOR_STEP = 31, ++ FOREACH = 32, ++ FOR_LOOP = 33, ++ FOR_STEP_LOOP = 34, ++ FOREACH_LOOP = 35, ++ FCALL = 36, ++ FCALL_LIB = 37, ++ FCALL_LIB_RETNEW = 38, ++ IF_ELSE = 39, ++ KEYDECL = 40, ++ KEYDEF = 41, ++ KEYDEF_REF = 42, ++ KEYDEF_REF_CHECK = 43, ++ KEYDEF_REF_EXPR = 44, ++ LABEL = 45, ++ MPCALL = 46, ++ MPCALL_PARENT = 47, ++ MFCALL = 48, ++ MFCALL_LIB = 49, ++ MFCALL_LIB_RETNEW = 50, ++ MFCALL_PARENT = 51, ++ MFCALL_PARENT_LIB = 52, ++ MFCALL_PARENT_LIB_RETNEW = 53, ++ NOP = 54, ++ NSTRUC = 55, ++ NSTRUC_REF = 56, ++ ON_IOERROR_NULL = 57, ++ PCALL = 58, ++ PCALL_LIB = 59, ++ PARADECL = 60, ++ PARAEXPR = 61, ++ POSTDEC = 62, ++ POSTINC = 63, ++ DECSTATEMENT = 64, ++ INCSTATEMENT = 65, ++ REF = 66, ++ REF_CHECK = 67, ++ REF_EXPR = 68, ++ REPEAT = 69, ++ REPEAT_LOOP = 70, ++ RETURN = 71, ++ RETF = 72, ++ RETP = 73, ++ STRUC = 74, ++ SYSVAR = 75, ++ UMINUS = 76, ++ VAR = 77, ++ VARPTR = 78, ++ WHILE = 79, ++ IDENTIFIER = 80, ++ AND_OP = 81, ++ BEGIN = 82, ++ CASE = 83, ++ COMMON = 84, ++ COMPILE_OPT = 85, ++ DO = 86, ++ ELSE = 87, ++ END = 88, ++ ENDCASE = 89, ++ ENDELSE = 90, ++ ENDFOR = 91, ++ ENDFOREACH = 92, ++ ENDIF = 93, ++ ENDREP = 94, ++ ENDSWITCH = 95, ++ ENDWHILE = 96, ++ EQ_OP = 97, ++ FORWARD = 98, ++ FUNCTION = 99, ++ GE_OP = 100, ++ GOTO = 101, ++ GT_OP = 102, ++ IF = 103, ++ INHERITS = 104, ++ LE_OP = 105, ++ LT_OP = 106, ++ MOD_OP = 107, ++ NE_OP = 108, ++ NOT_OP = 109, ++ OF = 110, ++ ON_IOERROR = 111, ++ OR_OP = 112, ++ PRO = 113, ++ SWITCH = 114, ++ THEN = 115, ++ UNTIL = 116, ++ XOR_OP = 117, ++ METHOD = 118, ++ COMMA = 119, ++ COLON = 120, ++ END_U = 121, ++ EQUAL = 122, ++ DEC = 123, ++ INC = 124, ++ AND_OP_EQ = 125, ++ ASTERIX_EQ = 126, ++ EQ_OP_EQ = 127, ++ GE_OP_EQ = 128, ++ GTMARK_EQ = 129, ++ GT_OP_EQ = 130, ++ LE_OP_EQ = 131, ++ LTMARK_EQ = 132, ++ LT_OP_EQ = 133, ++ MATRIX_OP1_EQ = 134, ++ MATRIX_OP2_EQ = 135, ++ MINUS_EQ = 136, ++ MOD_OP_EQ = 137, ++ NE_OP_EQ = 138, ++ OR_OP_EQ = 139, ++ PLUS_EQ = 140, ++ POW_EQ = 141, ++ SLASH_EQ = 142, ++ XOR_OP_EQ = 143, ++ MEMBER = 144, ++ LBRACE = 145, ++ RBRACE = 146, ++ SLASH = 147, ++ LSQUARE = 148, ++ RSQUARE = 149, ++ SYSVARNAME = 150, ++ EXCLAMATION = 151, ++ LCURLY = 152, ++ RCURLY = 153, ++ CONSTANT_HEX_BYTE = 154, ++ CONSTANT_HEX_LONG = 155, ++ CONSTANT_HEX_LONG64 = 156, ++ CONSTANT_HEX_INT = 157, ++ CONSTANT_HEX_I = 158, ++ CONSTANT_HEX_ULONG = 159, ++ CONSTANT_HEX_ULONG64 = 160, ++ CONSTANT_HEX_UI = 161, ++ CONSTANT_HEX_UINT = 162, ++ CONSTANT_BYTE = 163, ++ CONSTANT_LONG = 164, ++ CONSTANT_LONG64 = 165, ++ CONSTANT_INT = 166, ++ CONSTANT_I = 167, ++ CONSTANT_ULONG = 168, ++ CONSTANT_ULONG64 = 169, ++ CONSTANT_UI = 170, ++ CONSTANT_UINT = 171, ++ CONSTANT_OCT_BYTE = 172, ++ CONSTANT_OCT_LONG = 173, ++ CONSTANT_OCT_LONG64 = 174, ++ CONSTANT_OCT_INT = 175, ++ CONSTANT_OCT_I = 176, ++ CONSTANT_OCT_ULONG = 177, ++ CONSTANT_OCT_ULONG64 = 178, ++ CONSTANT_OCT_UI = 179, ++ CONSTANT_OCT_UINT = 180, ++ CONSTANT_FLOAT = 181, ++ CONSTANT_DOUBLE = 182, ++ CONSTANT_BIN_BYTE = 183, ++ CONSTANT_BIN_LONG = 184, ++ CONSTANT_BIN_LONG64 = 185, ++ CONSTANT_BIN_INT = 186, ++ CONSTANT_BIN_I = 187, ++ CONSTANT_BIN_ULONG = 188, ++ CONSTANT_BIN_ULONG64 = 189, ++ CONSTANT_BIN_UI = 190, ++ CONSTANT_BIN_UINT = 191, ++ ASTERIX = 192, ++ DOT = 193, ++ STRING_LITERAL = 194, ++ POW = 195, ++ MATRIX_OP1 = 196, ++ MATRIX_OP2 = 197, ++ PLUS = 198, ++ MINUS = 199, ++ LTMARK = 200, ++ GTMARK = 201, ++ LOG_NEG = 202, ++ LOG_AND = 203, ++ LOG_OR = 204, ++ QUESTION = 205, ++ STRING = 206, ++ INCLUDE = 207, ++ EOL = 208, ++ W = 209, ++ D = 210, ++ L = 211, ++ H = 212, ++ O = 213, ++ B = 214, ++ EXP = 215, ++ DBL_E = 216, ++ DBL = 217, ++ CONSTANT_OR_STRING_LITERAL = 218, ++ COMMENT = 219, ++ END_MARKER = 220, ++ WHITESPACE = 221, ++ SKIP_LINES = 222, ++ CONT_STATEMENT = 223, ++ END_OF_LINE = 224, + NULL_TREE_LOOKAHEAD = 3 + }; + #ifdef __cplusplus +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/GDLTreeParserTokenTypes.txt cvs/gdl/src/GDLTreeParserTokenTypes.txt +--- gdl-0.9rc4/src/GDLTreeParserTokenTypes.txt 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/GDLTreeParserTokenTypes.txt 2010-04-22 09:50:40.000000000 -0600 +@@ -4,211 +4,220 @@ + ASSIGN=5 + ASSIGN_INPLACE=6 + ASSIGN_REPLACE=7 +-ARRAYDEF=8 +-ARRAYDEF_CONST=9 +-ARRAYIX=10 +-ARRAYIX_ALL=11 +-ARRAYIX_ORANGE=12 +-ARRAYIX_RANGE=13 +-ARRAYIX_ORANGE_S=14 +-ARRAYIX_RANGE_S=15 +-ARRAYEXPR=16 +-ARRAYEXPR_FN=17 +-BLOCK=18 +-BREAK=19 +-CONTINUE=20 +-COMMONDECL=21 +-COMMONDEF=22 +-CONSTANT=23 +-DEREF=24 +-ELSEBLK=25 +-EXPR=26 +-FOR_STEP=27 +-FCALL=28 +-FCALL_LIB=29 +-FCALL_LIB_RETNEW=30 +-IF_ELSE=31 +-KEYDECL=32 +-KEYDEF=33 +-KEYDEF_REF=34 +-KEYDEF_REF_CHECK=35 +-KEYDEF_REF_EXPR=36 +-LABEL=37 +-MPCALL=38 +-MPCALL_PARENT=39 +-MFCALL=40 +-MFCALL_LIB=41 +-MFCALL_LIB_RETNEW=42 +-MFCALL_PARENT=43 +-MFCALL_PARENT_LIB=44 +-MFCALL_PARENT_LIB_RETNEW=45 +-NOP=46 +-NSTRUC=47 +-NSTRUC_REF=48 +-ON_IOERROR_NULL=49 +-PCALL=50 +-PCALL_LIB=51 +-PARADECL=52 +-PARAEXPR=53 +-POSTDEC=54 +-POSTINC=55 +-DECSTATEMENT=56 +-INCSTATEMENT=57 +-REF=58 +-REF_CHECK=59 +-REF_EXPR=60 +-RETURN=61 +-RETF=62 +-RETP=63 +-STRUC=64 +-SYSVAR=65 +-UMINUS=66 +-VAR=67 +-VARPTR=68 +-IDENTIFIER=69 +-AND_OP="and"=70 +-BEGIN="begin"=71 +-CASE="case"=72 +-COMMON="common"=73 +-COMPILE_OPT="compile_opt"=74 +-DO="do"=75 +-ELSE="else"=76 +-END="end"=77 +-ENDCASE="endcase"=78 +-ENDELSE="endelse"=79 +-ENDFOR="endfor"=80 +-ENDIF="endif"=81 +-ENDREP="endrep"=82 +-ENDSWITCH="endswitch"=83 +-ENDWHILE="endwhile"=84 +-EQ_OP="eq"=85 +-FOR="for"=86 +-FORWARD="forward_function"=87 +-FUNCTION="function"=88 +-GE_OP="ge"=89 +-GOTO="goto"=90 +-GT_OP="gt"=91 +-IF="if"=92 +-INHERITS="inherits"=93 +-LE_OP="le"=94 +-LT_OP="lt"=95 +-MOD_OP="mod"=96 +-NE_OP="ne"=97 +-NOT_OP="not"=98 +-OF="of"=99 +-ON_IOERROR="on_ioerror"=100 +-OR_OP="or"=101 +-PRO="pro"=102 +-REPEAT="repeat"=103 +-SWITCH="switch"=104 +-THEN="then"=105 +-UNTIL="until"=106 +-WHILE="while"=107 +-XOR_OP="xor"=108 +-METHOD=109 +-COMMA=110 +-COLON=111 +-END_U=112 +-EQUAL=113 +-DEC=114 +-INC=115 +-AND_OP_EQ=116 +-ASTERIX_EQ=117 +-EQ_OP_EQ=118 +-GE_OP_EQ=119 +-GTMARK_EQ=120 +-GT_OP_EQ=121 +-LE_OP_EQ=122 +-LTMARK_EQ=123 +-LT_OP_EQ=124 +-MATRIX_OP1_EQ=125 +-MATRIX_OP2_EQ=126 +-MINUS_EQ=127 +-MOD_OP_EQ=128 +-NE_OP_EQ=129 +-OR_OP_EQ=130 +-PLUS_EQ=131 +-POW_EQ=132 +-SLASH_EQ=133 +-XOR_OP_EQ=134 +-MEMBER=135 +-LBRACE=136 +-RBRACE=137 +-SLASH=138 +-LSQUARE=139 +-RSQUARE=140 +-SYSVARNAME=141 +-EXCLAMATION=142 +-LCURLY=143 +-RCURLY=144 +-CONSTANT_HEX_BYTE=145 +-CONSTANT_HEX_LONG=146 +-CONSTANT_HEX_LONG64=147 +-CONSTANT_HEX_INT=148 +-CONSTANT_HEX_I=149 +-CONSTANT_HEX_ULONG=150 +-CONSTANT_HEX_ULONG64=151 +-CONSTANT_HEX_UI=152 +-CONSTANT_HEX_UINT=153 +-CONSTANT_BYTE=154 +-CONSTANT_LONG=155 +-CONSTANT_LONG64=156 +-CONSTANT_INT=157 +-CONSTANT_I=158 +-CONSTANT_ULONG=159 +-CONSTANT_ULONG64=160 +-CONSTANT_UI=161 +-CONSTANT_UINT=162 +-CONSTANT_OCT_BYTE=163 +-CONSTANT_OCT_LONG=164 +-CONSTANT_OCT_LONG64=165 +-CONSTANT_OCT_INT=166 +-CONSTANT_OCT_I=167 +-CONSTANT_OCT_ULONG=168 +-CONSTANT_OCT_ULONG64=169 +-CONSTANT_OCT_UI=170 +-CONSTANT_OCT_UINT=171 +-CONSTANT_FLOAT=172 +-CONSTANT_DOUBLE=173 +-CONSTANT_BIN_BYTE=174 +-CONSTANT_BIN_LONG=175 +-CONSTANT_BIN_LONG64=176 +-CONSTANT_BIN_INT=177 +-CONSTANT_BIN_I=178 +-CONSTANT_BIN_ULONG=179 +-CONSTANT_BIN_ULONG64=180 +-CONSTANT_BIN_UI=181 +-CONSTANT_BIN_UINT=182 +-ASTERIX=183 +-DOT=184 +-STRING_LITERAL=185 +-POW=186 +-MATRIX_OP1=187 +-MATRIX_OP2=188 +-PLUS=189 +-MINUS=190 +-LTMARK=191 +-GTMARK=192 +-LOG_NEG=193 +-LOG_AND=194 +-LOG_OR=195 +-QUESTION=196 +-STRING=197 +-INCLUDE=198 +-EOL=199 +-W=200 +-D=201 +-L=202 +-H=203 +-O=204 +-B=205 +-EXP=206 +-DBL_E=207 +-DBL=208 +-CONSTANT_OR_STRING_LITERAL=209 +-COMMENT=210 +-END_MARKER=211 +-WHITESPACE=212 +-SKIP_LINES=213 +-CONT_STATEMENT=214 +-END_OF_LINE=215 ++ASSIGN_ARRAYEXPR_MFCALL=8 ++ARRAYDEF=9 ++ARRAYDEF_CONST=10 ++ARRAYIX=11 ++ARRAYIX_ALL=12 ++ARRAYIX_ORANGE=13 ++ARRAYIX_RANGE=14 ++ARRAYIX_ORANGE_S=15 ++ARRAYIX_RANGE_S=16 ++ARRAYEXPR=17 ++ARRAYEXPR_FN=18 ++ARRAYEXPR_MFCALL=19 ++BLOCK=20 ++BREAK=21 ++CSBLOCK=22 ++CONTINUE=23 ++COMMONDECL=24 ++COMMONDEF=25 ++CONSTANT=26 ++DEREF=27 ++ELSEBLK=28 ++EXPR=29 ++FOR="for"=30 ++FOR_STEP=31 ++FOREACH="foreach"=32 ++FOR_LOOP=33 ++FOR_STEP_LOOP=34 ++FOREACH_LOOP=35 ++FCALL=36 ++FCALL_LIB=37 ++FCALL_LIB_RETNEW=38 ++IF_ELSE=39 ++KEYDECL=40 ++KEYDEF=41 ++KEYDEF_REF=42 ++KEYDEF_REF_CHECK=43 ++KEYDEF_REF_EXPR=44 ++LABEL=45 ++MPCALL=46 ++MPCALL_PARENT=47 ++MFCALL=48 ++MFCALL_LIB=49 ++MFCALL_LIB_RETNEW=50 ++MFCALL_PARENT=51 ++MFCALL_PARENT_LIB=52 ++MFCALL_PARENT_LIB_RETNEW=53 ++NOP=54 ++NSTRUC=55 ++NSTRUC_REF=56 ++ON_IOERROR_NULL=57 ++PCALL=58 ++PCALL_LIB=59 ++PARADECL=60 ++PARAEXPR=61 ++POSTDEC=62 ++POSTINC=63 ++DECSTATEMENT=64 ++INCSTATEMENT=65 ++REF=66 ++REF_CHECK=67 ++REF_EXPR=68 ++REPEAT="repeat"=69 ++REPEAT_LOOP=70 ++RETURN=71 ++RETF=72 ++RETP=73 ++STRUC=74 ++SYSVAR=75 ++UMINUS=76 ++VAR=77 ++VARPTR=78 ++WHILE="while"=79 ++IDENTIFIER=80 ++AND_OP="and"=81 ++BEGIN="begin"=82 ++CASE="case"=83 ++COMMON="common"=84 ++COMPILE_OPT="compile_opt"=85 ++DO="do"=86 ++ELSE="else"=87 ++END="end"=88 ++ENDCASE="endcase"=89 ++ENDELSE="endelse"=90 ++ENDFOR="endfor"=91 ++ENDFOREACH="endforeach"=92 ++ENDIF="endif"=93 ++ENDREP="endrep"=94 ++ENDSWITCH="endswitch"=95 ++ENDWHILE="endwhile"=96 ++EQ_OP="eq"=97 ++FORWARD="forward_function"=98 ++FUNCTION="function"=99 ++GE_OP="ge"=100 ++GOTO="goto"=101 ++GT_OP="gt"=102 ++IF="if"=103 ++INHERITS="inherits"=104 ++LE_OP="le"=105 ++LT_OP="lt"=106 ++MOD_OP="mod"=107 ++NE_OP="ne"=108 ++NOT_OP="not"=109 ++OF="of"=110 ++ON_IOERROR="on_ioerror"=111 ++OR_OP="or"=112 ++PRO="pro"=113 ++SWITCH="switch"=114 ++THEN="then"=115 ++UNTIL="until"=116 ++XOR_OP="xor"=117 ++METHOD=118 ++COMMA=119 ++COLON=120 ++END_U=121 ++EQUAL=122 ++DEC=123 ++INC=124 ++AND_OP_EQ=125 ++ASTERIX_EQ=126 ++EQ_OP_EQ=127 ++GE_OP_EQ=128 ++GTMARK_EQ=129 ++GT_OP_EQ=130 ++LE_OP_EQ=131 ++LTMARK_EQ=132 ++LT_OP_EQ=133 ++MATRIX_OP1_EQ=134 ++MATRIX_OP2_EQ=135 ++MINUS_EQ=136 ++MOD_OP_EQ=137 ++NE_OP_EQ=138 ++OR_OP_EQ=139 ++PLUS_EQ=140 ++POW_EQ=141 ++SLASH_EQ=142 ++XOR_OP_EQ=143 ++MEMBER=144 ++LBRACE=145 ++RBRACE=146 ++SLASH=147 ++LSQUARE=148 ++RSQUARE=149 ++SYSVARNAME=150 ++EXCLAMATION=151 ++LCURLY=152 ++RCURLY=153 ++CONSTANT_HEX_BYTE=154 ++CONSTANT_HEX_LONG=155 ++CONSTANT_HEX_LONG64=156 ++CONSTANT_HEX_INT=157 ++CONSTANT_HEX_I=158 ++CONSTANT_HEX_ULONG=159 ++CONSTANT_HEX_ULONG64=160 ++CONSTANT_HEX_UI=161 ++CONSTANT_HEX_UINT=162 ++CONSTANT_BYTE=163 ++CONSTANT_LONG=164 ++CONSTANT_LONG64=165 ++CONSTANT_INT=166 ++CONSTANT_I=167 ++CONSTANT_ULONG=168 ++CONSTANT_ULONG64=169 ++CONSTANT_UI=170 ++CONSTANT_UINT=171 ++CONSTANT_OCT_BYTE=172 ++CONSTANT_OCT_LONG=173 ++CONSTANT_OCT_LONG64=174 ++CONSTANT_OCT_INT=175 ++CONSTANT_OCT_I=176 ++CONSTANT_OCT_ULONG=177 ++CONSTANT_OCT_ULONG64=178 ++CONSTANT_OCT_UI=179 ++CONSTANT_OCT_UINT=180 ++CONSTANT_FLOAT=181 ++CONSTANT_DOUBLE=182 ++CONSTANT_BIN_BYTE=183 ++CONSTANT_BIN_LONG=184 ++CONSTANT_BIN_LONG64=185 ++CONSTANT_BIN_INT=186 ++CONSTANT_BIN_I=187 ++CONSTANT_BIN_ULONG=188 ++CONSTANT_BIN_ULONG64=189 ++CONSTANT_BIN_UI=190 ++CONSTANT_BIN_UINT=191 ++ASTERIX=192 ++DOT=193 ++STRING_LITERAL=194 ++POW=195 ++MATRIX_OP1=196 ++MATRIX_OP2=197 ++PLUS=198 ++MINUS=199 ++LTMARK=200 ++GTMARK=201 ++LOG_NEG=202 ++LOG_AND=203 ++LOG_OR=204 ++QUESTION=205 ++STRING=206 ++INCLUDE=207 ++EOL=208 ++W=209 ++D=210 ++L=211 ++H=212 ++O=213 ++B=214 ++EXP=215 ++DBL_E=216 ++DBL=217 ++CONSTANT_OR_STRING_LITERAL=218 ++COMMENT=219 ++END_MARKER=220 ++WHITESPACE=221 ++SKIP_LINES=222 ++CONT_STATEMENT=223 ++END_OF_LINE=224 +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlwidget.cpp cvs/gdl/src/gdlwidget.cpp +--- gdl-0.9rc4/src/gdlwidget.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlwidget.cpp 2010-06-03 09:06:38.422741858 -0600 +@@ -13,13 +13,18 @@ + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * ++ + ***************************************************************************/ + ++#include ++ + #include "includefirst.hpp" + + #include "basegdl.hpp" + #include "dstructgdl.hpp" + ++#include "dinterpreter.hpp" ++ + #ifdef HAVE_LIBWXWIDGETS + + #include "gdlwidget.hpp" +@@ -32,6 +37,7 @@ + + BEGIN_EVENT_TABLE(GDLFrame, wxFrame) + EVT_BUTTON( wxID_ANY, GDLFrame::OnButton) ++ EVT_RADIOBUTTON(wxID_ANY, GDLFrame::OnRadioButton) + EVT_IDLE( GDLFrame::OnIdle) + END_EVENT_TABLE() + +@@ -62,7 +68,7 @@ + exit(2); + } + } +- std::cout << "Creating Sizer in getSizer: " << *sizer << std::endl; ++ // std::cout << "Creating Sizer in getSizer: " << *sizer << std::endl; + } + + // next are the abstraction to access all widgets only by their +@@ -102,6 +108,22 @@ + return widget; + } + ++// base widget ID from ID ++WidgetIDT GDLWidget::GetBase( WidgetIDT widID) ++{ ++ GDLWidget *widget, *parent; ++ WidgetIDT parentID; ++ ++ parentID = widID; ++ while ( 1) { ++ widget = GetWidget( parentID); ++ if ( widget->parent == 0) ++ return parentID; ++ else ++ parentID = widget->parent; ++ } ++} ++ + void GDLWidget::SetManaged( bool manval) + { + managed = manval; +@@ -109,20 +131,55 @@ + + void GDLWidget::SetMap( bool mapval) + { +- std::cout << "set map: " << mapval << std::endl; ++ // std::cout << "set map: " << mapval << std::endl; + map = mapval; + } + ++void GDLWidget::SetExclusiveMode( int exclusiveval) ++{ ++ exclusiveMode = exclusiveval; ++} ++ + void GDLWidget::SetUvalue( BaseGDL *uV) + { + uValue = uV; + } + ++void GDLWidget::SetVvalue( BaseGDL *vV) ++{ ++ vValue = vV; ++} ++ + void GDLWidget::SetWidgetType( DString wType) + { + widgetType = wType; + } + ++void GDLWidget::SetButtonOff() ++{ ++ buttonSet = false; ++} ++ ++void GDLWidget::SetButtonOn() ++{ ++ buttonSet = true; ++} ++ ++void GDLWidget::SetUname( DString uname) ++{ ++ uName = uname; ++} ++ ++void GDLWidget::SetProValue( DString provalue) ++{ ++ proValue = provalue; ++} ++ ++void GDLWidget::SetFuncValue( DString funcvalue) ++{ ++ funcValue = funcvalue; ++} ++ + //void GDLWidget::SetSizer( wxSizer *sizer) + //{ + // widgetSizer = sizer; +@@ -241,10 +298,10 @@ + } + + +-GDLWidget::GDLWidget( WidgetIDT p, BaseGDL* uV, bool s, bool mp, ++GDLWidget::GDLWidget( WidgetIDT p, BaseGDL* uV, BaseGDL* vV, bool s, bool mp, + DLong xO, DLong yO, DLong xS, DLong yS): + wxWidget( NULL), +- parent( p), uValue( uV), sensitive( s), map( mp), ++ parent( p), uValue( uV), vValue( vV), sensitive( s), map( mp), + xOffset( xO), yOffset( yO), xSize( xS), ySize( yS) + { + managed = false; +@@ -269,12 +326,14 @@ + base->RemoveChild( widgetID); + } + delete uValue; ++ delete vValue; + WidgetRemove( widgetID); + } + +-GDLWidgetBase::GDLWidgetBase( WidgetIDT p, BaseGDL* uV, bool s, bool mp, ++GDLWidgetBase::GDLWidgetBase( WidgetIDT p, BaseGDL* uV, BaseGDL* vV, ++ bool s, bool mp, + DLong xO, DLong yO, DLong xS, DLong yS): +- GDLWidget( p, uV, s, mp, xO, yO, xS, yS) ++ GDLWidget( p, uV, vV, s, mp, xO, yO, xS, yS) + {} + + GDLWidgetBase::GDLWidgetBase( WidgetIDT parentID, +@@ -298,10 +357,10 @@ + DLong xsize, DLong ysize, + DLong scr_xsize, DLong scr_ysize, + DLong x_scroll_size, DLong y_scroll_size): +- GDLWidget( parentID, uvalue, sensitive, map, xoffset, yoffset, 0, 0), ++ GDLWidget( parentID, uvalue, NULL, sensitive, map, xoffset, yoffset, 0, 0), + modal( modal_), mbarID( mBarID) + { +- std::cout << "In GDLWidgetBase::GDLWidgetBase: " << widgetID << std::endl; ++ // std::cout << "In GDLWidgetBase::GDLWidgetBase: " << widgetID << std::endl; + + xmanActCom = false; + wxWindow *wxParent = NULL; +@@ -328,13 +387,13 @@ + std::cout << "after wxMutexGuiEnter()" << std::endl; + + // GDLFrame is derived from wxFrame +- GDLFrame *frame = new GDLFrame( wxParent, widgetID, wxString(title_.c_str(), wxConvUTF8)); ++ GDLFrame *frame = new GDLFrame( wxParent, widgetID, title_); + ((wxFrame *) frame)->SetSize( xsize, ysize); + wxWidget = frame; + + wxPanel *panel = new wxPanel( frame, wxID_ANY); + widgetPanel = panel; +- std::cout << "Creating Panel: " << panel << std::endl; ++ // std::cout << "Creating Panel: " << panel << std::endl; + + getSizer( col, row, frameBox, panel, sizerPtr); + widgetSizer = *sizerPtr; +@@ -344,12 +403,13 @@ + panel->SetSizer( *sizerPtr); + + this->SetMap( mapWid); ++ + } else { + // If parent base widget exists .... + GDLWidget* gdlParent = GetWidget( parent); + wxParent = static_cast< wxWindow*>( gdlParent->WxWidget()); +- std::cout << "Getting Parent: " << parent << " " << gdlParent << " " +- << wxParent << std::endl; ++ // std::cout << "Getting Parent: " << parent << " " << gdlParent << " " ++ // << wxParent << std::endl; + + wxPanel *panel = gdlParent->GetPanel(); + widgetPanel = panel; +@@ -359,6 +419,13 @@ + if ( mapWid) mapWid = gdlParent->GetMap(); + this->SetMap( mapWid); + ++ // Set exclusiveMode ++ // If exclusive then set to -1 to signal first radiobutton ++ if ( exclusiveMode == 1) ++ this->SetExclusiveMode( -exclusiveMode); ++ else ++ this->SetExclusiveMode( exclusiveMode); ++ + if ( mapWid) { + if ( frameBox == 0) { + if ( row == 0) { +@@ -383,21 +450,21 @@ + } + + widgetSizer = sizer; +- std::cout << "Creating Sizer2: " << sizer << std::endl; ++ // std::cout << "Creating Sizer2: " << sizer << std::endl; + + if ( frameBox == 0) { + wxBoxSizer *parentSizer = (wxBoxSizer *) gdlParent->GetSizer(); +- std::cout << "Getting Parent Sizer:" << parentSizer << std::endl; ++ // std::cout << "Getting Parent Sizer:" << parentSizer << std::endl; + parentSizer->Add( sizer, 0, wxEXPAND|wxALL, 5); + } else { + wxStaticBoxSizer *parentSizer = + (wxStaticBoxSizer *) gdlParent->GetSizer(); +- std::cout << "Getting Parent Sizer:" << parentSizer << std::endl; ++ // std::cout << "Getting Parent Sizer:" << parentSizer << std::endl; + parentSizer->Add( sizer, 0, wxEXPAND|wxALL, 5); + } + + if( modal) +- wxWidget = new wxDialog( wxParent, widgetID, wxString(title_.c_str(), wxConvUTF8)); ++ wxWidget = new wxDialog( wxParent, widgetID, title_); + + } // if (mapWid == true) + } +@@ -415,7 +482,7 @@ + // Note: iterator for loop doesn't work when deleting widget + cIter cI = children.begin(); + for( SizeT i=0; i( gdlParent->WxWidget()); +- // std::cout << "Getting Parent: " << p << " " << gdlParent << " " << wxParent << std::endl; ++ ++ // std::cout << "In Button: " << widgetID << " Parent: " << p << " xMode:" << ++ //gdlParent->GetExclusiveMode() << " " << value << std::endl; + + + if (gdlParent->GetMap()) { + wxPanel *panel = gdlParent->GetPanel(); +- wxButton *button = new wxButton( panel, widgetID, wxString(value.c_str(), wxConvUTF8)); + ++ wxButton *button; ++ wxRadioButton *radioButton; ++ wxCheckBox *checkBox; + wxBoxSizer *boxSizer = (wxBoxSizer *) gdlParent->GetSizer(); +- std::cout << "Getting Sizer: " << boxSizer << std::endl; +- boxSizer->Add( button, 0, wxEXPAND | wxALL, 5); ++ ++ if ( gdlParent->GetExclusiveMode() == 0) { ++ button = new wxButton( panel, widgetID, _T( value.c_str())); ++ boxSizer->Add( button, 0, wxEXPAND | wxALL, 5); ++ } else if ( gdlParent->GetExclusiveMode() == -1) { ++ radioButton = new wxRadioButton( panel, widgetID, _T( value.c_str()), ++ wxDefaultPosition, wxDefaultSize, ++ wxRB_GROUP); ++ gdlParent->SetExclusiveMode( 1); ++ boxSizer->Add( radioButton, 0, wxEXPAND | wxALL, 5); ++ } else if ( gdlParent->GetExclusiveMode() == 1) { ++ radioButton = new wxRadioButton( panel, widgetID, _T( value.c_str())); ++ boxSizer->Add( radioButton, 0, wxEXPAND | wxALL, 5); ++ } else if ( gdlParent->GetExclusiveMode() == 2) { ++ checkBox = new wxCheckBox( panel, wxID_ANY, _T( value.c_str())); ++ boxSizer->Add( checkBox, 0, wxEXPAND | wxALL, 5); ++ } + + if ( wxParent != NULL) { +- std::cout << "SetSizeHints: " << wxParent << std::endl; ++ // std::cout << "SetSizeHints: " << wxParent << std::endl; + boxSizer->SetSizeHints( wxParent); + } + } // GetMap() + ++ + // Generate event structure + DStructGDL* widgbut = new DStructGDL( "WIDGET_BUTTON"); + widgbut->InitTag("ID", DLongGDL( widgetID)); +- widgbut->InitTag("TOP", DLongGDL( p)); ++ widgbut->InitTag("TOP", DLongGDL( GDLWidget::GetBase( p))); + widgbut->InitTag("HANDLER", DLongGDL( 0)); + widgbut->InitTag("SELECT", DLongGDL( 0)); + +@@ -508,11 +594,60 @@ + (s->GetTag(s->Desc()->TagIndex("SELECT"), 0)))[0] = 0; + } + ++//GDLWidgetDropList::GDLWidgetDropList( WidgetIDT p, BaseGDL *uV, DStringGDL *value, ++GDLWidgetDropList::GDLWidgetDropList( WidgetIDT p, BaseGDL *uV, BaseGDL *value, ++ DString title, DLong xSize, DLong style): ++ GDLWidget( p, uV, NULL, 0, 0, 0, 0, 0) ++{ ++ // std::cout << "In DropList: " << widgetID << " " << p << std::endl; ++ ++ GDLWidget* gdlParent = GetWidget( p); ++ wxWindow *wxParent = static_cast< wxWindow*>( gdlParent->WxWidget()); ++ ++ wxComboBox *combo; ++ ++ if (gdlParent->GetMap()) { ++ wxPanel *panel = gdlParent->GetPanel(); ++ ++ DStringGDL* val = static_cast( value); ++ ++ DLong n= val->N_Elements(); ++ wxString *choices = new wxString[n]; ++ for( SizeT i=0; iGetSizer(); ++ boxSizer->Add( combo, 0, wxEXPAND | wxALL, 5); ++ ++ if ( wxParent != NULL) { ++ // std::cout << "SetSizeHints: " << wxParent << std::endl; ++ boxSizer->SetSizeHints( wxParent); ++ } ++ } // GetMap() ++ ++ // Generate event structure ++ DStructGDL* widgdlist = new DStructGDL( "WIDGET_DROPLIST"); ++ widgdlist->InitTag("ID", DLongGDL( widgetID)); ++ widgdlist->InitTag("TOP", DLongGDL( p)); ++ widgdlist->InitTag("HANDLER", DLongGDL( 0)); ++ widgdlist->InitTag("SELECT", DLongGDL( 0)); ++ ++ // Push event structure into event variable list ++ std::ostringstream varname; ++ varname << "WDLIST" << this->WidgetID(); ++ DVar *v = new DVar( varname.rdbuf()->str().c_str(), widgdlist); ++ eventVarList.push_back(v); ++} ++ ++ + GDLWidgetText::GDLWidgetText( WidgetIDT p, BaseGDL *uV, DString value, + DLong xSize): +- GDLWidget( p, uV, 0, 0, 0, 0, 0) ++ GDLWidget( p, uV, NULL, 0, 0, 0, 0, 0) + { +- std::cout << "In Text: " << widgetID << " " << p << std::endl; ++ // std::cout << "In Text: " << widgetID << " " << p << std::endl; + + GDLWidget* gdlParent = GetWidget( p); + wxWindow *wxParent = static_cast< wxWindow*>( gdlParent->WxWidget()); +@@ -520,14 +655,14 @@ + + if (gdlParent->GetMap()) { + wxPanel *panel = gdlParent->GetPanel(); +- text = new wxTextCtrl( panel, widgetID, wxString(value.c_str(), wxConvUTF8), ++ text = new wxTextCtrl( panel, widgetID, _T( value.c_str()), + wxDefaultPosition, wxSize( xSize*5, wxDefaultCoord) ); + + wxBoxSizer *boxSizer = (wxBoxSizer *) gdlParent->GetSizer(); + boxSizer->Add( text, 0, wxEXPAND | wxALL, 5); + + if ( wxParent != NULL) { +- std::cout << "SetSizeHints: " << wxParent << std::endl; ++ // std::cout << "SetSizeHints: " << wxParent << std::endl; + boxSizer->SetSizeHints( wxParent); + } + } // GetMap() +@@ -549,7 +684,7 @@ + + void GDLWidgetText::SetTextValue( DString value) + { +- text->SetValue(wxString(value.c_str(), wxConvUTF8)); ++ text->SetValue( _T( value)); + // text->Refresh(); + //wxMilliSleep(700); + } +@@ -557,46 +692,32 @@ + + GDLWidgetLabel::GDLWidgetLabel( WidgetIDT p, BaseGDL *uV, DString value, + DLong xSize): +- GDLWidget( p, uV, 0, 0, 0, 0, 0) ++ GDLWidget( p, uV, NULL, 0, 0, 0, 0, 0) + { +- std::cout << "In Label: " << widgetID << " " << p << std::endl; ++ // std::cout << "In Label: " << widgetID << " " << p << std::endl; + + GDLWidget* gdlParent = GetWidget( p); + wxWindow *wxParent = static_cast< wxWindow*>( gdlParent->WxWidget()); + + if ( gdlParent->GetMap()) { + wxPanel *panel = gdlParent->GetPanel(); +- label = new wxStaticText( panel, wxID_ANY, wxString(value.c_str(), wxConvUTF8), ++ label = new wxStaticText( panel, wxID_ANY, _T( value.c_str()), + wxPoint(10, 10), wxDefaultSize, wxALIGN_CENTRE); + + wxBoxSizer *boxSizer = (wxBoxSizer *) gdlParent->GetSizer(); + boxSizer->Add( label, 0, wxEXPAND | wxALL, 5); + + if ( wxParent != NULL) { +- std::cout << "SetSizeHints: " << wxParent << std::endl; ++ // std::cout << "SetSizeHints: " << wxParent << std::endl; + boxSizer->SetSizeHints( wxParent); + } + } // GetMap() + +- /* +- // Generate event structure +- DStructGDL* widgtxt = new DStructGDL( "WIDGET_TEXT"); +- widgtxt->InitTag("ID", DLongGDL( widgetID)); +- widgtxt->InitTag("TOP", DLongGDL( p)); +- widgtxt->InitTag("HANDLER", DLongGDL( 0)); +- widgtxt->InitTag("SELECT", DLongGDL( 0)); +- +- // Push event structure into event variable list +- std::ostringstream varname; +- varname << "WTXT" << this->WidgetID(); +- DVar *v = new DVar( varname.rdbuf()->str().c_str(), widgtxt); +- eventVarList.push_back(v); +- */ + } + + void GDLWidgetLabel::SetLabelValue( DString value) + { +- label->SetLabel(wxString(value.c_str(), wxConvUTF8)); ++ label->SetLabel( _T( value)); + } + + // *** GDLFrame *** +@@ -612,6 +733,13 @@ + + std::cout << "in OnButton: " << event.GetId() << std::endl; + ++ // Get XmanagerActiveCommand status ++ WidgetIDT baseWidgetID = GDLWidget::GetBase( event.GetId()); ++ // std::cout << "Base Widget ID: " << baseWidgetID << std::endl; ++ GDLWidget *baseWidget = GDLWidget::GetWidget( baseWidgetID); ++ bool xmanActCom = baseWidget->GetXmanagerActiveCommand(); ++ //std::cout << "xmanActCom: " << xmanActCom << std::endl; ++ + // Form button event variable name + std::ostringstream varname; + varname << "WBUT" << event.GetId(); +@@ -619,14 +747,84 @@ + // Find name and set SELECT tag to 1 + DVar *var=FindInVarList( eventVarList, varname.rdbuf()->str().c_str()); + DStructGDL* s = static_cast( var->Data()); ++ + (*static_cast + (s->GetTag(s->Desc()->TagIndex("SELECT"), 0)))[0] = 1; + ++ if ( xmanActCom == true) { ++ DString eventHandler; ++ eventHandler = baseWidget->GetEventPro(); ++ eventHandler = StrUpCase( eventHandler); ++ ++ int proIx = ProIx( eventHandler); ++ DSub *sub = proList[ proIx]; ++ EnvBaseT* e; ++ e = new EnvUDT( NULL, sub); ++ std::auto_ptr< EnvBaseT> e_guard( e); ++ StackSizeGuard guard( GDLInterpreter::CallStack()); ++ GDLInterpreter::CallStack().push_back( e); ++ ++ EnvBaseT* caller; ++ caller = e->Caller(); ++ e->Interpreter()->CallStack().pop_back(); ++ ++ DLong id, top, handler, select; ++ id = (*static_cast ++ (s->GetTag(s->Desc()->TagIndex("ID"), 0)))[0]; ++ top = (*static_cast ++ (s->GetTag(s->Desc()->TagIndex("TOP"), 0)))[0]; ++ handler = (*static_cast ++ (s->GetTag(s->Desc()->TagIndex("HANDLER"), 0)))[0]; ++ ++ // Build event handler command ++ std::ostringstream ostr; ++ ostr << "EV={WIDGET_BUTTON, "; ++ ostr << "ID: " << id << "L, TOP: " << top << "L, "; ++ ostr << "HANDLER: " << handler << "L, SELECT: " << select << "L } "; ++ ostr << "& " << eventHandler.c_str() << ", EV"; ++ ++ DString line = ostr.rdbuf()->str(); ++ std::istringstream istr(line+"\n"); ++ ++ RefDNode theAST; ++ ++ GDLLexer lexer(istr, "", GDLParser::NONE); ++ GDLParser& parser = lexer.Parser(); ++ parser.interactive(); ++ ++ theAST = parser.getAST(); ++ RefDNode trAST; ++ GDLTreeParser treeParser( caller); ++ treeParser.interactive(theAST); ++ trAST = treeParser.getAST(); ++ ++ ProgNodeP progAST = ProgNode::NewProgNode( trAST); ++ std::auto_ptr< ProgNode> progAST_guard( progAST); ++ ++ // necessary for correct FOR loop handling ++ assert( dynamic_cast(caller) != NULL); ++ EnvUDT* env = static_cast(caller); ++ int nForLoopsIn = env->NForLoops(); ++ int nForLoops = ProgNode::NumberForLoops( progAST, nForLoopsIn); ++ env->ResizeForLoops( nForLoops); ++ env->ResizeForLoops( nForLoopsIn); ++ ++ RetCode retCode = ++ caller->Interpreter()->execute( progAST); ++ } ++ + // Pause 50 millisecs then refresh widget + wxMilliSleep( 50); + Refresh(); + } + ++void GDLFrame::OnRadioButton( wxCommandEvent& event) ++{ ++ std::cout << "in OnRadioButton: " << event.GetId() << std::endl; ++ ++ ++} ++ + void GDLFrame::OnIdle( wxIdleEvent&) + { + // std::cout << "In OnIdle" << std::endl; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlwidget.hpp cvs/gdl/src/gdlwidget.hpp +--- gdl-0.9rc4/src/gdlwidget.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlwidget.hpp 2010-06-03 09:06:38.425800749 -0600 +@@ -73,6 +73,7 @@ + // get widget from ID + static GDLWidget* GetWidget( WidgetIDT widID); + static GDLWidget* GetParent( WidgetIDT widID); ++ static WidgetIDT GetBase( WidgetIDT widID); + + static void Init(); // GUI intialization upon GDL startup + +@@ -84,23 +85,31 @@ + WidgetIDT widgetID; // own index to widgetList + WidgetIDT parent; // parent ID (0 for TLBs) + BaseGDL* uValue; // the UVALUE ++ BaseGDL* vValue; // the VVALUE + bool sensitive; + bool managed; + bool map; ++ bool buttonSet; ++ int exclusiveMode; + DLong xOffset, yOffset, xSize, ySize; + wxSizer* topWidgetSizer; + wxSizer* widgetSizer; + wxPanel* widgetPanel; + DString widgetType; ++ DString uName; ++ DString proValue; ++ DString funcValue; + + public: +- GDLWidget( WidgetIDT p=0, BaseGDL* uV=NULL, bool s=true, bool mp=true, ++ GDLWidget( WidgetIDT p=0, BaseGDL* uV=NULL, BaseGDL* vV=NULL, ++ bool s=true, bool mp=true, + DLong xO=-1, DLong yO=-1, DLong xS=-1, DLong yS=-1); + virtual ~GDLWidget(); + + wxObject* WxWidget() { return wxWidget;} + + BaseGDL* GetUvalue() { return uValue;} ++ BaseGDL* GetVvalue() { return vValue;} + + virtual void Realize( bool) {} + virtual DLong GetChild( DLong) {}; +@@ -125,10 +134,27 @@ + bool GetMap() { return map;} + void SetMap( bool); + ++ int GetExclusiveMode() { return exclusiveMode;} ++ void SetExclusiveMode( int); ++ + void SetUvalue( BaseGDL *); ++ void SetVvalue( BaseGDL *); + + void SetWidgetType( DString); + DString GetWidgetType() { return widgetType;} ++ ++ void SetButtonOff(); ++ void SetButtonOn(); ++ bool GetButtonSet() { return buttonSet;} ++ ++ void SetUname( DString); ++ DString GetUname() { return uName;} ++ ++ void SetProValue( DString); ++ DString GetProValue() { return proValue;} ++ ++ void SetFuncValue( DString); ++ DString GetFuncValue() { return funcValue;} + }; + + +@@ -145,6 +171,18 @@ + }; + + ++// droplist widget ************************************************** ++class GDLWidgetDropList: public GDLWidget ++{ ++public: ++ // GDLWidgetDropList( WidgetIDT p, BaseGDL *uV, DStringGDL *value, ++ // DString title, DLong xSize, DLong style); ++ GDLWidgetDropList( WidgetIDT p, BaseGDL *uV, BaseGDL *value, ++ DString title, DLong xSize, DLong style); ++ void SetSelectOff(); ++}; ++ ++ + // text widget ************************************************** + class GDLWidgetText: public GDLWidget + { +@@ -210,6 +248,7 @@ + + GDLWidgetBase( WidgetIDT p=0, // parent + BaseGDL* uV=NULL, // UVALUE ++ BaseGDL* vV=NULL, // VVALUE + bool s=true, // SENSITIVE + bool mp=true, // MAP + DLong xO=-1, DLong yO=-1, // offset +@@ -245,12 +284,12 @@ + + // event handlers (these functions should _not_ be virtual) + void OnButton( wxCommandEvent& event); ++ void OnRadioButton( wxCommandEvent& event); + void OnIdle( wxIdleEvent& event); + + private: + // any class wishing to process wxWidgets events must use this macro + DECLARE_EVENT_TABLE() +-; + }; + + #endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlxstream.cpp cvs/gdl/src/gdlxstream.cpp +--- gdl-0.9rc4/src/gdlxstream.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlxstream.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -24,6 +24,8 @@ + + using namespace std; + ++// bool GDLXStream::plstreamInitCalled = false; ++ + void GDLXStream::Init() + { + // plstream::init() calls exit() if it cannot establish a connection with X-server +@@ -36,9 +38,13 @@ + } + XCloseDisplay(display); + } +- +- plstream::init(); + ++// if( !plstreamInitCalled) ++// { ++ this->plstream::init(); ++// plstreamInitCalled = true; ++// } ++ + // set_stream(); // private + plgpls( &pls); + XwDev *dev = (XwDev *) pls->dev; +@@ -55,9 +61,37 @@ + { + if( !valid) return; + ++ // dummy call to get private function set_stream() called ++// char dummy; ++// gesc( &dummy); ++// ++// plgpls( &pls); ++ + XwDev *dev = (XwDev *) pls->dev; ++ ++// if( dev == NULL) ++// this->plstream::init(); ++// ++// plgpls( &pls); ++// ++// dev = (XwDev *) pls->dev; ++ ++ if( dev == NULL) ++ { ++ cerr << "X window invalid." << endl; ++ valid = false; ++ return; ++ } ++ + XwDisplay *xwd = (XwDisplay *) dev->xwd; + ++ if( xwd == NULL) ++ { ++ cerr << "X window not set." << endl; ++ valid = false; ++ return; ++ } ++ + XEvent event; + if( XCheckTypedWindowEvent( xwd->display, dev->window, + ClientMessage, &event)) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlxstream.hpp cvs/gdl/src/gdlxstream.hpp +--- gdl-0.9rc4/src/gdlxstream.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlxstream.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -28,14 +28,14 @@ + PLStream* pls; + + public: +- GDLXStream( int nx, int ny): +- GDLGStream( nx, ny, "xwin") ++ GDLXStream( int nx, int ny) ++ : GDLGStream( nx, ny, "xwin") ++// , plstreamInitCalled( false) + { + } + + ~GDLXStream() +- { +- } ++ {} + + void Init(); + void EventHandler(); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gdlzstream.cpp cvs/gdl/src/gdlzstream.cpp +--- gdl-0.9rc4/src/gdlzstream.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gdlzstream.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -43,6 +43,6 @@ + + void GDLZStream::Init() + { +- plstream::init(); ++ plstream::init(); + } + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/grib.cpp cvs/gdl/src/grib.cpp +--- gdl-0.9rc4/src/grib.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/grib.cpp 2010-04-22 09:50:41.000000000 -0600 +@@ -1,5 +1,5 @@ + /*************************************************************************** +- grib_fun.cpp - GRIB GDL library function ++ grib.cpp - GRIB GDL library function + ------------------- + begin : Jan 18 2009 + copyright : (C) 2009 by Sylwester Arabas +@@ -27,7 +27,7 @@ + #include "grib.hpp" + + #ifdef USE_GRIB +-# include "grib_api.h" ++# include + # include + #endif + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/grib.hpp cvs/gdl/src/grib.hpp +--- gdl-0.9rc4/src/grib.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/grib.hpp 2010-04-22 09:50:41.000000000 -0600 +@@ -15,8 +15,8 @@ + * * + ***************************************************************************/ + +-#ifndef GRIB_FUN_HPP_ +-#define GRIB_FUN_HPP_ ++#ifndef GRIB_HPP_ ++#define GRIB_HPP_ + + #include "datatypes.hpp" + #include "envt.hpp" +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gshhs.cpp cvs/gdl/src/gshhs.cpp +--- gdl-0.9rc4/src/gshhs.cpp 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/gshhs.cpp 2010-05-21 10:23:57.505905593 -0600 +@@ -0,0 +1,288 @@ ++/*************************************************************************** ++ gshhs.cpp - GSHHS-related routines ++ ------------------- ++ begin : Apr 18 2010 ++ copyright : (C) 2010 by Sylwester Arabas ++ based on the GPL-licensed code (see note below) ++ by P. Wessel and W. H. F. Smith ++ email : slayoo@users.sourceforge.net ++ ***************************************************************************/ ++ ++/*************************************************************************** ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++#ifdef HAVE_CONFIG_H ++#include ++#else ++// default: assume we have GSHHS ++#define USE_GSHHS 1 ++#endif ++ ++#include "includefirst.hpp" ++#include "gshhs.hpp" ++#include "plotting.hpp" ++#include "math_utl.hpp" ++ ++#ifdef USE_GSHHS ++# include ++#endif ++ ++namespace lib { ++ ++ using namespace std; ++ ++ void map_continents(EnvT* e) ++ { ++#ifndef USE_GSHHS ++ e->Throw("GDL was compiled without support for GSHHS"); ++#else ++ ++ // mapping init ++ bool mapSet = false; ++#ifdef USE_LIBPROJ4 ++ LPTYPE idata; ++ XYTYPE odata; ++ get_mapset(mapSet); ++ if (mapSet) ++ { ++ ref = map_init(); ++ if (ref == NULL) e->Throw( "Projection initialization failed."); ++ } ++#endif ++ if (!mapSet) ++ e->Throw("Map transform not established (MAP_SET)."); ++ ++ // plotting init ++ GDLGStream* actStream = GetPlotStream(e); ++ ++ gkw_color(e, actStream); ++ ++ actStream->NoSub(); ++ ++ DDouble *sx, *sy; ++ GetSFromPlotStructs(&sx, &sy); ++ ++ DFloat *wx, *wy; ++ GetWFromPlotStructs(&wx, &wy); ++ ++ DDouble xStart, xEnd, yStart, yEnd; ++ DataCoordLimits(sx, sy, wx, wy, &xStart, &xEnd, &yStart, &yEnd); ++ ++ actStream->vpor(wx[0], wx[1], wy[0], wy[1]); ++ actStream->wind( xStart, xEnd, yStart, yEnd); ++ ++ // GDL stuff ++ static int riversIx = e->KeywordIx("RIVERS"); ++ bool kw_rivers = e->KeywordSet(riversIx); ++ static int countriesIx = e->KeywordIx("COUNTRIES"); ++ bool kw_countries = e->KeywordSet(countriesIx); ++ static int hiresIx = e->KeywordIx("HIRES"); ++ bool kw_hires = e->KeywordSet(hiresIx); ++ static int fillIx = e->KeywordIx("FILL_CONTINENTS"); ++ bool kw_fill = e->KeywordSet(fillIx); ++ ++ // SA: the code below is based on the gshhs.c by Paul Wessel ++ // here's the original copyright notice: ++ ++ /* ++ * Copyright (c) 1996-2009 by P. Wessel and W. H. F. Smith ++ * See COPYING file for copying and redistribution conditions. ++ * ++ * PROGRAM: gshhs.c ++ * AUTHOR: Paul Wessel (pwessel@hawaii.edu) ++ * CREATED: JAN. 28, 1996 ++ * PURPOSE: To extract ASCII data from the binary GSHHS shoreline data ++ * as described in the 1996 Wessel & Smith JGR Data Analysis Note. ++ * VERSION: 1.1 (Byte flipping added) ++ * 1.2 18-MAY-1999: ++ * Explicit binary open for DOS systems ++ * POSIX.1 compliant ++ * 1.3 08-NOV-1999: Released under GNU GPL ++ * 1.4 05-SEPT-2000: Made a GMT supplement; FLIP no longer needed ++ * 1.5 14-SEPT-2004: Updated to deal with latest GSHHS database (1.3) ++ * 1.6 02-MAY-2006: Updated to deal with latest GSHHS database (1.4) ++ * 1.7 11-NOV-2006: Fixed bug in computing level (&& vs &) ++ * 1.8 31-MAR-2007: Updated to deal with latest GSHHS database (1.5) ++ * 1.9 27-AUG-2007: Handle line data as well as polygon data ++ * 1.10 15-FEB-2008: Updated to deal with latest GSHHS database (1.6) ++ * 1.12 15-JUN-2009: Now contains information on container polygon, ++ * the polygons ancestor in the full resolution, and ++ * a flag to tell if a lake is a riverlake. ++ * Updated to deal with latest GSHHS database (2.0) ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; version 2 of the License. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * Contact info: www.soest.hawaii.edu/pwessel ++ */ ++ ++ string dir = string(GDLDATADIR) + "/../gshhs/"; ++ enum set {continents, countries, rivers, coasts}; ++ string sufix = kw_hires ? "_h.b" : "_c.b"; ++ ++ vector files(4); ++ files[continents] = dir + "gshhs" + sufix; ++ files[countries] = dir + "wdb_borders" + sufix; ++ files[rivers] = dir + "wdb_rivers" + sufix; ++ files[coasts] = dir + "gshhs" + sufix; ++ ++ for (int i = 0; i < files.size(); ++i) ++ { ++ if (kw_fill && i != continents) continue; ++ ++ if (i == countries && !kw_countries) continue; ++ if (i == rivers && !kw_rivers) continue; ++ // TODO: coasts, continents ++ ++ FILE *fp = NULL; ++ if ((fp = fopen (files[i].c_str(), "rb")) == NULL ) ++ e->Throw("GSHHS: Could not open file: " + files[i]); ++ ++ struct GSHHS h; ++ int n_read = fread((void *)&h, (size_t)sizeof (struct GSHHS), (size_t)1, fp); ++ int version = (h.flag >> 8) & 255; ++ int flip = (version != GSHHS_DATA_RELEASE); /* Take as sign that byte-swabbing is needed */ ++ ++ int max_east = 270000000; ++ while (n_read == 1) ++ { ++ if (flip) ++ { ++ h.id = swabi4((unsigned int)h.id); ++ h.n = swabi4((unsigned int)h.n); ++ h.west = swabi4((unsigned int)h.west); ++ h.east = swabi4((unsigned int)h.east); ++ h.south = swabi4((unsigned int)h.south); ++ h.north = swabi4((unsigned int)h.north); ++ h.area = swabi4((unsigned int)h.area); ++ h.area_full = swabi4((unsigned int)h.area_full); ++ h.flag = swabi4((unsigned int)h.flag); ++ h.container = swabi4((unsigned int)h.container); ++ h.ancestor = swabi4((unsigned int)h.ancestor); ++ } ++ ++ int level = h.flag & 255; // Level is 1-4 ++ version = (h.flag >> 8) & 255; // Version is 1-7 ++ int greenwich = (h.flag >> 16) & 1; // Greenwich is 0 or 1 ++ int src = (h.flag >> 24) & 1; // Greenwich is 0 (WDBII) or 1 (WVS) ++ int river = (h.flag >> 25) & 1; // River is 0 (not river) or 1 (is river) ++ double ww = h.west * GSHHS_SCL; // Convert from microdegrees to degrees ++ double ee = h.east * GSHHS_SCL; ++ double ss = h.south * GSHHS_SCL; ++ double nn = h.north * GSHHS_SCL; ++ char source = (src == 1) ? 'W' : 'C'; // Either WVS or CIA (WDBII) pedigree ++ if (river) source = tolower ((int)source); // Lower case c means river-lake ++ int line = (h.area) ? 0 : 1; // Either Polygon (0) or Line (1) (if no area) ++ ++ /* ++ double area = 0.1 * h.area; // Now im km^2 ++ double f_area = 0.1 * h.area_full; // Now im km^2 ++ ++ char kind[2] = {'P', 'L'}; ++ char c = kind[line]; ++ if (line) ++ { ++ printf ("%c %6d%8d%2d%2c%10.5f%10.5f%10.5f%10.5f\n", c, h.id, h.n, level, source, ww, ee, ss, nn); ++ } ++ else ++ { ++ char ancestor[8], container[8]; ++ (h.container == -1) ? sprintf (container, "-") : sprintf (container, "%6d", h.container); ++ (h.ancestor == -1) ? sprintf (ancestor, "-") : sprintf (ancestor, "%6d", h.ancestor); ++ printf ("%c %6d%8d%2d%2c%13.3f%13.3f%10.5f%10.5f%10.5f%10.5f %s %s\n", c, h.id, h.n, level, source, area, f_area, ww, ee, ss, nn, container, ancestor); ++ } ++ */ ++ ++ double lon_last, lat_last; ++ PLFLT *lons, *lats; ++ if (kw_fill && !line) ++ { ++ lons = (PLFLT*)malloc(h.n * sizeof(PLFLT)); ++ if (lons == NULL) ++ e->Throw("Failed to allocate memory (lons)"); ++ lats = (PLFLT*)malloc(h.n * sizeof(PLFLT)); ++ if (lats == NULL) ++ e->Throw("Failed to allocate memory (lats)"); ++ } ++ for (int k = 0; k < h.n; k++) ++ { ++ struct POINT p; ++ if (fread ((void *)&p, (size_t)sizeof(struct POINT), (size_t)1, fp) != 1) ++ { ++ e->Throw("Error reading file" + files[i] + " for " + (line ? "line" : "polygon") ++ + i2s(h.id) + ", point " + i2s(k)); ++ } ++ ++ if (!(line && kw_fill)) ++ { ++ // byte order ++ if (flip) ++ { ++ p.x = swabi4((unsigned int)p.x); ++ p.y = swabi4((unsigned int)p.y); ++ } ++ ++ // value scaling ++ double lon = p.x * GSHHS_SCL; ++ if ((greenwich && p.x > max_east) || (h.west > 180000000)) lon -= 360.0; ++ double lat = p.y * GSHHS_SCL; ++ ++#ifdef USE_LIBPROJ4 ++ // map projection ++ if (mapSet) // ... always true ++ { ++ idata.lam = lon * DEG_TO_RAD; ++ idata.phi = lat * DEG_TO_RAD; ++ odata = PJ_FWD(idata, ref); ++ lon = odata.x; ++ lat = odata.y; ++ } ++#endif ++ ++ // drawing line or recording data for drawing a polygon afterwards ++ if (!kw_fill) ++ { ++ if (k != 0) actStream->join(lon_last, lat_last, lon, lat); ++ lon_last = lon; ++ lat_last = lat; ++ } ++ else ++ { ++ lons[k] = lon; ++ lats[k] = lat; ++ } ++ } ++ } ++ if (kw_fill && !line) ++ { ++ actStream->fill(h.n, lons, lats); // TODO: PL_MAXPOLY is 256 :( ++ free(lons); ++ free(lats); ++ } ++ max_east = 180000000; /* Only Eurasia needs 270 */ ++ n_read = fread((void *)&h, (size_t)sizeof (struct GSHHS), (size_t)1, fp); ++ } ++ ++ fclose(fp); ++ } ++ ++ actStream->lsty(1); //reset linestyle ++ actStream->flush(); ++ ++#endif ++ } ++ ++} // namespace ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gshhs.hpp cvs/gdl/src/gshhs.hpp +--- gdl-0.9rc4/src/gshhs.hpp 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/gshhs.hpp 2010-05-21 10:23:57.508906751 -0600 +@@ -0,0 +1,30 @@ ++/*************************************************************************** ++ gshhs.hpp - GSHHS-related routines ++ ------------------- ++ begin : Apr 18 2010 ++ copyright : (C) 2010 by Sylwester Arabas ++ email : slayoo@users.sf.net ++ ***************************************************************************/ ++ ++/*************************************************************************** ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++#ifndef GSHHS_HPP_ ++#define GSHHS_HPP_ ++ ++#include "datatypes.hpp" ++#include "envt.hpp" ++ ++namespace lib { ++ ++ void map_continents(EnvT* e); ++ ++} // namespace ++ ++#endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gsl_fun.cpp cvs/gdl/src/gsl_fun.cpp +--- gdl-0.9rc4/src/gsl_fun.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gsl_fun.cpp 2010-06-03 09:06:38.705801613 -0600 +@@ -68,6 +68,9 @@ + // zeropoly + #include + ++// spher_harm ++#include ++ + #define LOG10E 0.434294 + + namespace lib { +@@ -1149,7 +1152,7 @@ + if (input != NULL) + if (input->N_Elements() < nbins) + e->Throw( +- "HISTOGRAM: Expression " +e->GetString(inputIx) + ++ "Expression " +e->GetString(inputIx) + + " does not have enough elements."); + else if (input->N_Elements() > nbins) + nbins = input->N_Elements(); +@@ -1202,8 +1205,7 @@ + if( e->KeywordPresent( 7)) { + + if (input != NULL) +- e->Throw( +- "HISTOGRAM: Conflicting keywords."); ++ e->Throw("Conflicting keywords."); + + DULong k = 0; + multimap< size_t, SizeT> bin_j; +@@ -1459,8 +1461,7 @@ + SizeT nParam=e->NParam(); + + if( nParam < 2) +- e->Throw( +- "INTERPOLATE: Incorrect number of arguments."); ++ e->Throw("Incorrect number of arguments."); + + BaseGDL* p0 = e->GetParDefined( 0); + BaseGDL* p1 = e->GetParDefined( 1); +@@ -1479,8 +1480,7 @@ + auto_ptr guard3; + + if( p0->Rank() < nParam-1) +- e->Throw( +- "INTERPOLATE: Number of parameters must agree with dimensions of argument."); ++ e->Throw("Number of parameters must agree with dimensions of argument."); + + bool cubic = false; + if ( e->KeywordSet(0)) cubic = true; +@@ -1495,13 +1495,11 @@ + // If not GRID then check that rank and dims match + if ( nParam == 3 && !grid) { + if (p1->Rank() != p2->Rank()) +- e->Throw( +- "INTERPOLATE: Coordinate arrays must have same length if Grid not set."); ++ e->Throw("Coordinate arrays must have same length if Grid not set."); + else { + for( SizeT i=0; iRank(); ++i) { + if (p1->Dim(i) != p2->Dim(i)) +- e->Throw( +- "INTERPOLATE: Coordinate arrays must have same length if Grid not set."); ++ e->Throw("Coordinate arrays must have same length if Grid not set."); + } + } + } +@@ -1644,8 +1642,7 @@ + if( nParam == 3) { + + if( cubic) +- e->Throw( +- "INTERPOLATE: Bicubic interpolation not yet supported."); ++ e->Throw("Bicubic interpolation not yet supported."); + + if ( p1->Type() == DOUBLE) + p1D = static_cast ( p1); +@@ -1695,8 +1692,7 @@ + if( nParam == 4) { + + if( cubic) +- e->Throw( +- "INTERPOLATE: Bicubic interpolation not supported."); ++ e->Throw("Bicubic interpolation not supported."); + + if ( p1->Type() == DOUBLE) + p1D = static_cast ( p1); +@@ -1856,26 +1852,22 @@ + + void la_trired_pro( EnvT* e) + { +- SizeT nParam=e->NParam(); ++ SizeT nParam=e->NParam(3); + float f32; + double f64; + +- if( nParam != 3) +- e->Throw( +- "LA_TRIRED: Incorrect number of arguments."); ++// if( nParam != 3) ++// e->Throw( ++// "LA_TRIRED: Incorrect number of arguments."); + + BaseGDL* p0 = e->GetNumericArrayParDefined( 0); + + SizeT nEl = p0->N_Elements(); + if( nEl == 0) +- e->Throw( +- "LA_TRIRED: Variable is undefined: "+ +- e->GetParString(0)); ++ e->Throw("Variable is undefined: "+ e->GetParString(0)); + + if (p0->Dim(0) != p0->Dim(1)) +- e->Throw( +- "LA_TRIRED: Input must be a square matrix: "+ +- e->GetParString(0)); ++ e->Throw("Input must be a square matrix: "+ e->GetParString(0)); + + if( p0->Type() == COMPLEX) + { +@@ -2796,6 +2788,110 @@ + ); + } + ++ // SA: GDL implementation of LEGENDRE uses gsl_sf_legendre_Plm, while SPHER_HARM implem. ++ // below uses gsl_sf_legendre_sphPlm which is intended for use with sph. harms ++ template ++ void spher_harm_helper_helper_helper(EnvT *e, T_theta *theta, T_phi *phi, T_res *res, ++ int l, int m, int step_theta, int step_phi, SizeT length) ++ { ++ double sign = (m < 0 && m % 2 == -1) ? -1. : 1.; ++ // SA: I haven't found any L,M values which GSL would not accept... ++ //gsl_sf_result sphPlm; ++ for (SizeT j = 0; j < length; ++j) ++ { ++ /* ++ if (GSL_SUCCESS != gsl_sf_legendre_sphPlm_e(l, abs(m), cos(theta[j * step_theta]), &sphPlm)) ++ e->Throw("GSL refused to compute Legendre polynomial value for the given L,M pair"); ++ res[j] = sign * sphPlm.val; ++ */ ++ res[j] = sign * gsl_sf_legendre_sphPlm(l, abs(m), cos(theta[j * step_theta])); ++ res[j] *= exp(complex(0., m * phi[j * step_phi])); ++ } ++ } ++ template ++ void spher_harm_helper_helper(EnvT* e, BaseGDL *theta, T_phi *phi, T_res *res, ++ int l, int m, int step_theta, int step_phi, SizeT length) ++ { ++ if (theta->Type() == DOUBLE || theta->Type() == COMPLEXDBL) ++ { ++ DDoubleGDL *theta_ = e->GetParAs(0); ++ spher_harm_helper_helper_helper(e, &((*theta_)[0]), phi, res, l, m, step_theta, step_phi, length); ++ } ++ else ++ { ++ DFloatGDL *theta_ = e->GetParAs(0); ++ spher_harm_helper_helper_helper(e, &((*theta_)[0]), phi, res, l, m, step_theta, step_phi, length); ++ } ++ } ++ template ++ void spher_harm_helper(EnvT* e, BaseGDL *theta, BaseGDL *phi, T_res *res, ++ int l, int m, int step_theta, int step_phi, SizeT length) ++ { ++ if (phi->Type() == DOUBLE || phi->Type() == COMPLEXDBL) ++ { ++ DDoubleGDL *phi_ = e->GetParAs(1); ++ spher_harm_helper_helper(e, theta, &((*phi_)[0]), res, l, m, step_theta, step_phi, length); ++ } ++ else ++ { ++ DFloatGDL *phi_ = e->GetParAs(1); ++ spher_harm_helper_helper(e, theta, &((*phi_)[0]), res, l, m, step_theta, step_phi, length); ++ } ++ } ++ BaseGDL* spher_harm(EnvT* e) ++ { ++ // sanity checks etc ++ SizeT nParam=e->NParam(4); ++ ++ BaseGDL *theta = e->GetNumericParDefined(0); ++ BaseGDL *phi = e->GetNumericParDefined(1); ++ ++ int step_theta = 1, step_phi = 1; ++ SizeT length = theta->N_Elements(); ++ if (theta->N_Elements() != phi->N_Elements()) ++ { ++ if ( ++ (theta->N_Elements() > 1 && phi->Rank() != 0) || ++ (phi->N_Elements() > 1 && theta->Rank() != 0) ++ ) e->Throw("Theta (1st arg.) or Phi (2nd arg.) must be scalar, or have the same number of values"); ++ if (theta->N_Elements() > 1) step_phi = 0; ++ else ++ { ++ step_theta = 0; ++ length = phi->N_Elements(); ++ } ++ } ++ ++ DLong l; ++ e->AssureLongScalarPar(2, l); ++ if (l < 0) e->Throw("L (3rd arg.) must be greater than or equal to zero"); ++ ++ DLong m; ++ e->AssureLongScalarPar(3, m); ++ if (abs(m) > l) e->Throw("M (4th arg.) must be in the range [-L, L]"); ++ ++ // allocating (and guarding) memory ++ BaseGDL *res; ++ bool dbl = e->KeywordSet(0) || theta->Type() == DOUBLE || phi->Type() == DOUBLE; ++ { ++ dimension dim = dimension(length); ++ if (phi->Rank() == 0 && theta->Rank() == 0) dim.Remove(0); ++ if (dbl) res = new DComplexDblGDL(dim); ++ else res = new DComplexGDL(dim); ++ } ++ auto_ptr res_guard(res); ++ ++ // computing the result ++ if (dbl) ++ spher_harm_helper(e, theta, phi, &((*static_cast(res))[0]), l, m, step_theta, step_phi, length); ++ else ++ spher_harm_helper(e, theta, phi, &((*static_cast(res))[0]), l, m, step_theta, step_phi, length); ++ ++ // returning ++ res_guard.release(); ++ return res; ++ } ++ + } // namespace + + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/gsl_fun.hpp cvs/gdl/src/gsl_fun.hpp +--- gdl-0.9rc4/src/gsl_fun.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/gsl_fun.hpp 2010-06-03 09:06:38.720801837 -0600 +@@ -55,6 +55,7 @@ + BaseGDL* binomialcoef(EnvT* e); + BaseGDL* wtn(EnvT* e); + BaseGDL* zeropoly(EnvT* e); ++ BaseGDL* spher_harm(EnvT* e); + + } // namespace + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/hdf_pro.cpp cvs/gdl/src/hdf_pro.cpp +--- gdl-0.9rc4/src/hdf_pro.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/hdf_pro.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -49,7 +49,7 @@ + + void hdf_sd_getdata_pro( EnvT* e) + { +- SizeT nParam=e->NParam(); ++ SizeT nParam=e->NParam(2); + char fieldname[256]; + int32 rank; + int32 dims[MAXRANK]; +@@ -124,7 +124,6 @@ + } + } + +- + // Reverse order of edges for setting up GDL array( + for( SizeT i = 0; i < rank/2; i++) { + int32 tempedge = edges[i]; +@@ -539,7 +538,7 @@ + + void hdf_vg_gettrs_pro( EnvT* e) + { +- SizeT nParam=e->NParam(); ++ SizeT nParam=e->NParam(3); + char groupname[256]; + int32 nentries; + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/initsysvar.cpp cvs/gdl/src/initsysvar.cpp +--- gdl-0.9rc4/src/initsysvar.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/initsysvar.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -40,7 +40,7 @@ + + // the index of some system variables + UInt pathIx, promptIx, edit_inputIx, quietIx, +- dIx, pIx, xIx, yIx, zIx, vIx, cIx, MouseIx, ++ dIx, pIx, xIx, yIx, zIx, vIx, gdlIx, cIx, MouseIx, + errorStateIx, errorIx, errIx, err_stringIx, valuesIx, + journalIx, exceptIx, mapIx, cpuIx, dirIx, stimeIx, warnIx; + +@@ -353,9 +353,10 @@ + sysVarList.push_back( order); + + // !GDL (to allow distinguish IDL/GDL with DEFSYSV, '!gdl', exists=exists ) +- DStringGDL *gdlData = new DStringGDL( "GDL"); +- DVar *gdl = new DVar( "GDL", gdlData); +- sysVarList.push_back( gdl); ++ DStructGDL* gdlStruct = new DStructGDL( "!GNUDATALANGUAGE"); ++ gdlStruct->NewTag("RELEASE", new DStringGDL( VERSION)); ++ DVar *gdl = new DVar( "GDL", gdlStruct); ++ sysVarList.push_back(gdl); + sysVarRdOnlyList.push_back( gdl); // make it read only + + // !DPI +@@ -444,7 +445,7 @@ + vIx = sysVarList.size(); + sysVarList.push_back(v); + sysVarRdOnlyList.push_back(v); +- ++ + // !Mouse + DStructGDL* MouseData = new DStructGDL( "!MOUSE"); + MouseData->NewTag("X", new DLongGDL( 0)); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/io.cpp cvs/gdl/src/io.cpp +--- gdl-0.9rc4/src/io.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/io.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -26,15 +26,18 @@ + + const string StreamInfo( ios* searchStream) + { ++ if( dynamic_cast( searchStream) != NULL) ++ return "Unit: 0, (redirected)"; ++ + if( searchStream == &cin) return "Unit: 0, "; + if( searchStream == &cout) return "Unit: -1, "; + if( searchStream == &cerr) return "Unit: -2, "; + for( SizeT i=0; iFStream() == searchStream) +- { +- return "Unit: "+i2s(i+1)+", File: "+fileUnits[ i].Name(); +- } ++ { ++ return "Unit: "+i2s(i+1)+", File: "+fileUnits[ i].Name(); ++ } + } + return "Internal error: Stream not found."; + } +@@ -133,6 +136,8 @@ + SizeT width_, + bool f77_, bool compress_) + { ++ string expName = name_; ++ WordExp( expName); + + f77 = f77_; + +@@ -146,11 +151,11 @@ + if( anyStream == NULL) + anyStream = new AnyStream(); + +- name=name_; ++ name=expName; + mode=mode_; + compress = compress_; + +- anyStream->Open(name_,mode_,compress_); ++ anyStream->Open(expName,mode_,compress_); + + swapEndian = swapEndian_; + deleteOnClose = dOC; +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/io.hpp cvs/gdl/src/io.hpp +--- gdl-0.9rc4/src/io.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/io.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -4,7 +4,7 @@ + begin : July 22 2002 + copyright : (C) 2002 by Marc Schellens + email : m_schellens@users.sf.net +-***************************************************************************/ ++***************************************************************************/ + + /* ************************************************************************* + * * +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/lapack.cpp cvs/gdl/src/lapack.cpp +--- gdl-0.9rc4/src/lapack.cpp 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/lapack.cpp 2010-02-02 14:26:59.000000000 -0700 +@@ -0,0 +1,19 @@ ++/*************************************************************************** ++ lapack.cpp - lapack routines ++ ------------------- ++ begin : January 31 2010 ++ copyright : (C) 2010y Marc Schellens ++ email : m_schellens@users.sf.net ++***************************************************************************/ ++ ++/*************************************************************************** ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++//#include ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/libinit.cpp cvs/gdl/src/libinit.cpp +--- gdl-0.9rc4/src/libinit.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/libinit.cpp 2010-06-03 09:06:39.176800521 -0600 +@@ -38,7 +38,7 @@ + #include "gsl_fun.hpp" + + #ifdef USE_PYTHON +-#include "gdlpython.hpp" ++# include "gdlpython.hpp" + #endif + + #include "grib.hpp" +@@ -316,9 +316,10 @@ + new DLibPro(lib::writeu,string("WRITEU"),-1,writeuKey); + new DLibPro(lib::readu,string("READU"),-1,writeuKey); + +- const string resolve_routineKey[]={"EITHER","IS_FUNCTION",KLISTEND}; ++ const string resolve_routineWarnKey[]={"EITHER","IS_FUNCTION","NO_RECOMPILE",KLISTEND}; ++ const string resolve_routineKey[]={KLISTEND}; + new DLibPro(lib::resolve_routine,string("RESOLVE_ROUTINE"),1, +- resolve_routineKey); ++ NULL, resolve_routineWarnKey); + + const string assocKey[]={"PACKED",KLISTEND}; + new DLibFunRetNew(lib::assoc,string("ASSOC"),3,assocKey); +@@ -394,13 +395,13 @@ + const string whereKey[]={"COMPLEMENT","NCOMPLEMENT",KLISTEND}; + new DLibFunRetNew(lib::where,string("WHERE"),2,whereKey); + +- const string totalKey[]={"CUMULATIVE","DOUBLE","NAN","INTEGER",KLISTEND}; ++ const string totalKey[]={"CUMULATIVE","DOUBLE","NAN","INTEGER","PRESERVE_TYPE",KLISTEND}; + new DLibFunRetNew(lib::total,string("TOTAL"),2,totalKey,NULL,true); + +- const string productKey[]={"CUMULATIVE","NAN",KLISTEND}; ++ const string productKey[]={"CUMULATIVE","NAN","INTEGER","PRESERVE_TYPE",KLISTEND}; + new DLibFunRetNew(lib::product,string("PRODUCT"),2,productKey,NULL,true); + +- new DLibFunRetNew(lib::n_params,string("N_PARAMS"),1); // IDL allows one paramter ++ new DLibFunRetNew(lib::n_params,string("N_PARAMS"),1); // IDL allows one parameter + new DLibFunRetNew(lib::keyword_set,string("KEYWORD_SET"),1); + + const string array_equalKey[]={"NO_TYPECONV",KLISTEND}; +@@ -428,13 +429,12 @@ + // new DLibFun(lib::max_fun,string("MAX"),2,maxKey); + + #ifdef USE_PYTHON +- + const string python_funKey[]={"ARGV","DEFAULTRETURNVALUE",KLISTEND}; + new DLibFun(lib::gdlpython_fun,string("PYTHON"),-1,python_funKey); + + const string python_proKey[]={"ARGV",KLISTEND}; + new DLibPro(lib::gdlpython_pro,string("PYTHON"),-1,python_proKey); +-#endif ++#endif + + // graphics ******************************************************* + const string windowKey[]={"COLORS","FREE","PIXMAP","RETAIN","TITLE", +@@ -461,7 +461,8 @@ + { + "CLOSE_FILE","FILENAME","LANDSCAPE","PORTRAIT", + "DECOMPOSED","GET_DECOMPOSED","Z_BUFFERING","SET_RESOLUTION", +- "SET_CHARACTER_SIZE","GET_VISUAL_DEPTH","XSIZE","YSIZE","COLOR",KLISTEND ++ "SET_CHARACTER_SIZE","GET_VISUAL_DEPTH","XSIZE","YSIZE", ++ "COLOR","GET_SCREEN_SIZE","INCHES",KLISTEND + }; + const string deviceWarnKey[] = {"RETAIN", KLISTEND}; + new DLibPro(lib::device,string("DEVICE"),0, deviceKey, deviceWarnKey); +@@ -723,6 +724,14 @@ + }; + new DLibPro(lib::xyouts, string("XYOUTS"), 3, xyoutsKey); + ++ const string polyfillKey[]= ++ { ++ "COLOR","DATA","NORMAL","DEVICE","CLIP","NOCLIP", ++ /*"LINE_FILL","SPACING","LINESTYLE","ORIENTATION","THICK",*/ ++ KLISTEND ++ }; ++ new DLibPro(lib::polyfill, string("POLYFILL"), 3, polyfillKey); ++ + new DLibPro(lib::erase,string("ERASE"),1); + + const string laguerreKey[]={"DOUBLE","COEFFICIENTS",KLISTEND}; +@@ -793,6 +802,8 @@ + new DLibFun(lib::wtn, string("WTN"), 2, wtnKey); + const string zeropolyKey[] = {"DOUBLE", "COMPANION", "JENKINS_TRAUB", KLISTEND }; + new DLibFun(lib::zeropoly, string("IMSL_ZEROPOLY"), 1, zeropolyKey); ++ const string spher_harmKey[] = {"DOUBLE", KLISTEND }; ++ new DLibFun(lib::spher_harm, string("SPHER_HARM"), 4, spher_harmKey); + + // sort lists + sort( libFunList.begin(), libFunList.end(), CompLibFunName()); +Only in gdl-0.9rc4/src: libinit.cpp.orig +Only in gdl-0.9rc4/src: libinit.cpp.rej +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/libinit_jmg.cpp cvs/gdl/src/libinit_jmg.cpp +--- gdl-0.9rc4/src/libinit_jmg.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/libinit_jmg.cpp 2010-05-21 10:23:57.887907432 -0600 +@@ -50,11 +50,14 @@ + #include "fftw.hpp" + #endif + ++#include "gshhs.hpp" ++ + using namespace std; + + void LibInit_jmg() + { + const char KLISTEND[] = ""; ++ + // the following by Joel Gales + const string sizeKey[]={"L64","DIMENSIONS","FILE_LUN","N_DIMENSIONS", + "N_ELEMENTS","STRUCTURE","TNAME","TYPE",KLISTEND}; +@@ -89,8 +92,9 @@ + "LOCATIONS",KLISTEND}; + new DLibFun(lib::histogram_fun,string("HISTOGRAM"),1,histogramKey); + +- const string interpolateKey[]={"CUBIC","GRID","MISSING",KLISTEND}; +- new DLibFun(lib::interpolate_fun,string("INTERPOLATE"),4,interpolateKey); ++ const string interpolateKey[]={"CUBIC","GRID",KLISTEND}; ++ const string interpolateWarnKey[]={"MISSING",KLISTEND}; ++ new DLibFun(lib::interpolate_fun,string("INTERPOLATE"),4,interpolateKey,interpolateWarnKey); + + const string la_triredKey[]={"DOUBLE","UPPER",KLISTEND}; + new DLibPro(lib::la_trired_pro,string("LA_TRIRED"),3,la_triredKey); +@@ -112,8 +116,19 @@ + const string map_proj_inverseKey[]={"RADIANS",KLISTEND}; + new DLibFun(lib::map_proj_inverse_fun, + string("MAP_PROJ_INVERSE"),3,map_proj_inverseKey); ++ + #endif + ++ // SA: GSHHS dataset ++ // TODO: COASTS, CONTINENTS, ORIENTATION, LIMIT, ++ // MAP_STRUCTURE, MLINESTYLE, MLINETHICK, SPACING, T3D, ZVALUE ++ const string map_continentsKey[] = {"COLOR", "RIVERS", "COUNTRIES", ++ "HIRES", "FILL_CONTINENTS", KLISTEND}; ++ const string map_continentsWarnKey[] = {"USA", KLISTEND}; ++ new DLibPro(lib::map_continents, string("MAP_CONTINENTS"), 0, ++ map_continentsKey, map_continentsWarnKey); ++ ++ + const string convert_coordKey[]={"DATA","DEVICE","NORMAL","T3D","DOUBLE", + "TO_DATA","TO_DEVICE","TO_NORMAL",KLISTEND}; + new DLibFun(lib::convert_coord,string("CONVERT_COORD"),3,convert_coordKey); +@@ -247,14 +262,19 @@ + + #ifdef HAVE_LIBWXWIDGETS + const string widget_baseKey[] = {"ALIGN_BOTTOM","ALIGN_CENTER","ALIGN_LEFT","ALIGN_RIGHT","ALIGN_TOP","MBAR","MODAL","BASE_ALIGN_BOTTOM","BASE_ALIGN_CENTER","BASE_ALIGN_LEFT","BASE_ALIGN_RIGHT","BASE_ALIGN_TOP","COLUMN","ROW","CONTEXT_EVENTS","CONTEXT_MENU","EVENT_FUNC","EVENT_PRO","EXCLUSIVE","NONEXCLUSIVE","FLOATING","FRAME","FUNC_GET_VALUE","GRID_LAYOUT","GROUP_LEADER","KBRD_FOCUS_EVENTS","KILL_NOTIFY","MAP","NO_COPY","NOTIFY_REALIZE","PRO_SET_VALUE","SCR_XSIZE","SCR_YSIZE","SCROLL","SENSITIVE","SPACE","TITLE","TLB_FRAME_ATTR","TLB_ICONIFY_EVENTS","TLB_KILL_REQUEST_EVENTS","TLB_MOVE_EVENTS","TLB_SIZE_EVENTS","TOOLBAR","TRACKING_EVENTS","UNITS","UNAME","UVALUE","XOFFSET","XPAD","XSIZE","X_SCROLL_SIZE","YOFFSET","YPAD","YSIZE","Y_SCROLL_SIZE","DISPLAY_NAME","RESOURCE_NAME","RNAME_MBAR",KLISTEND}; +- new DLibFun(lib::widget_base,string("WIDGET_BASE"),0,widget_baseKey); ++ new DLibFun(lib::widget_base,string("WIDGET_BASE"),1,widget_baseKey); + + const string widget_buttonKey[] = {"ACCELERATOR","ALIGN_CENTER","ALIGN_LEFT","ALIGN_RIGHT","BITMAP","CHECKED_MENU","DYNAMIC_RESIZE","EVENT_FUNC","EVENT_PRO","FONT","FRAME","FUNC_GET_VALUE","GROUP_LEADER","HELP","KILL_NOTIFY","MENU","NO_COPY","NO_RELEASE","NOTIFY_REALIZE","PRO_SET_VALUE","PUSHBUTTON_EVENTS","SCR_XSIZE","SCR_YSIZE","SENSITIVE","SEPARATOR","TAB_MODE","TOOLTIP","TRACKING_EVENTS","UNAME","UNITS","UVALUE","VALUE","X_BITMAP_EXTRA","XOFFSET","XSIZE","YOFFSET","YSIZE",KLISTEND}; + new DLibFun(lib::widget_button,string("WIDGET_BUTTON"),1,widget_buttonKey); + ++ const string widget_droplistKey[] = {"DYNAMIC_RESIZE","EVENT_FUNC","EVENT_PRO","FONT","FRAME","FUNC_GET_VALUE","GROUP_LEADER","KILL_NOTIFY","NO_COPY","NOTIFY_REALIZE","PRO_SET_VALUE","RESOURCE_NAME","SCR_XSIZE","SCR_YSIZE","SENSITIVE","TAB_MODE","TITLE","TRACKING_EVENTS","UNAME","UNITS","UVALUE","VALUE","XOFFSET","XSIZE","YOFFSET","YSIZE",KLISTEND}; ++ new DLibFun(lib::widget_droplist,string("WIDGET_DROPLIST"),1,widget_droplistKey); ++ + const string widget_textKey[] = {"ALL_EVENTS","CONTEXT_EVENTS","EDITABLE","EVENT_FUNC","EVENT_PRO","FONT","FRAME","FUNC_GET_VALUE","GROUP_LEADER","IGNORE_ACCELERATORS","KBRD_FOCUS_EVENTS","KILL_NOTIFY","NO_COPY","NO_NEWLINE","NOTIFY_REALIZE","PRO_SET_VALUE","RESOURCE_NAME","SCR_XSIZE","SCR_YSIZE","SCROLL","SENSITIVE","TAB_MODE","TRACKING_EVENTS","UNAME","UNITS","UVALUE","VALUE","WRAP","XOFFSET","XSIZE","YOFFSET","YSIZE",KLISTEND}; + new DLibFun(lib::widget_text,string("WIDGET_TEXT"),1,widget_textKey); + ++ const string widget_labelKey[] = {"ALL_EVENTS","CONTEXT_EVENTS","EDITABLE","EVENT_FUNC","EVENT_PRO","FONT","FRAME","FUNC_GET_VALUE","GROUP_LEADER","IGNORE_ACCELERATORS","KBRD_FOCUS_EVENTS","KILL_NOTIFY","NO_COPY","NO_NEWLINE","NOTIFY_REALIZE","PRO_SET_VALUE","RESOURCE_NAME","SCR_XSIZE","SCR_YSIZE","SCROLL","SENSITIVE","TAB_MODE","TRACKING_EVENTS","UNAME","UNITS","UVALUE","VALUE","WRAP","XOFFSET","XSIZE","YOFFSET","YSIZE",KLISTEND}; ++ new DLibFun(lib::widget_label,string("WIDGET_LABEL"),1,widget_labelKey); + + const string widget_infoKey[] = {"VALID","MODAL","MANAGED","XMANAGER_BLOCK","CHILD","VERSION", + KLISTEND}; +@@ -266,8 +286,11 @@ + + const string widget_controlKey[] = {"REALIZE","MANAGED","EVENT_PRO", + "XMANAGER_ACTIVE_COMMAND","DESTROY", +- "GET_UVALUE","SET_UVALUE","SET_VALUE","MAP", +- KLISTEND}; ++ "GET_UVALUE","SET_UVALUE","SET_VALUE", ++ "MAP","FUNC_GET_VALUE","PRO_SET_VALUE", ++ "SET_UNAME","NO_COPY","SET_BUTTON", ++ "SET_DROPLIST_SELECT","SENSITIVE", ++ "GET_VALUE",KLISTEND}; + new DLibPro(lib::widget_control,string("WIDGET_CONTROL"),1, + widget_controlKey); + #endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/magick_cl.cpp cvs/gdl/src/magick_cl.cpp +--- gdl-0.9rc4/src/magick_cl.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/magick_cl.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -124,6 +124,8 @@ + try{ + DString filename; + e->AssureScalarPar(0,filename); ++ ++ WordExp( filename); + + Image a; + try +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/Makefile.am cvs/gdl/src/Makefile.am +--- gdl-0.9rc4/src/Makefile.am 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/Makefile.am 2010-05-21 10:23:54.639968000 -0600 +@@ -43,7 +43,8 @@ + convol_inc1.cpp convol_inc2.cpp sigfpehandler.cpp sigfpehandler.hpp devicez.hpp \ + gdlzstream.cpp gdlzstream.hpp gdlwidget.hpp arrayindexlistt.hpp arrayindex.cpp \ + fftw.cpp fftw.hpp mpi.cpp mpi.hpp plot3d_nr.cpp grib.cpp grib.hpp \ +- prognode.cpp prognodeexpr.cpp strassenmatrix.hpp ++ prognode.cpp prognodeexpr.cpp strassenmatrix.hpp datatypesref.cpp lapack.cpp \ ++ gshhs.cpp gshhs.hpp newprognode.cpp + # Makefile.am Makefile.in + + +@@ -51,7 +52,7 @@ + # standalone program + if !BUILDASLIBRARY + bin_PROGRAMS = gdl +-gdl_SOURCES = $(cpp_hpp_files) gdl.cpp ++gdl_SOURCES = $(cpp_hpp_files) gdl.cpp lapack.cpp newprognode.cpp + # trigger basename generation + gdl_CXXFLAGS = $(AM_CXXFLAGS) + # the library search path. +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/Makefile.in cvs/gdl/src/Makefile.in +--- gdl-0.9rc4/src/Makefile.in 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/Makefile.in 2010-05-21 10:23:54.650967800 -0600 +@@ -121,7 +121,8 @@ + gdlzstream.hpp gdlwidget.hpp arrayindexlistt.hpp \ + arrayindex.cpp fftw.cpp fftw.hpp mpi.cpp mpi.hpp plot3d_nr.cpp \ + grib.cpp grib.hpp prognode.cpp prognodeexpr.cpp \ +- strassenmatrix.hpp pythongdl.cpp ++ strassenmatrix.hpp datatypesref.cpp lapack.cpp gshhs.cpp \ ++ gshhs.hpp newprognode.cpp pythongdl.cpp + am__objects_1 = assocdata.lo basic_fun_cl.lo basic_fun.lo \ + basic_fun_jmg.lo basic_op.lo basic_pro.lo basic_pro_jmg.lo \ + CFMTLexer.lo color.lo convert2.lo datatypes.lo dcommon.lo \ +@@ -143,7 +144,8 @@ + image.lo gdljournal.lo convol.lo convol_inc0.lo convol_inc1.lo \ + convol_inc2.lo sigfpehandler.lo gdlzstream.lo arrayindex.lo \ + fftw.lo mpi.lo plot3d_nr.lo grib.lo prognode.lo \ +- prognodeexpr.lo ++ prognodeexpr.lo datatypesref.lo lapack.lo gshhs.lo \ ++ newprognode.lo + @BUILDASLIBRARY_TRUE@am_libgdl_la_OBJECTS = $(am__objects_1) \ + @BUILDASLIBRARY_TRUE@ pythongdl.lo + libgdl_la_OBJECTS = $(am_libgdl_la_OBJECTS) +@@ -200,7 +202,8 @@ + gdlzstream.hpp gdlwidget.hpp arrayindexlistt.hpp \ + arrayindex.cpp fftw.cpp fftw.hpp mpi.cpp mpi.hpp plot3d_nr.cpp \ + grib.cpp grib.hpp prognode.cpp prognodeexpr.cpp \ +- strassenmatrix.hpp gdl.cpp ++ strassenmatrix.hpp datatypesref.cpp lapack.cpp gshhs.cpp \ ++ gshhs.hpp newprognode.cpp gdl.cpp + am__objects_2 = gdl-assocdata.$(OBJEXT) gdl-basic_fun_cl.$(OBJEXT) \ + gdl-basic_fun.$(OBJEXT) gdl-basic_fun_jmg.$(OBJEXT) \ + gdl-basic_op.$(OBJEXT) gdl-basic_pro.$(OBJEXT) \ +@@ -246,9 +249,12 @@ + gdl-sigfpehandler.$(OBJEXT) gdl-gdlzstream.$(OBJEXT) \ + gdl-arrayindex.$(OBJEXT) gdl-fftw.$(OBJEXT) gdl-mpi.$(OBJEXT) \ + gdl-plot3d_nr.$(OBJEXT) gdl-grib.$(OBJEXT) \ +- gdl-prognode.$(OBJEXT) gdl-prognodeexpr.$(OBJEXT) ++ gdl-prognode.$(OBJEXT) gdl-prognodeexpr.$(OBJEXT) \ ++ gdl-datatypesref.$(OBJEXT) gdl-lapack.$(OBJEXT) \ ++ gdl-gshhs.$(OBJEXT) gdl-newprognode.$(OBJEXT) + @BUILDASLIBRARY_FALSE@am_gdl_OBJECTS = $(am__objects_2) \ +-@BUILDASLIBRARY_FALSE@ gdl-gdl.$(OBJEXT) ++@BUILDASLIBRARY_FALSE@ gdl-gdl.$(OBJEXT) gdl-lapack.$(OBJEXT) \ ++@BUILDASLIBRARY_FALSE@ gdl-newprognode.$(OBJEXT) + gdl_OBJECTS = $(am_gdl_OBJECTS) + @BUILDASLIBRARY_FALSE@gdl_DEPENDENCIES = \ + @BUILDASLIBRARY_FALSE@ $(top_builddir)/src/antlr/libantlr.a +@@ -491,9 +497,10 @@ + convol_inc1.cpp convol_inc2.cpp sigfpehandler.cpp sigfpehandler.hpp devicez.hpp \ + gdlzstream.cpp gdlzstream.hpp gdlwidget.hpp arrayindexlistt.hpp arrayindex.cpp \ + fftw.cpp fftw.hpp mpi.cpp mpi.hpp plot3d_nr.cpp grib.cpp grib.hpp \ +- prognode.cpp prognodeexpr.cpp strassenmatrix.hpp ++ prognode.cpp prognodeexpr.cpp strassenmatrix.hpp datatypesref.cpp lapack.cpp \ ++ gshhs.cpp gshhs.hpp newprognode.cpp + +-@BUILDASLIBRARY_FALSE@gdl_SOURCES = $(cpp_hpp_files) gdl.cpp ++@BUILDASLIBRARY_FALSE@gdl_SOURCES = $(cpp_hpp_files) gdl.cpp lapack.cpp newprognode.cpp + # trigger basename generation + @BUILDASLIBRARY_FALSE@gdl_CXXFLAGS = $(AM_CXXFLAGS) + # the library search path. +@@ -654,6 +661,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convol_inc1.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convol_inc2.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datatypes.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/datatypesref.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dcommon.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dcompiler.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default_io.Plo@am__quote@ +@@ -693,6 +701,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-convol_inc1.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-convol_inc2.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-datatypes.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-datatypesref.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-dcommon.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-dcompiler.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-default_io.Po@am__quote@ +@@ -722,6 +731,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-getfmtast.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-graphics.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-grib.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-gshhs.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-gsl_fun.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-hdf5_fun.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-hdf_fun.Po@am__quote@ +@@ -731,6 +741,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-initct.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-initsysvar.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-io.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-lapack.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-libinit.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-libinit_ac.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-libinit_cl.Po@am__quote@ +@@ -751,6 +762,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-ncdf_dim_cl.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-ncdf_var_cl.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-new.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-newprognode.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-objects.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-ofmt.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gdl-plot3d_nr.Po@am__quote@ +@@ -780,6 +792,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getfmtast.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grib.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gshhs.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsl_fun.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdf5_fun.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdf_fun.Plo@am__quote@ +@@ -789,6 +802,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/initct.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/initsysvar.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lapack.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinit.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinit_ac.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libinit_cl.Plo@am__quote@ +@@ -809,6 +823,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncdf_dim_cl.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncdf_var_cl.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/new.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/newprognode.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/objects.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ofmt.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plot3d_nr.Plo@am__quote@ +@@ -2205,6 +2220,62 @@ + @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-prognodeexpr.obj `if test -f 'prognodeexpr.cpp'; then $(CYGPATH_W) 'prognodeexpr.cpp'; else $(CYGPATH_W) '$(srcdir)/prognodeexpr.cpp'; fi` + ++gdl-datatypesref.o: datatypesref.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-datatypesref.o -MD -MP -MF $(DEPDIR)/gdl-datatypesref.Tpo -c -o gdl-datatypesref.o `test -f 'datatypesref.cpp' || echo '$(srcdir)/'`datatypesref.cpp ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-datatypesref.Tpo $(DEPDIR)/gdl-datatypesref.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='datatypesref.cpp' object='gdl-datatypesref.o' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-datatypesref.o `test -f 'datatypesref.cpp' || echo '$(srcdir)/'`datatypesref.cpp ++ ++gdl-datatypesref.obj: datatypesref.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-datatypesref.obj -MD -MP -MF $(DEPDIR)/gdl-datatypesref.Tpo -c -o gdl-datatypesref.obj `if test -f 'datatypesref.cpp'; then $(CYGPATH_W) 'datatypesref.cpp'; else $(CYGPATH_W) '$(srcdir)/datatypesref.cpp'; fi` ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-datatypesref.Tpo $(DEPDIR)/gdl-datatypesref.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='datatypesref.cpp' object='gdl-datatypesref.obj' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-datatypesref.obj `if test -f 'datatypesref.cpp'; then $(CYGPATH_W) 'datatypesref.cpp'; else $(CYGPATH_W) '$(srcdir)/datatypesref.cpp'; fi` ++ ++gdl-lapack.o: lapack.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-lapack.o -MD -MP -MF $(DEPDIR)/gdl-lapack.Tpo -c -o gdl-lapack.o `test -f 'lapack.cpp' || echo '$(srcdir)/'`lapack.cpp ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-lapack.Tpo $(DEPDIR)/gdl-lapack.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='lapack.cpp' object='gdl-lapack.o' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-lapack.o `test -f 'lapack.cpp' || echo '$(srcdir)/'`lapack.cpp ++ ++gdl-lapack.obj: lapack.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-lapack.obj -MD -MP -MF $(DEPDIR)/gdl-lapack.Tpo -c -o gdl-lapack.obj `if test -f 'lapack.cpp'; then $(CYGPATH_W) 'lapack.cpp'; else $(CYGPATH_W) '$(srcdir)/lapack.cpp'; fi` ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-lapack.Tpo $(DEPDIR)/gdl-lapack.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='lapack.cpp' object='gdl-lapack.obj' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-lapack.obj `if test -f 'lapack.cpp'; then $(CYGPATH_W) 'lapack.cpp'; else $(CYGPATH_W) '$(srcdir)/lapack.cpp'; fi` ++ ++gdl-gshhs.o: gshhs.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-gshhs.o -MD -MP -MF $(DEPDIR)/gdl-gshhs.Tpo -c -o gdl-gshhs.o `test -f 'gshhs.cpp' || echo '$(srcdir)/'`gshhs.cpp ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-gshhs.Tpo $(DEPDIR)/gdl-gshhs.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gshhs.cpp' object='gdl-gshhs.o' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-gshhs.o `test -f 'gshhs.cpp' || echo '$(srcdir)/'`gshhs.cpp ++ ++gdl-gshhs.obj: gshhs.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-gshhs.obj -MD -MP -MF $(DEPDIR)/gdl-gshhs.Tpo -c -o gdl-gshhs.obj `if test -f 'gshhs.cpp'; then $(CYGPATH_W) 'gshhs.cpp'; else $(CYGPATH_W) '$(srcdir)/gshhs.cpp'; fi` ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-gshhs.Tpo $(DEPDIR)/gdl-gshhs.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='gshhs.cpp' object='gdl-gshhs.obj' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-gshhs.obj `if test -f 'gshhs.cpp'; then $(CYGPATH_W) 'gshhs.cpp'; else $(CYGPATH_W) '$(srcdir)/gshhs.cpp'; fi` ++ ++gdl-newprognode.o: newprognode.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-newprognode.o -MD -MP -MF $(DEPDIR)/gdl-newprognode.Tpo -c -o gdl-newprognode.o `test -f 'newprognode.cpp' || echo '$(srcdir)/'`newprognode.cpp ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-newprognode.Tpo $(DEPDIR)/gdl-newprognode.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='newprognode.cpp' object='gdl-newprognode.o' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-newprognode.o `test -f 'newprognode.cpp' || echo '$(srcdir)/'`newprognode.cpp ++ ++gdl-newprognode.obj: newprognode.cpp ++@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-newprognode.obj -MD -MP -MF $(DEPDIR)/gdl-newprognode.Tpo -c -o gdl-newprognode.obj `if test -f 'newprognode.cpp'; then $(CYGPATH_W) 'newprognode.cpp'; else $(CYGPATH_W) '$(srcdir)/newprognode.cpp'; fi` ++@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-newprognode.Tpo $(DEPDIR)/gdl-newprognode.Po ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='newprognode.cpp' object='gdl-newprognode.obj' libtool=no @AMDEPBACKSLASH@ ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -c -o gdl-newprognode.obj `if test -f 'newprognode.cpp'; then $(CYGPATH_W) 'newprognode.cpp'; else $(CYGPATH_W) '$(srcdir)/newprognode.cpp'; fi` ++ + gdl-gdl.o: gdl.cpp + @am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gdl_CXXFLAGS) $(CXXFLAGS) -MT gdl-gdl.o -MD -MP -MF $(DEPDIR)/gdl-gdl.Tpo -c -o gdl-gdl.o `test -f 'gdl.cpp' || echo '$(srcdir)/'`gdl.cpp + @am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/gdl-gdl.Tpo $(DEPDIR)/gdl-gdl.Po +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/math_fun_ac.cpp cvs/gdl/src/math_fun_ac.cpp +--- gdl-0.9rc4/src/math_fun_ac.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/math_fun_ac.cpp 2010-06-03 09:06:39.532739607 -0600 +@@ -7,6 +7,10 @@ + + ****************************************************************************/ + ++ ++ ++ ++ + /*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * +@@ -539,15 +543,16 @@ + return res; + } + } ++ + // we also check wether X input array is well ordered ... + double step; + int flag_skip=0; +- for (count = 1; count < nElpYpos; ++count) { ++ for (count = 1; count < nElpXpos; ++count) { + step=(*Xpos)[count]-(*Xpos)[count-1]; + if (step < 0.0) { + if (flag_skip == 0) { + cout << "SPL_INIT (warning): at least one x[n+1]-x[n] step is negative: X is assumed to be ordered" << endl; +- flag_skip == 1; ++ flag_skip = 1; + } + } + if (abs(step) == 0.0) { +@@ -560,15 +565,23 @@ + // may be we will have to check the size of these arrays ? + + BaseGDL* Yderiv0=e->GetKW(e->KeywordIx("YP0")); +- if(Yderiv0 !=NULL) cout << "SPL_INIT: sorry Keyword YP0 not ready now"<< endl; +- BaseGDL* YderivN=e->GetKW(e->KeywordIx("YPN_1")); +- if(Yderiv0 !=NULL) cout << "SPL_INIT: sorry Keyword YPN_1 not ready now"<< endl; ++ DDoubleGDL* YP0; ++ + +- (*res)[0] =0.; +- (*res)[nElpXpos-1] =0.; +- (*U)[0] =0.; ++ if(Yderiv0 !=NULL && !isinf((*(YP0=e->GetKWAs(e->KeywordIx("YP0"))))[0] )){ ++ // first derivative at the point X0 is defined and different to Inf ++ (*res)[0]=-0.5; ++ (*U)[0] = ( 3. / ((*Xpos)[1]-(*Xpos)[0])) * (((*Ypos)[1]-(*Ypos)[0]) / ++ ((*Xpos)[1]-(*Xpos)[0]) - (*YP0)[0] ); ++ ++ }else{ ++ // YP0 is omitted or equal to Inf ++ (*res)[0]=0.; ++ (*U)[0]=0.; ++ } ++ + +- double psig, pu, x, xm, xp, y, ym, yp, p; ++ double psig, pu, x, xm, xp, y, ym, yp, p, dx, qn; + + for (count = 1; count < nElpXpos-1; ++count) { + x=(*Xpos)[count]; +@@ -586,14 +599,31 @@ + (*U)[count]=(6.00*pu-psig*(*U)[count-1])/p; + } + +- // for (SizeT count = 0; count < nElpXpos; ++count) { +- // cout<< " : " << count << " " << (*res)[count] << " " << (*U)[count] << endl; +- //} ++ BaseGDL* YderivN=e->GetKW(e->KeywordIx("YPN_1")); ++ DDoubleGDL* YPN; ++ ++ if(YderivN !=NULL && !isinf((*(YPN=e->GetKWAs(e->KeywordIx("YPN_1"))))[0] )){ ++ // first derivative at the point XN-1 is defined and different to Inf ++ (*res)[nElpXpos-1] =0.; ++ qn=0.5; ++ ++ dx=((*Xpos)[nElpXpos-1]-(*Xpos)[nElpXpos-2]); ++ (*U)[nElpXpos-1]= (3./dx)*((*YPN)[0]-((*Ypos)[nElpXpos-1]-(*Ypos)[nElpXpos-2])/dx); ++ ++ }else{ ++ // YPN_1 is omitted or equal to Inf ++ qn=0.; ++ (*U)[nElpXpos-1]=0.; ++ } + +- for (count = nElpXpos-2; count > 0; count--) +- (*res)[count] =(*res)[count]*(*res)[count+1]+(*U)[count]; ++ (*res)[nElpXpos-1] =((*U)[nElpXpos-1]-qn*(*U)[nElpXpos-2])/(qn*(*res)[nElpXpos-2]+ 1.); + ++ for (count = nElpXpos-2; count != -1; --count){ ++ (*res)[count] =(*res)[count]*(*res)[count+1]+(*U)[count]; ++ } ++ + GM_CV0(); ++ + } + + BaseGDL* spl_interp_fun( EnvT* e) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/math_fun.cpp cvs/gdl/src/math_fun.cpp +--- gdl-0.9rc4/src/math_fun.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/math_fun.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -4,7 +4,7 @@ + begin : July 22 2002 + copyright : (C) 2002 by Marc Schellens + email : m_schellens@users.sf.net +- ***************************************************************************/ ++***************************************************************************/ + + /*************************************************************************** + * * +@@ -57,13 +57,13 @@ + void FromToGSL( srcT* src, destT* dest, SizeT nEl) + { + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT d = 0; dDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iN_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX) +- return sin_fun_template< DComplexGDL>( p0); ++ return sin_fun_template< DComplexGDL>( p0); + else if( p0->Type() == COMPLEXDBL) +- return sin_fun_template< DComplexDblGDL>( p0); ++ return sin_fun_template< DComplexDblGDL>( p0); + else if( p0->Type() == DOUBLE) +- return sin_fun_template< DDoubleGDL>( p0); ++ return sin_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return sin_fun_template< DFloatGDL>( p0); ++ return sin_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iThrow( +- "Incorrect number of arguments."); ++ "Incorrect number of arguments."); + + BaseGDL* p0 = e->GetParDefined( 0);//, "COS"); + + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX) +- return cos_fun_template< DComplexGDL>( p0); ++ return cos_fun_template< DComplexGDL>( p0); + else if( p0->Type() == COMPLEXDBL) +- return cos_fun_template< DComplexDblGDL>( p0); ++ return cos_fun_template< DComplexDblGDL>( p0); + else if( p0->Type() == DOUBLE) +- return cos_fun_template< DDoubleGDL>( p0); ++ return cos_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return cos_fun_template< DFloatGDL>( p0); ++ return cos_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i ++template< typename T> + BaseGDL* tan_fun_template( BaseGDL* p0) + { + T* p0C = static_cast( p0); + T* res = new T( p0C->Dim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i ++ BaseGDL* tan_fun_template< DComplexGDL>( BaseGDL* p0) ++ { ++ typedef DComplexGDL T; ++ T* p0C = static_cast( p0); ++ T* res = new T( p0C->Dim(), BaseGDL::NOZERO); ++ SizeT nEl = p0->N_Elements(); ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++ { ++#pragma omp for ++ for( SizeT i=0; i((*p0C)[ i])); ++ } ++ } + return res; + } + +@@ -336,35 +354,35 @@ + + if( nParam == 0) + e->Throw( +- "Incorrect number of arguments."); ++ "Incorrect number of arguments."); + + BaseGDL* p0 = e->GetParDefined( 0);//, "TAN"); + + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX) +- return tan_fun_template< DComplexGDL>( p0); ++ return tan_fun_template< DComplexGDL>( p0); + else if( p0->Type() == COMPLEXDBL) +- return tan_fun_template< DComplexDblGDL>( p0); ++ return tan_fun_template< DComplexDblGDL>( p0); + else if( p0->Type() == DOUBLE) +- return tan_fun_template< DDoubleGDL>( p0); ++ return tan_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return tan_fun_template< DFloatGDL>( p0); ++ return tan_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iThrow( +- "Incorrect number of arguments."); ++ "Incorrect number of arguments."); + + BaseGDL* p0 = e->GetParDefined( 0);//, "SINH"); + + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX) +- return sinh_fun_template< DComplexGDL>( p0); ++ return sinh_fun_template< DComplexGDL>( p0); + else if( p0->Type() == COMPLEXDBL) +- return sinh_fun_template< DComplexDblGDL>( p0); ++ return sinh_fun_template< DComplexDblGDL>( p0); + else if( p0->Type() == DOUBLE) +- return sinh_fun_template< DDoubleGDL>( p0); ++ return sinh_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return sinh_fun_template< DFloatGDL>( p0); ++ return sinh_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iThrow( +- "Incorrect number of arguments."); ++ "Incorrect number of arguments."); + + BaseGDL* p0 = e->GetParDefined( 0);//, "COSH"); + + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX) +- return cosh_fun_template< DComplexGDL>( p0); ++ return cosh_fun_template< DComplexGDL>( p0); + else if( p0->Type() == COMPLEXDBL) +- return cosh_fun_template< DComplexDblGDL>( p0); ++ return cosh_fun_template< DComplexDblGDL>( p0); + else if( p0->Type() == DOUBLE) +- return cosh_fun_template< DDoubleGDL>( p0); ++ return cosh_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return cosh_fun_template< DFloatGDL>( p0); ++ return cosh_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iThrow( +- "Incorrect number of arguments."); ++ "Incorrect number of arguments."); + + BaseGDL* p0 = e->GetParDefined( 0);//, "TANH"); + + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX) +- return tanh_fun_template< DComplexGDL>( p0); ++ return tanh_fun_template< DComplexGDL>( p0); + else if( p0->Type() == COMPLEXDBL) +- return tanh_fun_template< DComplexDblGDL>( p0); ++ return tanh_fun_template< DComplexDblGDL>( p0); + else if( p0->Type() == DOUBLE) +- return tanh_fun_template< DDoubleGDL>( p0); ++ return tanh_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return tanh_fun_template< DFloatGDL>( p0); ++ return tanh_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iN_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX || p0->Type() == COMPLEXDBL) + { + e->Throw( +- "Operation illegal with complex type."); ++ "Operation illegal with complex type."); + } + else if( p0->Type() == DOUBLE) + { + DDoubleGDL* p0D = static_cast( p0); + DDoubleGDL* res = new DDoubleGDL( p0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == FLOAT) +@@ -572,13 +590,13 @@ + DFloatGDL* p0F = static_cast( p0); + DFloatGDL* res = new DFloatGDL( p0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iN_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX || p0->Type() == COMPLEXDBL) + { + e->Throw( +- "Operation illegal with complex type."); ++ "Operation illegal with complex type."); + } + else if( p0->Type() == DOUBLE) + { + DDoubleGDL* p0D = static_cast( p0); + DDoubleGDL* res = new DDoubleGDL( p0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == FLOAT) +@@ -632,26 +650,26 @@ + DFloatGDL* p0F = static_cast( p0); + DFloatGDL* res = new DFloatGDL( p0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i + inline C atanC(const C& c) + { ++// double x = c.real(); ++// double x2 = x * x; ++// double y = c.imag(); ++// return C(0.5 * atan2(2.0*x, 1.0 - x2 - y*y), 0.25 * log( (x2 + (y+1)*(y+1)) / (x2 + (y-1)*(y-1)) )); + const C i(0.0,1.0); + const C one(1.0,0.0); + return log( (one + i * c) / (one - i * c)) / (C(2.0,0.0)*i); +@@ -681,18 +703,18 @@ + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + if( nParam == 2) + { + BaseGDL* p1 = e->GetPar( 1); + if( p1 == NULL) + e->Throw( +- "Variable is undefined: "+e->GetParString(1)); ++ "Variable is undefined: "+e->GetParString(1)); + SizeT nEl1 = p1->N_Elements(); + if( nEl1 == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(1)); ++ "Variable is undefined: "+e->GetParString(1)); + + DType t = (DTypeOrder[ p0->Type()] > DTypeOrder[ p1->Type()])? p0->Type() : p1->Type(); + +@@ -707,7 +729,7 @@ + SizeT nElMin = p0dim ? nEl : nEl1; + SizeT i, zero = 0, *i0, *i1; + i0 = p0->Rank() == 0 ? &zero : &i, +- i1 = p1->Rank() == 0 ? &zero : &i; ++ i1 = p1->Rank() == 0 ? &zero : &i; + + if( t == COMPLEX) + { +@@ -795,7 +817,7 @@ + + DFloatGDL* res = new DFloatGDL( dim, BaseGDL::NOZERO); + for (i = 0; i < nElMin; ++i) (*res)[i] = +- (float)atan2((double)(*p0F)[*i0], (double)(*p1F)[*i1]); ++ (float)atan2((double)(*p0F)[*i0], (double)(*p1F)[*i1]); + return res; + } + else +@@ -825,65 +847,67 @@ + DComplexGDL* p0C = static_cast( p0); + DFloatGDL* res = new DFloatGDL( p0C->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == COMPLEX) +- { +- DComplexGDL* p0C = static_cast( p0); +- DComplexGDL* res = new DComplexGDL( p0->Dim(), BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ +-#pragma omp for +- for( SizeT i=0; i( p0); ++ DComplexGDL* res = new DComplexGDL( p0->Dim(), BaseGDL::NOZERO); ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++ { ++#pragma omp for ++ for( SizeT i=0; iType() == COMPLEXDBL && e->KeywordSet(phaseIx)) + { + DComplexDblGDL* p0C = static_cast( p0); + DDoubleGDL* res = new DDoubleGDL( p0C->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == COMPLEXDBL) +- { +- DComplexDblGDL* p0C = static_cast( p0); +- DComplexDblGDL* res = new DComplexDblGDL( p0->Dim(), BaseGDL::NOZERO); +-#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ +-#pragma omp for +- for( SizeT i=0; i( p0); ++ DComplexDblGDL* res = new DComplexDblGDL( p0->Dim(), BaseGDL::NOZERO); ++#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++ { ++#pragma omp for ++ for( SizeT i=0; iType() == DOUBLE) + { + DDoubleGDL* p0D = static_cast( p0); + DDoubleGDL* res = new DDoubleGDL( p0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == FLOAT) +@@ -891,13 +915,13 @@ + DFloatGDL* p0F = static_cast( p0); + DFloatGDL* res = new DFloatGDL( p0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i +-// BaseGDL* alog_fun_template( BaseGDL* p0) +-// { +-// T* p0C = static_cast( p0); +-// T* res = new T( p0C->Dim(), BaseGDL::NOZERO); +-// SizeT nEl = p0->N_Elements(); +-// for( SizeT i=0; i ++ // BaseGDL* alog_fun_template( BaseGDL* p0) ++ // { ++ // T* p0C = static_cast( p0); ++ // T* res = new T( p0C->Dim(), BaseGDL::NOZERO); ++ // SizeT nEl = p0->N_Elements(); ++ // for( SizeT i=0; iLog(); //alog_fun_template< DComplexGDL>( p0); +-// else if( p0->Type() == COMPLEXDBL) +-// return p0->Log(); //alog_fun_template< DComplexDblGDL>( p0); +-// else if( p0->Type() == DOUBLE) +-// return p0->Log(); //alog_fun_template< DDoubleGDL>( p0); +-// else if( p0->Type() == FLOAT) +-// return p0->Log(); //alog_fun_template< DFloatGDL>( p0); ++ // else if( p0->Type() == COMPLEXDBL) ++ // return p0->Log(); //alog_fun_template< DComplexDblGDL>( p0); ++ // else if( p0->Type() == DOUBLE) ++ // return p0->Log(); //alog_fun_template< DDoubleGDL>( p0); ++ // else if( p0->Type() == FLOAT) ++ // return p0->Log(); //alog_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + res->LogThis(); +-// for( SizeT i=0; i +-// BaseGDL* alog10_fun_template( BaseGDL* p0) +-// { +-// T* p0C = static_cast( p0); +-// T* res = new T( p0C->Dim(), BaseGDL::NOZERO); +-// SizeT nEl = p0->N_Elements(); +-// for( SizeT i=0; iNParam( 1);//, "ALOG10"); +- +-// BaseGDL* p0 = e->GetParDefined( 0);//, "ALOG10"); +- +-// SizeT nEl = p0->N_Elements(); +-// if( nEl == 0) +-// e->Throw( +-// "ALOG10: Variable is undefined: "+e->GetParString(0)); +- +-// if( p0->Type() == COMPLEX) +-// return alog10_fun_template< DComplexGDL>( p0); +-// else if( p0->Type() == COMPLEXDBL) +-// return alog10_fun_template< DComplexDblGDL>( p0); +-// else if( p0->Type() == DOUBLE) +-// return alog10_fun_template< DDoubleGDL>( p0); +-// else if( p0->Type() == FLOAT) +-// return alog10_fun_template< DFloatGDL>( p0); +-// else +-// { +-// DFloatGDL* res = static_cast +-// (p0->Convert2( FLOAT, BaseGDL::COPY)); +-// for( SizeT i=0; i ++ // BaseGDL* alog10_fun_template( BaseGDL* p0) ++ // { ++ // T* p0C = static_cast( p0); ++ // T* res = new T( p0C->Dim(), BaseGDL::NOZERO); ++ // SizeT nEl = p0->N_Elements(); ++ // for( SizeT i=0; iNParam( 1);//, "ALOG10"); ++ ++ // BaseGDL* p0 = e->GetParDefined( 0);//, "ALOG10"); ++ ++ // SizeT nEl = p0->N_Elements(); ++ // if( nEl == 0) ++ // e->Throw( ++ // "ALOG10: Variable is undefined: "+e->GetParString(0)); ++ ++ // if( p0->Type() == COMPLEX) ++ // return alog10_fun_template< DComplexGDL>( p0); ++ // else if( p0->Type() == COMPLEXDBL) ++ // return alog10_fun_template< DComplexDblGDL>( p0); ++ // else if( p0->Type() == DOUBLE) ++ // return alog10_fun_template< DDoubleGDL>( p0); ++ // else if( p0->Type() == FLOAT) ++ // return alog10_fun_template< DFloatGDL>( p0); ++ // else ++ // { ++ // DFloatGDL* res = static_cast ++ // (p0->Convert2( FLOAT, BaseGDL::COPY)); ++ // for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iN_Elements(); + if( nEl == 0) + e->Throw( +- "SQRT: Variable is undefined: "+e->GetParString(0)); ++ "SQRT: Variable is undefined: "+e->GetParString(0)); + + if( p0->Type() == COMPLEX) +- return sqrt_fun_template< DComplexGDL>( p0); ++ return sqrt_fun_template< DComplexGDL>( p0); + else if( p0->Type() == COMPLEXDBL) +- return sqrt_fun_template< DComplexDblGDL>( p0); ++ return sqrt_fun_template< DComplexDblGDL>( p0); + else if( p0->Type() == DOUBLE) +- return sqrt_fun_template< DDoubleGDL>( p0); ++ return sqrt_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return sqrt_fun_template< DFloatGDL>( p0); ++ return sqrt_fun_template< DFloatGDL>( p0); + else + { + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == COMPLEXDBL) +@@ -1143,28 +1167,28 @@ + DDoubleGDL* res = new DDoubleGDL(p0C->Dim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == DOUBLE) +- return abs_fun_template< DDoubleGDL>( p0); ++ return abs_fun_template< DDoubleGDL>( p0); + else if( p0->Type() == FLOAT) +- return abs_fun_template< DFloatGDL>( p0); ++ return abs_fun_template< DFloatGDL>( p0); + else if( p0->Type() == LONG64) +- return abs_fun_template< DLong64GDL>( p0); ++ return abs_fun_template< DLong64GDL>( p0); + else if( p0->Type() == LONG) +- return abs_fun_template< DLongGDL>( p0); ++ return abs_fun_template< DLongGDL>( p0); + else if( p0->Type() == INT) +- return abs_fun_template< DIntGDL>( p0); ++ return abs_fun_template< DIntGDL>( p0); + else if( p0->Type() == ULONG64) + return p0->Dup(); + else if( p0->Type() == ULONG) +@@ -1178,13 +1202,13 @@ + DFloatGDL* res = static_cast + (p0->Convert2( FLOAT, BaseGDL::COPY)); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i( round((*p0C)[ i])); +- } +-} ++ for( SizeT i=0; i( round((*p0C)[ i])); ++ } ++ } + return res; + } else { + DLongGDL* res = new DLongGDL(p0C->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i( round((*p0C)[ i])); +- } +-} ++ for( SizeT i=0; i( round((*p0C)[ i])); ++ } ++ } + return res; + } + } +@@ -1231,7 +1255,7 @@ + SizeT nEl = p0->N_Elements(); + if( nEl == 0) + e->Throw( +- "ROUND: Variable is undefined: "+e->GetParString(0)); ++ "ROUND: Variable is undefined: "+e->GetParString(0)); + + static SizeT l64Ix = e->KeywordIx( "L64"); + bool isKWSetL64 = e->KeywordSet( l64Ix); +@@ -1245,26 +1269,26 @@ + if (isKWSetL64) { + DLong64GDL* res = new DLong64GDL(p0C->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iN_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + bool isKWSetL64 = e->KeywordSet( "L64"); + +@@ -1389,26 +1413,26 @@ + if (isKWSetL64) { + DLong64GDL* res = new DLong64GDL(p0C->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iN_Elements(); + if( nEl == 0) + e->Throw( +- "Variable is undefined: "+e->GetParString(0)); ++ "Variable is undefined: "+e->GetParString(0)); + + bool isKWSetL64 = e->KeywordSet( "L64"); + +@@ -1533,26 +1557,26 @@ + if (isKWSetL64) { + DLong64GDL* res = new DLong64GDL(p0C->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iDim(), BaseGDL::NOZERO); + SizeT nEl = p0->N_Elements(); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i(p0->Dup()); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == COMPLEXDBL) + { + DComplexDblGDL* res = static_cast(p0->Dup()); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == DOUBLE || +@@ -1687,13 +1711,13 @@ + DComplexGDL* c0 = static_cast(p0); + DFloatGDL* res = new DFloatGDL( c0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iType() == COMPLEXDBL) +@@ -1701,13 +1725,13 @@ + DComplexDblGDL* c0 = static_cast(p0); + DDoubleGDL* res = new DDoubleGDL( c0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i( p0); + DComplexDblGDL *res = c0->New( c0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i( p0); + DComplexGDL *res = c0->New( c0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i( p0); + DDoubleGDL *res = c0->New( c0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i( p0); + DFloatGDL *res = c0->New( c0->Dim(), BaseGDL::NOZERO); + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; i( p0->Convert2( FLOAT, BaseGDL::COPY)); + + #pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ ++ { + #pragma omp for +- for( SizeT i=0; iNParam(1); + DDoubleGDL* v = static_cast(e->GetParDefined(0)-> +@@ -1827,7 +1851,7 @@ + } + + // by medericboquien@users.sourceforge.net +- BaseGDL* gauss_cvf(EnvT* e) ++ BaseGDL* gauss_cvf(EnvT* e) + { + SizeT nParam = e->NParam(1); + DDoubleGDL* p = static_cast(e->GetParDefined(0)-> +@@ -1864,8 +1888,8 @@ + e->Throw("Degrees of freedom must be positive."); + + if (nv == 1 && ndf == 1) { +- res = new DDoubleGDL(dimension(1), BaseGDL::NOZERO); +- (*res)[0] = gsl_cdf_tdist_P((*v)[0],(*df)[0]); ++ res = new DDoubleGDL(dimension(1), BaseGDL::NOZERO); ++ (*res)[0] = gsl_cdf_tdist_P((*v)[0],(*df)[0]); + } else if (nv > 1 && ndf == 1) { + res = new DDoubleGDL(dimension(nv), BaseGDL::NOZERO); + for (SizeT count = 0; count < nv; ++count) +@@ -1889,7 +1913,7 @@ + } + + // by medericboquien@users.sourceforge.net +- BaseGDL* laguerre(EnvT* e) ++ BaseGDL* laguerre(EnvT* e) + { + SizeT nParam = e->NParam(2); + +@@ -1933,19 +1957,19 @@ + double gamma_kn1 = gsl_sf_gamma(k+n+1.); + DDoubleGDL* coefKW = new DDoubleGDL(dimension(n+1) , BaseGDL::NOZERO); + +-/*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) +-{ +-#pragma omp for*/ ++ /*#pragma omp parallel if (nEl >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= nEl)) ++ { ++ #pragma omp for*/ + for(count = 0;count<=n;++count) { + dcount = static_cast(count); + (*coefKW)[count] = ((count & 0x0001)?-1.0:1.0)*gamma_kn1/ + (gsl_sf_gamma(n-dcount+1.)*gsl_sf_gamma(k+dcount+1.)* + gsl_sf_gamma(dcount+1.)); +- } +-// } ++ } ++ // } + if(e->GetParDefined(0)->Type() != DOUBLE && !e->KeywordSet(doubleKWIx)) + coefKW = static_cast(coefKW-> +- Convert2(FLOAT,BaseGDL::CONVERT)); ++ Convert2(FLOAT,BaseGDL::CONVERT)); + e->SetKW(coefKWIx, coefKW); + } + +@@ -1960,7 +1984,7 @@ + // SA: based on equations 5-5 & 5-6 from Snyder (1987) USGS report no 1395 (page 31) + // available for download at: http://pubs.er.usgs.gov/djvu/PP/pp_1395.djvu + template inline void ll_arc_distance_helper( +- T c, T Az, T phi1, T l0, T& phi, T& l, bool degrees) ++ T c, T Az, T phi1, T l0, T& phi, T& l, bool degrees) + { + // temporary variables + T pi = 4 * atan((T)1.), +@@ -1973,8 +1997,8 @@ + // computing the results + phi = asin(sin_phi1 * cos_c + cos_phi1 * sin_c * cos_Az) / dtor; + l = l0 * dtor + atan2( +- sin_c * sin(Az * dtor), (cos_phi1 * cos_c - sin_phi1 * sin_c * cos_Az) +- ); ++ sin_c * sin(Az * dtor), (cos_phi1 * cos_c - sin_phi1 * sin_c * cos_Az) ++ ); + // placing the result in (-pi, pi) + while (l < -pi) l += 2 * pi; + while (l > pi) l -= 2 * pi; +@@ -2005,8 +2029,8 @@ + bool args_complex = args_complexdbl ? false : + (p0->Type() == COMPLEX || p1->Type() == COMPLEX || p2->Type() == COMPLEX); + DType type = ( +- p0->Type() == DOUBLE || p1->Type() == DOUBLE || p2->Type() == DOUBLE || args_complexdbl +- ) ? DOUBLE : FLOAT; ++ p0->Type() == DOUBLE || p1->Type() == DOUBLE || p2->Type() == DOUBLE || args_complexdbl ++ ) ? DOUBLE : FLOAT; + + // converting datatypes if neccesarry + if (p0->Type() != type) p0 = p0->Convert2(type, BaseGDL::COPY); +@@ -2016,35 +2040,35 @@ + // calculating (by calling a helper template function for float/double versions) + BaseGDL* rt = p0->New(dimension(2, BaseGDL::NOZERO)); + if (type == FLOAT) +- { +- ll_arc_distance_helper( +- (*static_cast(p1))[0], +- (*static_cast(p2))[0], +- (*static_cast(p0))[1], +- (*static_cast(p0))[0], +- (*static_cast(rt))[1], +- (*static_cast(rt))[0], +- e->KeywordSet("DEGREES") +- ); +- } ++ { ++ ll_arc_distance_helper( ++ (*static_cast(p1))[0], ++ (*static_cast(p2))[0], ++ (*static_cast(p0))[1], ++ (*static_cast(p0))[0], ++ (*static_cast(rt))[1], ++ (*static_cast(rt))[0], ++ e->KeywordSet("DEGREES") ++ ); ++ } + else +- { +- ll_arc_distance_helper( +- (*static_cast(p1))[0], +- (*static_cast(p2))[0], +- (*static_cast(p0))[1], +- (*static_cast(p0))[0], +- (*static_cast(rt))[1], +- (*static_cast(rt))[0], +- e->KeywordSet("DEGREES") +- ); +- } ++ { ++ ll_arc_distance_helper( ++ (*static_cast(p1))[0], ++ (*static_cast(p2))[0], ++ (*static_cast(p0))[1], ++ (*static_cast(p0))[0], ++ (*static_cast(rt))[1], ++ (*static_cast(rt))[0], ++ e->KeywordSet("DEGREES") ++ ); ++ } + + // handling complex/dcomplex conversion + return rt->Convert2( +- args_complexdbl ? COMPLEXDBL : args_complex ? COMPLEX : type, +- BaseGDL::CONVERT +- ); ++ args_complexdbl ? COMPLEXDBL : args_complex ? COMPLEX : type, ++ BaseGDL::CONVERT ++ ); + } + + BaseGDL* crossp(EnvT* e) +@@ -2057,22 +2081,22 @@ + BaseGDL *a, *b, *c; + + a = (DTypeOrder[p0->Type()] >= DTypeOrder[p1->Type()] ? p0 : p1)->New(dimension(3), BaseGDL::ZERO); +- // a = 0 +- // .--mem: new a (with the type and shape of the result) ++ // a = 0 ++ // .--mem: new a (with the type and shape of the result) + b = p0->CShift(-1)->Convert2(a->Type(), BaseGDL::CONVERT); +- // | .--mem: new b ++ // | .--mem: new b + a->Add(b); // | | a = shift(p0, -1) + delete b; // | `--mem: del b + b = p1->CShift(-2)->Convert2(a->Type(), BaseGDL::CONVERT); +- // | .--mem: new b ++ // | .--mem: new b + a->Mult(b); // | | a = shift(p0, -1) * shift(p1, -2) + b->Sub(b); // | | b = 0 + c = p0->CShift(1)->Convert2(a->Type(), BaseGDL::CONVERT); +- // | | .--mem: new c ++ // | | .--mem: new c + b->Sub(c); // | | | b = - shift(p0, 1) + delete c; // | | `--mem: del c + c = p1->CShift(2)->Convert2(a->Type(), BaseGDL::CONVERT); +- // | | .--mem: new c ++ // | | .--mem: new c + b->Mult(c); // | | | b = - shift(p0, 1) * shift(p1, 2) + delete c; // | | `--mem: del c + a->Add(b); // | | a = shift(p0, -1) * shift(p1, -2) - shift(p0, 1) * shift(p1, 2) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/math_fun_jmg.cpp cvs/gdl/src/math_fun_jmg.cpp +--- gdl-0.9rc4/src/math_fun_jmg.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/math_fun_jmg.cpp 2010-04-22 09:50:41.000000000 -0600 +@@ -1754,8 +1754,18 @@ + trAST = treeParser.getAST(); + ProgNodeP progAST = ProgNode::NewProgNode( trAST); + auto_ptr< ProgNode> progAST_guard( progAST); +- GDLInterpreter::RetCode retCode = caller->Interpreter()->execute( progAST); +- } ++ ++ // Marc: necessary for correct FOR loop handling ++ assert( dynamic_cast(caller) != NULL); ++ EnvUDT* env = static_cast(caller); ++ int nForLoopsIn = env->NForLoops(); ++ int nForLoops = ProgNode::NumberForLoops( progAST, nForLoopsIn); ++ env->ResizeForLoops( nForLoops); ++ ++ RetCode retCode = caller->Interpreter()->execute( progAST); ++ ++ env->ResizeForLoops( nForLoopsIn); ++} + + + BaseGDL* rk4jmg_fun(EnvT* e) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/math_utl.hpp cvs/gdl/src/math_utl.hpp +--- gdl-0.9rc4/src/math_utl.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/math_utl.hpp 2010-04-16 11:22:53.000000000 -0600 +@@ -22,11 +22,16 @@ + + //#define ABS(xxx) (( xxx > -xxx)?(xxx):(-xxx)) + +-template< typename T> +-inline T abs( T a) { return (a>=T(0))?a:-a;} +- ++// This caused a compiler error on g++ 4.5, see: ++// http://sourceforge.net/tracker/index.php?func=detail&aid=2949808&group_id=97659&atid=618683 ++// template< typename T> ++// inline T abs( T a) { return (a>=T(0))?a:-a;} + namespace lib { + ++ // SA: needs to be inside a namespace for GCC 4.5 ++ template< typename T> ++ inline T abs( T a) { return (a>=T(0))?a:-a;} ++ + // int trans513(char *, int, int, int, DType); + // int transpose(char *, SizeT, SizeT [], SizeT, DType); + // int transpose_perm(char *, SizeT, SizeT [], SizeT, DType, long []); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/newprognode.cpp cvs/gdl/src/newprognode.cpp +--- gdl-0.9rc4/src/newprognode.cpp 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/newprognode.cpp 2010-05-04 11:32:32.000000000 -0600 +@@ -0,0 +1,822 @@ ++/*************************************************************************** ++ newprognode.cpp - translation from DNodes to ProgNode (our final 'code') ++ ------------------- ++ begin : July 22 2002 ++ copyright : (C) 2002 by Marc Schellens ++ email : m_schellens@users.sf.net ++ ***************************************************************************/ ++ ++/*************************************************************************** ++ * * ++ * This program is free software; you can redistribute it and/or modify * ++ * it under the terms of the GNU General Public License as published by * ++ * the Free Software Foundation; either version 2 of the License, or * ++ * (at your option) any later version. * ++ * * ++ ***************************************************************************/ ++ ++#include "includefirst.hpp" ++ ++#include ++ ++#include ++ ++#include "dinterpreter.hpp" ++#include "prognodeexpr.hpp" ++#include "basegdl.hpp" ++#include "arrayindexlistt.hpp" ++#include "envt.hpp" ++#include "gdlexception.hpp" ++ ++using namespace std; ++ ++// helper function for NewProgNode( const RefDNode& refNode) ++// checks if parameterlist is all constant ++// used for constant evaluation at compile time ++bool ConstantPar( ProgNodeP _t) ++{ ++ ++ while(_t != NULL) { ++ switch ( _t->getType()) { ++ case GDLTokenTypes::KEYDEF_REF: ++ { ++ return false; ++ } ++ case GDLTokenTypes::KEYDEF_REF_EXPR: ++ { ++ return false; ++ } ++ case GDLTokenTypes::KEYDEF: ++ { ++// ProgNodeP __t162 = _t; ++ ++ // match(antlr::RefAST(_t),KEYDEF); ++// _t = _t->getFirstChild(); ++ // match(antlr::RefAST(_t),IDENTIFIER); ++// _t = _t->getNextSibling(); ++ ++ if( !_t->getFirstChild()->getNextSibling()->ConstantNode()) ++ return false; ++ ++// _t = __t162; ++ _t = _t->getNextSibling(); ++ break; ++ } ++ case GDLTokenTypes::REF: ++ { ++ return false; ++ } ++ case GDLTokenTypes::REF_EXPR: ++ { ++ return false; ++ } ++ case GDLTokenTypes::KEYDEF_REF_CHECK: ++ { ++ return false; ++ } ++ case GDLTokenTypes::REF_CHECK: ++ { ++ return false; ++ } ++ default: ++ { ++ // expr ++ if( !_t->ConstantNode()) ++ return false; ++ ++ _t = _t->getNextSibling(); ++ break; ++ } ++ } // switch ++ } // while ++ ++ return true; ++} ++ ++ ++ ++// here the transcription from DNode to ProgNode takes place ++// references are resolved ++ProgNodeP ProgNode::NewProgNode( const RefDNode& refNode) ++{ ++ // this can happen in case of a subroutine with only common blocks ++ if( refNode == RefDNode(antlr::nullAST)) return NULL; ++ ++ bool nonCopy = false; ++ if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) ++ { ++ if( NonCopyNode( refNode->GetFirstChild()->getType())) ++ nonCopy = true; ++ if( refNode->GetFirstChild()->GetNextSibling() != RefDNode(antlr::nullAST)) ++ if( NonCopyNode( refNode->GetFirstChild()->GetNextSibling()->getType())) ++ nonCopy = true; ++ } ++ ++ // note: constant expressions are always nonCopy ++ // but expressions of constant expressions are not ++ if( nonCopy) // VAR, VARPTR,... ++ { ++ UnaryExpr* newUnary = NULL; ++ BinaryExpr* newNode = NULL; ++ switch( refNode->getType()) ++ { ++ case GDLTokenTypes::QUESTION: ++ { ++ return new QUESTIONNode( refNode); ++ } ++ ++ // unary ++ case GDLTokenTypes::UMINUS: ++ { ++ // // optimize constant unary minus away ++ // // CONSTANT is a non-copy node ++ // if( refNode->GetFirstChild()->getType() == GDLTokenTypes::CONSTANT) ++ // { ++ // const RefDNode& child = refNode->GetFirstChild(); ++ // child->ResetCData( child->CData()->UMinus()); ++ // return NewProgNode( child); ++ // } ++ // else ++ newUnary = new UMINUSNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LOG_NEG: ++ { ++ newUnary = new LOG_NEGNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::NOT_OP: ++ { ++ newUnary = new NOT_OPNode( refNode); ++ break; ++ } ++ ++ // binary ++ case GDLTokenTypes::AND_OP: ++ { ++ newNode = new AND_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::OR_OP: ++ { ++ newNode = new OR_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::XOR_OP: ++ { ++ newNode = new XOR_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LOG_AND: ++ { ++ newNode = new LOG_ANDNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LOG_OR: ++ { ++ newNode = new LOG_ORNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::EQ_OP: ++ { ++ newNode = new EQ_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::NE_OP: ++ { ++ newNode = new NE_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LE_OP: ++ { ++ newNode = new LE_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LT_OP: ++ { ++ newNode = new LT_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::GE_OP: ++ { ++ newNode = new GE_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::GT_OP: ++ { ++ newNode = new GT_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::PLUS: ++ { ++ newNode = new PLUSNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::MINUS: ++ { ++ newNode = new MINUSNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LTMARK: ++ { ++ newNode = new LTMARKNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::GTMARK: ++ { ++ newNode = new GTMARKNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::ASTERIX: ++ { ++ newNode = new ASTERIXNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::MATRIX_OP1: ++ { ++ newNode = new MATRIX_OP1NCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::MATRIX_OP2: ++ { ++ newNode = new MATRIX_OP2NCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::SLASH: ++ { ++ newNode = new SLASHNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::MOD_OP: ++ { ++ newNode = new MOD_OPNCNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::POW: ++ { ++ newNode = new POWNCNode( refNode); ++ break; ++ } ++ // case GDLTokenTypes::DEC: ++ // { ++ // return new DECNCNode( refNode); ++ // } ++ // case GDLTokenTypes::INC: ++ // { ++ // return new INCNCNode( refNode); ++ // } ++ // case GDLTokenTypes::POSTDEC: ++ // { ++ // return new POSTDECNCNode( refNode); ++ // } ++ // case GDLTokenTypes::POSTINC: ++ // { ++ // return new POSTINCNCNode( refNode); ++ // } ++ // default: ++ // return new DefaultNode( refNode); ++ } ++ ++ if( newNode != NULL) ++ { ++ if( !newNode->ConstantExpr()) return newNode; ++ ++ auto_ptr guard( newNode); ++ ++ BaseGDL* cData = newNode->Eval(); ++ ++ ProgNodeP cN = new CONSTANTNode( newNode->StealNextSibling(), cData); ++ cN->lineNumber = refNode->getLine(); ++ cN->setText( "C" + refNode->getText()); ++ ++ return cN; ++ } ++ else if( newUnary != NULL) ++ { ++ if( !newUnary->ConstantExpr()) return newUnary; ++ ++ auto_ptr guard( newUnary); ++ ++ BaseGDL* cData = newUnary->Eval(); ++ ++ ProgNodeP cN = new CONSTANTNode( newUnary->StealNextSibling(), cData); ++ cN->lineNumber = refNode->getLine(); ++ cN->setText( "C" + refNode->getText()); ++ ++ return cN; ++ } ++ } ++ else // !nonCopy ++ { ++ UnaryExpr* newUnary = NULL; ++ BinaryExpr* newNode = NULL; ++ switch( refNode->getType()) ++ { ++ case GDLTokenTypes::QUESTION: ++ { ++ return new QUESTIONNode( refNode); ++ } ++ ++ // unary ++ case GDLTokenTypes::UMINUS: ++ { ++ newUnary = new UMINUSNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LOG_NEG: ++ { ++ newUnary = new LOG_NEGNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::NOT_OP: ++ { ++ newUnary = new NOT_OPNode( refNode); ++ break; ++ } ++ ++ // binary ++ case GDLTokenTypes::AND_OP: ++ { ++ newNode = new AND_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::OR_OP: ++ { ++ newNode = new OR_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::XOR_OP: ++ { ++ newNode = new XOR_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LOG_AND: ++ { ++ newNode = new LOG_ANDNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LOG_OR: ++ { ++ newNode = new LOG_ORNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::EQ_OP: ++ { ++ newNode = new EQ_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::NE_OP: ++ { ++ newNode = new NE_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LE_OP: ++ { ++ newNode = new LE_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LT_OP: ++ { ++ newNode = new LT_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::GE_OP: ++ { ++ newNode = new GE_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::GT_OP: ++ { ++ newNode = new GT_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::PLUS: ++ { ++ newNode = new PLUSNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::MINUS: ++ { ++ newNode = new MINUSNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::LTMARK: ++ { ++ newNode = new LTMARKNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::GTMARK: ++ { ++ newNode = new GTMARKNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::ASTERIX: ++ { ++ newNode = new ASTERIXNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::MATRIX_OP1: ++ { ++ newNode = new MATRIX_OP1Node( refNode); ++ break; ++ } ++ case GDLTokenTypes::MATRIX_OP2: ++ { ++ newNode = new MATRIX_OP2Node( refNode); ++ break; ++ } ++ case GDLTokenTypes::SLASH: ++ { ++ newNode = new SLASHNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::MOD_OP: ++ { ++ newNode = new MOD_OPNode( refNode); ++ break; ++ } ++ case GDLTokenTypes::POW: ++ { ++ newNode = new POWNode( refNode); ++ break; ++ } ++ // case GDLTokenTypes::DEC: ++ // { ++ // return new DECNode( refNode); ++ // } ++ // case GDLTokenTypes::INC: ++ // { ++ // return new INCNode( refNode); ++ // } ++ // case GDLTokenTypes::POSTDEC: ++ // { ++ // return new POSTDECNode( refNode); ++ // } ++ // case GDLTokenTypes::POSTINC: ++ // { ++ // return new POSTINCNode( refNode); ++ // } ++ // default: ++ } ++ if( newNode != NULL) ++ { ++ if( !newNode->ConstantExpr()) return newNode; ++ ++ auto_ptr guard( newNode); ++ ++ BaseGDL* cData = newNode->Eval(); ++ ++ ProgNodeP cN = new CONSTANTNode( newNode->StealNextSibling(), cData); ++ cN->lineNumber = refNode->getLine(); ++ cN->setText( "C" + refNode->getText()); ++ ++ return cN; ++ } ++ else if( newUnary != NULL) ++ { ++ if( !newUnary->ConstantExpr()) return newUnary; ++ ++ auto_ptr guard( newUnary); ++ ++ BaseGDL* cData = newUnary->Eval(); ++ ++ ProgNodeP cN = new CONSTANTNode( newUnary->StealNextSibling(), cData); ++ cN->lineNumber = refNode->getLine(); ++ cN->setText( "C" + refNode->getText()); ++ ++ return cN; ++ } ++ } ++ ++ // independed of nonCopy: ++ switch( refNode->getType()) ++ { ++ case GDLTokenTypes::FCALL_LIB_RETNEW: ++ { ++ ProgNodeP c = new DefaultNode( refNode); ++ ++ if( !static_cast(c->libFun)->RetConstant() ++ || !ConstantPar( c->getFirstChild())) return c; ++ ++ auto_ptr< ProgNode> guard( c); ++ ++ BaseGDL* cData = c->Eval(); ++ ++ ProgNodeP cN = new CONSTANTNode( c->StealNextSibling(), cData); ++ cN->lineNumber = refNode->getLine(); ++ cN->setText( "C()"); ++ ++ return cN; ++ } ++ ++ case GDLTokenTypes::FCALL_LIB: ++ { ++ return new FCALL_LIBNode( refNode); ++ } ++ case GDLTokenTypes::MFCALL: ++ { ++ return new MFCALLNode( refNode); ++ } ++ case GDLTokenTypes::MFCALL_PARENT: ++ { ++ return new MFCALL_PARENTNode( refNode); ++ } ++ case GDLTokenTypes::FCALL: ++ { ++ return new FCALLNode( refNode); ++ } ++ case GDLTokenTypes::ARRAYEXPR_MFCALL: ++ { ++ return new ARRAYEXPR_MFCALLNode( refNode); ++ } ++ ++ case GDLTokenTypes::ARRAYEXPR: ++ { ++ return new ARRAYEXPRNode( refNode); ++ } ++ ++ case GDLTokenTypes::VAR: ++ { ++ return new VARNode( refNode); ++ } ++ case GDLTokenTypes::VARPTR: ++ { ++ return new VARPTRNode( refNode); ++ } ++ case GDLTokenTypes::SYSVAR: ++ { ++ return new SYSVARNode( refNode); ++ } ++ case GDLTokenTypes::DEREF: ++ { ++ return new DEREFNode( refNode); ++ } ++ case GDLTokenTypes::CONSTANT: ++ { ++ return new CONSTANTNode( refNode); ++ } ++ case GDLTokenTypes::ARRAYDEF: ++ { ++ ARRAYDEFNode* c = new ARRAYDEFNode( refNode); ++ if( !c->ConstantArray()) return c; ++ ++ auto_ptr< ARRAYDEFNode> guard( c); ++ ++ BaseGDL* cData = c->Eval(); ++ ++ ProgNodeP cN = new CONSTANTNode( c->StealNextSibling(), cData); ++ cN->lineNumber = refNode->getLine(); ++ cN->setText( "[c]"); ++ ++ return cN; ++ ++ } ++ case GDLTokenTypes::ARRAYDEF_CONST: ++ { ++ ++ ProgNodeP c = new ARRAYDEFNode( refNode); ++ auto_ptr< ProgNode> guard( c); ++ ++ BaseGDL* cData = c->Eval(); ++ ++ ProgNodeP cN = new CONSTANTNode( c->StealNextSibling(), cData); ++ cN->lineNumber = refNode->getLine(); ++ cN->setText( "[C]"); ++ ++ return cN; ++ ++// DNode* cN = new DNode(); ++// cN->setType(GDLTokenTypes::CONSTANT); ++// cN->setText("[CONSTANT]"); ++// cN->setNextSibling( refNode->getNextSibling()); ++ ++// refNode->setNextSibling(antlr::nullAST); ++ ++// ProgNodeP c = new ARRAYDEFNode( refNode); ++// auto_ptr< ProgNode> guard( c); ++// //c->setType( GDLTokenTypes::ARRAYDEF); ++ ++// // evaluate constant ++// BaseGDL* res = c->Eval(); ++ ++// cN->ResetCData( res); ++ ++// return new CONSTANTNode( RefDNode( cN)); ++ } ++ case GDLTokenTypes::STRUC: ++ { ++ return new STRUCNode( refNode); ++ } ++ case GDLTokenTypes::NSTRUC: ++ { ++ return new NSTRUCNode( refNode); ++ } ++ case GDLTokenTypes::NSTRUC_REF: ++ { ++ return new NSTRUC_REFNode( refNode); ++ } ++ case GDLTokenTypes::ASSIGN: ++ { ++ return new ASSIGNNode( refNode); ++ } ++ case GDLTokenTypes::ASSIGN_ARRAYEXPR_MFCALL: ++ { ++ return new ASSIGN_ARRAYEXPR_MFCALLNode( refNode); ++ } ++ case GDLTokenTypes::ASSIGN_REPLACE: ++ { ++ return new ASSIGN_REPLACENode( refNode); ++ } ++ case GDLTokenTypes::GOTO: ++ { ++ return new GOTONode( refNode); ++ } ++ case GDLTokenTypes::BREAK: ++ { ++ return new BREAKNode( refNode); ++ } ++ case GDLTokenTypes::CONTINUE: ++ { ++ return new CONTINUENode( refNode); ++ } ++ case GDLTokenTypes::LABEL: ++ { ++ return new LABELNode( refNode); ++ } ++ case GDLTokenTypes::ON_IOERROR: ++ { ++ return new ON_IOERRORNode( refNode); ++ } ++ case GDLTokenTypes::ON_IOERROR_NULL: ++ { ++ return new ON_IOERROR_NULLNode( refNode); ++ } ++ case GDLTokenTypes::RETF: ++ { ++ return new RETFNode( refNode); ++ } ++ case GDLTokenTypes::RETP: ++ { ++ return new RETPNode( refNode); ++ } ++ case GDLTokenTypes::FOR: ++ { ++ return new FORNode( refNode); ++ } ++ case GDLTokenTypes::FOR_STEP: ++ { ++ return new FOR_STEPNode( refNode); ++ } ++ case GDLTokenTypes::FOREACH: ++ { ++ return new FOREACHNode( refNode); ++ } ++ case GDLTokenTypes::WHILE: ++ { ++ return new WHILENode( refNode); ++ } ++ case GDLTokenTypes::REPEAT: ++ { ++ return new REPEATNode( refNode); ++ } ++ case GDLTokenTypes::CASE: ++ { ++ return new CASENode( refNode); ++ } ++ case GDLTokenTypes::SWITCH: ++ { ++ return new SWITCHNode( refNode); ++ } ++ case GDLTokenTypes::BLOCK: ++ { ++ return new BLOCKNode( refNode); ++ } ++ case GDLTokenTypes::IF: ++ { ++ return new IFNode( refNode); ++ } ++ case GDLTokenTypes::IF_ELSE: ++ { ++ return new IF_ELSENode( refNode); ++ } ++ case GDLTokenTypes::PCALL_LIB: ++ { ++ return new PCALL_LIBNode( refNode); ++ } ++ case GDLTokenTypes::MPCALL: ++ { ++ return new MPCALLNode( refNode); ++ } ++ case GDLTokenTypes::MPCALL_PARENT: ++ { ++ return new MPCALL_PARENTNode( refNode); ++ } ++ case GDLTokenTypes::PCALL: ++ { ++ return new PCALLNode( refNode); ++ } ++ case GDLTokenTypes::DEC: ++ { ++ return new DECNode( refNode); ++ } ++ case GDLTokenTypes::INC: ++ { ++ return new INCNode( refNode); ++ } ++ // the following must change their type if precalculation strikes ++ case GDLTokenTypes::KEYDEF_REF: ++ { ++ ProgNodeP nn = new KEYDEF_REFNode( refNode); ++ ++ if( !nn->getFirstChild()->getNextSibling()->ConstantNode()) ++ return nn; ++ ++// nn->setType( GDLTokenTypes::KEYDEF); ++ delete nn; ++ nn = new KEYDEFNode( refNode); ++ return nn; ++ } ++ case GDLTokenTypes::KEYDEF_REF_EXPR: ++ { ++ ProgNodeP nn = new KEYDEF_REF_EXPRNode( refNode); ++ ++ if( !nn->getFirstChild()->getNextSibling()->ConstantNode()) ++ return nn; ++ ++ delete nn; ++ nn = new KEYDEFNode( refNode); ++// nn->setType( GDLTokenTypes::KEYDEF); ++ return nn; ++ } ++ case GDLTokenTypes::PARAEXPR: ++ { ++ ProgNodeP firstChild = ++ new ParameterNode( refNode); ++ return firstChild; ++ } ++ case GDLTokenTypes::KEYDEF: ++ { ++ ProgNodeP nn = new KEYDEFNode( refNode); ++ return nn; ++ } ++ case GDLTokenTypes::REF: ++ { ++ ProgNodeP nn = new REFNode( refNode); ++ ++ if( !nn->getFirstChild()->ConstantNode()) ++ return nn; ++ ++ delete nn; ++ ++ ProgNodeP firstChild = ++ new ParameterNode( refNode);//->GetFirstChild()); ++ return firstChild; ++ } ++ case GDLTokenTypes::REF_EXPR: ++ { ++ ProgNodeP nn = new REF_EXPRNode( refNode); ++ ++ if( !nn->getFirstChild()->ConstantNode()) ++ return nn; ++ ++ delete nn; ++ ProgNodeP firstChild = ++ new ParameterNode( refNode);//->GetFirstChild()); ++ return firstChild; ++ ++// auto_ptr guard(nn); ++// return nn->StealFirstChild(); ++ } ++ case GDLTokenTypes::KEYDEF_REF_CHECK: ++ { ++ ProgNodeP nn = new KEYDEF_REF_CHECKNode( refNode); ++ ++ if( nn->getFirstChild()->getNextSibling()->getType() != ++ GDLTokenTypes::CONSTANT) return nn; ++ ++ delete nn; ++ nn = new KEYDEFNode( refNode); ++ return nn; ++ } ++ case GDLTokenTypes::REF_CHECK: ++ { ++ ProgNodeP nn = new REF_CHECKNode( refNode); ++ ++ if( !nn->getFirstChild()->ConstantNode()) ++ return nn; ++ ++ delete nn; ++ ProgNodeP firstChild = ++ new ParameterNode( refNode); ++ return firstChild; ++ ++// auto_ptr guard(nn); ++// ProgNodeP firstChild = nn->StealFirstChild(); ++// firstChild->SetNextSibling( nn->StealNextSibling()); ++// return firstChild; ++ } ++ } ++ ++ // default ++ return new DefaultNode( refNode); ++} +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/objects.cpp cvs/gdl/src/objects.cpp +--- gdl-0.9rc4/src/objects.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/objects.cpp 2010-04-22 09:50:41.000000000 -0600 +@@ -215,6 +215,14 @@ + // insert into structList + structList.push_back( widgbut); + ++ DStructDesc* widgdlist = new DStructDesc( "WIDGET_DROPLIST"); ++ widgdlist->AddTag("ID", &aLong); ++ widgdlist->AddTag("TOP", &aLong); ++ widgdlist->AddTag("HANDLER", &aLong); ++ widgdlist->AddTag("SELECT", &aLong); ++ // insert into structList ++ structList.push_back( widgdlist); ++ + DStructDesc* widgtxt = new DStructDesc( "WIDGET_TEXT"); + widgtxt->AddTag("ID", &aLong); + widgtxt->AddTag("TOP", &aLong); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/objects.hpp cvs/gdl/src/objects.hpp +--- gdl-0.9rc4/src/objects.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/objects.hpp 2010-04-22 09:50:41.000000000 -0600 +@@ -65,9 +65,9 @@ + + enum DebugCode { + DEBUG_CLEAR=0, +- DEBUG_STOP, +- DEBUG_PROCESS_STOP +-}; ++ DEBUG_STOP = 1, ++ DEBUG_PROCESS_STOP = 2 ++}; + + template< class Container> void Purge( Container& s) + { +@@ -91,4 +91,50 @@ + + bool BigEndian(); + ++template class RefHeap { ++private: ++ T* ptr; ++ SizeT count; ++ ++ // prevent usage ++ RefHeap& operator=(const RefHeap& other) { return *this;} ++ template operator RefHeap() {return RefHeap(ptr);} ++ ++ ++public: ++ ++ SizeT Count() const { return count;} ++ ++ void Inc() {++count;} ++ void Add( SizeT add) {count += add;} ++ bool Dec() {return (--count==0);} ++ ++ RefHeap(T* p = 0) ++ : ptr(p), count(1) ++ {} ++ ++ RefHeap( const RefHeap& other) ++ : ptr( other.ptr), count( other.count) ++ {} ++ ++ ~RefHeap() ++ {} ++ ++ operator T* () const ++ { ++ return ptr; ++ } ++ ++ T* operator->() const ++ { ++ return ptr; ++ } ++ ++ T*& get() ++ { ++ return ptr; ++ } ++}; ++ ++ + #endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/plotting.cpp cvs/gdl/src/plotting.cpp +--- gdl-0.9rc4/src/plotting.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/plotting.cpp 2010-05-21 10:23:58.575907008 -0600 +@@ -27,6 +27,7 @@ + #include "graphics.hpp" + #include "plotting.hpp" + #include "math_utl.hpp" ++#include // GSL_CONST_MKSA_INCH + + #define PLK_Escape 0x1B + #define free_mem(a) \ +@@ -62,8 +63,34 @@ + static int xSizeIx = e->KeywordIx( "XSIZE"); + static int ySizeIx = e->KeywordIx( "YSIZE"); + static int colorIx = e->KeywordIx( "COLOR"); ++ static int inchesIx = e->KeywordIx( "INCHES"); + ++ static int get_screen_sizeIx = e->KeywordIx( "GET_SCREEN_SIZE"); ++ + Graphics* actDevice = Graphics::GetDevice(); ++ ++ if( e->KeywordPresent( get_screen_sizeIx)) ++ { ++ // see below in Function "get_scren_size()" explanations ... ++ Display* display = XOpenDisplay(NULL); ++ if (display == NULL) ++ e->Throw("Cannot connect to X server"); ++ ++ int screen_num; ++ int screen_width; ++ int screen_height; ++ screen_num = DefaultScreen(display); ++ screen_width = DisplayWidth(display, screen_num); ++ screen_height = DisplayHeight(display, screen_num); ++ ++ DIntGDL* res; ++ res = new DIntGDL(2, BaseGDL::NOZERO); ++ ++ (*res)[0]= screen_width; ++ (*res)[1]= screen_height; ++ e->SetKW( get_screen_sizeIx, res); ++ } ++ + + if( e->KeywordSet( closeFileIx)) + { +@@ -157,7 +184,9 @@ + { + DFloat xSizeValue; + e->AssureFloatScalarKW( xSizeIx, xSizeValue); +- bool success = actDevice->SetXPageSize( xSizeValue); ++ bool success = actDevice->SetXPageSize( xSizeValue ++ * (e->KeywordPresent(inchesIx) ? 100. * GSL_CONST_MKSA_INCH : 1.) ++ ); + if( !success) + e->Throw( "Current device does not support " + "keyword XSIZE."); +@@ -168,7 +197,9 @@ + { + DFloat ySizeValue; + e->AssureFloatScalarKW( ySizeIx, ySizeValue); +- bool success = actDevice->SetYPageSize( ySizeValue); ++ bool success = actDevice->SetYPageSize( ySizeValue ++ * (e->KeywordPresent(inchesIx) ? 100. * GSL_CONST_MKSA_INCH : 1.) ++ ); + if( !success) + e->Throw( "Current device does not support " + "keyword YSIZE."); +@@ -687,6 +718,27 @@ + (*static_cast( xStruct->GetTag( ticklenTag, 0)))[0]; + } + ++ void AdjustAxisOpts(string& xOpt, string& yOpt, ++ DLong xStyle, DLong yStyle, DLong xTicks, DLong yTicks, ++ string& xTickformat, string& yTickformat, DLong xLog, DLong yLog ++ ) // {{{ ++ { ++ if ((xStyle & 8) == 8) xOpt = "b"; ++ if ((yStyle & 8) == 8) yOpt = "b"; ++ ++ if (xTicks == 1) xOpt += "t"; else xOpt += "st"; ++ if (yTicks == 1) yOpt += "tv"; else yOpt += "stv"; ++ ++ if (xTickformat != "(A1)") xOpt += "n"; ++ if (yTickformat != "(A1)") yOpt += "n"; ++ ++ if( xLog) xOpt += "l"; ++ if( yLog) yOpt += "l"; ++ ++ if ((xStyle & 4) == 4) xOpt = ""; ++ if ((yStyle & 4) == 4) yOpt = ""; ++ } // }}} ++ + GDLGStream* GetPlotStream( EnvT* e) + { + Graphics* actDevice=Graphics::GetDevice(); +@@ -1057,6 +1109,8 @@ + while (1) { + plg->GetCursor(&gin); + if (gin.button > 0) break; ++ if( sigControlC) ++ return; + } + mode=1; + } +@@ -1070,6 +1124,8 @@ + plg->GetCursor(&gin); + if (abs(RefX-gin.dX) >0 || abs(RefY-gin.dY) >0) break; + if (gin.button > 0) break; ++ if( sigControlC) ++ return; + } + } + mode=1; +@@ -1081,6 +1137,8 @@ + // TODO: When no Mouse, should be extended later to any key of the keyboard + if (gin.keysym == PLK_Escape) break; + if (gin.button > 0) break; ++ if( sigControlC) ++ return; + } + } + +@@ -1417,6 +1475,8 @@ + + // axis + string xOpt="bc", yOpt="bc"; ++ AdjustAxisOpts(xOpt, yOpt, xStyle, yStyle, xTicks, yTicks, xTickformat, yTickformat, xLog, yLog); ++ /* SA: moved into a common AdjustAxisOpts() function + if ((xStyle & 8) == 8) xOpt = "b"; + if ((yStyle & 8) == 8) yOpt = "b"; + +@@ -1431,6 +1491,7 @@ + + if ((xStyle & 4) == 4) xOpt = ""; + if ((yStyle & 4) == 4) yOpt = ""; ++ */ + + // axis titles + actStream->schr( 0.0, actH/defH * xCharSize); +@@ -1650,6 +1711,36 @@ + actStream->flush(); + } // oplot + ++ ++ void GetSFromPlotStructs(DDouble **sx, DDouble **sy) ++ { ++ static DStructGDL* xStruct = SysVar::X(); ++ static DStructGDL* yStruct = SysVar::Y(); ++ unsigned sxTag = xStruct->Desc()->TagIndex( "S"); ++ unsigned syTag = yStruct->Desc()->TagIndex( "S"); ++ *sx = &(*static_cast( xStruct->GetTag( sxTag, 0)))[0]; ++ *sy = &(*static_cast( yStruct->GetTag( syTag, 0)))[0]; ++ } ++ ++ void GetWFromPlotStructs(DFloat **wx, DFloat **wy) ++ { ++ static DStructGDL* xStruct = SysVar::X(); ++ static DStructGDL* yStruct = SysVar::Y(); ++ unsigned xwindowTag = xStruct->Desc()->TagIndex( "WINDOW"); ++ unsigned ywindowTag = yStruct->Desc()->TagIndex( "WINDOW"); ++ *wx = &(*static_cast( xStruct->GetTag( xwindowTag, 0)))[0]; ++ *wy = &(*static_cast( yStruct->GetTag( ywindowTag, 0)))[0]; ++ } ++ ++ void DataCoordLimits(DDouble *sx, DDouble *sy, DFloat *wx, DFloat *wy, ++ DDouble *xStart, DDouble *xEnd, DDouble *yStart, DDouble *yEnd) ++ { ++ *xStart = (wx[0] - sx[0]) / sx[1]; ++ *xEnd = (wx[1] - sx[0]) / sx[1]; ++ *yStart = (wy[0] - sy[0]) / sy[1]; ++ *yEnd = (wy[1] - sy[0]) / sy[1]; ++ } ++ + // PLOTS + void plots( EnvT* e) + { +@@ -1802,30 +1893,15 @@ + } + #endif + ++ DDouble *sx, *sy; ++ DFloat *wx, *wy; ++ GetSFromPlotStructs(&sx, &sy); ++ GetWFromPlotStructs(&wx, &wy); ++ + // Determine data coordinate limits (if mapSet is true) + // These are computed from window and scaling axis system + // variables because map routines change these directly. +- DDouble *sx; +- DDouble *sy; +- DStructGDL* xStruct = SysVar::X(); +- DStructGDL* yStruct = SysVar::Y(); +- unsigned sxTag = xStruct->Desc()->TagIndex( "S"); +- unsigned syTag = yStruct->Desc()->TagIndex( "S"); +- sx = &(*static_cast( xStruct->GetTag( sxTag, 0)))[0]; +- sy = &(*static_cast( yStruct->GetTag( syTag, 0)))[0]; +- +- DFloat *wx; +- DFloat *wy; +- unsigned xwindowTag = xStruct->Desc()->TagIndex( "WINDOW"); +- unsigned ywindowTag = yStruct->Desc()->TagIndex( "WINDOW"); +- wx = &(*static_cast( xStruct->GetTag( xwindowTag, 0)))[0]; +- wy = &(*static_cast( yStruct->GetTag( ywindowTag, 0)))[0]; +- +- xStart = (wx[0] - sx[0]) / sx[1]; +- xEnd = (wx[1] - sx[0]) / sx[1]; +- yStart = (wy[0] - sy[0]) / sy[1]; +- yEnd = (wy[1] - sy[0]) / sy[1]; +- ++ DataCoordLimits(sx, sy, wx, wy, &xStart, &xEnd, &yStart, &yEnd); + + if(e->KeywordSet("DEVICE")) { + PLFLT xpix, ypix; +@@ -1989,31 +2065,15 @@ + } + #endif + ++ DDouble *sx, *sy; ++ DFloat *wx, *wy; ++ GetSFromPlotStructs(&sx, &sy); ++ GetWFromPlotStructs(&wx, &wy); + + // Determine data coordinate limits + // These are computed from window and scaling axis system + // variables because map routines change these directly. +- DDouble *sx; +- DDouble *sy; +- DStructGDL* xStruct = SysVar::X(); +- DStructGDL* yStruct = SysVar::Y(); +- unsigned sxTag = xStruct->Desc()->TagIndex( "S"); +- unsigned syTag = yStruct->Desc()->TagIndex( "S"); +- sx = &(*static_cast( xStruct->GetTag( sxTag, 0)))[0]; +- sy = &(*static_cast( yStruct->GetTag( syTag, 0)))[0]; +- +- DFloat *wx; +- DFloat *wy; +- unsigned xwindowTag = xStruct->Desc()->TagIndex( "WINDOW"); +- unsigned ywindowTag = yStruct->Desc()->TagIndex( "WINDOW"); +- wx = &(*static_cast( xStruct->GetTag( xwindowTag, 0)))[0]; +- wy = &(*static_cast( yStruct->GetTag( ywindowTag, 0)))[0]; +- +- xStart = (wx[0] - sx[0]) / sx[1]; +- xEnd = (wx[1] - sx[0]) / sx[1]; +- yStart = (wy[0] - sy[0]) / sy[1]; +- yEnd = (wy[1] - sy[0]) / sy[1]; +- ++ DataCoordLimits(sx, sy, wx, wy, &xStart, &xEnd, &yStart, &yEnd); + + if(e->KeywordSet("DEVICE")) { + PLFLT xpix, ypix; +@@ -2169,6 +2229,150 @@ + actStream->flush(); + } + ++ void polyfill( EnvT* e) ++ { ++ SizeT nParam = e->NParam(1); ++ DDoubleGDL* yVal, *xVal; ++ SizeT xEl, yEl; ++ ++ bool mapSet=false; ++#ifdef USE_LIBPROJ4 ++ LPTYPE idata; ++ XYTYPE odata; ++ get_mapset(mapSet); ++ if (mapSet) ++ { ++ ref = map_init(); ++ if (ref == NULL) e->Throw( "Projection initialization failed."); ++ } ++#endif ++ ++ if(nParam == 1 || nParam == 3) ++ { ++ e->Throw("1- and 3-argument case not implemented yet"); ++ } ++ else ++ { ++ xVal = !mapSet ++ ? e->GetParAs< DDoubleGDL>(0) ++ : static_cast( ++ e->GetNumericArrayParDefined(0)->Convert2(DOUBLE, BaseGDL::COPY) ++ ); ++ yVal = !mapSet ++ ? e->GetParAs< DDoubleGDL>(1) ++ : static_cast( ++ e->GetNumericArrayParDefined(1)->Convert2(DOUBLE, BaseGDL::COPY) ++ ); ++ ++ xEl = xVal->N_Elements(); ++ yEl = yVal->N_Elements(); ++ } ++ ++ if (xEl != yEl) ++ e->Throw("xEl != yEl"); // TODO ++ ++ if (xEl < 3) ++ e->Throw("Input arrays must define at least three points"); ++ ++ DFloat xMarginL, xMarginR,yMarginB, yMarginT; ++ get_axis_margin("X", xMarginL, xMarginR); ++ get_axis_margin("Y", yMarginB, yMarginT); ++ ++ DDouble xStart, xEnd, yStart, yEnd; ++ bool xLog, yLog; ++ ++ get_axis_crange("X", xStart, xEnd); ++ get_axis_crange("Y", yStart, yEnd); ++ get_axis_type("X", xLog); ++ get_axis_type("Y", yLog); ++ ++ GDLGStream* actStream = GetPlotStream( e); ++ ++ gkw_color(e, actStream); ++ ++ PLFLT xMR, xML, yMB, yMT; ++ CheckMargin( e, actStream, xMarginL, xMarginR, yMarginB, yMarginT, xMR, xML, yMB, yMT); ++ ++ DDouble *sx, *sy; ++ DFloat *wx, *wy; ++ GetSFromPlotStructs(&sx, &sy); ++ GetWFromPlotStructs(&wx, &wy); ++ ++ // Determine data coordinate limits ++ // These are computed from window and scaling axis system ++ // variables because map routines change these directly. ++ DataCoordLimits(sx, sy, wx, wy, &xStart, &xEnd, &yStart, &yEnd); ++ ++ if(e->KeywordSet("DEVICE")) { ++ PLFLT xpix, ypix; ++ PLINT xleng, yleng, xoff, yoff; ++ actStream->gpage(xpix, ypix,xleng, yleng, xoff, yoff); ++ xStart=0; xEnd=xleng; ++ yStart=0; yEnd=yleng; ++ xLog = false; yLog = false; ++ actStream->NoSub(); ++ } else if(e->KeywordSet("NORMAL")) { ++ xStart = 0; ++ xEnd = 1; ++ yStart = 0; ++ yEnd = 1; ++ actStream->NoSub(); ++ actStream->vpor(0, 1, 0, 1); ++ xLog = false; yLog = false; ++ } else { ++ actStream->NoSub(); ++ actStream->vpor(wx[0], wx[1], wy[0], wy[1]); ++ } ++ ++ //CLIPPING ++ DLong noclip = 1; ++ e->AssureLongScalarKWIfPresent( "NOCLIP", noclip); ++ if (noclip == 0) ++ { ++ static int clippingix = e->KeywordIx( "CLIP"); ++ DDoubleGDL* clippingD = e->IfDefGetKWAs( clippingix); ++ if (clippingD != NULL) Clipping( clippingD, xStart, xEnd, yStart, yEnd); ++ } ++ ++ actStream->wind( xStart, xEnd, yStart, yEnd); ++ ++/* SA: does not work at all (TODO, help welcome) ++ // LINE_FILL, SPACING, LINESTYLE, ORIENTATION, THICK ++ static int line_fillIx = e->KeywordIx("LINE_FILL"); ++ if (e->KeywordSet(line_fillIx)) ++ { ++ PLINT inc = 0, del = 1; ++ ++ static int orientationIx = e->KeywordIx("ORIENTATION"); ++ if (e->KeywordSet(orientationIx)) inc = PLINT(1e1 * (*e->GetKWAs(orientationIx))[0]); ++ ++ static int spacingIx = e->KeywordIx("SPACING"); ++ if (e->KeywordSet(spacingIx)) del = PLINT(1e4 * (*e->GetKWAs(spacingIx))[0]); ++ ++ gkw_thick(e, actStream); ++ gkw_linestyle(e, actStream); ++ ++ actStream->pat(1, &inc, &del); ++ } ++*/ ++ ++#ifdef USE_LIBPROJ4 ++ if (mapSet) ++ { ++ for (SizeT i = 0; i < xEl; ++i) ++ { ++ idata.lam = (*xVal)[i] * DEG_TO_RAD; ++ idata.phi = (*yVal)[i] * DEG_TO_RAD; ++ odata = PJ_FWD(idata, ref); ++ (*xVal)[i] = odata.x; ++ (*yVal)[i] = odata.y; ++ } ++ } ++#endif ++ ++ actStream->fill(xEl, static_cast(&(*xVal)[0]), static_cast(&(*yVal)[0])); ++ actStream->flush(); ++ } + + void surface( EnvT* e) + { +@@ -3078,14 +3282,8 @@ + + DDouble *sx, *sy; + DFloat *wx, *wy; +- unsigned sxTag = xStruct->Desc()->TagIndex( "S"); +- unsigned syTag = yStruct->Desc()->TagIndex( "S"); +- unsigned xwindowTag = xStruct->Desc()->TagIndex( "WINDOW"); +- unsigned ywindowTag = yStruct->Desc()->TagIndex( "WINDOW"); +- sx = &(*static_cast( xStruct->GetTag( sxTag, 0)))[0]; +- sy = &(*static_cast( yStruct->GetTag( syTag, 0)))[0]; +- wx = &(*static_cast( xStruct->GetTag( xwindowTag, 0)))[0]; +- wy = &(*static_cast( yStruct->GetTag( ywindowTag, 0)))[0]; ++ GetSFromPlotStructs(&sx, &sy); ++ GetWFromPlotStructs(&wx, &wy); + + // mapping only in OVERPLOT mode + if (!overplot) set_mapset(0); +@@ -3100,10 +3298,7 @@ + } + else + { +- xStart = (wx[0] - sx[0]) / sx[1]; +- xEnd = (wx[1] - sx[0]) / sx[1]; +- yStart = (wy[0] - sy[0]) / sy[1]; +- yEnd = (wy[1] - sy[0]) / sy[1]; ++ DataCoordLimits(sx, sy, wx, wy, &xStart, &xEnd, &yStart, &yEnd); + } + get_axis_margin("X",xMarginL, xMarginR); + get_axis_margin("Y",yMarginB, yMarginF); +@@ -3465,8 +3660,14 @@ + string xOpt = "bcnst"; + string yOpt = "bcnstv"; + ++ /* SA: moved into a common AdjustAxisOpts() + if( xLog) xOpt += "l"; + if( yLog) yOpt += "l"; ++ */ ++ DString xTickformat, yTickformat; ++ e->AssureStringScalarKWIfPresent( "XTICKFORMAT", xTickformat); ++ e->AssureStringScalarKWIfPresent( "YTICKFORMAT", yTickformat); ++ AdjustAxisOpts(xOpt, yOpt, xStyle, yStyle, xTicks, yTicks, xTickformat, yTickformat, xLog, yLog); + + // axis titles + actStream->schr( 0.0, actH/defH * xCharSize); +@@ -3550,10 +3751,6 @@ + { + SizeT nParam=e->NParam( 0); + bool valid=true; +- DDouble zVal, yVal, xVal; +- +- if (nParam >= 1) e->AssureDoubleScalarPar( 0, xVal); +- + // !X, !Y (also used below) + + DLong xStyle=0, yStyle=0; +@@ -3565,10 +3762,24 @@ + bool xAxis=false, yAxis=false; + static int xaxisIx = e->KeywordIx( "XAXIS"); + static int yaxisIx = e->KeywordIx( "YAXIS"); +- +- if( e->GetKW( xaxisIx) != NULL) xAxis = true; +- if( e->GetKW( yaxisIx) != NULL) yAxis = true; +- ++ ++ PLINT xaxis_value, yaxis_value; ++ bool standardNumPos; ++ //IDL behaviour for XAXIS and YAXIS options ++ if( (e->GetKW( xaxisIx) != NULL) ) { ++ xAxis = true; ++ e->AssureLongScalarKWIfPresent( "XAXIS", xaxis_value); ++ if (xaxis_value == 0) {standardNumPos = true;} else {standardNumPos = false;} ++ } ++ if( e->GetKW( yaxisIx) != NULL) { ++ yAxis = true; xAxis = false; // like in IDL, yaxis overrides xaxis ++ e->AssureLongScalarKWIfPresent( "YAXIS", yaxis_value); ++ if (yaxis_value == 0) {standardNumPos = true;} else {standardNumPos = false;} ++ } ++ if( (e->GetKW( xaxisIx) == NULL) & (e->GetKW( yaxisIx) == NULL ) ) { ++ xAxis = true; standardNumPos = true; ++ } ++ + // [XY]STYLE + gkw_axis_style(e, "X", xStyle); + gkw_axis_style(e, "Y", yStyle); +@@ -3583,13 +3794,22 @@ + gkw_axis_margin(e, "X",xMarginL, xMarginR); + gkw_axis_margin(e, "Y",yMarginB, yMarginT); + +- + // x and y range +- DDouble xStart; +- DDouble xEnd; +- DDouble yStart; +- DDouble yEnd; ++ DDouble xStart, xEnd; ++ DDouble yStart, yEnd; + ++ get_axis_crange("X", xStart, xEnd); ++ get_axis_crange("Y", yStart, yEnd); ++ ++ DLong xnozero=1, ynozero=0; ++ gkw_axis_range( e, "X", xStart, xEnd, xnozero); ++ gkw_axis_range( e, "Y", yStart, yEnd, ynozero); ++ ++ if (xStart == xEnd && yStart == yEnd) { ++ e->Throw("Invalid plotting ranges. Set up a plot window first."); ++ } ++ ++ /* + if ((xStyle & 1) != 1 && xAxis) { + PLFLT intv; + intv = AutoIntvAC(xStart, xEnd, false ); +@@ -3600,17 +3820,35 @@ + + if ((yStyle & 1) != 1 && yAxis) { + PLFLT intv; +- intv = AutoIntvAC(xStart, xEnd, false ); ++ intv = AutoIntvAC(yStart, yEnd, false ); + // intv = AutoIntv(yEnd-yStart); + //yEnd = ceil(yEnd/intv) * intv; + //yStart = floor(yStart/intv) * intv; + } ++ */ + ++ DDouble zVal, yVal, xVal; ++ //read arguments ++ if (nParam == 1) { ++ e->AssureDoubleScalarPar( 0, xVal); ++ yVal=0.; //IDL behaviour ++ } ++ if (nParam == 2) { ++ e->AssureDoubleScalarPar( 0, xVal); ++ e->AssureDoubleScalarPar( 1, yVal); ++ } ++ if (nParam == 3) { ++ e->Throw( "Sorry, we do not yet support the 3D case"); ++ } ++ if (nParam == 0 && standardNumPos) { xVal = xStart; yVal = yStart; } ++ if (nParam == 0 && !standardNumPos) { xVal = xEnd; yVal = yEnd; } + ++ /* + DLong ynozero, xnozero; + //[x|y]range keyword + gkw_axis_range(e, "X", xStart, xEnd, ynozero); + gkw_axis_range(e, "Y", yStart, yEnd, xnozero); ++ */ + + // AC nomore useful + // if(xEnd == xStart) xEnd=xStart+1; +@@ -3633,11 +3871,16 @@ + bool xLog, yLog; + get_axis_type("X", xLog); + get_axis_type("Y", yLog); ++ /* ++ //if log, x/y/Start/End are already logarithmic. + if( xLog && xStart <= 0.0) + Warning( "AXIS: Infinite x plot range."); + if( yLog && minVal <= 0.0) + Warning( "AXIS: Infinite y plot range."); +- ++ */ ++ // test for x/yVal ++ if (xLog) { if (xVal <= 0.) xVal=xStart; else xVal=log10(xVal);} ++ if (yLog) { if (yVal <= 0.) yVal=yStart; else yVal=log10(yVal);} + + DDouble ticklen = 0.02; + e->AssureDoubleScalarKWIfPresent( "TICKLEN", ticklen); +@@ -3668,9 +3911,48 @@ + PLFLT defH, actH; + actStream->gchr( defH, actH); + ++ // get viewport coordinates in normalised units ++ PLFLT vpXL, vpXR, vpYB, vpYT; ++ actStream->gvpd(vpXL, vpXR, vpYB, vpYT); ++ PLFLT vpX = vpXR-vpXL; ++ PLFLT vpY = vpYT-vpYB; ++ ++ // create new viewport and draw only the relevant side (viewport ++ // will be reset to its original values later) ++ PLFLT svpXL, svpXR, svpYB, svpYT; //new viewport coordinates ++ if (xAxis) { ++ //keep the X values the same ++ svpXL=vpXL; svpXR=vpXR; ++ if (standardNumPos) { //our axis is the bottom of viewport ++ svpYB=vpY*(yVal-yStart)/(yEnd-yStart)+vpYB; ++ svpYT=svpYB+0.2; //value doesn't matter, as long as svpYT>svpYB ++ } else { //our axis is the top of viewport ++ svpYT=vpYT-vpY*(yEnd-yVal)/(yEnd-yStart); ++ svpYB=svpYT-0.2; //value doesn't matter, as long as svpYT>svpYB ++ } ++ } ++ if (yAxis) { ++ //keep the top and bottom the same ++ svpYT=vpYT; svpYB=vpYB; ++ if (standardNumPos) { //our axis is the left of the viewport ++ svpXL=vpX*(xVal-xStart)/(xEnd-xStart)+vpXL; ++ svpXR=svpXL+0.2; //value doesn't matter, as long as svpXR>svpXL ++ } else { //our axis is the right of the viewport ++ svpXR=vpXR-vpX*(xEnd-xVal)/(xEnd-xStart); ++ svpXL=svpXR-0.2; //value doesn't matter, as long as svpXR>svpXL ++ } ++ } ++ actStream->vpor(svpXL, svpXR, svpYB, svpYT); ++ //The world coordinates for the relevant axis should be same as ++ //the originals, while the other axis doesn't matter. ++ actStream->wind(xStart, xEnd, yStart,yEnd); ++ ++ // POSITION ++ //DFloatGDL* pos = (DFloatGDL*) 0xF; ++ + /* + // viewport and world coordinates +- bool okVPWC = SetVP_WC( e, actStream, pos, clippingD, ++ bool okVPWC = SetVP_WC( e, actStream, pos, NULL, + xLog, yLog, + xMarginL, xMarginR, yMarginB, yMarginT, + xStart, xEnd, minVal, maxVal); +@@ -3681,15 +3963,16 @@ + actStream->wid( 0); + + // axis +- string xOpt="bc", yOpt="bc"; +- if ((xStyle & 8) == 8) xOpt = "b"; +- if ((yStyle & 8) == 8) yOpt = "b"; ++ string xOpt, yOpt; ++ if (standardNumPos) { xOpt = "b"; yOpt = "b";} else { xOpt = "c"; yOpt = "c"; } + + if (xTicks == 1) xOpt += "t"; else xOpt += "st"; + if (yTicks == 1) yOpt += "tv"; else yOpt += "stv"; + +- if (xTickformat != "(A1)") xOpt += "n"; +- if (yTickformat != "(A1)") yOpt += "n"; ++ if (xTickformat != "(A1)" && standardNumPos) xOpt += "nf"; ++ if (xTickformat != "(A1)" && !standardNumPos) xOpt += "mf"; ++ if (yTickformat != "(A1)" && standardNumPos) yOpt += "nf"; ++ if (yTickformat != "(A1)" && !standardNumPos) yOpt += "mf"; + + if( xLog) xOpt += "l"; + if( yLog) yOpt += "l"; +@@ -3697,11 +3980,13 @@ + if ((xStyle & 4) == 4) xOpt = ""; + if ((yStyle & 4) == 4) yOpt = ""; + ++ string titleOpt; + if (xAxis) { + + // axis titles + actStream->schr( 0.0, actH/defH * xCharSize); +- actStream->mtex("b",3.5,0.5,0.5,xTitle.c_str()); ++ if (standardNumPos) { titleOpt = "b"; } else { titleOpt = "t"; } ++ actStream->mtex(titleOpt.c_str(),3.5,0.5,0.5,xTitle.c_str()); + + // the axis (separate for x and y axis because of charsize) + PLFLT xintv; +@@ -3711,11 +3996,38 @@ + xintv = (xEnd - xStart) / xTicks; + } + actStream->box( xOpt.c_str(), xintv, xMinor, "", 0.0, 0); ++ ++ if (e->KeywordSet("SAVE")) ++ { ++ // X.CRANGE ++ set_axis_crange("X", xStart, xEnd); ++ ++ // X.TYPE ++ set_axis_type("X",xLog); ++ ++ // X.S ... TODO: set_axis_s() ++ DStructGDL* Struct=NULL; ++ Struct = SysVar::X(); ++ static unsigned sTag = Struct->Desc()->TagIndex( "S"); ++ PLFLT p_xmin, p_xmax, p_ymin, p_ymax; ++ actStream->gvpd (p_xmin, p_xmax, p_ymin, p_ymax); ++ if(Struct != NULL) ++ { ++ (*static_cast( Struct->GetTag( sTag, 0)))[0] = ++ (p_xmin*xEnd - p_xmax*xStart) / (xEnd - xStart); ++ (*static_cast( Struct->GetTag( sTag, 0)))[1] = ++ (p_xmax - p_xmin) / (xEnd - xStart); ++ } ++ } + } + + if (yAxis) { ++ ++ // axis titles + actStream->schr( 0.0, actH/defH * yCharSize); +- actStream->mtex("l",5.0,0.5,0.5,yTitle.c_str()); ++ if (standardNumPos) { titleOpt = "l"; } else { titleOpt = "r"; } ++ actStream->mtex(titleOpt.c_str(),5.0,0.5,0.5,yTitle.c_str()); ++ + // the axis (separate for x and y axis because of charsize) + PLFLT yintv; + if (yTicks == 0) { +@@ -3724,8 +4036,35 @@ + yintv = (yEnd - yStart) / yTicks; + } + actStream->box( "", 0.0, 0, yOpt.c_str(), yintv, yMinor); ++ ++ if (e->KeywordSet("SAVE")) ++ { ++ // Y.CRANGE ++ set_axis_crange("Y", yStart, yEnd); ++ ++ // Y.TYPE ++ set_axis_type("Y",yLog); ++ ++ // Y.S ... TODO: set_axis_s() ++ DStructGDL* Struct=NULL; ++ Struct = SysVar::Y(); ++ static unsigned sTag = Struct->Desc()->TagIndex( "S"); ++ PLFLT p_xmin, p_xmax, p_ymin, p_ymax; ++ actStream->gvpd (p_xmin, p_xmax, p_ymin, p_ymax); ++ if(Struct != NULL) ++ { ++ (*static_cast( Struct->GetTag( sTag, 0)))[0] = ++ (p_ymin*yEnd - p_ymax*yStart) / (yEnd - yStart); ++ (*static_cast( Struct->GetTag( sTag, 0)))[1] = ++ (p_ymax - p_ymin) / (yEnd - yStart); ++ } ++ } + } + ++ // reset the viewport and world coordinates to the original values ++ actStream->vpor(vpXL, vpXR, vpYB, vpYT); ++ actStream->wind(xStart, xEnd, yStart,yEnd); ++ + // title and sub title + // axis has subtitle but no title, gkw_title requires both + // gkw_title(e, actStream, actH/defH); +@@ -3791,14 +4130,8 @@ + if (yVal->N_Elements() == 1 && yVal->Rank() == 0) + minEl = xVal->N_Elements(); + +- DDouble *sx; +- DDouble *sy; +- static DStructGDL* xStruct = SysVar::X(); +- static DStructGDL* yStruct = SysVar::Y(); +- static unsigned sxTag = xStruct->Desc()->TagIndex( "S"); +- static unsigned syTag = yStruct->Desc()->TagIndex( "S"); +- sx = &(*static_cast( xStruct->GetTag( sxTag, 0)))[0]; +- sy = &(*static_cast( yStruct->GetTag( syTag, 0)))[0]; ++ DDouble *sx, *sy; ++ GetSFromPlotStructs(&sx, &sy); + + bool mapSet=false; + #ifdef USE_LIBPROJ4 +@@ -3950,14 +4283,8 @@ + if (yVal->N_Elements() == 1 && yVal->Rank() == 0) + minEl = xVal->N_Elements(); + +- DDouble *sx; +- DDouble *sy; +- static DStructGDL* xStruct = SysVar::X(); +- static DStructGDL* yStruct = SysVar::Y(); +- static unsigned sxTag = xStruct->Desc()->TagIndex( "S"); +- static unsigned syTag = yStruct->Desc()->TagIndex( "S"); +- sx = &(*static_cast( xStruct->GetTag( sxTag, 0)))[0]; +- sy = &(*static_cast( yStruct->GetTag( syTag, 0)))[0]; ++ DDouble *sx, *sy; ++ GetSFromPlotStructs(&sx, &sy); + + bool mapSet=false; + #ifdef USE_LIBPROJ4 +@@ -5010,15 +5337,15 @@ + if (nParam == 3) + p2 = e->GetParDefined( 2); + +- static DStructGDL* xStruct = SysVar::X(); +- static DStructGDL* yStruct = SysVar::Y(); ++ DDouble *sx, *sy; ++ GetSFromPlotStructs(&sx, &sy); ++ + static DStructGDL* zStruct = SysVar::Z(); +- static unsigned sxTag = xStruct->Desc()->TagIndex( "S"); +- static unsigned syTag = yStruct->Desc()->TagIndex( "S"); + static unsigned szTag = zStruct->Desc()->TagIndex( "S"); +- DDouble *sx = &(*static_cast( xStruct->GetTag( sxTag, 0)))[0]; +- DDouble *sy = &(*static_cast( yStruct->GetTag( syTag, 0)))[0]; + DDouble *sz = &(*static_cast( zStruct->GetTag( szTag, 0)))[0]; ++ ++ static DStructGDL* xStruct = SysVar::X(); ++ static DStructGDL* yStruct = SysVar::Y(); + static unsigned xtTag = xStruct->Desc()->TagIndex( "TYPE"); + static unsigned ytTag = yStruct->Desc()->TagIndex( "TYPE"); + static unsigned ztTag = zStruct->Desc()->TagIndex( "TYPE"); +Only in gdl-0.9rc4/src: plotting.cpp.orig +Only in gdl-0.9rc4/src: plotting.cpp.rej +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/plotting.hpp cvs/gdl/src/plotting.hpp +--- gdl-0.9rc4/src/plotting.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/plotting.hpp 2010-04-22 09:50:41.000000000 -0600 +@@ -42,6 +42,7 @@ + void axis( EnvT* e); + void erase( EnvT* e); + void cursor( EnvT* e); ++ void polyfill( EnvT* e); + + + //helper functions +@@ -101,6 +102,12 @@ + + BaseGDL* convert_coord( EnvT* e); + ++ GDLGStream* GetPlotStream( EnvT* e); ++ void GetSFromPlotStructs(DDouble **sx, DDouble **sy); ++ void GetWFromPlotStructs(DFloat **wx, DFloat **wy); ++ void DataCoordLimits(DDouble *sx, DDouble *sy, DFloat *wx, DFloat *wy, ++ DDouble *xStart, DDouble *xEnd, DDouble *yStart, DDouble *yEnd); ++ + } // namespace + + #endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/print.cpp cvs/gdl/src/print.cpp +--- gdl-0.9rc4/src/print.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/print.cpp 2010-04-16 11:22:53.000000000 -0600 +@@ -142,12 +142,16 @@ + DString fmtString; + e->AssureScalarKW( 0, fmtString); + ++ if( fmtString != "") ++ { + RefFMTNode fmtAST = GetFMTAST( fmtString); + + // formatted output ignores WIDTH + FMTOut Formatter( fmtAST, os, e, parOffset); ++ return; ++ } + } +- else // default-format output ++ //else // default-format output + { + int nParam = e->NParam(); + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/deriv.pro cvs/gdl/src/pro/deriv.pro +--- gdl-0.9rc4/src/pro/deriv.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/deriv.pro 2010-06-03 09:06:40.358740996 -0600 +@@ -110,7 +110,7 @@ + ; When GDL behavior of {MESSAGE, .skip, .Continue} will be similar to + ; IDL, the following flag can be switch to 1 ! + ; +-flag_message=0 ++flag_message=1 + name_proc='% DERIV: ' + ; + if ((N_PARAMS() EQ 0) OR (N_PARAMS() GT 2)) then begin +Only in gdl-0.9rc4/src/pro/dicom: Makefile.am.off +Only in gdl-0.9rc4/src/pro/dicom: Makefile.in.off +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/findex.pro cvs/gdl/src/pro/findex.pro +--- gdl-0.9rc4/src/pro/findex.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/pro/findex.pro 2010-04-09 04:30:38.000000000 -0600 +@@ -0,0 +1,97 @@ ++ ;+ ++ ; ROUTINE: findex ++ ; ++ ; PURPOSE: Compute "floating point index" into a table using binary ++ ; search. The resulting output may be used with INTERPOLATE. ++ ; ++ ; USEAGE: result = findex(u,v) ++ ; ++ ; INPUT: ++ ; u a monitically increasing or decreasing 1-D grid ++ ; v a scalor, or array of values ++ ; ++ ; OUTPUT: ++ ; result Floating point index. Integer part of RESULT(i) gives ++ ; the index into to U such that V(i) is between ++ ; U(RESULT(i)) and U(RESULT(i)+1). The fractional part ++ ; is the weighting factor ++ ; ++ ; V(i)-U(RESULT(i)) ++ ; --------------------- ++ ; U(RESULT(i)+1)-U(RESULT(i)) ++ ; ++ ; ++ ; DISCUSSION: ++ ; This routine is used to expedite one dimensional ++ ; interpolation on irregular 1-d grids. Using this routine ++ ; with INTERPOLATE is much faster then IDL's INTERPOL ++ ; procedure because it uses a binary instead of linear ++ ; search algorithm. The speedup is even more dramatic when ++ ; the same independent variable (V) and grid (U) are used ++ ; for several dependent variable interpolations. ++ ; ++ ; ++ ; EXAMPLE: ++ ; ++ ;; In this example I found the FINDEX + INTERPOLATE combination ++ ;; to be about 60 times faster then INTERPOL. ++ ; ++ ; u=randomu(iseed,200000) & u=u(sort(u)) ++ ; v=randomu(iseed,10) & v=v(sort(v)) ++ ; y=randomu(iseed,200000) & y=y(sort(y)) ++ ; ++ ; t=systime(1) & y1=interpolate(y,findex(u,v)) & print,systime(1)-t ++ ; t=systime(1) & y2=interpol(y,u,v) & print,systime(1)-t ++ ; print,f='(3(a,10f7.4/))','findex: ',y1,'interpol: ',y2,'diff: ',y1-y2 ++ ; ++ ; AUTHOR: Paul Ricchiazzi 21 Feb 97 ++ ; Institute for Computational Earth System Science ++ ; University of California, Santa Barbara ++ ; paul@icess.ucsb.edu ++ ; ++ ; REVISIONS: ++ ; ++ ; LICENCE: (note added by Sylwester Arabas) ++ ; This code was posted by Paul Ricchiazzi at the comp.land.idl-pvwave ++ ; newsgroup on Feb 21 1997. The post mentions 'donating this procedure ++ ; to the IDL community' - it is thus regarded as 'public domain' licence ++ ; compatible with GNU GPL. ++ ; ++ ;- ++ ; ++ function findex,u,v ++ nu=n_elements(u) ++ nv=n_elements(v) ++ ++ us=u-shift(u,+1) ++ us=us(1:*) ++ umx=max(us,min=umn) ++ if umx gt 0 and umn lt 0 then message,'u must be monotonic' ++ if umx gt 0 then inc=1 else inc=0 ++ ++ maxcomp=fix(alog(float(nu))/alog(2.)+.5) ++ ++ ; maxcomp = maximum number of binary search iteratios ++ ++ jlim=lonarr(2,nv) ++ jlim(0,*)=0 ; array of lower limits ++ jlim(1,*)=nu-1 ; array of upper limits ++ ++ iter=0 ++ repeat begin ++ jj=(jlim(0,*)+jlim(1,*))/2 ++ ii=where(v ge u(jj),n) & if n gt 0 then jlim(1-inc,ii)=jj(ii) ++ ii=where(v lt u(jj),n) & if n gt 0 then jlim(inc,ii)=jj(ii) ++ jdif=max(jlim(1,*)-jlim(0,*)) ++ if iter gt maxcomp then begin ++ print,maxcomp,iter, jdif ++ message,'binary search failed' ++ endif ++ iter=iter+1 ++ endrep until jdif eq 1 ++ ++ w=v-v ++ w(*)=(v-u(jlim(0,*)))/(u(jlim(0,*)+1)-u(jlim(0,*)))+jlim(0,*) ++ ++ return,w ++ end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/hist_2d.pro cvs/gdl/src/pro/hist_2d.pro +--- gdl-0.9rc4/src/pro/hist_2d.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/pro/hist_2d.pro 2010-02-20 13:46:27.000000000 -0700 +@@ -0,0 +1,39 @@ ++; by Sylwester Arabas ++; uses hist_nd() released under GPL by J.D. Smith ++function hist_2d, v1, v2, bin1=bin1, bin2=bin2, max1=max1, max2=max2, min1=min1, min2=min2 ++ on_error, 2 ++ ++ ; bin-widths default to 1 ++ if n_elements(bin1) eq 0 then bin1 = 1 ++ if n_elements(bin2) eq 0 then bin2 = 1 ++ ++ ; min and max default to minimum and maximum values ... with some exceptions ++ if n_elements(min1) eq 0 then begin ++ if n_elements(max1) ne 0 then min1 = 0 < min(v1, /nan) else min1 = 0 < min(v1, max=max1, /nan) ++ endif else if n_elements(max1) eq 0 then max1 = max(v1, /nan) ++ if n_elements(min2) eq 0 then begin ++ if n_elements(max2) ne 0 then min2 = 0 < min(v2, /nan) else min2 = 0 < min(v2, max=max2, /nan) ++ endif else if n_elements(max2) eq 0 then max2 = max(v2, /nan) ++ ++ ; sanity checks for some undefined-behaviour conditions ++ if bin1 le 0 then message, "bin1 must be > 0" ++ if bin2 le 0 then message, "bin2 must be > 0" ++ if ~finite(min1) || ~finite(min2) || ~finite(max1) || ~finite(max2) then $ ++ message, "min1, min2, max1 and max2 must all be finite" ++ if min1 eq max1 then message, "min1 must not be equal to max1" ++ if min2 eq max2 then message, "min2 must not be equal to max2" ++ ++ ; the shorter array determines how many elements are taken into account ++ n = n_elements(v1) < n_elements(v2) ++ if n eq 1 then begin ++ ; emulating IDL behaviour with 1-element arrays and scalars ++ data = transpose([[v1[0], max1 + 1], [v2[0], max2 + 1]]) ++ endif else begin ++ data = transpose([[v1[0 : n - 1]], [v2[0 : n - 1]]]) ++ endelse ++ ++ ret = hist_nd(temporary(data), [bin1, bin2], min=[min1, min2], max=[max1, max2]) ++ if size(ret,/n_dimensions) eq 1 then return, reform(ret, n_elements(ret), 1) ++ return, ret ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/hist_nd.pro cvs/gdl/src/pro/hist_nd.pro +--- gdl-0.9rc4/src/pro/hist_nd.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/pro/hist_nd.pro 2010-02-20 13:46:27.000000000 -0700 +@@ -0,0 +1,177 @@ ++;+ ++; NAME: ++; HIST_ND ++; ++; PURPOSE: ++; ++; Perform an N-dimensional histogram, also known as the joint ++; density function of N variables, ala HIST_2D. ++; ++; CALLING SEQUENCE: ++; hist=HIST_ND(V,[BINSIZE,MIN=,MAX=,NBINS=,REVERSE_INDICES=]) ++; ++; INPUTS: ++; ++; V: A NxP array representing P data points in N dimensions. ++; ++; BINSIZE: The size of the bin to use. Either an N point vector ++; specifying a separate size for each dimension, or a scalar, ++; which will be used for all dimensions. If BINSIZE is not ++; passed, NBINS must be. ++; ++; OPTIONAL INPUTS: ++; ++; MIN: The minimum value for the histogram. Either a P point ++; vector specifying a separate minimum for each dimension, or ++; a scalar, which will be used for all dimensions. If ++; omitted, the natural minimum within the dataset will be ++; used. ++; ++; MAX: The maximum value for the histogram. Either a P point ++; vector specifying a separate maximmum for each dimension, or ++; a scalar, which will be used for all dimensions. If omitted, ++; the natural maximum within the dataset will be used. ++; ++; NBINS: Rather than specifying the binsize, you can pass NBINS, ++; the number of bins in each dimension, which can be a P point ++; vector, or a scalar. If BINSIZE it also passed, NBINS will ++; be ignored, otherwise BINSIZE will then be calculated as ++; binsize=(max-min)/nbins. Note that *unlike* RSI's version ++; of histogram as of IDL 5.4, this keyword actually works as ++; advertised, giving you NBINS bins over the range min to max. ++; ++; KEYWORD PARAMETERS: ++; ++; MIN,MAX,NBINS: See above ++; ++; REVERSE_INDICES: Set to a named variable to receive the ++; reverse indices, for mapping which points occurred in a ++; given bin. Note that this is a 1-dimensional reverse index ++; vector (see HISTOGRAM). E.g., to find the indices of points ++; which fell in a histogram bin [i,j,k], look up: ++; ++; ind=[i+nx*(j+ny*k)] ++; ri[ri[ind]:ri[ind+1]-1] ++; ++; See also ARRAY_INDICES for converting in the other ++; direction. ++; ++; OUTPUTS: ++; ++; hist: The N-Dimensional histogram, an array of size ++; N1xN2xN3x...xND where the Ni's are the number of bins ++; implied by the data, and/or the optional inputs min, max and ++; binsize. ++; ++; OPTIONAL OUTPUTS: ++; ++; The reverse indices. ++; ++; EXAMPLE: ++; ++; v=randomu(sd,3,100) ++; h=hist_nd(v,.25,MIN=0,MAX=1,REVERSE_INDICES=ri) ++; ++; SEE ALSO: ++; ++; HISTOGRAM, HIST_2D ++; ++; MODIFICATION HISTORY: ++; ++; Mon Mar 5 09:45:53 2007, J.D. Smith ++; ++; Correctly trim out of range elements from the ++; histogram, when MIN/MAX are specified. Requires IDL ++; v6.1 or later. ++; ++; Tue Aug 19 09:13:43 2003, J.D. Smith ++; ++; Slight update to BINSIZE logic to provide consistency ++; with HIST_2D. ++; ++; Fri Oct 11 10:10:01 2002, J.D. Smith ++; ++; Updated to use new DIMENSION keyword to MAX/MIN. ++; ++; Fri Apr 20 12:57:34 2001, JD Smith ++; ++; Slight update to NBINS logic. More aggressive keyword ++; checking. ++; ++; Wed Mar 28 19:41:10 2001, JD Smith ++; ++; Written, based on HIST_2D, and suggestions of CM. ++; ++;- ++;############################################################################## ++; ++; LICENSE ++; ++; Copyright (C) 2001-2003, 2004, 2007 J.D. Smith ++; ++; This file is free software; you can redistribute it and/or modify ++; it under the terms of the GNU General Public License as published ++; by the Free Software Foundation; either version 2, or (at your ++; option) any later version. ++; ++; This file is distributed in the hope that it will be useful, but ++; WITHOUT ANY WARRANTY; without even the implied warranty of ++; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++; General Public License for more details. ++; ++; You should have received a copy of the GNU General Public License ++; along with this file; see the file COPYING. If not, write to the ++; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ++; Boston, MA 02110-1301, USA. ++; ++;############################################################################## ++ ++function hist_nd,V,bs,MIN=mn,MAX=mx,NBINS=nbins,REVERSE_INDICES=ri ++ s=size(V,/DIMENSIONS) ++ if n_elements(s) ne 2 then message,'Input must be N (dimensions) x P (points)' ++ if s[0] gt 8 then message, 'Only up to 8 dimensions allowed' ++ ++ imx=max(V,DIMENSION=2,MIN=imn) ++ ++ if n_elements(mx) eq 0 then mx=imx ++ if n_elements(mn) eq 0 then mn=imn ++ ++ if s[0] gt 1 then begin ++ if n_elements(mn) eq 1 then mn=replicate(mn,s[0]) ++ if n_elements(mx) eq 1 then mx=replicate(mx,s[0]) ++ if n_elements(bs) eq 1 then bs=replicate(bs,s[0]) ++ if n_elements(nbins) eq 1 then nbins=replicate(nbins,s[0]) ++ endif ++ ++ if ~array_equal(mn le mx,1b) then $ ++ message,'Min must be less than or equal to max.' ++ ++ if n_elements(bs) eq 0 then begin ++ if n_elements(nbins) ne 0 then begin ++ nbins=long(nbins) ;No fractional bins, please ++ bs=float(mx-mn)/nbins ;a correct formulation ++ endif else message,'Must pass either binsize or NBINS' ++ endif else nbins=long((mx-mn)/bs+1) ++ ++ total_bins=product(nbins,/PRESERVE_TYPE) ;Total number of bins ++ h=long((V[s[0]-1,*]-mn[s[0]-1])/bs[s[0]-1]) ++ ;; The scaled indices, s[n]+N[n-1]*(s[n-1]+N[n-2]*(s[n-2]+... ++ for i=s[0]-2,0,-1 do h=nbins[i]*temporary(h) + long((V[i,*]-mn[i])/bs[i]) ++ ++ out_of_range=[~array_equal(mn le imn,1b),~array_equal(mx ge imx,1b)] ++ if ~array_equal(out_of_range,0b) then begin ++ in_range=1 ++ if out_of_range[0] then $ ;out of range low ++ in_range=total(V ge rebin(mn,s,/SAMP),1,/PRESERVE_TYPE) eq s[0] ++ if out_of_range[1] then $ ;out of range high ++ in_range AND= total(V le rebin(mx,s,/SAMP),1,/PRESERVE_TYPE) eq s[0] ++ h=(temporary(h) + 1L)*temporary(in_range) - 1L ++ endif ++ ++ ret=make_array(TYPE=3,DIMENSION=nbins,/NOZERO) ++ if arg_present(ri) then $ ++ ret[0]=histogram(h,MIN=0L,MAX=total_bins-1L,REVERSE_INDICES=ri) $ ++ else $ ++ ret[0]=histogram(h,MIN=0L,MAX=total_bins-1L) ++ return,ret ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/interpol.pro cvs/gdl/src/pro/interpol.pro +--- gdl-0.9rc4/src/pro/interpol.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/pro/interpol.pro 2010-04-09 04:30:38.000000000 -0600 +@@ -0,0 +1,43 @@ ++; by Sylwester Arabas ++; relies on findex.pro by Paul Ricchiazzi ++function interpol, p0, p1, p2, lsquadratic=lsquadratic, quadratic=quadratic, spline=spline ++ on_error, 2 ++ ++ ; sanity checks ++ if n_params() eq 1 then $ ++ message, 'Two or three parameters required' ++ if keyword_set(lsquadratic) then $ ++ message, 'LSQUADRATIC keyword not supported yet (FIXME!)' ++ if keyword_set(quadratic) then $ ++ message, 'QUADRATIC keyword not supported yet (FIXME!)' ++ ++ isint = size(p0, /ty) lt 4 || size(p0, /ty) gt 11 ++ ++ if n_params() eq 2 then begin ++ ; regular grid case ++ if size(p1, /dimensions) eq 0 then begin ++ ind = findgen(p1) / (p1 - (p1 eq 1 ? 0 : 1)) * (n_elements(p0) - 1) ++ endif else begin ++ message, 'In the two-parameter case the second parameter must be a scalar' ++ ; TODO: IDL does something else here... ++ endelse ++ endif else if ~keyword_set(spline) then begin ++ ; irregular grid case ++ ind = findex(p1, p2) ++ endif ++ ++ if keyword_set(spline) then begin ++ ; spline case ++ if n_params() eq 2 then begin ++ x = findgen(n_elements(p0)) ++ y = spl_interp(x, p0, spl_init(x, p0), ind) ++ endif else begin ++ y = spl_interp(p1, p0, spl_init(p1, p0), p2) ++ endelse ++ return, fix(temporary(y), type=size(p0, /type)) ++ endif else begin ++ ; linear interpolation case ++ return, interpolate(isint ? float(p0) : p0, ind) ++ endelse ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/ludc.pro cvs/gdl/src/pro/ludc.pro +--- gdl-0.9rc4/src/pro/ludc.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/src/pro/ludc.pro 2010-04-21 15:48:07.000000000 -0600 +@@ -0,0 +1,7 @@ ++; ++; Alain Coulais, 21/04/2010, under GNU GPL 2 or later ++; fake LUDC to be able to run end-to-end IDL time_test3 ++; ++pro LUDC, a,b,c ++MESSAGE, /Continue, 'Sorry, this procedure LUDC is not available' ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/Makefile.am cvs/gdl/src/pro/Makefile.am +--- gdl-0.9rc4/src/pro/Makefile.am 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/Makefile.am 2010-04-22 09:50:41.000000000 -0600 +@@ -11,15 +11,20 @@ + file_dirname.pro \ + file_lines.pro \ + filepath.pro \ ++ findex.pro \ + findfile.pro \ + helpform.pro \ ++ hist_2d.pro \ ++ hist_nd.pro \ + identity.pro \ + imsl_zerosys.pro \ ++ interpol.pro \ + ishft.pro \ + kurtosis.pro \ + last_item.pro \ + lmgr.pro \ + loadct.pro \ ++ ludc.pro \ + map_clip_set.pro \ + matrix_multiply.pro \ + mean.pro \ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/Makefile.in cvs/gdl/src/pro/Makefile.in +--- gdl-0.9rc4/src/pro/Makefile.in 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/Makefile.in 2010-04-22 09:50:41.000000000 -0600 +@@ -250,15 +250,20 @@ + file_dirname.pro \ + file_lines.pro \ + filepath.pro \ ++ findex.pro \ + findfile.pro \ + helpform.pro \ ++ hist_2d.pro \ ++ hist_nd.pro \ + identity.pro \ + imsl_zerosys.pro \ ++ interpol.pro \ + ishft.pro \ + kurtosis.pro \ + last_item.pro \ + lmgr.pro \ + loadct.pro \ ++ ludc.pro \ + map_clip_set.pro \ + matrix_multiply.pro \ + mean.pro \ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/README.txt cvs/gdl/src/pro/README.txt +--- gdl-0.9rc4/src/pro/README.txt 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/README.txt 2010-04-16 11:22:54.000000000 -0600 +@@ -4,14 +4,14 @@ + 1/ procedures from the IDL library + + Most of the files here are re-implementation of the +-open source files avaiblable in the IDL lib directory. +-Since the original library is under Copyrigth, we cannot copy it ++open source files available in the IDL lib directory. ++Since the original library is under Copyright, we cannot copy it + directly in GDL. Then we need to develop a clone for some of the + most useful procedures in this library. + +-Some of these routines can be find and downloaded from ++Some of these routines can be found and downloaded from + http://idlastro.gsfc.nasa.gov/idllibsrch.html +-but we cannot includ them now in GDL. ++but we cannot include them now in GDL. + + Please see STATUS for a list of the files, + if they are needed, or not, written (in GDL or C++) +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/restore.pro cvs/gdl/src/pro/restore.pro +--- gdl-0.9rc4/src/pro/restore.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/restore.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -79,22 +79,12 @@ + print, "% RESTORE: default FILENAME is used : ", filename0 + endif + ; +-CMRESTORE, filename0, filename=filename1, verbose=verbose, $ +- p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, $ +- p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, $ +- p20, p21, p22, p23, p24, p25, p26, p27, p28, p29, $ +- names=_nme_ ++CMRESTORE, filename0, filename=filename1, verbose=verbose, names=_nme_, $ ++ data=data, pass_method='struct' + +-for i=0,n_elements(_nme_)-1 do begin +- p = strcompress('p' + string(i), /remove_all) +- parm = 'dummy=routine_names(_nme_[i],' + p + ',store=-1)' +- stat = execute(parm) +- ;; +- ;; at the end, I saw the /Verbose is OK in CMRESTORE (but 2 times !) +- ;;if KEYWORD_SET(verbose) then begin +- ;; print, '% RESTORE: Restored variable: ' , _nme_[i]+'.' +- ;;endif +-endfor ++ for i = 0, n_elements(_nme_) - 1 do begin ++ dummy = routine_names(_nme_[i], data.(i), store=-1) ++ endfor + +-return ++ return + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/STATUS cvs/gdl/src/pro/STATUS +--- gdl-0.9rc4/src/pro/STATUS 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/STATUS 2010-04-16 11:22:54.000000000 -0600 +@@ -123,7 +123,7 @@ + !h_eq_ct.pro + !h_eq_int.pro + !hilbert.pro +-!hist_2d.pro ++=hist_2d.pro + !hist_equal.pro + hls.pro + hsv.pro +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/str_sep.pro cvs/gdl/src/pro/str_sep.pro +--- gdl-0.9rc4/src/pro/str_sep.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/str_sep.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -6,6 +6,7 @@ + ; + ; MODIFICATION HISTORY: + ; 01-Sep-2006 : written by Joel Gales ++; 14-Apr-2010 : Alain Coulais : complete re-writing + ; + ; LICENCE: + ; Copyright (C) 2006, J. Gales +@@ -15,8 +16,54 @@ + ; (at your option) any later version. + ; + ;- ++; ++function STR_SEP, str, sep, $ ++ trim=trim, remove_all=remove_all, esc=esc, $ ++ test=test, help=help ++; ++ON_ERROR, 2 ++; ++if KEYWORD_SET(help) then begin ++ print, 'function STR_SEP, str, sep, $' ++ print, ' trim=trim, remove_all=remove_all, esc=esc, $' ++ print, ' test=test, help=help' ++ return, -1 ++endif ++; ++if (N_PARAMS() NE 2) then MESSAGE, 'Wrong number of arguments. (Two Strings expected)' + +-function str_sep, str, sep ++if N_ELEMENTS(str) NE 1 then MESSAGE, 'No array allowed for Input String' ++if N_ELEMENTS(sep) NE 1 then MESSAGE, 'No array allowed for Sep String' ++if (SIZE(str, /type) NE 7) then MESSAGE, 'Invalid Input String.' ++if (SIZE(sep, /type) NE 7) then MESSAGE, 'Invalid Sep String.' ++; ++if KEYWORD_SET(escape) then begin ++ MESSAGE, /continue, 'Sorry, this keyword ESCAPE is not implemented (no effect)' ++ MESSAGE, /continue, 'PLEASE CONTRIBUTE' ++endif ++ ++if (STRLEN(sep) EQ 1) then res=STRSPLIT(str,sep, /extract) ++if (STRLEN(sep) GT 1) then res=STRSPLIT(str,sep, /regex, /extract) ++; ++nb_parts=N_ELEMENTS(res) ++; ++if KEYWORD_SET(trim) then begin ++ for i=0,nb_parts-1 do res[ii]=STRTRIM(res[ii], 2) ++endif ++if KEYWORD_SET(remove_all) then begin ++ for i=0,nb_parts-1 do res[ii]=STRCOMPRESS(res[ii], /Remove_All) ++endif ++; ++if KEYWORD_SET(test) then STOP ++; ++return, res ++; ++end ++; ++; --------- original code by Joel ------------ ++; seems to be OK only when : SRTLEN(sep) == 1 ++; ++function OLD_STR_SEP, str, sep + on_error, 2 + + if n_params() ne 2 then message, 'Two parameters required.' +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/strsplit.pro cvs/gdl/src/pro/strsplit.pro +--- gdl-0.9rc4/src/pro/strsplit.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/strsplit.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -16,6 +16,7 @@ + ; MODIFICATION HISTORY: + ; 17-Jul-2005 : written by Pierre Chanial + ; 30-Jun-2009 : Alain Coulais : will allow 1D string : 'string' and ['string'] ++; 14-Apr-2010 : Alain Coulais : complete re-writing + ; + ; LICENCE: + ; Copyright (C) 2004, Pierre Chanial +@@ -26,44 +27,138 @@ + ; + ; + ;- +- +-function STRSPLIT, input1, input2, _ref_extra = extra, REGEX=regex +- +-on_error, 2 +- ++; ++function STRMULTIPOS, str, single_char, test=test ++ON_ERROR, 2 ++if (SIZE(str, /type) NE 7) OR (SIZE(single_char, /type) NE 7) then begin ++ MESSAGE, 'Invalid input string.' ++ return, -1 ++endif ++if (STRLEN(single_char) NE 1) then begin ++ MESSAGE, 'field2 must be a Single Char' ++ return, -1 ++endif ++; ++resu=-1 ++; ++for ii=0, STRLEN(str)-1 do begin ++ sub_str=STRMID(str,ii,1) ++ if (sub_str EQ single_char) then resu=[resu,ii] ++endfor ++; ++if N_ELEMENTS(resu) GT 1 then resu=resu[1:*] ++; ++if KEYWORD_SET(test) then STOP ++; ++return, resu ++; ++end ++; ++function STRSPLIT, input1, input2, $ ++ count=count, length=length, extract=extract, regex=regex, $ ++ escape=escape, fold_case=fold_case, preserve_null=preserve_null, $ ++ test=test, help=help ++; ++ON_ERROR, 2 ++; ++if KEYWORD_SET(help) then begin ++ print, 'function STRSPLIT, input1, input2, $' ++ print, ' count=count, length=length, extract=extract, regex=regex, $' ++ print, ' escape=escape, fold_case=fold_case, preserve_null=preserve_null, $' ++ print, ' test=test, help=help' ++ return, -1 ++endif ++; ++if KEYWORD_SET(escape) then begin ++ MESSAGE, /continue, 'Sorry, this keyword ESCAPE is not implemented (no effect)' ++ MESSAGE, /continue, 'PLEASE CONTRIBUTE' ++endif ++if KEYWORD_SET(preserve_null) then begin ++ if (N_PARAMS() EQ 1) then begin ++ MESSAGE, /continue, 'Sorry, this keyword PRESERVE_NULL is not implemented (no effect)' ++ MESSAGE, /continue, 'PLEASE CONTRIBUTE' ++ endif ++endif ++if KEYWORD_SET(fold_case) then begin ++ MESSAGE, /continue, 'Sorry, this keyword FOLD_CASE is not implemented (no effect)' ++ MESSAGE, /continue, 'PLEASE CONTRIBUTE' ++endif + ;if keyword_set( regex) then begin + ; message,'REGEX keyword not implemented yet.' + ;endif + + if (SIZE(input1, /type) NE 7) then begin +- MESSAGE, 'Invalid input string.' ++ MESSAGE, 'Invalid input string.' + endif + ; + if (SIZE(input1, /n_dimensions) GT 1) then begin +- MESSAGE, 'Invalid input string.' ++ MESSAGE, 'Invalid input string.' + endif + ; + local_input1=input1 + ; + if (SIZE(input1, /n_dimensions) EQ 1) then begin +- local_input1=local_input1[0] ++ local_input1=local_input1[0] + endif + ; +-if (N_PARAMS() EQ 2) then begin +- if (N_ELEMENTS(input2) EQ 0) then begin +- MESSAGE, 'Undefined pattern string.' +- endif +- if KEYWORD_SET(regex) then begin +- return, STRTOK(local_input1, input2, _extra = extra, REGEX=regex) +- endif else begin +- return, STRTOK(local_input1, input2, _extra = extra) +- endelse +-endif ++if KEYWORD_SET(regex) then regex_flag=1 else regex_flag=0 + ; +-if KEYWORD_SET(regex) then begin +- return, STRTOK(local_input1, _extra = extra, REGEX=regex) ++if (N_PARAMS() EQ 2) then begin ++ if (N_ELEMENTS(input2) EQ 0) then begin ++ MESSAGE, 'Undefined pattern string.' ++ endif ++ if (STRLEN(input2) EQ 1) OR KEYWORD_SET(regex) then begin ++ resu=STRTOK(local_input1, input2, extract=extract, REGEX=regex_flag) ++ endif else begin ++ resu=0 ++ for ii=0, STRLEN(input2)-1 do resu=[resu, STRMULTIPOS(local_input1, STRMID(input2, ii, 1))] ++ resu=resu[WHERE(resu GE 0)] ++ resu=resu[UNIQ(resu,SORT(resu))] ++ if KEYWORD_SET(extract) then begin ++ if N_ELEMENTS(resu) EQ 1 then begin ++ sresu=local_input1 ++ endif else begin ++ sresu=STRARR(N_ELEMENTS(resu)) ++ sresu[0]=STRMID(local_input1, 0, resu[1]) ++ for ii=1, N_ELEMENTS(resu)-2 do begin ++ ;;print, resu[ii]+1,resu[ii+1]-resu[ii]-1 ++ sresu[ii]=STRMID(local_input1, resu[ii]+1,resu[ii+1]-resu[ii]-1) ++ endfor ++ sresu[N_ELEMENTS(resu)-1]=STRMID(local_input1, resu[N_ELEMENTS(resu)-1]+1) ++ ;stop ++ resu=sresu ++ endelse ++ if NOT(KEYWORD_SET(preserve_null)) then begin ++ ok=WHERE(STRLEN(resu) GT 0, nb_ok) ++ if (nb_ok GT 0) then resu=resu[ok] ++ endif ++ endif else begin ++ if N_ELEMENTS(resu) GT 0 then resu[1:*]=resu[1:*]+1 else resu=0 ++ if NOT(KEYWORD_SET(preserve_null)) then begin ++ refresu=resu ++ resu=resu[0] ++ for ii=1, N_ELEMENTS(refresu)-1 do begin ++ if (refresu[ii]-refresu[ii-1]) GT 1 then resu=[resu,refresu[ii]] ++ endfor ++ endif ++ endelse ++ endelse + endif else begin +- return, STRTOK(local_input1, _extra = extra) ++ resu=STRTOK(local_input1, extract = extract, REGEX=regex_flag) + endelse + ; ++if KEYWORD_SET(count) then begin ++ if ((STRLEN(input1) EQ 0) OR (STRLEN(input2) EQ 0)) then begin ++ count=0 ++ endif else begin ++ count=N_ELEMENTS(resu) ++ endelse ++endif ++; ++if KEYWORD_SET(length) then length=STRLEN(resu) ++; ++if KEYWORD_SET(test) then STOP ++; ++return, resu ++; + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/tvscl.pro cvs/gdl/src/pro/tvscl.pro +--- gdl-0.9rc4/src/pro/tvscl.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/tvscl.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -38,29 +38,42 @@ + ; not yet implemented in MIN, MAX and BYTSCL. + ; + ; MODIFICATION HISTORY: +-; Original: 14/3/05; SJT ++; Original: 14/03/2005; SJT ++; Modification: 14/04/2010; Alain Coulais: ++; -- better managment of inputs ++; -- no use of "locs" if no /NaN ! ++; + ;- +- +-pro tvscl, image, x, y, nan = nan, _extra = _extra +- +-on_error, 2 ; Return to caller on error. +- +-if keyword_set(nan) then begin +- locs = where(finite(image), nf) +- if nf eq 0 then message, "No finite values found in image" +-endif else locs = lindgen(n_elements(image)) +- +-dmin = min(image[locs], max = dmax) ++pro TVSCL, image, x, y, nan = nan, _extra = _extra ++; ++ON_ERROR, 2 ; Return to caller on error. ++; ++if N_PARAMS() EQ 0 then begin ++ MESSAGE, 'Incorrect number of arguments.' ++ return ++endif ++if (SIZE(image,/n_elements) EQ 0) then begin ++ MESSAGE, ' Expression must be an array in this context' ++ return ++endif ++; ++if KEYWORD_SET(nan) then begin ++ locs = WHERE(FINITE(image), nf) ++ if (nf EQ 0) then MESSAGE, "No finite values found in image" ++ dmin = MIN(image[locs], max = dmax) ++endif else begin ++ dmin = MIN(image, max = dmax) ++endelse + + if !d.table_size eq 0 then imax = !d.n_colors-1 $ + else imax = !d.table_size-1 + +-img = bytscl(image, min = dmin, max = dmax, top = imax) ++img = BYTSCL(image, min = dmin, max = dmax, top = imax) + +-case n_params() of +- 1: tv, img, _extra = _extra +- 2: tv, img, x, _extra = _extra +- 3: tv, img, x, y, _extra = _extra ++case N_PARAMS() of ++ 1: TV, img, _extra = _extra ++ 2: TV, img, x, _extra = _extra ++ 3: TV, img, x, y, _extra = _extra + endcase + + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pro/UrgentNeed.txt cvs/gdl/src/pro/UrgentNeed.txt +--- gdl-0.9rc4/src/pro/UrgentNeed.txt 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pro/UrgentNeed.txt 2010-04-16 11:22:54.000000000 -0600 +@@ -37,7 +37,6 @@ + !h_eq_ct.pro + !h_eq_int.pro + !hilbert.pro +-!hist_2d.pro + !hist_equal.pro + !ibeta.pro + !int_2d.pro +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/prognode.cpp cvs/gdl/src/prognode.cpp +--- gdl-0.9rc4/src/prognode.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/prognode.cpp 2010-05-21 10:23:58.598904426 -0600 +@@ -27,6 +27,70 @@ + + using namespace std; + ++///////////////////////////////////////////////////////////////////////////// ++// c-tor d-tor ++///////////////////////////////////////////////////////////////////////////// ++ ++// tanslation RefDNode -> ProgNode ++ProgNode::ProgNode( const RefDNode& refNode): ++ keepRight( false), ++ keepDown( false), ++ breakTarget( NULL), ++ ttype( refNode->getType()), ++ text( refNode->getText()), ++ down( NULL), ++ right( NULL), ++ lineNumber( refNode->getLine()), ++ cData( refNode->StealCData()), ++ libPro( refNode->libPro), ++ libFun( refNode->libFun), ++ var( refNode->var), ++ arrIxList( refNode->StealArrIxList()), ++// arrIxList( refNode->CloneArrIxList()), ++ labelStart( refNode->labelStart), ++ labelEnd( refNode->labelEnd) ++{ ++ initInt = refNode->initInt; ++} ++ ++ ++ ++ProgNode::~ProgNode() ++{ ++ // delete cData in case this node is a constant ++ if( (getType() == GDLTokenTypes::CONSTANT)) ++ { ++ delete cData; ++ } ++ if( (getType() == GDLTokenTypes::ARRAYIX)) ++ { ++ delete arrIxList; ++ } ++ if( !keepDown) delete down; ++ if( !keepRight) delete right; ++} ++ ++ ++ ++ProgNodeP ProgNode::GetNULLProgNodeP() ++ { ++ return interpreter->GetNULLProgNodeP(); ++ } ++ ++ ++void FORNode::KeepRight( ProgNodeP r) ++{ ++ throw GDLException( "Internal error: FORNode::KeepRight() called. Please report."); ++} ++void FOR_STEPNode::KeepRight( ProgNodeP r) ++{ ++ throw GDLException( "Internal error: FOR_STEPNode::KeepRight() called. Please report."); ++} ++void FOREACHNode::KeepRight( ProgNodeP r) ++{ ++ throw GDLException( "Internal error: FOREACHNode::KeepRight() called. Please report."); ++} ++ + bool ProgNode::ConstantNode() + { + if( this->getType() == GDLTokenTypes::SYSVAR) +@@ -36,12 +100,15 @@ + SizeT rdOnlySize = sysVarRdOnlyList.size(); + for( SizeT i=0; ivar) +- return true; ++ return true; + } + + return this->getType() == GDLTokenTypes::CONSTANT; + } + ++///////////////////////////////////////////////////////// ++// Eval ++///////////////////////////////////////////////////////// + BaseGDL* ARRAYDEFNode::Eval() + { + // GDLInterpreter:: +@@ -67,7 +134,7 @@ + if( ty == UNDEF) + { + throw GDLException( _t, "Variable is undefined: "+ +- ProgNode::interpreter->Name(e)); ++ ProgNode::interpreter->Name(e),true,false); + } + if( cType == UNDEF) + { +@@ -82,7 +149,7 @@ + { + throw + GDLException( _t, e->TypeStr()+ +- " is not allowed in this context."); ++ " is not allowed in this context.",true,false); + } + + // update order if larger type (or types are equal) +@@ -111,7 +178,7 @@ + if( (*newS) != (*oldS)) + throw GDLException( _t, + "Conflicting data structures: "+ +- ProgNode::interpreter->Name(cTypeData)+", "+ProgNode::interpreter->Name(e)); ++ ProgNode::interpreter->Name(cTypeData)+", "+ProgNode::interpreter->Name(e),true,false); + } + } + } +@@ -128,6 +195,8 @@ + return res; + } + ++ ++ + BaseGDL* STRUCNode::Eval() + { + // don't forget the struct in extrat.cpp if you change something here +@@ -162,6 +231,8 @@ + return res; + } + ++ ++ + BaseGDL* NSTRUCNode::Eval() + { + ProgNodeP id = NULL; +@@ -410,7 +481,7 @@ + // match(antlr::RefAST(_t),IDENTIFIER); + // _t = _t->getNextSibling(); + BaseGDL* kval=ProgNode::interpreter-> +- check_expr(this->getFirstChild()->getNextSibling()); ++ lib_function_call(this->getFirstChild()->getNextSibling()); + + BaseGDL** kvalRef = ProgNode::interpreter->callStack.back()->GetPtrTo( kval); + if( kvalRef != NULL) +@@ -426,7 +497,7 @@ + } + void REF_CHECKNode::Parameter( EnvBaseT* actEnv) + { +- BaseGDL* pval=ProgNode::interpreter->check_expr(this->getFirstChild()); ++ BaseGDL* pval=ProgNode::interpreter->lib_function_call(this->getFirstChild()); + + BaseGDL** pvalRef = ProgNode::interpreter->callStack.back()->GetPtrTo( pval); + if( pvalRef != NULL) +@@ -453,7 +524,7 @@ + + + +-void ASSIGNNode::Run() ++RetCode ASSIGNNode::Run() + { + BaseGDL* r; + BaseGDL** l; +@@ -475,7 +546,7 @@ + } + case GDLTokenTypes::FCALL_LIB: + { +- r=ProgNode::interpreter->check_expr(_t); ++ r=ProgNode::interpreter->lib_function_call(_t); + _t = ProgNode::interpreter->_retTree; + + if( !ProgNode::interpreter->callStack.back()->Contains( r)) +@@ -495,9 +566,13 @@ + l=ProgNode::interpreter->l_expr(_t, r); + + ProgNode::interpreter->_retTree = this->getNextSibling(); ++ ++ return RC_OK; + } + +-void ASSIGN_REPLACENode::Run() ++ ++ ++RetCode ASSIGN_ARRAYEXPR_MFCALLNode::Run() + { + BaseGDL* r; + BaseGDL** l; +@@ -506,27 +581,111 @@ + //match(antlr::RefAST(_t),ASSIGN_REPLACE); + ProgNodeP _t = this->getFirstChild(); + { ++ // BOTH + if( _t->getType() == GDLTokenTypes::FCALL_LIB) + { +- r=ProgNode::interpreter->check_expr(_t); ++ r=ProgNode::interpreter->lib_function_call(_t); + +- if( r == NULL) // ROUTINE_NAMES +- ProgNode::interpreter->callStack.back()->Throw( "Undefined return value"); ++ if( r == NULL) // ROUTINE_NAMES ++ ProgNode::interpreter->callStack.back()->Throw( "Undefined return value"); + +- _t = ProgNode::interpreter->_retTree; +- +- +- if( !ProgNode::interpreter->callStack.back()->Contains( r)) +- r_guard.reset( r); ++ _t = ProgNode::interpreter->_retTree; ++ ++ if( !ProgNode::interpreter->callStack.back()->Contains( r)) ++ r_guard.reset( r); + + } + else + { +- r=ProgNode::interpreter->tmp_expr(_t); +- _t = ProgNode::interpreter->_retTree; +- +- r_guard.reset( r); +- ++ // ASSIGN ++ switch ( _t->getType()) { ++ case GDLTokenTypes::CONSTANT: ++ case GDLTokenTypes::DEREF: ++ case GDLTokenTypes::SYSVAR: ++ case GDLTokenTypes:: VAR: ++ case GDLTokenTypes::VARPTR: ++ { ++ r= ProgNode::interpreter->indexable_expr(_t); ++ _t = ProgNode::interpreter->_retTree; ++ break; ++ } ++ default: ++ { ++ r=ProgNode::interpreter->indexable_tmp_expr(_t); ++ _t = ProgNode::interpreter->_retTree; ++ r_guard.reset( r); ++ break; ++ } ++ }//switch ++ } ++ } ++ ++ ProgNodeP lExpr = _t; ++ ++ // try MFCALL ++ try ++ { ++ l=ProgNode::interpreter->l_arrayexpr_mfcall_as_mfcall(_t); ++ ++ if( r != (*l)) ++ { ++ delete *l; ++ ++ if( r_guard.get() == r) ++ *l = r_guard.release(); ++ else ++ *l = r->Dup(); ++ } ++ } ++ catch( GDLException& e) ++ { ++ // try ARRAYEXPR ++ try ++ { ++ l=ProgNode::interpreter->l_arrayexpr_mfcall_as_arrayexpr(lExpr, r); ++ } ++ catch( GDLException& e2) ++ { ++ throw GDLException(e.toString() + " or "+e2.toString()); ++ } ++ } ++ ++ ProgNode::interpreter->_retTree = this->getNextSibling(); ++ return RC_OK; ++} ++ ++ ++ ++RetCode ASSIGN_REPLACENode::Run() ++{ ++ BaseGDL* r; ++ BaseGDL** l; ++ auto_ptr r_guard; ++ ++ //match(antlr::RefAST(_t),ASSIGN_REPLACE); ++ ProgNodeP _t = this->getFirstChild(); ++ { ++ if( _t->getType() == GDLTokenTypes::FCALL_LIB) ++ { ++ r=_t->Eval();//ProgNode::interpreter->lib_function_call(_t); ++ r_guard.reset( r); ++ ++ if( r == NULL) // ROUTINE_NAMES ++ throw GDLException( this, "Undefined return value", true, false); ++ ++ _t = ProgNode::interpreter->_retTree; ++ ++/* if( !ProgNode::interpreter->callStack.back()->Contains( r)) ++ r_guard.reset( r); ++ else ++ r_guard.reset( r->Dup());*/ ++ } ++ else ++ { ++ r=ProgNode::interpreter->tmp_expr(_t); ++ _t = ProgNode::interpreter->_retTree; ++ ++ r_guard.reset( r); + } + } + +@@ -555,21 +714,22 @@ + break; + } + } +- +- if( r != (*l)) +- { +- delete *l; +- +- if( r_guard.get() == r) ++// if( r != (*l)) ++// { ++ delete *l; ++// if( r_guard.get() == r) + *l = r_guard.release(); +- else +- *l = r->Dup(); +- } ++// else ++// *l = r->Dup(); ++// } + +- ProgNode::interpreter->_retTree = this->getNextSibling(); ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return RC_OK; + } + +-void PCALL_LIBNode::Run() ++ ++ ++RetCode PCALL_LIBNode::Run() + { + // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack + StackGuard guard( ProgNode::interpreter->CallStack()); +@@ -595,8 +755,12 @@ + + ProgNode::interpreter->SetRetTree( this->getNextSibling()); + // ProgNode::interpreter->_retTree = this->getNextSibling(); ++ return RC_OK; + } +-void MPCALLNode::Run() ++ ++ ++ ++RetCode MPCALLNode::Run() + { + // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack + StackGuard guard(ProgNode::interpreter->CallStack()); +@@ -628,15 +792,17 @@ + ProgNode::interpreter->call_pro(static_cast(newEnv->GetPro())->GetTree()); + + ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return RC_OK; + } + +-void MPCALL_PARENTNode::Run() ++ ++ ++RetCode MPCALL_PARENTNode::Run() + { + // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack + StackGuard guard(ProgNode::interpreter->callStack); + BaseGDL *self; + EnvUDT* newEnv; +- + + // match(antlr::RefAST(_t),MPCALL_PARENT); + ProgNodeP _t = this->getFirstChild(); +@@ -667,8 +833,9 @@ + + ProgNode::interpreter->SetRetTree( this->getNextSibling()); + // ProgNode::interpreter->_retTree = this->getNextSibling(); ++ return RC_OK; + } +-void PCALLNode::Run() ++RetCode PCALLNode::Run() + { + // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack + StackGuard guard(ProgNode::interpreter->callStack); +@@ -696,172 +863,606 @@ + + ProgNode::interpreter->SetRetTree( this->getNextSibling()); + // ProgNode::interpreter->_retTree = this->getNextSibling(); ++ return RC_OK; + } +-void DECNode::Run() ++ ++ ++ ++RetCode DECNode::Run() + { + // match(antlr::RefAST(_t),DEC); + ProgNodeP _t = this->getFirstChild(); + ProgNode::interpreter->l_decinc_expr(_t, GDLTokenTypes::DECSTATEMENT); + + ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return RC_OK; + } +-void INCNode::Run() ++ ++ ++ ++RetCode INCNode::Run() + { + // match(antlr::RefAST(_t),INC); + ProgNodeP _t = this->getFirstChild(); + ProgNode::interpreter->l_decinc_expr(_t, GDLTokenTypes::INCSTATEMENT); + + ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return RC_OK; + } + +- +-// void FOR_INIT_Node::Run() +-// { +-// BaseGDL* s; +-// BaseGDL* e; +-// BaseGDL* st; +-// GDLInterpreter::RetCode retCode = RC_OK; ++RetCode FORNode::Run()//for_statement(ProgNodeP _t) { ++{ ++ EnvUDT* callStack_back = static_cast(GDLInterpreter::CallStack().back()); ++ ++ ForLoopInfoT& loopInfo = callStack_back->GetForLoopInfo( this->forLoopIx); + +-// //match(antlr::RefAST(_t),FOR); +-// ProgNodeP _t = this->getFirstChild(); ++ ProgNodeP vP = this->GetNextSibling()->GetFirstChild(); + +-// ProgNodeP sv = _t; ++ BaseGDL** v=ProgNode::interpreter->l_simple_var(vP); + +-// BaseGDL** v=l_simple_var(_t); +-// _t = _retTree; +-// s=expr(_t); +-// _t = _retTree; +-// e=expr(_t); +-// _t = _retTree; +- +-// auto_ptr s_guard(s); +-// auto_ptr e_guard(e); +- +-// s->ForCheck( &e); +-// e_guard.release(); +-// e_guard.reset(e); +- +-// ProgNodeP b= _t; +- +-// // ASSIGNMENT used here also +-// delete (*v); +- +-// // problem: +-// // EXECUTE may call DataListT.loc.resize(), as v points to the +-// // old sequence v might be invalidated -> segfault +-// // note that the value (*v) is preserved by resize() +-// s_guard.release(); // s held in *v after this +- +- +-// (*v)=s; +-// SetReturnCode( RC_OK); +-// } +- +-// void ENDFORNode::Run() +-// { +-// v=l_simple_var( sv); +-// (*v)->ForAdd(); +-// ProgNode::interpreter->SetRetTree( target); +-// } +-// void ENDFOR_STEPNode::Run() +-// { +-// v=l_simple_var( sv); +-// (*v)->ForAdd(st)) +-// ProgNode::interpreter->SetRetTree( target); +-// } +- +-// void FORNode::Run() +-// { +-// if( ProgNode::interpreter->returnCode != RC_OK) +-// { +-// if( retCode == RC_CONTINUE) continue; +-// if( retCode == RC_BREAK) +-// { +-// retCode = RC_OK; +-// break; +-// } +-// if( retCode >= RC_RETURN) break; +-// } +- +-// if( (*v)->ForCondUp( e)) +-// { +-// ProgNode::interpreter->SetRetTree( b); +-// } +-// else +-// { +-// ProgNode::interpreter->SetRetTree( this->getNextSibling()); +-// } +-// } +- +-// void FOR_STEP_INITNode::Run() +-// { +-// BaseGDL* s; +-// BaseGDL* e; +-// BaseGDL* st; +-// // match(antlr::RefAST(_t),FOR_STEP); +-// ProgNodeP _t = this->getFirstChild(); ++ BaseGDL* s=ProgNode::interpreter->expr( this->GetFirstChild()); ++ auto_ptr s_guard(s); + +-// ProgNodeP sv = _t; ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=ProgNode::interpreter->expr(this->GetFirstChild()->GetNextSibling()); + +-// v=l_simple_var(_t); +-// _t = _retTree; +-// s=expr(_t); +-// _t = _retTree; +-// e=expr(_t); +-// _t = _retTree; +-// st=expr(_t); +-// _t = _retTree; +- +-// auto_ptr s_guard(s); +-// auto_ptr e_guard(e); +-// auto_ptr st_guard(st); +- +-// SizeT nJump = static_cast(callStack.back())->NJump(); +- +-// s->ForCheck( &e, &st); +-// e_guard.release(); +-// e_guard.reset(e); +-// st_guard.release(); +-// st_guard.reset(st); +- +-// ProgNodeP bs=_t; +- +-// // ASSIGNMENT used here also +-// delete (*v); +-// } +-// void FOR_STEPNode::Run() +-// { +-// if( ProgNode::interpreter->returnCode != RC_OK) +-// { +-// if( retCode == RC_CONTINUE) continue; +-// if( retCode == RC_BREAK) +-// { +-// retCode = RC_OK; +-// break; +-// } +-// if( retCode >= RC_RETURN) break; +-// } ++ s->ForCheck( &loopInfo.endLoopVar); ++ ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v)= s_guard.release(); // s held in *v after this ++ ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ ProgNode::interpreter->_retTree = vP->GetNextSibling(); ++ return RC_OK; ++ } ++ else ++ { ++ // skip if initial test fails ++ ProgNode::interpreter->_retTree = this->GetNextSibling()->GetNextSibling(); ++ return RC_OK; ++ } ++} ++ ++ ++ RetCode FOR_LOOPNode::Run() ++ { ++ EnvUDT* callStack_back = static_cast(GDLInterpreter::CallStack().back()); ++ ForLoopInfoT& loopInfo = callStack_back->GetForLoopInfo( this->forLoopIx); ++ BaseGDL* endLoopVar = loopInfo.endLoopVar; ++ if( endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ ProgNode::interpreter->_retTree = this->GetNextSibling(); ++ return RC_OK; ++ ++ } ++ ++ // // problem: ++ // // EXECUTE may call DataListT.loc.resize(), as v points to the ++ // // old sequence v might be invalidated -> segfault ++ // // note that the value (*v) is preserved by resize() ++ ++ BaseGDL** v=this->getFirstChild()->LEval();//ProgNode::interpreter->l_simple_var(this->getFirstChild()); ++ ++// shortCut:; ++ ++ //(*v)->ForAdd(); ++ if( (*v)->ForAddCondUp( endLoopVar)) ++ { ++ ProgNode::interpreter->_retTree = this->statementList; //GetFirstChild()->GetNextSibling(); ++// if( ProgNode::interpreter->_retTree == this) goto shortCut; ++ } ++ else ++ { ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ ProgNode::interpreter->_retTree = this->GetNextSibling(); ++ } ++ return RC_OK; ++ } ++ ++ ++ RetCode FOR_STEPNode::Run()//for_statement(ProgNodeP _t) { ++{ ++ EnvUDT* callStack_back = static_cast(GDLInterpreter::CallStack().back()); ++ ++ ForLoopInfoT& loopInfo = callStack_back->GetForLoopInfo( this->forLoopIx); ++ ++ ProgNodeP vP = this->GetNextSibling()->GetFirstChild(); ++ ++ BaseGDL** v=ProgNode::interpreter->l_simple_var(vP); ++ ++ BaseGDL* s=ProgNode::interpreter->expr( this->GetFirstChild()); ++ auto_ptr s_guard(s); ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=ProgNode::interpreter->expr(this->GetFirstChild()->GetNextSibling()); ++ ++ delete loopInfo.loopStepVar; ++ loopInfo.loopStepVar=ProgNode::interpreter->expr(this->GetFirstChild()->GetNextSibling()->GetNextSibling()); ++ ++ s->ForCheck( &loopInfo.endLoopVar, &loopInfo.loopStepVar); ++ ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v)= s_guard.release(); // s held in *v after this ++ ++ if( loopInfo.loopStepVar->Sgn() == -1) ++ { ++ if( (*v)->ForCondDown( loopInfo.endLoopVar)) ++ { ++ ProgNode::interpreter->_retTree = vP->GetNextSibling(); ++ return RC_OK; ++ ++ } ++ } ++ else ++ { ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ ProgNode::interpreter->_retTree = vP->GetNextSibling(); ++ return RC_OK; ++ ++ } ++ } ++ // skip if initial test fails ++ ProgNode::interpreter->_retTree = this->GetNextSibling()->GetNextSibling(); ++ return RC_OK; ++} ++ ++RetCode FOR_STEP_LOOPNode::Run() ++{ ++ EnvUDT* callStack_back = static_cast(GDLInterpreter::CallStack().back()); ++ ++ ForLoopInfoT& loopInfo = callStack_back->GetForLoopInfo( this->forLoopIx); ++ if( loopInfo.endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ ProgNode::interpreter->_retTree = this->GetNextSibling(); ++ return RC_OK; ++ } ++ ++ // // problem: ++ // // EXECUTE may call DataListT.loc.resize(), as v points to the ++ // // old sequence v might be invalidated -> segfault ++ // // note that the value (*v) is preserved by resize() ++ ++ BaseGDL** v=ProgNode::interpreter->l_simple_var(this->GetFirstChild()); ++ ++ (*v)->ForAdd(loopInfo.loopStepVar); ++ if( loopInfo.loopStepVar->Sgn() == -1) ++ { ++ if( (*v)->ForCondDown( loopInfo.endLoopVar)) ++ { ++ ProgNode::interpreter->_retTree = this->GetFirstChild()->GetNextSibling(); ++ return RC_OK; ++ } ++ } ++ else ++ { ++ if( (*v)->ForCondUp( loopInfo.endLoopVar)) ++ { ++ ProgNode::interpreter->_retTree = this->GetFirstChild()->GetNextSibling(); ++ return RC_OK; ++ } ++ } ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ delete loopInfo.loopStepVar; ++ loopInfo.loopStepVar = NULL; ++ ProgNode::interpreter->_retTree = this->GetNextSibling(); ++ return RC_OK; ++} ++ ++RetCode FOREACHNode::Run() ++{ ++ EnvUDT* callStack_back = static_cast(GDLInterpreter::CallStack().back()); ++ ForLoopInfoT& loopInfo = callStack_back->GetForLoopInfo( this->forLoopIx); ++ ++ ProgNodeP vP = this->GetNextSibling()->GetFirstChild(); ++ ++ BaseGDL** v=ProgNode::interpreter->l_simple_var(vP); ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar=ProgNode::interpreter->expr(this->GetFirstChild()); ++ ++ loopInfo.foreachIx = 0; ++ ++ // currently there are no empty arrays ++ //SizeT nEl = loopInfo.endLoopVar->N_Elements(); ++ ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v) = loopInfo.endLoopVar->NewIx( 0); ++ ++ ProgNode::interpreter->_retTree = vP->GetNextSibling(); ++ return RC_OK; ++} ++ ++RetCode FOREACH_LOOPNode::Run() ++{ ++ EnvUDT* callStack_back = static_cast(GDLInterpreter::CallStack().back()); ++ ForLoopInfoT& loopInfo = callStack_back->GetForLoopInfo( this->forLoopIx); ++ ++ if( loopInfo.endLoopVar == NULL) ++ { ++ // non-initialized loop (GOTO) ++ ProgNode::interpreter->_retTree = this->GetNextSibling(); ++ return RC_OK; ++ } ++ ++ BaseGDL** v=ProgNode::interpreter->l_simple_var(this->GetFirstChild()); ++ ++ ++loopInfo.foreachIx; ++ ++ SizeT nEl = loopInfo.endLoopVar->N_Elements(); ++ ++ if( loopInfo.foreachIx < nEl) ++ { ++ // ASSIGNMENT used here also ++ delete (*v); ++ (*v) = loopInfo.endLoopVar->NewIx( loopInfo.foreachIx); ++ ++ ProgNode::interpreter->_retTree = this->GetFirstChild()->GetNextSibling(); ++ return RC_OK; ++ } ++ ++ delete loopInfo.endLoopVar; ++ loopInfo.endLoopVar = NULL; ++ // loopInfo.foreachIx = -1; ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ return RC_OK; ++} ++ ++ ++ ++RetCode REPEATNode::Run() ++{ ++ // _t is REPEAT_LOOP, GetFirstChild() is expr, GetNextSibling is first loop statement ++ if( this->GetFirstChild()->GetFirstChild()->GetNextSibling() == NULL) ++ ProgNode::interpreter->SetRetTree( this->GetFirstChild()); ++ else ++ ProgNode::interpreter->SetRetTree( this->GetFirstChild()->GetFirstChild()->GetNextSibling()); // statement ++ return RC_OK; ++} ++ ++ ++ ++RetCode REPEAT_LOOPNode::Run() ++{ ++ auto_ptr eVal( ProgNode::interpreter->expr(this->GetFirstChild())); ++ if( eVal.get()->False()) ++ { ++ ProgNode::interpreter->SetRetTree( this->GetFirstChild()->GetNextSibling()); // 1st loop statement ++ if( this->GetFirstChild()->GetNextSibling() == NULL) ++ throw GDLException(this, "Empty REPEAT loop entered (infinite loop).",true,false); ++ return RC_OK; ++ } ++ ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); // statement ++ return RC_OK; ++} ++ ++ ++ ++RetCode WHILENode::Run() ++{ ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = this->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) ++ { ++ e1 = evalExpr->EvalNC(); ++ } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++// auto_ptr eVal( ProgNode::interpreter->expr( this->GetFirstChild())); ++ if( e1->True()) ++ { ++ ProgNode::interpreter->SetRetTree( this->GetFirstChild()->GetNextSibling()); ++ if( this->GetFirstChild()->GetNextSibling() == NULL) ++ throw GDLException(this,"Empty WHILE loop entered (infinite loop).",true,false); ++ } ++ else ++ { ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ } ++ return RC_OK; ++} ++ ++ ++ ++RetCode IFNode::Run() ++ { ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = this->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) ++ { ++ e1 = evalExpr->EvalNC(); ++ } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++// auto_ptr eVal( ProgNode::interpreter->expr( this->GetFirstChild())); ++ if( e1->True()) ++ { ++ ProgNode::interpreter->SetRetTree( this->GetFirstChild()->GetNextSibling()); ++ } ++ else ++ { ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ } ++ return RC_OK; ++} ++ ++RetCode IF_ELSENode::Run() ++{ ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = this->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) ++ { ++ e1 = evalExpr->EvalNC(); ++ } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++// auto_ptr eVal( ProgNode::interpreter->expr( this->GetFirstChild())); ++ if( e1->True()) ++ { ++ ProgNode::interpreter->SetRetTree( this->GetFirstChild()->GetNextSibling()->GetFirstChild()); ++ } ++ else ++ { ++ ProgNode::interpreter->SetRetTree( this->GetFirstChild()->GetNextSibling()->GetNextSibling()); ++ } ++ return RC_OK; ++} ++ ++ ++ ++RetCode CASENode::Run() ++{ ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = this->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) ++ { ++ e1 = evalExpr->EvalNC(); ++ } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++ ++// auto_ptr eVal( ProgNode::interpreter->expr( this->GetFirstChild())); ++ if( !e1->Scalar()) ++ throw GDLException( this->GetFirstChild(), "Expression must be a" ++ " scalar in this context: "+ProgNode::interpreter->Name(e1),true,false); ++ ++ ProgNodeP b=this->GetFirstChild()->GetNextSibling(); // remeber block begin ++ ++ for( int i=0; inumBranch; ++i) ++ { ++ if( b->getType() == GDLTokenTypes::ELSEBLK) ++ { ++ ProgNodeP sL = b->GetFirstChild(); // statement_list ++ ++ if(sL != NULL ) ++ { ++ ProgNode::interpreter->SetRetTree( sL); ++ } ++ else ++ { ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ } ++ return RC_OK; ++ } ++ else ++ { ++ ProgNodeP ex = b->GetFirstChild(); // EXPR ++ ++ auto_ptr ee_guard; ++ BaseGDL* ee; ++ if( NonCopyNode( ex->getType())) ++ { ++ ee = ex->EvalNC(); ++ } ++ else ++ { ++ ee = ex->Eval(); ++ ee_guard.reset(ee); ++ } ++// BaseGDL* ee=ProgNode::interpreter->expr(ex); ++ // auto_ptr ee_guard(ee); ++ bool equalexpr=e1->EqualNoDelete(ee); // Equal deletes ee ++ ++ if( equalexpr) ++ { ++ ProgNodeP bb = ex->GetNextSibling(); // statement_list ++ if(bb != NULL ) ++ { ++ ProgNode::interpreter->SetRetTree( bb); ++ return RC_OK; ++ } ++ else ++ { ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ return RC_OK; ++ } ++ } ++ } ++ b=b->GetNextSibling(); // next block ++ } // for ++ ++ throw GDLException( this, "CASE statement found no match.",true,false); ++ return RC_OK; ++} ++ ++ ++ ++RetCode SWITCHNode::Run() ++{ ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = this->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) ++ { ++ e1 = evalExpr->EvalNC(); ++ } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++ ++// auto_ptr eVal( ProgNode::interpreter->expr( this->GetFirstChild())); ++ if( !e1->Scalar()) ++ throw GDLException( this->GetFirstChild(), "Expression must be a" ++ " scalar in this context: "+ProgNode::interpreter->Name(e1),true,false); ++ ++ ProgNodeP b=this->GetFirstChild()->GetNextSibling(); // remeber block begin ++ ++ bool hook=false; // switch executes everything after 1st match ++ for( int i=0; inumBranch; i++) ++ { ++ if( b->getType() == GDLTokenTypes::ELSEBLK) ++ { ++ hook=true; ++ ++ ProgNodeP sL = b->GetFirstChild(); // statement_list ++ ++ if(sL != NULL ) ++ { ++ ProgNode::interpreter->SetRetTree( sL); ++ return RC_OK; ++ } ++ } ++ else ++ { ++ ProgNodeP ex = b->GetFirstChild(); // EXPR ++ ++ if( !hook) ++ { ++ auto_ptr ee_guard; ++ BaseGDL* ee; ++ if( NonCopyNode( ex->getType())) ++ { ++ ee = ex->EvalNC(); ++ } ++ else ++ { ++ ee = ex->Eval(); ++ ee_guard.reset(ee); ++ } ++// BaseGDL* ee=ProgNode::interpreter->expr(ex); ++ // auto_ptr ee_guard(ee); ++ hook=e1->EqualNoDelete(ee); // Equal deletes ee ++ } ++ ++ if( hook) ++ { ++ ProgNodeP bb = ex->GetNextSibling(); // statement_list ++ // statement there ++ if(bb != NULL ) ++ { ++ ProgNode::interpreter->SetRetTree( bb); ++ return RC_OK; ++ } ++ } ++ } ++ b=b->GetNextSibling(); // next block ++ } // for ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ return RC_OK; ++} ++ ++RetCode BLOCKNode::Run() ++{ ++ ProgNode::interpreter->SetRetTree( this->getFirstChild()); ++ return RC_OK; ++} ++ ++RetCode GOTONode::Run() ++ { ++ ProgNode::interpreter->SetRetTree( static_cast(GDLInterpreter::CallStack().back())-> ++ GotoTarget( targetIx)->GetNextSibling()); ++ return RC_OK; ++ } ++RetCode CONTINUENode::Run() ++{ ++assert( this->breakTarget != NULL); ProgNode::interpreter->SetRetTree( this->breakTarget); ++ return RC_OK; ++} ++RetCode BREAKNode::Run() ++{ ++ProgNode::interpreter->SetRetTree( this->breakTarget); ++ return RC_OK; ++} ++RetCode LABELNode::Run() ++{ ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ return RC_OK; ++} ++RetCode ON_IOERROR_NULLNode::Run() ++{ ++ static_cast(GDLInterpreter::CallStack().back())->SetIOError( -1); ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ return RC_OK; ++} ++RetCode ON_IOERRORNode::Run() ++{ ++ static_cast(GDLInterpreter::CallStack().back())->SetIOError( this->targetIx); ++ ProgNode::interpreter->SetRetTree( this->GetNextSibling()); ++ return RC_OK; ++} ++ ++ ++RetCode RETFNode::Run() ++{ ++ ProgNodeP _t = this->getFirstChild(); ++ assert( _t != NULL); ++ if ( !static_cast(GDLInterpreter::CallStack().back())->LFun()) ++ { ++ BaseGDL* e=ProgNode::interpreter->expr(_t); ++ ++ delete ProgNode::interpreter->returnValue; ++ ProgNode::interpreter->returnValue=e; ++ ++ GDLInterpreter::CallStack().back()->RemoveLoc( e); // steal e from local list ++ } ++ else ++ { ++ BaseGDL** eL=ProgNode::interpreter->l_ret_expr(_t); ++ ++ // returnValueL is otherwise owned ++ ProgNode::interpreter->returnValueL=eL; ++ } ++ //if( !(interruptEnable && sigControlC) && ( debugMode == DEBUG_CLEAR)) ++ //return RC_RETURN; ++ return RC_RETURN; ++} ++ ++RetCode RETPNode::Run() ++{ ++ return RC_RETURN; ++} ++ ++ ++ ++ ++ ++ + +-// if( st->Sgn() == -1) +-// { +-// if( (*v)->ForCondDown( e)) +-// { +-// ProgNode::interpreter->SetRetTree( bs); +-// } +-// else +-// { +-// ProgNode::interpreter->SetRetTree( this->getNextSibling()); +-// } +-// } +-// else +-// { +-// if( (*v)->ForCondUp( e)) +-// { +-// ProgNode::interpreter->SetRetTree( bs); +-// } +-// else +-// { +-// ProgNode::interpreter->SetRetTree( this->getNextSibling()); +-// } +-// } +-// } +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/prognodeexpr.cpp cvs/gdl/src/prognodeexpr.cpp +--- gdl-0.9rc4/src/prognodeexpr.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/prognodeexpr.cpp 2010-05-21 10:23:58.663905064 -0600 +@@ -18,6 +18,7 @@ + #include "includefirst.hpp" + + #include ++#include + + #include + +@@ -30,18 +31,6 @@ + + using namespace std; + +-bool NonCopyNode( int type) +-{ +- return (type == GDLTokenTypes::DEREF) || +- (type == GDLTokenTypes::CONSTANT) || +- (type == GDLTokenTypes::VAR) || +- (type == GDLTokenTypes::VARPTR); +-} +-// are always copy nodes +-// (type == GDLTokenTypes::ARRAYDEF) +-// (type == GDLTokenTypes::STRUC) +-// (type == GDLTokenTypes::NSTRUC) +-// (type == GDLTokenTypes::NSTRUC_REF) + + BinaryExpr::BinaryExpr( const RefDNode& refNode): DefaultNode( refNode) + { +@@ -57,6 +46,9 @@ + } + + ProgNode::ProgNode(): // for NULLProgNode ++ keepRight( false), ++ keepDown( false), ++ breakTarget( NULL), + ttype( antlr::Token::NULL_TREE_LOOKAHEAD), + text( "NULLProgNode"), + down( NULL), +@@ -70,64 +62,29 @@ + labelEnd( 0) + {} + +-// tanslation RefDNode -> ProgNode +-ProgNode::ProgNode( const RefDNode& refNode): +- ttype( refNode->getType()), +- text( refNode->getText()), +- down( NULL), +- right( NULL), +- lineNumber( refNode->getLine()), +- cData( refNode->StealCData()), +- libPro( refNode->libPro), +- libFun( refNode->libFun), +- var( refNode->var), +- arrIxList( refNode->StealArrIxList()), +-// arrIxList( refNode->CloneArrIxList()), +- labelStart( refNode->labelStart), +- labelEnd( refNode->labelEnd) +-{ +- initInt = refNode->initInt; +- +-// if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) +-// { +-// down = NewProgNode( refNode->GetFirstChild()); +-// } +-// if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) +-// { +-// right = NewProgNode( refNode->GetNextSibling()); +-// } +-} +- +-ProgNode::~ProgNode() ++BaseGDL* ProgNode::EvalNC() + { +- // delete cData in case this node is a constant +- if( (getType() == GDLTokenTypes::CONSTANT)) +- { +- delete cData; +- } +- if( (getType() == GDLTokenTypes::ARRAYIX)) +- { +- delete arrIxList; +- } +- delete down; +- delete right; ++ throw GDLException( this, ++ "Internal error. " ++ "ProgNode::EvalNC() called.",true,false); + } + +-BaseGDL* ProgNode::EvalNC() ++BaseGDL** ProgNode::LEval() + { + throw GDLException( this, + "Internal error. " +- "ProgNode::EvalNC() called."); ++ "ProgNode::LEval() called.",true,false); + } + +-void ProgNode::Run() ++RetCode ProgNode::Run() + { + throw GDLException( this, + "Internal error. " +- "ProgNode::Run() called."); ++ "ProgNode::Run() called.",true,false); ++ return RC_OK; // silence compiler + } + +-void ProgNode::SetNodes( const ProgNodeP r, const ProgNodeP d) ++void ProgNode::SetRightDown( const ProgNodeP r, const ProgNodeP d) + { + right = r; + down = d; +@@ -138,692 +95,7 @@ + return ProgNode::interpreter->expr( this); + } + +-// checks if parameterlist is constant +-bool ConstantPar( ProgNodeP _t) +-{ +- +- while(_t != NULL) { +- switch ( _t->getType()) { +- case GDLTokenTypes::KEYDEF_REF: +- { +- return false; +- } +- case GDLTokenTypes::KEYDEF_REF_EXPR: +- { +- return false; +- } +- case GDLTokenTypes::KEYDEF: +- { +-// ProgNodeP __t162 = _t; +- +- // match(antlr::RefAST(_t),KEYDEF); +-// _t = _t->getFirstChild(); +- // match(antlr::RefAST(_t),IDENTIFIER); +-// _t = _t->getNextSibling(); +- +- if( !_t->getFirstChild()->getNextSibling()->ConstantNode()) +- return false; +- +-// _t = __t162; +- _t = _t->getNextSibling(); +- break; +- } +- case GDLTokenTypes::REF: +- { +- return false; +- } +- case GDLTokenTypes::REF_EXPR: +- { +- return false; +- } +- case GDLTokenTypes::KEYDEF_REF_CHECK: +- { +- return false; +- } +- case GDLTokenTypes::REF_CHECK: +- { +- return false; +- } +- default: +- { +- // expr +- if( !_t->ConstantNode()) +- return false; +- +- _t = _t->getNextSibling(); +- break; +- } +- } // switch +- } // while +- +- return true; +-} +- +- +- +- +- +-ProgNodeP ProgNode::NewProgNode( const RefDNode& refNode) +-{ +- // this can happen in case of a subroutine with only common blocks +- if( refNode == RefDNode(antlr::nullAST)) return NULL; +- +- bool nonCopy = false; +- if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) +- { +- if( NonCopyNode( refNode->GetFirstChild()->getType())) +- nonCopy = true; +- if( refNode->GetFirstChild()->GetNextSibling() != +- RefDNode(antlr::nullAST)) +- if( NonCopyNode( refNode->GetFirstChild()->GetNextSibling()->getType())) +- nonCopy = true; +- } +- +- // note: constant expressions are always nonCopy +- // but expressions of constant expressions are not +- if( nonCopy) // VAR, VARPTR,... +- { +- UnaryExpr* newUnary = NULL; +- BinaryExpr* newNode = NULL; +- switch( refNode->getType()) +- { +- case GDLTokenTypes::QUESTION: +- { +- return new QUESTIONNode( refNode); +- } +- +- // unary +- case GDLTokenTypes::UMINUS: +- { +- // // optimize constant unary minus away +- // // CONSTANT is a non-copy node +- // if( refNode->GetFirstChild()->getType() == GDLTokenTypes::CONSTANT) +- // { +- // const RefDNode& child = refNode->GetFirstChild(); +- // child->ResetCData( child->CData()->UMinus()); +- // return NewProgNode( child); +- // } +- // else +- newUnary = new UMINUSNode( refNode); +- break; +- } +- case GDLTokenTypes::LOG_NEG: +- { +- newUnary = new LOG_NEGNode( refNode); +- break; +- } +- case GDLTokenTypes::NOT_OP: +- { +- newUnary = new NOT_OPNode( refNode); +- break; +- } +- +- // binary +- case GDLTokenTypes::AND_OP: +- { +- newNode = new AND_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::OR_OP: +- { +- newNode = new OR_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::XOR_OP: +- { +- newNode = new XOR_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::LOG_AND: +- { +- newNode = new LOG_ANDNCNode( refNode); +- break; +- } +- case GDLTokenTypes::LOG_OR: +- { +- newNode = new LOG_ORNCNode( refNode); +- break; +- } +- case GDLTokenTypes::EQ_OP: +- { +- newNode = new EQ_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::NE_OP: +- { +- newNode = new NE_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::LE_OP: +- { +- newNode = new LE_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::LT_OP: +- { +- newNode = new LT_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::GE_OP: +- { +- newNode = new GE_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::GT_OP: +- { +- newNode = new GT_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::PLUS: +- { +- newNode = new PLUSNCNode( refNode); +- break; +- } +- case GDLTokenTypes::MINUS: +- { +- newNode = new MINUSNCNode( refNode); +- break; +- } +- case GDLTokenTypes::LTMARK: +- { +- newNode = new LTMARKNCNode( refNode); +- break; +- } +- case GDLTokenTypes::GTMARK: +- { +- newNode = new GTMARKNCNode( refNode); +- break; +- } +- case GDLTokenTypes::ASTERIX: +- { +- newNode = new ASTERIXNCNode( refNode); +- break; +- } +- case GDLTokenTypes::MATRIX_OP1: +- { +- newNode = new MATRIX_OP1NCNode( refNode); +- break; +- } +- case GDLTokenTypes::MATRIX_OP2: +- { +- newNode = new MATRIX_OP2NCNode( refNode); +- break; +- } +- case GDLTokenTypes::SLASH: +- { +- newNode = new SLASHNCNode( refNode); +- break; +- } +- case GDLTokenTypes::MOD_OP: +- { +- newNode = new MOD_OPNCNode( refNode); +- break; +- } +- case GDLTokenTypes::POW: +- { +- newNode = new POWNCNode( refNode); +- break; +- } +- // case GDLTokenTypes::DEC: +- // { +- // return new DECNCNode( refNode); +- // } +- // case GDLTokenTypes::INC: +- // { +- // return new INCNCNode( refNode); +- // } +- // case GDLTokenTypes::POSTDEC: +- // { +- // return new POSTDECNCNode( refNode); +- // } +- // case GDLTokenTypes::POSTINC: +- // { +- // return new POSTINCNCNode( refNode); +- // } +- // default: +- // return new DefaultNode( refNode); +- } +- +- if( newNode != NULL) +- { +- if( !newNode->ConstantExpr()) return newNode; +- +- auto_ptr guard( newNode); +- +- BaseGDL* cData = newNode->Eval(); +- +- ProgNodeP cN = new CONSTANTNode( newNode->StealNextSibling(), cData); +- cN->lineNumber = refNode->getLine(); +- cN->setText( "C" + refNode->getText()); +- +- return cN; +- } +- else if( newUnary != NULL) +- { +- if( !newUnary->ConstantExpr()) return newUnary; +- +- auto_ptr guard( newUnary); +- +- BaseGDL* cData = newUnary->Eval(); +- +- ProgNodeP cN = new CONSTANTNode( newUnary->StealNextSibling(), cData); +- cN->lineNumber = refNode->getLine(); +- cN->setText( "C" + refNode->getText()); +- +- return cN; +- } +- } +- else // !nonCopy +- { +- UnaryExpr* newUnary = NULL; +- BinaryExpr* newNode = NULL; +- switch( refNode->getType()) +- { +- case GDLTokenTypes::QUESTION: +- { +- return new QUESTIONNode( refNode); +- } +- +- // unary +- case GDLTokenTypes::UMINUS: +- { +- newUnary = new UMINUSNode( refNode); +- break; +- } +- case GDLTokenTypes::LOG_NEG: +- { +- newUnary = new LOG_NEGNode( refNode); +- break; +- } +- case GDLTokenTypes::NOT_OP: +- { +- newUnary = new NOT_OPNode( refNode); +- break; +- } +- +- // binary +- case GDLTokenTypes::AND_OP: +- { +- newNode = new AND_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::OR_OP: +- { +- newNode = new OR_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::XOR_OP: +- { +- newNode = new XOR_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::LOG_AND: +- { +- newNode = new LOG_ANDNode( refNode); +- break; +- } +- case GDLTokenTypes::LOG_OR: +- { +- newNode = new LOG_ORNode( refNode); +- break; +- } +- case GDLTokenTypes::EQ_OP: +- { +- newNode = new EQ_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::NE_OP: +- { +- newNode = new NE_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::LE_OP: +- { +- newNode = new LE_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::LT_OP: +- { +- newNode = new LT_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::GE_OP: +- { +- newNode = new GE_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::GT_OP: +- { +- newNode = new GT_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::PLUS: +- { +- newNode = new PLUSNode( refNode); +- break; +- } +- case GDLTokenTypes::MINUS: +- { +- newNode = new MINUSNode( refNode); +- break; +- } +- case GDLTokenTypes::LTMARK: +- { +- newNode = new LTMARKNode( refNode); +- break; +- } +- case GDLTokenTypes::GTMARK: +- { +- newNode = new GTMARKNode( refNode); +- break; +- } +- case GDLTokenTypes::ASTERIX: +- { +- newNode = new ASTERIXNode( refNode); +- break; +- } +- case GDLTokenTypes::MATRIX_OP1: +- { +- newNode = new MATRIX_OP1Node( refNode); +- break; +- } +- case GDLTokenTypes::MATRIX_OP2: +- { +- newNode = new MATRIX_OP2Node( refNode); +- break; +- } +- case GDLTokenTypes::SLASH: +- { +- newNode = new SLASHNode( refNode); +- break; +- } +- case GDLTokenTypes::MOD_OP: +- { +- newNode = new MOD_OPNode( refNode); +- break; +- } +- case GDLTokenTypes::POW: +- { +- newNode = new POWNode( refNode); +- break; +- } +- // case GDLTokenTypes::DEC: +- // { +- // return new DECNode( refNode); +- // } +- // case GDLTokenTypes::INC: +- // { +- // return new INCNode( refNode); +- // } +- // case GDLTokenTypes::POSTDEC: +- // { +- // return new POSTDECNode( refNode); +- // } +- // case GDLTokenTypes::POSTINC: +- // { +- // return new POSTINCNode( refNode); +- // } +- // default: +- } +- if( newNode != NULL) +- { +- if( !newNode->ConstantExpr()) return newNode; +- +- auto_ptr guard( newNode); +- +- BaseGDL* cData = newNode->Eval(); +- +- ProgNodeP cN = new CONSTANTNode( newNode->StealNextSibling(), cData); +- cN->lineNumber = refNode->getLine(); +- cN->setText( "C" + refNode->getText()); +- +- return cN; +- } +- else if( newUnary != NULL) +- { +- if( !newUnary->ConstantExpr()) return newUnary; +- +- auto_ptr guard( newUnary); +- +- BaseGDL* cData = newUnary->Eval(); +- +- ProgNodeP cN = new CONSTANTNode( newUnary->StealNextSibling(), cData); +- cN->lineNumber = refNode->getLine(); +- cN->setText( "C" + refNode->getText()); +- +- return cN; +- } +- } +- +- // independed of nonCopy: +- switch( refNode->getType()) +- { +- case GDLTokenTypes::FCALL_LIB_RETNEW: +- { +- ProgNodeP c = new DefaultNode( refNode); +- +- if( !static_cast(c->libFun)->RetConstant() +- || !ConstantPar( c->getFirstChild())) return c; +- +- auto_ptr< ProgNode> guard( c); +- +- BaseGDL* cData = c->Eval(); +- +- ProgNodeP cN = new CONSTANTNode( c->StealNextSibling(), cData); +- cN->lineNumber = refNode->getLine(); +- cN->setText( "C()"); +- +- return cN; +- } +- case GDLTokenTypes::VAR: +- { +- return new VARNode( refNode); +- } +- case GDLTokenTypes::VARPTR: +- { +- return new VARPTRNode( refNode); +- } +- case GDLTokenTypes::SYSVAR: +- { +- return new SYSVARNode( refNode); +- } +- case GDLTokenTypes::DEREF: +- { +- return new DEREFNode( refNode); +- } +- case GDLTokenTypes::CONSTANT: +- { +- return new CONSTANTNode( refNode); +- } +- case GDLTokenTypes::ARRAYDEF: +- { +- ARRAYDEFNode* c = new ARRAYDEFNode( refNode); +- if( !c->ConstantArray()) return c; +- +- auto_ptr< ARRAYDEFNode> guard( c); +- +- BaseGDL* cData = c->Eval(); +- +- ProgNodeP cN = new CONSTANTNode( c->StealNextSibling(), cData); +- cN->lineNumber = refNode->getLine(); +- cN->setText( "[c]"); +- +- return cN; +- +- } +- case GDLTokenTypes::ARRAYDEF_CONST: +- { +- +- ProgNodeP c = new ARRAYDEFNode( refNode); +- auto_ptr< ProgNode> guard( c); +- +- BaseGDL* cData = c->Eval(); +- +- ProgNodeP cN = new CONSTANTNode( c->StealNextSibling(), cData); +- cN->lineNumber = refNode->getLine(); +- cN->setText( "[C]"); +- +- return cN; +- +-// DNode* cN = new DNode(); +-// cN->setType(GDLTokenTypes::CONSTANT); +-// cN->setText("[CONSTANT]"); +-// cN->setNextSibling( refNode->getNextSibling()); +- +-// refNode->setNextSibling(antlr::nullAST); +- +-// ProgNodeP c = new ARRAYDEFNode( refNode); +-// auto_ptr< ProgNode> guard( c); +-// //c->setType( GDLTokenTypes::ARRAYDEF); +- +-// // evaluate constant +-// BaseGDL* res = c->Eval(); +- +-// cN->ResetCData( res); +- +-// return new CONSTANTNode( RefDNode( cN)); +- } +- case GDLTokenTypes::STRUC: +- { +- return new STRUCNode( refNode); +- } +- case GDLTokenTypes::NSTRUC: +- { +- return new NSTRUCNode( refNode); +- } +- case GDLTokenTypes::NSTRUC_REF: +- { +- return new NSTRUC_REFNode( refNode); +- } +- case GDLTokenTypes::ASSIGN: +- { +- return new ASSIGNNode( refNode); +- } +- case GDLTokenTypes::ASSIGN_REPLACE: +- { +- return new ASSIGN_REPLACENode( refNode); +- } +- case GDLTokenTypes::PCALL_LIB: +- { +- return new PCALL_LIBNode( refNode); +- } +- case GDLTokenTypes::MPCALL: +- { +- return new MPCALLNode( refNode); +- } +- case GDLTokenTypes::MPCALL_PARENT: +- { +- return new MPCALL_PARENTNode( refNode); +- } +- case GDLTokenTypes::PCALL: +- { +- return new PCALLNode( refNode); +- } +- case GDLTokenTypes::DEC: +- { +- return new DECNode( refNode); +- } +- case GDLTokenTypes::INC: +- { +- return new INCNode( refNode); +- } +- // the following must change their type if precalculation strikes +- case GDLTokenTypes::KEYDEF_REF: +- { +- ProgNodeP nn = new KEYDEF_REFNode( refNode); +- +- if( !nn->getFirstChild()->getNextSibling()->ConstantNode()) +- return nn; +- +-// nn->setType( GDLTokenTypes::KEYDEF); +- delete nn; +- nn = new KEYDEFNode( refNode); +- return nn; +- } +- case GDLTokenTypes::KEYDEF_REF_EXPR: +- { +- ProgNodeP nn = new KEYDEF_REF_EXPRNode( refNode); +- +- if( !nn->getFirstChild()->getNextSibling()->ConstantNode()) +- return nn; + +- delete nn; +- nn = new KEYDEFNode( refNode); +-// nn->setType( GDLTokenTypes::KEYDEF); +- return nn; +- } +- case GDLTokenTypes::PARAEXPR: +- { +- ProgNodeP firstChild = +- new ParameterNode( refNode); +- return firstChild; +- } +- case GDLTokenTypes::KEYDEF: +- { +- ProgNodeP nn = new KEYDEFNode( refNode); +- return nn; +- } +- case GDLTokenTypes::REF: +- { +- ProgNodeP nn = new REFNode( refNode); +- +- if( !nn->getFirstChild()->ConstantNode()) +- return nn; +- +- delete nn; +- +- ProgNodeP firstChild = +- new ParameterNode( refNode);//->GetFirstChild()); +- return firstChild; +- } +- case GDLTokenTypes::REF_EXPR: +- { +- ProgNodeP nn = new REF_EXPRNode( refNode); +- +- if( !nn->getFirstChild()->ConstantNode()) +- return nn; +- +- delete nn; +- ProgNodeP firstChild = +- new ParameterNode( refNode);//->GetFirstChild()); +- return firstChild; +- +-// auto_ptr guard(nn); +-// return nn->StealFirstChild(); +- } +- case GDLTokenTypes::KEYDEF_REF_CHECK: +- { +- ProgNodeP nn = new KEYDEF_REF_CHECKNode( refNode); +- +- if( nn->getFirstChild()->getNextSibling()->getType() != +- GDLTokenTypes::CONSTANT) return nn; +- +- delete nn; +- nn = new KEYDEFNode( refNode); +- return nn; +- } +- case GDLTokenTypes::REF_CHECK: +- { +- ProgNodeP nn = new REF_CHECKNode( refNode); +- +- if( !nn->getFirstChild()->ConstantNode()) +- return nn; +- +- delete nn; +- ProgNodeP firstChild = +- new ParameterNode( refNode); +- return firstChild; +- +-// auto_ptr guard(nn); +-// ProgNodeP firstChild = nn->StealFirstChild(); +-// firstChild->SetNextSibling( nn->StealNextSibling()); +-// return firstChild; +- } +- } +- +- // default +- return new DefaultNode( refNode); +-} + + // converts inferior type to superior type + void ProgNode::AdjustTypes(auto_ptr& a, auto_ptr& b) +@@ -925,7 +197,7 @@ + BaseGDL* res=static_cast(callStack.back())->GetKW(this->varIx); + if( res == NULL) + throw GDLException( this, "Variable is undefined: "+ +- callStack.back()->GetString(this->varIx)); ++ callStack.back()->GetString(this->varIx),true,false); + return res; + } + +@@ -936,7 +208,7 @@ + { + EnvStackT& callStack=interpreter->CallStack(); + throw GDLException( this, "Variable is undefined: "+ +- callStack.back()->GetString( res)); ++ callStack.back()->GetString( res),true,false); + } + return res; + } +@@ -952,43 +224,69 @@ + { + this->var=FindInVarList(sysVarList,this->getText()); + if( this->var == NULL) +- throw GDLException( this, "Not a legal system variable: !"+ +- this->getText()); ++ throw GDLException( this, "Not a legal system variable: !"+ ++ this->getText(),true,false); + } + // system variables are always defined + return this->var->Data(); + } + ++ ++ ++ + BaseGDL* DEREFNode::EvalNC() + { +- BaseGDL* e1 = this->getFirstChild()->Eval(); +- auto_ptr e1_guard(e1); +- +- DPtrGDL* ptr=dynamic_cast(e1); +- if( ptr == NULL) ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ ProgNodeP evalExpr = this->getFirstChild(); ++ if( NonCopyNode( evalExpr->getType())) ++ { ++ e1 = evalExpr->EvalNC(); ++ } ++ else ++ { ++ e1 = evalExpr->Eval(); ++ e1_guard.reset(e1); ++ } ++ ++ if( e1 == NULL || e1->Type() != PTR) + throw GDLException( this, "Pointer type required" +- " in this context: "+interpreter->Name(e1)); +- DPtr sc; ++ " in this context: "+interpreter->Name(e1),true,false); ++ DPtrGDL* ptr=static_cast(e1); ++ DPtr sc; + if( !ptr->Scalar(sc)) + throw GDLException( this, "Expression must be a " +- "scalar in this context: "+interpreter->Name(e1)); ++ "scalar in this context: "+interpreter->Name(e1),true,false); + if( sc == 0) + throw GDLException( this, "Unable to dereference" +- " NULL pointer: "+interpreter->Name(e1)); ++ " NULL pointer: "+interpreter->Name(e1),true,false); + + try{ + return interpreter->GetHeap(sc); + } + catch( GDLInterpreter::HeapException) + { +- throw GDLException( this, "Invalid pointer: "+interpreter->Name(e1)); ++ throw GDLException( this, "Invalid pointer: "+interpreter->Name(e1),true,false); + } + } + ++ ++ + // trinary operator + BaseGDL* QUESTIONNode::Eval() + { +- auto_ptr e1( op1->Eval()); ++ auto_ptr e1_guard; ++ BaseGDL* e1; ++ if( NonCopyNode( op1->getType())) ++ { ++ e1 = op1->EvalNC(); ++ } ++ else ++ { ++ e1 = op1->Eval(); ++ e1_guard.reset(e1); ++ } ++// auto_ptr e1( op1->Eval()); + if( e1->True()) + { + return op2->Eval(); // right->down +@@ -2511,3 +1809,501 @@ + // { BaseGDL* res; + // return new POSTINCNode( refNode); + // } ++ ++ BaseGDL** FCALL_LIB_RETNEWNode::LEval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++ throw GDLException(this,"Internal error: FCALL_LIB_RETNEW as left expr."); ++ } ++ ++ BaseGDL* FCALL_LIB_RETNEWNode::Eval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++ ++// match(antlr::RefAST(_t),FCALL_LIB_RETNEW); ++// _t = _t->getFirstChild(); ++// match(antlr::RefAST(_t),IDENTIFIER); ++ EnvT* newEnv=new EnvT( this, this->libFun);//libFunList[fl->funIx]); ++// _t =_t->getFirstChild(); ++// EnvT* newEnv=new EnvT( fl, fl->libFun);//libFunList[fl->funIx]); ++ static int n_elementsIx = LibFunIx("N_ELEMENTS"); ++ static DLibFun* n_elementsFun = libFunList[n_elementsIx]; ++ ++ if( this->libFun == n_elementsFun) ++ { ++ ProgNode::interpreter->parameter_def_n_elements(this->getFirstChild(), newEnv); ++ } ++ else ++ { ++ ProgNode::interpreter->parameter_def(this->getFirstChild(), newEnv); ++ } ++ ++// parameter_def(_t->getFirstChild(), newEnv); ++ // push id.pro onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ // make the call ++ BaseGDL* ++ res=static_cast(newEnv->GetPro())->Fun()(newEnv); ++ //*** MUST always return a defined expression ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL** FCALL_LIBNode::LEval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++// match(antlr::RefAST(_t),FCALL_LIB); ++ EnvT* newEnv=new EnvT( this, this->libFun);//libFunList[fl->funIx]); ++ ++ ProgNode::interpreter->parameter_def(this->getFirstChild(), newEnv); ++ ++ EnvT* callerEnv = static_cast(ProgNode::interpreter->CallStack().back()); ++ ++ // push id.pro onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ // make the call ++ BaseGDL* libRes = static_cast(newEnv->GetPro())->Fun()(newEnv); ++ ++ BaseGDL** res = callerEnv->GetPtrTo( libRes); ++ if( res == NULL) ++ throw GDLException( this, "Library function must return a " ++ "l-value in this context: "+this->getText()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL* FCALL_LIBNode::Eval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++// match(antlr::RefAST(_t),FCALL_LIB); ++ EnvT* newEnv=new EnvT( this, this->libFun);//libFunList[fl->funIx]); ++ ++ ProgNode::interpreter->parameter_def(this->getFirstChild(), newEnv); ++ ++ assert( dynamic_cast(ProgNode::interpreter->CallStack().back()) != NULL); ++ EnvUDT* callStackBack = static_cast(ProgNode::interpreter->CallStack().back()); ++ ++ // push id.pro onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ // make the call ++ BaseGDL* res=static_cast(newEnv->GetPro())->Fun()(newEnv); ++ // *** MUST always return a defined expression ++// if( res == NULL) ++// throw GDLException( _t, ""); ++ ++ if( callStackBack->Contains( res)) ++ res = res->Dup(); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL** MFCALLNode::LEval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++ ++// match(antlr::RefAST(_t),MFCALL); ++ ProgNodeP _t = this->getFirstChild(); ++ BaseGDL* self=ProgNode::interpreter->expr(_t); ++ auto_ptr self_guard(self); ++ ++ ProgNodeP mp = _t->getNextSibling(); ++// match(antlr::RefAST(_t),IDENTIFIER); ++ _t = mp->getNextSibling(); ++ ++ EnvUDT* newEnv=new EnvUDT( self, mp, "", true); ++ ++ self_guard.release(); ++ ++ ProgNode::interpreter->parameter_def(_t, newEnv); ++ ++ // push environment onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ ++ // make the call ++ BaseGDL** res=ProgNode::interpreter-> ++ call_lfun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL* MFCALLNode::Eval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++ ++ ProgNodeP _t = this->getFirstChild(); ++ ++ BaseGDL* self=ProgNode::interpreter->expr(_t); ++ auto_ptr self_guard(self); ++ ++ _t = _t->getNextSibling(); ++ //match(antlr::RefAST(_t),IDENTIFIER); ++ ++ EnvUDT* newEnv=new EnvUDT( self, _t); ++ ++ self_guard.release(); ++ ++ _t = _t->getNextSibling(); ++ ++ ProgNode::interpreter->parameter_def(_t, newEnv); ++ ++ // push environment onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ ++ // make the call ++ BaseGDL* res=ProgNode::interpreter->call_fun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL** MFCALL_PARENTNode::LEval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++// match(antlr::RefAST(_t),MFCALL_PARENT); ++ ProgNodeP _t = this->getFirstChild(); ++ BaseGDL* self=ProgNode::interpreter->expr(_t); ++ auto_ptr self_guard(self); ++ ++ _t = _t->getNextSibling(); ++ ProgNodeP parent = _t; ++// match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ProgNodeP p = _t; ++// match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ++ EnvUDT* newEnv=new EnvUDT( self, p, parent->getText(), true); ++ ++ self_guard.release(); ++ ++ ProgNode::interpreter->parameter_def(_t, newEnv); ++ ++ // push environment onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ ++ // make the call ++ BaseGDL** res=ProgNode::interpreter-> ++ call_lfun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL* MFCALL_PARENTNode::Eval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++// match(antlr::RefAST(_t),MFCALL_PARENT); ++ ProgNodeP _t = this->getFirstChild(); ++ BaseGDL* self=ProgNode::interpreter->expr(_t); ++ auto_ptr self_guard(self); ++ ++ _t = _t->getNextSibling(); ++ ProgNodeP parent = _t; ++// match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ProgNodeP p = _t; ++// match(antlr::RefAST(_t),IDENTIFIER); ++ _t = _t->getNextSibling(); ++ ++ EnvUDT* newEnv=new EnvUDT( self, p, parent->getText()); ++ ++ self_guard.release(); ++ ++ ProgNode::interpreter->parameter_def(_t, newEnv); ++ ++ // push environment onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ ++ // make the call ++ BaseGDL* res=ProgNode::interpreter->call_fun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL** FCALLNode::LEval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++ // match(antlr::RefAST(_t),FCALL); ++ ProgNodeP _t = this->getFirstChild(); ++ ++ ProgNode::interpreter->SetFunIx( this); ++ ++ EnvUDT* newEnv=new EnvUDT( this, funList[this->funIx], true); ++ ++ ProgNode::interpreter->parameter_def(_t, newEnv); ++ ++ // push environment onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ ++ // make the call ++ BaseGDL** res= ++ ProgNode::interpreter->call_lfun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL* FCALLNode::Eval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++ ProgNode::interpreter->SetFunIx( this); ++ ++ EnvUDT* newEnv=new EnvUDT( this, funList[this->funIx]); ++ ++ ProgNode::interpreter->parameter_def(this->getFirstChild(), newEnv); ++ ++ // push environment onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ ++ // make the call ++ BaseGDL* ++ res=ProgNode::interpreter->call_fun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL* ARRAYEXPR_MFCALLNode::Eval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++// match(antlr::RefAST(_t),ARRAYEXPR_MFCALL); ++ ProgNodeP mark = this->getFirstChild(); ++ ++ ProgNodeP _t = mark->getNextSibling(); // skip DOT ++ ++ BaseGDL* self=ProgNode::interpreter->expr(_t); ++ auto_ptr self_guard(self); ++ ++ ProgNodeP mp2 = _t->getNextSibling(); ++ //match(antlr::RefAST(_t),IDENTIFIER); ++ ++ _t = mp2->getNextSibling(); ++ ++ BaseGDL* res; ++ ++ EnvUDT* newEnv; ++ try { ++ newEnv=new EnvUDT( self, mp2); ++ self_guard.release(); ++ } ++ catch( GDLException& ex) ++ { ++ goto tryARRAYEXPR; ++ } ++ ++ ProgNode::interpreter->parameter_def(_t, newEnv); ++ ++ // push environment onto call stack ++ ProgNode::interpreter->CallStack().push_back(newEnv); ++ ++ // make the call ++ res= ++ ProgNode::interpreter-> ++ call_fun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ ++ tryARRAYEXPR:; ++ //_t = mark; ++ ++ ProgNodeP dot = mark; ++ // match(antlr::RefAST(_t),DOT); ++ _t = mark->getFirstChild(); ++ ++ SizeT nDot=dot->nDot; ++ auto_ptr aD( new DotAccessDescT(nDot+1)); ++ ++ ProgNode::interpreter->r_dot_array_expr(_t, aD.get()); ++ _t = _t->getNextSibling(); ++ for (; _t != NULL;) { ++ ProgNode::interpreter->tag_array_expr(_t, aD.get()); ++ _t = _t->getNextSibling(); ++ } ++ res= aD->Resolve(); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++ } ++ ++ BaseGDL** ARRAYEXPR_MFCALLNode::LEval() ++ { ++ // better than auto_ptr: auto_ptr wouldn't remove newEnv from the stack ++ StackGuard guard(ProgNode::interpreter->CallStack()); ++ } ++ ++ BaseGDL** VARNode::LEval() ++ { ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return &ProgNode::interpreter->CallStack().back()->GetKW(this->varIx); ++ } ++ BaseGDL** VARPTRNode::LEval() ++ { ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return &this->var->Data(); ++ } ++ ++ ++ BaseGDL* ARRAYEXPRNode::Eval() ++ { ++ BaseGDL* res; ++ ProgNodeP ax; ++ ++ ArrayIndexListT* aL; ++ BaseGDL* r; ++ ArrayIndexListGuard guard; ++ auto_ptr r_guard; ++ ++ ExprListT exprList; // for cleanup ++ IxExprListT ixExprList; ++ SizeT nExpr; ++ BaseGDL* s; ++ ++ // match(antlr::RefAST(_t),ARRAYEXPR); ++ ProgNodeP _t = this->getFirstChild(); ++ ++ switch ( _t->getType()) { ++ case GDLTokenTypes::VAR: ++ case GDLTokenTypes::CONSTANT: ++ case GDLTokenTypes::DEREF: ++ case GDLTokenTypes::SYSVAR: ++ case GDLTokenTypes::VARPTR: ++ { ++ r=_t->EvalNC(); ++ //r=indexable_expr(_t); ++ break; ++ } ++ case GDLTokenTypes::FCALL_LIB: ++ { ++ // better than Eval(): no copying here if not necessary ++ r=ProgNode::interpreter->lib_function_call(_t); ++ ++ if( !ProgNode::interpreter->CallStack().back()->Contains( r)) ++ r_guard.reset( r); // guard if no global data ++ ++ break; ++ } ++ // case ASSIGN: ++ // case ASSIGN_REPLACE: ++ // case ASSIGN_ARRAYEXPR_MFCALL: ++ // case ARRAYDEF: ++ // case ARRAYEXPR: ++ // case ARRAYEXPR_MFCALL: ++ // case EXPR: ++ // case FCALL: ++ // case FCALL_LIB_RETNEW: ++ // case MFCALL: ++ // case MFCALL_PARENT: ++ // case NSTRUC: ++ // case NSTRUC_REF: ++ // case POSTDEC: ++ // case POSTINC: ++ // case STRUC: ++ // case DEC: ++ // case INC: ++ // case DOT: ++ // case QUESTION: ++ default: ++ { ++ r=ProgNode::interpreter->indexable_tmp_expr(_t); ++ r_guard.reset( r); ++ break; ++ } ++ } // switch ++ ++ _t = _t->getNextSibling(); ++ ++ aL = _t->arrIxList; ++ assert( aL != NULL); ++ guard.reset(aL); ++ ++ // ax = _t ++ // match(antlr::RefAST(_t),ARRAYIX); ++ _t = _t->getFirstChild(); ++ ++ nExpr = aL->NParam(); ++ ++ if( nExpr == 0) ++ { ++ goto empty; ++ } ++ ++ for (;;) ++ { ++ switch ( _t->getType()) { ++ case GDLTokenTypes::VAR: ++ case GDLTokenTypes::CONSTANT: ++ case GDLTokenTypes::DEREF: ++ case GDLTokenTypes::SYSVAR: ++ case GDLTokenTypes::VARPTR: ++ { ++ s=_t->EvalNC();//indexable_expr(_t); ++ _t = _t->getNextSibling();//_retTree; ++ break; ++ } ++ case GDLTokenTypes::FCALL_LIB: ++ { ++ s=ProgNode::interpreter->lib_function_call(_t); ++ _t = _t->getNextSibling(); ++ ++ if( !ProgNode::interpreter->CallStack().back()->Contains( s)) ++ exprList.push_back( s); ++ ++ break; ++ } ++ // case ASSIGN: ++ // case ASSIGN_REPLACE: ++ // case ASSIGN_ARRAYEXPR_MFCALL: ++ // case ARRAYDEF: ++ // case ARRAYEXPR: ++ // case ARRAYEXPR_MFCALL: ++ // case EXPR: ++ // case FCALL: ++ // case FCALL_LIB_RETNEW: ++ // case MFCALL: ++ // case MFCALL_PARENT: ++ // case NSTRUC: ++ // case NSTRUC_REF: ++ // case POSTDEC: ++ // case POSTINC: ++ // case STRUC: ++ // case DEC: ++ // case INC: ++ // case DOT: ++ // case QUESTION: ++ default: ++ { ++ s=ProgNode::interpreter->indexable_tmp_expr(_t); ++ _t = _t->getNextSibling(); ++ exprList.push_back( s); ++ break; ++ } ++ } // switch ++ ++ ixExprList.push_back( s); ++ if( ixExprList.size() == nExpr) ++ break; // for -> finish ++ } // for ++ ++ empty: ++ res = aL->Index( r, ixExprList); ++ ++ ProgNode::interpreter->SetRetTree( this->getNextSibling()); ++ return res; ++} +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/prognodeexpr.hpp cvs/gdl/src/prognodeexpr.hpp +--- gdl-0.9rc4/src/prognodeexpr.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/prognodeexpr.hpp 2010-05-21 10:23:58.667906577 -0600 +@@ -92,11 +92,80 @@ + + + ++ ++ ++class FCALL_LIB_RETNEWNode: public LeafNode ++{ ++public: ++ FCALL_LIB_RETNEWNode( const RefDNode& refNode): LeafNode( refNode) ++ {} ++ BaseGDL** LEval(); ++ BaseGDL* Eval(); ++}; ++ ++ ++ ++class FCALL_LIBNode: public LeafNode ++{ ++public: ++ FCALL_LIBNode( const RefDNode& refNode): LeafNode( refNode) ++ {} ++ BaseGDL** LEval(); ++ BaseGDL* Eval(); ++}; ++ ++ ++ ++class MFCALLNode: public LeafNode ++{ ++public: ++ MFCALLNode( const RefDNode& refNode): LeafNode( refNode) ++ {} ++ BaseGDL** LEval(); ++ BaseGDL* Eval(); ++}; ++ ++ ++ ++class MFCALL_PARENTNode: public LeafNode ++{ ++public: ++ MFCALL_PARENTNode( const RefDNode& refNode): LeafNode( refNode) ++ {} ++ BaseGDL** LEval(); ++ BaseGDL* Eval(); ++}; ++ ++ ++ ++class FCALLNode: public LeafNode ++{ ++public: ++ FCALLNode( const RefDNode& refNode): LeafNode( refNode) ++ {} ++ BaseGDL** LEval(); ++ BaseGDL* Eval(); ++}; ++ ++ ++ ++class ARRAYEXPR_MFCALLNode: public LeafNode ++{ ++public: ++ ARRAYEXPR_MFCALLNode( const RefDNode& refNode): LeafNode( refNode) ++ {} ++ BaseGDL** LEval(); ++ BaseGDL* Eval(); ++}; ++ ++ ++ + class VARNode: public LeafNode + { + public: + VARNode( const RefDNode& refNode): LeafNode( refNode) + {} ++ BaseGDL** LEval(); + BaseGDL* EvalNC(); + }; + class VARPTRNode: public LeafNode +@@ -104,6 +173,7 @@ + public: + VARPTRNode( const RefDNode& refNode): LeafNode( refNode) + {} ++ BaseGDL** LEval(); + BaseGDL* EvalNC(); + }; + class SYSVARNode: public LeafNode +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/prognode.hpp cvs/gdl/src/prognode.hpp +--- gdl-0.9rc4/src/prognode.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/prognode.hpp 2010-05-21 10:23:58.601905794 -0600 +@@ -33,6 +33,22 @@ + class ProgNode; + typedef ProgNode* ProgNodeP; + ++inline bool NonCopyNode( int type) ++{ ++ return (type == GDLTokenTypes::DEREF) || ++ (type == GDLTokenTypes::VAR) || ++ (type == GDLTokenTypes::VARPTR) || ++ (type == GDLTokenTypes::CONSTANT) || ++ (type == GDLTokenTypes::SYSVAR) ; ++// are always copy nodes: ++// (type == GDLTokenTypes::ARRAYDEF) ++// (type == GDLTokenTypes::STRUC) ++// (type == GDLTokenTypes::NSTRUC) ++// (type == GDLTokenTypes::NSTRUC_REF) ++} ++ ++class BreakableNode; ++ + // the nodes the programs are made of + class ProgNode + { +@@ -44,6 +60,11 @@ + std::string text; + + protected: ++ bool keepRight; ++ bool keepDown; ++ ++ ProgNodeP breakTarget; ++ + ProgNodeP down; + ProgNodeP right; + +@@ -67,8 +88,13 @@ + int targetIx; // Index into label list + int structDefined; // struct contains entry with no tag name + int compileOpt; // for PRO and FUNCTION nodes ++ int forLoopIx; // acessing loop variables + }; + ++ void SetType( int tt, const std::string& txt) { ttype = tt; text = txt;} ++ ++ static ProgNodeP GetNULLProgNodeP(); ++ + private: + // from DNode (see there) + int lineNumber; +@@ -76,20 +102,46 @@ + int labelStart; // for loops to determine if to bail out + int labelEnd; // for loops to determine if to bail out + ++ // disable usage ++ ProgNode( const ProgNode& p) {} ++ + public: + ProgNode(); + + ProgNode( const RefDNode& refNode); + ++ // tree translation takes place here ++ // see newprognode.cpp + static ProgNodeP NewProgNode( const RefDNode& refNode); ++ static int NumberForLoops( ProgNodeP tree, int offset = 0) ++ { ++ return tree->NumberForLoops( offset); ++ } + ++ virtual int NumberForLoops( int actNum) ++ { ++ if( down != NULL && !keepDown) ++ { ++ actNum = down->NumberForLoops( actNum); ++ } ++ ++ if( right != NULL && !keepRight) ++ { ++ actNum = right->NumberForLoops( actNum); ++ } ++ return actNum; ++ } ++ + virtual ~ProgNode(); + +- void SetNodes( const ProgNodeP right, const ProgNodeP down); ++ void SetRightDown( const ProgNodeP right, const ProgNodeP down); ++ ++ virtual BaseGDL** LEval(); ++ virtual BaseGDL* Eval(); // caller receives ownership ++ virtual BaseGDL* EvalNC(); // non-copy used by all operators (and in other places) ++ virtual RetCode Run(); + +- virtual BaseGDL* Eval(); +- virtual BaseGDL* EvalNC(); // non-copy +- virtual void Run(); ++// RetCode (*RunP)(); + + bool ConstantNode(); + +@@ -99,7 +151,7 @@ + } + ProgNodeP GetFirstChild() const + { +- return getFirstChild(); ++ return down;//getFirstChild(); + } + void SetFirstChild( ProgNodeP d) + { +@@ -109,9 +161,15 @@ + { + return right; + } ++ ProgNodeP GetLastSibling() const ++ { ++ ProgNodeP act = const_cast(this); ++ while(!act->KeepRight() && act->GetNextSibling() != NULL) act = act->GetNextSibling(); ++ return act; ++ } + ProgNodeP GetNextSibling() const + { +- return getNextSibling(); ++ return right;//getNextSibling(); + } + void SetNextSibling( ProgNodeP r) + { +@@ -130,7 +188,52 @@ + down = NULL; + return n; + } ++ ++ bool KeepRight() const { return keepRight;} ++ bool KeepDown() const { return keepDown;} + ++ void KeepDown( ProgNodeP d) ++ { ++ down = d; ++ keepDown = true; ++ } ++ virtual void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ } ++ ++ void SetRight( ProgNodeP r) ++ { ++ right = r; ++// keepRight = false; ++ } ++ ++ virtual void SetAllBreak( ProgNodeP target) ++ { ++ if( down != NULL && !keepDown) ++ { ++ down->SetAllBreak( target); ++ } ++ ++ if( right != NULL && !keepRight) ++ { ++ right->SetAllBreak( target); ++ } ++ } ++ virtual void SetAllContinue( ProgNodeP target) ++ { ++ if( down != NULL && !keepDown) ++ { ++ down->SetAllContinue( target); ++ } ++ ++ if( right != NULL && !keepRight) ++ { ++ right->SetAllContinue( target); ++ } ++ } ++ + int getType() { return ttype;} + void setType( int t) { ttype=t;} + std::string getText() { return text;} +@@ -138,32 +241,39 @@ + int getLine() const { return lineNumber;} + void setLine( int l) { lineNumber = l;} + void SetGotoIx( int ix) { targetIx=ix;} ++ ++ ProgNodeP BreakTarget() const { return breakTarget;} + + bool LabelInRange( const int lIx) +- { return (lIx >= labelStart) && (lIx < labelEnd);} ++ { ++// std::cout << "LabelInRange: " << ((lIx >= labelStart) && (lIx < labelEnd)) << " " << lIx << " [" << labelStart << "," << labelEnd << ")" << std::endl; ++ return (lIx >= labelStart) && (lIx < labelEnd); ++ } + +- friend class GDLInterpreter; +- friend class DInterpreter; +- +-friend class NSTRUCNode; +-friend class ASSIGNNode; +-friend class ASSIGN_REPLACENode; +-friend class PCALL_LIBNode;//: public CommandNode +-friend class MPCALLNode;//: public CommandNode +-friend class MPCALL_PARENTNode;//: public CommandNode +-friend class PCALLNode;//: public CommandNode +- +- friend class KEYDEF_Node; +- friend class KEYDEF_REFNode; +- friend class KEYDEF_REF_CHECKNode; +- friend class KEYDEF_REF_EXPRNode; +- friend class REFNode; +- friend class REF_CHECKNode; +- friend class REF_EXPRNode; +- friend class ParameterNode; ++ friend class GDLInterpreter; ++ friend class DInterpreter; + ++ friend class NSTRUCNode; ++ friend class ASSIGNNode; ++ friend class ASSIGN_REPLACENode; ++ friend class PCALL_LIBNode;//: public CommandNode ++ friend class MPCALLNode;//: public CommandNode ++ friend class MPCALL_PARENTNode;//: public CommandNode ++ friend class PCALLNode;//: public CommandNode ++ friend class ARRAYEXPR_MFCALLNode; ++ friend class KEYDEF_Node; ++ friend class KEYDEF_REFNode; ++ friend class KEYDEF_REF_CHECKNode; ++ friend class KEYDEF_REF_EXPRNode; ++ friend class REFNode; ++ friend class REF_CHECKNode; ++ friend class REF_EXPRNode; ++ friend class ParameterNode; ++ friend class ARRAYEXPRNode; + }; + ++ ++ + class DefaultNode: public ProgNode + { + public: +@@ -173,15 +283,926 @@ + { + if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) + { +- down = NewProgNode( refNode->GetFirstChild()); ++ down = NewProgNode( refNode->GetFirstChild()); + } + if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) + { +- right = NewProgNode( refNode->GetNextSibling()); ++ right = NewProgNode( refNode->GetNextSibling()); + } + } + }; + ++class RETPNode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++public: ++ RETPNode(): DefaultNode() {} ++ ++ RETPNode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++class RETFNode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++public: ++ RETFNode(): DefaultNode() {} ++ ++ RETFNode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++class GOTONode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++ void SetAllBreak( ProgNodeP target) ++ { ++// breakTarget = target; ++ ++ if( right != NULL && !keepRight) ++ { ++ right->SetAllBreak( target); ++ } ++ } ++public: ++ GOTONode(): DefaultNode() {} ++ ++ GOTONode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++class CONTINUENode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++ ++ void SetAllContinue( ProgNodeP target) ++ { ++ assert( target != NULL); ++ breakTarget = target; ++ ++ if( right != NULL && !keepRight) ++ { ++ right->SetAllContinue( target); ++ } ++ } ++public: ++ CONTINUENode(): DefaultNode() {} ++ ++ CONTINUENode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++class BREAKNode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++ ++ void SetAllBreak( ProgNodeP target) ++ { ++ breakTarget = target; ++ ++ if( right != NULL && !keepRight) ++ { ++ right->SetAllBreak( target); ++ } ++ } ++public: ++ BREAKNode(): DefaultNode() {} ++ ++ BREAKNode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++class LABELNode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++ ++public: ++ LABELNode(): DefaultNode() {} ++ ++ LABELNode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++class ON_IOERROR_NULLNode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++ ++public: ++ ON_IOERROR_NULLNode(): DefaultNode() {} ++ ++ ON_IOERROR_NULLNode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++class ON_IOERRORNode: public DefaultNode ++{ ++public: ++ RetCode Run(); ++ ++ ++public: ++ ON_IOERRORNode(): DefaultNode() {} ++ ++ ON_IOERRORNode( const RefDNode& refNode): DefaultNode( refNode) ++ {} ++}; ++ ++ ++class BreakableNode: public ProgNode ++{ ++public: ++ void SetAllBreak( ProgNodeP target) ++ { ++ // down: do NOT descent into own loop tree here ++ ++ if( right != NULL && !keepRight) ++ { ++ right->SetAllBreak( target); ++ } ++ } ++ void SetAllContinue( ProgNodeP target) ++ { ++ // down: do NOT descent into own loop tree here ++ ++ if( right != NULL && !keepRight) ++ { ++ right->SetAllContinue( target); ++ } ++ } ++ ++public: ++ BreakableNode(): ProgNode() {} ++ ++ BreakableNode( const RefDNode& refNode): ProgNode( refNode) ++ { ++ if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) ++ { ++ down = NewProgNode( refNode->GetFirstChild()); ++ } ++ if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) ++ { ++ right = NewProgNode( refNode->GetNextSibling()); ++ } ++ } ++}; ++ ++ ++ ++ ++class FOR_LOOPNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ ProgNodeP statementList; ++ ++ ProgNodeP GetStatementList() ++ { ++ return down->GetNextSibling();//->GetNextSibling()->GetNextSibling(); ++ } ++ ++ public: ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ assert( this->GetStatementList() != NULL); ++// if( this->GetStatementList() != NULL) ++ this->GetStatementList()->SetAllBreak( right); ++ } ++ ++ int NumberForLoops( int actNum) ++ { ++ this->forLoopIx = actNum; ++ actNum++; ++ ProgNodeP statementList = this->GetStatementList(); ++ if( statementList != NULL && !down->KeepRight()) ++ { ++ actNum = statementList->NumberForLoops( actNum); ++ } ++ if( right != NULL && !keepRight) ++ { ++ actNum = right->NumberForLoops( actNum); ++ } ++ return actNum; ++ } ++ ++ public: ++ FOR_LOOPNode( ProgNodeP r, ProgNodeP d): BreakableNode() ++ { ++ SetType( GDLTokenTypes::FOR_LOOP, "for_loop"); ++ SetRightDown( r, d); ++ ++ assert( down != NULL); ++ ++ statementList = this->GetStatementList(); ++ if( statementList != NULL) ++ { ++ statementList->SetAllContinue( this); ++ statementList->GetLastSibling()->KeepRight( this); ++ if( right != NULL) statementList->SetAllBreak( right); ++ } ++ else ++ { ++ down->KeepRight( this); ++ statementList = this; ++ } ++ } ++ ++}; ++ ++ ++class FORNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ void KeepRight( ProgNodeP r); ++ ++ int NumberForLoops( int actNum) ++ { ++ this->forLoopIx = actNum; ++ ++// assert( down == NULL); ++ ++ assert( right != NULL && !keepRight); ++ ++ actNum = right->NumberForLoops( actNum); ++ ++ return actNum; ++ } ++ ++ public: ++ FORNode(): BreakableNode() {} ++ ++ FORNode( const RefDNode& refNode): BreakableNode( refNode) ++ { ++ ProgNodeP keep = down->GetNextSibling(); ++ down->SetRight( down->GetNextSibling()->GetNextSibling()->GetNextSibling()); ++ ++ keep->GetNextSibling()->SetRight( NULL); ++ ++ FOR_LOOPNode* forLoop = new FOR_LOOPNode( right, down); ++ forLoop->setLine( getLine()); ++ ++ down = keep; ++ ++ right = forLoop; ++// if( this->GetStatementList() != NULL && right != NULL) ++// this->GetStatementList()->GetLastSibling()->KeepRight( right); ++ } ++}; ++ ++ ++ ++class FOR_STEP_LOOPNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ ProgNodeP GetStatementList() ++ { ++ return down->GetNextSibling();//->GetNextSibling()->GetNextSibling()->GetNextSibling(); ++ } ++ ++ public: ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ if( this->GetStatementList() != NULL) ++ this->GetStatementList()->SetAllBreak( right); ++ } ++ ++ int NumberForLoops( int actNum) ++ { ++ this->forLoopIx = actNum; ++ actNum++; ++ ProgNodeP statementList = this->GetStatementList(); ++ if( statementList != NULL && !down->KeepRight()) ++ { ++ actNum = statementList->NumberForLoops( actNum); ++ } ++ if( right != NULL && !keepRight) ++ { ++ actNum = right->NumberForLoops( actNum); ++ } ++ return actNum; ++ } ++ ++ public: ++ FOR_STEP_LOOPNode( ProgNodeP r, ProgNodeP d): BreakableNode() ++ { ++ SetType( GDLTokenTypes::FOR_STEP_LOOP, "for_step_loop"); ++ SetRightDown( r, d); ++ ++ assert( down != NULL); ++ ++ ProgNodeP statementList = this->GetStatementList(); ++ if( statementList != NULL) ++ { ++ statementList->SetAllContinue( this); ++ statementList->GetLastSibling()->KeepRight( this); ++ if( right != NULL) statementList->SetAllBreak( right); ++ } ++ else ++ { ++ down->KeepRight( this); ++ } ++ } ++ ++}; ++ ++ ++ ++class FOR_STEPNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ void KeepRight( ProgNodeP r); ++ ++ int NumberForLoops( int actNum) ++ { ++ this->forLoopIx = actNum; ++ ++ //assert( down == NULL); ++ ++ assert( right != NULL && !keepRight); ++ ++ actNum = right->NumberForLoops( actNum); ++ ++ return actNum; ++ } ++ ++ public: ++ FOR_STEPNode(): BreakableNode() {} ++ ++ FOR_STEPNode( const RefDNode& refNode): BreakableNode( refNode) ++ { ++ ProgNodeP keep = down->GetNextSibling(); ++ down->SetRight( down->GetNextSibling()->GetNextSibling()->GetNextSibling()->GetNextSibling()); ++ ++ keep->GetNextSibling()->GetNextSibling()->SetRight( NULL); ++ ++ FOR_STEP_LOOPNode* forLoop = new FOR_STEP_LOOPNode( right, down); ++ forLoop->setLine( getLine()); ++ ++ down = keep; ++ ++ right = forLoop; ++ ++// if( this->GetStatementList() != NULL && right != NULL) ++// this->GetStatementList()->GetLastSibling()->KeepRight( right); ++ } ++}; ++ ++class FOREACH_LOOPNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ ProgNodeP GetStatementList() ++ { ++ return down->GetNextSibling(); ++ } ++ ++ public: ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ if( this->GetStatementList() != NULL) ++ this->GetStatementList()->SetAllBreak( right); ++ } ++ ++ int NumberForLoops( int actNum) ++ { ++ this->forLoopIx = actNum; ++ actNum++; ++ ProgNodeP statementList = this->GetStatementList(); ++ if( statementList != NULL && !down->KeepRight()) ++ { ++ actNum = statementList->NumberForLoops( actNum); ++ } ++ if( right != NULL && !keepRight) ++ { ++ actNum = right->NumberForLoops( actNum); ++ } ++ return actNum; ++ } ++ ++ public: ++ FOREACH_LOOPNode( ProgNodeP r, ProgNodeP d): BreakableNode() ++ { ++ SetType( GDLTokenTypes::FOREACH_LOOP, "foreach_loop"); ++ SetRightDown( r, d); ++ ++ assert( down != NULL); ++ ++ ProgNodeP statementList = this->GetStatementList(); ++ if( statementList != NULL) ++ { ++ statementList->SetAllContinue( this); ++ statementList->GetLastSibling()->KeepRight( this); ++ if( right != NULL) statementList->SetAllBreak( right); ++ } ++ else ++ { ++ down->KeepRight( this); ++ } ++ } ++ ++}; ++ ++ ++ ++class FOREACHNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ void KeepRight( ProgNodeP r); ++ ++ int NumberForLoops( int actNum) ++ { ++ this->forLoopIx = actNum; ++ ++// assert( down == NULL); ++ ++ assert( right != NULL && !keepRight); ++ ++ actNum = right->NumberForLoops( actNum); ++ ++ return actNum; ++ } ++ ++ public: ++ FOREACHNode(): BreakableNode() {} ++ ++ FOREACHNode( const RefDNode& refNode): BreakableNode( refNode) ++ { ++ ProgNodeP keep = down->GetNextSibling(); ++ down->SetRight( down->GetNextSibling()->GetNextSibling()); ++ ++ keep->SetRight( NULL); ++ ++ FOREACH_LOOPNode* forLoop = new FOREACH_LOOPNode( right, down); ++ forLoop->setLine( getLine()); ++ ++ down = keep; ++ ++ right = forLoop; ++ } ++}; ++ ++ ++ ++class WHILENode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ ProgNodeP GetStatementList() ++ { ++ return down->GetNextSibling(); ++ } ++ ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ if( this->GetStatementList() != NULL) ++ this->GetStatementList()->SetAllBreak( right); ++ } ++ ++ public: ++ WHILENode(): BreakableNode() {} ++ ++ WHILENode( const RefDNode& refNode): BreakableNode( refNode) ++ { ++ assert( down != NULL); ++ ++// down->GetLastSibling()->KeepRight( this); // for empty body ++ ++ ProgNodeP statementList = this->GetStatementList(); ++ if( statementList != NULL) ++ { ++ statementList->SetAllContinue( this); ++ if( right != NULL) statementList->SetAllBreak( right); ++ statementList->GetLastSibling()->KeepRight( this); // for empty body ++ } ++ } ++}; ++ ++ ++ ++class REPEAT_LOOPNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ ProgNodeP GetStatementList() ++ { ++ return down->GetNextSibling(); ++ } ++ ++ public: ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ if( this->GetStatementList() != NULL) ++ this->GetStatementList()->SetAllBreak( right); ++ } ++ ++ public: ++ REPEAT_LOOPNode( ProgNodeP r, ProgNodeP d): BreakableNode() ++ { ++ SetType( GDLTokenTypes::REPEAT_LOOP, "repeat_loop"); ++ SetRightDown( r, d); ++ ++ assert( down != NULL); ++ ++ ProgNodeP statementList = this->GetStatementList(); ++ if( statementList != NULL) ++ { ++ statementList->SetAllContinue( this); ++ statementList->GetLastSibling()->KeepRight( this); ++ if( right != NULL) statementList->SetAllBreak( right); ++ } ++ } ++ ++}; ++ ++ ++ ++class REPEATNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ down->KeepRight( right); // REPEAT_LOOP ++ } ++ ++public: ++ REPEATNode(): BreakableNode() {} ++ ++ REPEATNode( const RefDNode& refNode): BreakableNode( refNode) ++ { ++ REPEAT_LOOPNode* repeatLoop = new REPEAT_LOOPNode( NULL, down); ++ repeatLoop->KeepRight( right); ++ repeatLoop->setLine( getLine()); ++ ++ down = repeatLoop; ++ } ++}; ++ ++ ++ ++class CASENode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ ProgNodeP GetStatementList() ++ { ++ return down->GetNextSibling(); ++ } ++ ++ void KeepRight( ProgNodeP r) ++ { ++ assert( down != NULL); ++ right = r; ++ keepRight = true; ++ // down is expr ++ ProgNodeP csBlock = GetStatementList(); ++ while( csBlock != NULL) ++ { ++ if( csBlock->getType() == GDLTokenTypes::ELSEBLK) ++ { ++ ProgNodeP statementList = csBlock->GetFirstChild(); ++ if( statementList != NULL) ++ { ++ statementList->GetLastSibling()->KeepRight( right); ++ } ++ } ++ else ++ { ++ // keep expr in case of empty statement ++ ProgNodeP statementList = csBlock->GetFirstChild()->GetNextSibling(); ++ if( statementList != NULL) ++ { ++ statementList->GetLastSibling()->KeepRight( right); ++ } ++ } ++ csBlock = csBlock->GetNextSibling(); ++ } ++ GetStatementList()->SetAllBreak( right); ++ } ++ ++public: ++ CASENode(): BreakableNode() {} ++ ++ CASENode( const RefDNode& refNode): BreakableNode( refNode) ++ { ++ assert( down != NULL); ++ ++ ProgNodeP statementList = this->GetStatementList(); ++ statementList->SetAllBreak( right); ++ ++ // down is expr ++ ProgNodeP csBlock = GetStatementList(); ++ ++ while( csBlock != NULL) ++ { ++ if( csBlock->getType() == GDLTokenTypes::ELSEBLK) ++ { ++ ProgNodeP statementList = csBlock->GetFirstChild(); ++ if( statementList != NULL) ++ { ++ statementList->GetLastSibling()->KeepRight( right); ++ } ++ } ++ else ++ { ++ // keep expr in case of empty statement ++ ProgNodeP statementList = csBlock->GetFirstChild()->GetNextSibling(); ++ if( statementList != NULL) ++ { ++ statementList->GetLastSibling()->KeepRight( right); ++ } ++ } ++ ++// if( csBlock->GetNextSibling() == NULL) ++// { ++// csBlock->KeepRight( right); ++// break; ++// } ++ ++ csBlock = csBlock->GetNextSibling(); ++ } ++ } ++}; ++ ++ ++ ++class SWITCHNode: public BreakableNode ++{ ++ public: ++ RetCode Run(); ++ ++ ProgNodeP GetStatementList() ++ { ++ return down->GetNextSibling(); ++ } ++ ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ ProgNodeP csBlock = GetStatementList(); ++ ProgNodeP lastStatementList = NULL; ++ while( csBlock != NULL) ++ { ++ if( csBlock->getType() == GDLTokenTypes::ELSEBLK) ++ { ++ ProgNodeP statementList = csBlock->GetFirstChild(); ++ if( statementList != NULL) ++ { ++ lastStatementList = statementList; ++ } ++ } ++ else ++ { ++ // keep expr in case of empty statement ++ ProgNodeP statementList = csBlock->GetFirstChild()->GetNextSibling(); ++ if( statementList != NULL) ++ { ++ lastStatementList = statementList; ++ } ++ } ++ csBlock = csBlock->GetNextSibling(); ++ } ++ if( lastStatementList != NULL) ++ lastStatementList->GetLastSibling()->KeepRight( right); ++ GetStatementList()->SetAllBreak( right); ++ } ++ ++public: ++ SWITCHNode(): BreakableNode() {} ++ ++ SWITCHNode( const RefDNode& refNode): BreakableNode( refNode) ++ { ++ assert( down != NULL); ++ ++ ProgNodeP statementList = this->GetStatementList(); ++ statementList->SetAllBreak( right); ++ ++ // down is expr ++ ProgNodeP csBlock = GetStatementList(); ++ ++ ProgNodeP lastStatementList = NULL; ++ ++ while( csBlock != NULL) ++ { ++ if( csBlock->getType() == GDLTokenTypes::ELSEBLK) ++ { ++ ProgNodeP statementList = csBlock->GetFirstChild(); ++ if( statementList != NULL) ++ { ++ if( lastStatementList != NULL) ++ lastStatementList->GetLastSibling()->KeepRight( statementList); ++ ++ lastStatementList = statementList; ++ } ++ } ++ else ++ { ++ // keep expr in case of empty statement ++ ProgNodeP statementList = csBlock->GetFirstChild()->GetNextSibling(); ++ if( statementList != NULL) ++ { ++ if( lastStatementList != NULL) ++ lastStatementList->GetLastSibling()->KeepRight( statementList); ++ ++ lastStatementList = statementList; ++ } ++ } ++ if( csBlock->GetNextSibling() == NULL) ++ { ++ if( lastStatementList != NULL) ++ lastStatementList->GetLastSibling()->KeepRight( right); ++ break; ++ } ++ csBlock = csBlock->GetNextSibling(); ++ } ++ } ++ ++}; ++ ++ ++ ++class BLOCKNode: public ProgNode ++{ ++ public: ++ RetCode Run(); ++ ++ void KeepRight( ProgNodeP r) ++ { ++ right = r; ++ keepRight = true; ++ // must recursively set dependents here ++ if( down != NULL && !KeepDown()) ++ down->GetLastSibling()->KeepRight( right); ++ else ++ this->KeepDown( right); ++ } ++ ++public: ++ BLOCKNode(): ProgNode() {} ++ ++ BLOCKNode( const RefDNode& refNode): ProgNode( refNode) ++ { ++ if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) ++ { ++ down = NewProgNode( refNode->GetFirstChild()); ++ } ++ if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) ++ { ++ right = NewProgNode( refNode->GetNextSibling()); ++ ++ // first statement ++ if( down != NULL) ++ down->GetLastSibling()->KeepRight( right); ++ else ++ this->KeepDown( right); ++ } ++ } ++ ++}; ++ ++ ++ ++class IFNode: public ProgNode ++{ ++ public: ++ RetCode Run(); ++ ++ void KeepRight( ProgNodeP r) ++ { ++ assert( down != NULL); ++ right = r; ++ keepRight = true; ++ down->GetLastSibling()->KeepRight( right); ++ } ++public: ++ IFNode(): ProgNode() {} ++ ++ IFNode( const RefDNode& refNode): ProgNode( refNode) ++ { ++ if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) ++ { ++ down = NewProgNode( refNode->GetFirstChild()); ++ } ++ if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) ++ { ++ right = NewProgNode( refNode->GetNextSibling()); ++ } ++ ++ assert( down != NULL); ++ ++ // first alternative ++ if( right != NULL) ++ { ++ ProgNodeP s1 = down->GetNextSibling(); // skip expr ++ s1->GetLastSibling()->KeepRight( right); ++ } ++ } ++}; ++ ++ ++ ++class IF_ELSENode: public ProgNode ++{ ++ public: ++ RetCode Run(); ++ ++ void KeepRight( ProgNodeP r) ++ { ++ // must recursively set dependents here ++ assert( down != NULL); ++ ++ right = r; ++ keepRight = true; ++ ++ ProgNodeP s1 = down->GetNextSibling(); // skip expr ++ if( s1->GetFirstChild() == NULL || s1->KeepDown()) ++ { ++ s1->KeepDown( right); ++ } ++ else ++ { ++ s1->GetFirstChild()->GetLastSibling()->KeepRight( right); ++ } ++ ++ // 2nd alternative ++ ProgNodeP s2 = s1->GetNextSibling(); ++ s2->GetLastSibling()->KeepRight( right); ++ } ++ ++public: ++ IF_ELSENode(): ProgNode() {} ++ ++ IF_ELSENode( const RefDNode& refNode): ProgNode( refNode) ++ { ++// std::cout << "IF_ELSENode" << std::endl; ++ if( refNode->GetFirstChild() != RefDNode(antlr::nullAST)) ++ { ++ down = NewProgNode( refNode->GetFirstChild()); ++ } ++ if( refNode->GetNextSibling() != RefDNode(antlr::nullAST)) ++ { ++ right = NewProgNode( refNode->GetNextSibling()); ++ } ++ ++ assert( down != NULL); ++ ++ // IF expr s1 s2 ++ // first alternative ++ // s1 is always a BLOCK (gdlc.tree.g, if_statement) ++ // right MUST be set here even if NULL as it IS set to 2nd alternative ++ ProgNodeP s1 = down->GetNextSibling(); // skip expr ++ if( s1->GetFirstChild() == NULL || s1->KeepDown()) ++ { ++ s1->KeepDown( right); ++ } ++ else ++ { ++ s1->GetFirstChild()->GetLastSibling()->KeepRight( right); ++ } ++ ++ if( right != NULL) ++ { ++ // 2nd alternative ++ ProgNodeP s2 = s1->GetNextSibling(); ++ ++ s2->GetLastSibling()->KeepRight( right); // disconnect s2 ++ } ++ } ++}; ++ + //#undef UNDEF + //#ifdef UNDEF + class EnvBaseT; +@@ -253,71 +1274,60 @@ + { + public: + ASSIGNNode( const RefDNode& refNode): CommandNode( refNode) {} +- void Run(); ++ RetCode Run(); ++}; ++class ASSIGN_ARRAYEXPR_MFCALLNode: public CommandNode ++{ ++public: ++ ASSIGN_ARRAYEXPR_MFCALLNode( const RefDNode& refNode): CommandNode( refNode) {} ++ RetCode Run(); + }; + class ASSIGN_REPLACENode: public CommandNode + { + public: + ASSIGN_REPLACENode( const RefDNode& refNode): CommandNode( refNode) {} +- void Run(); ++ RetCode Run(); + }; + class PCALL_LIBNode: public CommandNode + { + public: + PCALL_LIBNode( const RefDNode& refNode): CommandNode( refNode) {} +- void Run(); ++ RetCode Run(); + }; + class MPCALLNode: public CommandNode + { + public: + MPCALLNode( const RefDNode& refNode): CommandNode( refNode) {} +- void Run(); ++ RetCode Run(); + }; + class MPCALL_PARENTNode: public CommandNode + { + public: + MPCALL_PARENTNode( const RefDNode& refNode): CommandNode( refNode) {} +- void Run(); ++ RetCode Run(); + }; + class PCALLNode: public CommandNode + { + public: + PCALLNode( const RefDNode& refNode): CommandNode( refNode) {} +- void Run(); ++ RetCode Run(); + }; + class DECNode: public CommandNode + { public: + DECNode( const RefDNode& refNode): CommandNode( refNode){} +- void Run(); ++ RetCode Run(); + }; + class INCNode: public CommandNode + { public: + INCNode( const RefDNode& refNode): CommandNode( refNode){} +- void Run(); ++ RetCode Run(); ++}; ++ ++class ARRAYEXPRNode: public DefaultNode ++{ ++public: ++ ARRAYEXPRNode( const RefDNode& refNode): DefaultNode( refNode) {} ++ BaseGDL* Eval(); // caller receives ownership + }; +-// class FOR_INITNode: public CommandNode +-// { public: +-// FOR_INITNode( const RefDNode& refNode): CommandNode( refNode){} +-// void Run(); +-// }; +-// class FORNode: public CommandNode +-// { public: +-// FORNode( const RefDNode& refNode): CommandNode( refNode){} +-// void Run(); +-// }; +-// class FOR_STEPNode: public CommandNode +-// { public: +-// FOR_STEPNode( const RefDNode& refNode): CommandNode( refNode){} +-// void Run(); +-// }; +- +- +-// class ARRAYDEFNode: public CommandNode +-// { +-// public: +-// /*virtual*/ RetCode Run(); +-// +-// }; +-//#endif + + #endif +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/pythongdl.cpp cvs/gdl/src/pythongdl.cpp +--- gdl-0.9rc4/src/pythongdl.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/pythongdl.cpp 2010-04-16 11:22:54.000000000 -0600 +@@ -43,6 +43,14 @@ + + //#include + ++#include "gdleventhandler.hpp" ++ ++// SA fix based on: ++// http://synopsis.fresco.org/viewsvn/Synopsis/branches/Synopsis_0_8/src/Synopsis/Python/Object.hh?r2=1792&rev=1792&r1=1657&sortdir=down ++#if PY_VERSION_HEX < 0x02050000 ++ typedef int Py_ssize_t; ++#endif ++ + void LibInit(); // defined in libinit.cpp + + using namespace std; +@@ -176,7 +184,7 @@ + if( kwDict != NULL) + { + PyObject *key, *value; +- int dictPos = 0; ++ Py_ssize_t dictPos = 0; + + int nKW = PyDict_Size( kwDict); + +@@ -242,7 +250,7 @@ + if( kwDict != NULL) + { + PyObject *key, *value; +- int dictPos = 0; ++ Py_ssize_t dictPos = 0; + + int nKW = PyDict_Size( kwDict); + for( SizeT k=0; kNParam(); + if( nParam == parOffset) return; + ++ ostringstream oss; ++ + BaseGDL* parIn; + for( SizeT i=parOffset; iGlobalPar( i)) +- { // defined global ++ { // defined global + parIn = *par; +- } ++ } + else +- { // defined local +- if( prompt != NULL) +- { // prompt keyword there -> error +- throw GDLException( e->CallingNode(), +- "Expression must be named variable " +- "in this context: "+e->GetParString( i)); +- } +- else +- { // prompt not there -> put out or ignore +- if( is == &cin) +- { +- (*par)->ToStream( cout); +- cout << flush; +- noPrompt = false; +- } +- continue; +- } +- } ++ { // defined local ++ if( prompt != NULL) ++ { // prompt keyword there -> error ++ throw GDLException( e->CallingNode(), ++ "Expression must be named variable " ++ "in this context: "+e->GetParString( i)); ++ } ++ else ++ { // prompt not there -> put out or ignore ++ if( is == &cin) ++ { ++ (*par)->ToStream( oss); ++ actualPrompt = oss.str(); ++#ifdef HAVE_LIBREADLINE ++ cout << flush; ++#else ++ cout << oss.str() << flush; ++#endif ++ noPrompt = false; ++ } ++ continue; ++ } ++ } + } + else + { // undefined + if( e->LocalPar( i)) +- throw GDLException( e->CallingNode(), ++ throw GDLException( e->CallingNode(), + "Internal error: Input: UNDEF is local."); + + (*par) = new DFloatGDL( 0.0); +@@ -181,16 +189,71 @@ + } + + if( is == &cin && noPrompt) +- if( prompt != NULL) +- { +- prompt->ToStream( cout); +- cout << flush; +- } +- else ++ if( prompt != NULL) ++ { ++ prompt->ToStream( oss); ++ actualPrompt = oss.str(); ++#ifdef HAVE_LIBREADLINE ++ cout << flush; ++#else ++ cout << oss.str() << flush; ++#endif ++ } ++ else ++ { ++ actualPrompt = ": "; ++#ifdef HAVE_LIBREADLINE ++ cout << flush; ++#else ++ cout << ": " << flush; ++#endif ++ } ++ ++#ifdef HAVE_LIBREADLINE ++ if( is == &cin && isatty(0)) + { +- cout << ": " << flush; ++ string line; ++ string strTrimLine; ++ ++ int edit_input = SysVar::Edit_Input();// && isatty(0); ++ ++ do { ++ char *cline; ++ ++ lineEdit = true; ++ ++ if( edit_input != 0) ++ cline = readline(actualPrompt.c_str()); ++ else ++ cline = e->Interpreter()->NoReadline(actualPrompt.c_str()); ++ ++ lineEdit = false; ++ ++ if( !cline) ++ { ++// if (isatty(0)) ++ cout << endl; ++ e->Throw("Error encountered reading from: Unit: 0, (redirected)."); ++ } ++ else ++ // make a string ++ line = cline; ++ ++ free(cline); // done here for compatibility with readline ++ ++ strTrimLine = line; ++ StrTrim(strTrimLine); ++ } while( strTrimLine == "" && parIn->Type() != STRING); ++ ++ istringstream iss( line + "\n"); ++ parIn->FromStream( iss); ++ ++ if( sigControlC) ++ return; + } +- parIn->FromStream( *is); ++ else ++#endif ++ parIn->FromStream( *is); + } + } + } +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/sigfpehandler.cpp cvs/gdl/src/sigfpehandler.cpp +--- gdl-0.9rc4/src/sigfpehandler.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/sigfpehandler.cpp 2010-04-16 11:22:54.000000000 -0600 +@@ -18,6 +18,7 @@ + #include "includefirst.hpp" + + #include ++#include + + #include "gdlexception.hpp" + +@@ -29,6 +30,7 @@ + // and intager modulo division by zero + void SigFPEHandler( int signo) + { ++ signal(SIGFPE,SigFPEHandler); + Warning( "Program caused arithmetic error: Integer divide by 0"); + siglongjmp( sigFPEJmpBuf,-1); + } +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/specializations.hpp cvs/gdl/src/specializations.hpp +--- gdl-0.9rc4/src/specializations.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/specializations.hpp 2010-04-22 09:50:41.000000000 -0600 +@@ -245,10 +245,10 @@ + Data_* Data_::Pow( BaseGDL* r); + template<> + Data_* Data_::PowInv( BaseGDL* r); +-template<> +-Data_* Data_::MatrixOp( BaseGDL* r); +-template<> +-Data_* Data_::MatrixOp( BaseGDL* r); ++template<> ++Data_* Data_::MatrixOp( BaseGDL* r,bool t,bool tr, bool s); ++template<> ++Data_* Data_::MatrixOp( BaseGDL* ,bool t,bool tr,bool s); + template<> + Data_* Data_::LogNeg(); + template<> +@@ -323,10 +323,16 @@ + template<> + bool Data_::ForCondUp( BaseGDL*); + template<> ++bool Data_::ForAddCondUp( BaseGDL* loopInfo); ++// bool Data_::ForAddCondUp( ForLoopInfoT& loopInfo); ++template<> + bool Data_::ForCondDown( BaseGDL*); + template<> ++bool Data_::ForAddCondUp( BaseGDL* loopInfo); ++// bool Data_::ForAddCondUp( ForLoopInfoT& loopInfo); ++template<> + bool Data_::ForCondUp( BaseGDL*); +-template<> ++template<> + bool Data_::ForCondDown( BaseGDL*); + template<> + void Data_::DecAt( ArrayIndexListT* ixList); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/strassenmatrix.hpp cvs/gdl/src/strassenmatrix.hpp +--- gdl-0.9rc4/src/strassenmatrix.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/strassenmatrix.hpp 2010-04-16 11:22:54.000000000 -0600 +@@ -1,7 +1,7 @@ + #ifndef STRASSENMATRIX_HPP__ + #define STRASSENMATRIX_HPP__ + +-//#define USE_STRASSEN_MATRIXMULTIPLICATION ++#define USE_STRASSEN_MATRIXMULTIPLICATION + + #ifdef USE_STRASSEN_MATRIXMULTIPLICATION + +@@ -2069,7 +2069,8 @@ + #pragma omp taskq + { + /* p1 = (a11 + a22) x (b11 + b22) */ +-#pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++// #pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++#pragma omp task default(shared) + { + T* subBuf = new T[ 5 * n_22]; + T* a_cum = subBuf + 3 * n_22; +@@ -2093,7 +2094,8 @@ + } + + /* p4 = a22 x (b21 - b11) */ +-#pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++// #pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++#pragma omp task default(shared) + { + T* subBuf = new T[ 5 * n_22]; + T* a_cum = subBuf + 3 * n_22; +@@ -2113,7 +2115,8 @@ + } + + /* p5 = (a11 + a12) x b22 */ +-#pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++// #pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++#pragma omp task default(shared) + { + T* subBuf = new T[ 5 * n_22]; + T* a_cum = subBuf + 3 * n_22; +@@ -2133,7 +2136,8 @@ + } + + /* p7 = (a12 - a22) x (b21 + b22) */ +-#pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++// #pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++#pragma omp task default(shared) + { + T* subBuf = new T[ 5 * n_22]; + T* a_cum = subBuf + 3 * n_22; +@@ -2156,7 +2160,8 @@ + } + + /* p2 = (a21 + a22) x b11 */ +-#pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++// #pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++#pragma omp task default(shared) + { + T* subBuf = new T[ 5 * n_22]; + T* a_cum = subBuf + 3 * n_22; +@@ -2176,7 +2181,8 @@ + } + + /* p3 = a11 x (b12 - b22) */ +-#pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++// #pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++#pragma omp task default(shared) + { + T* subBuf = new T[ 5 * n_22]; + T* a_cum = subBuf + 3 * n_22; +@@ -2196,7 +2202,8 @@ + } + + /* p6 = (a21 - a11) x (b11 + b12) */ +-#pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++// #pragma omp task private( subBuf, a_cum, b_cum) default(shared) ++#pragma omp task default(shared) + { + T* subBuf = new T[ 5 * n_22]; + T* a_cum = subBuf + 3 * n_22; +Only in gdl-0.9rc4/src: strassenmatrix.no_c_check.hpp +Only in gdl-0.9rc4/src: strassenmatrix.ok.hpp +Only in gdl-0.9rc4/src: strassenmatrix.rc1.hpp +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/str.cpp cvs/gdl/src/str.cpp +--- gdl-0.9rc4/src/str.cpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/str.cpp 2010-04-22 09:50:41.000000000 -0600 +@@ -88,12 +88,21 @@ + + return res; + } +- ++//#define STRMID_DEBUG + string StrMid(const string& s, long first, long len, bool reverse) + { +- // (long)string::npos == -1 +- if( len != string::npos && len <= 0) return string(""); ++#ifdef STRMID_DEBUG ++cout << "DebugInfo: StrMid(\"" << s << "\"," << first <<","<= strLen) return string(""); + if( first < 0) first = 0; + ++#ifdef STRMID_DEBUG ++ cout << s.substr( first, len)<<"." << endl; ++#endif + return s.substr( first, len); + } + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/typedefs.hpp cvs/gdl/src/typedefs.hpp +--- gdl-0.9rc4/src/typedefs.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/typedefs.hpp 2010-05-21 10:23:58.975905747 -0600 +@@ -58,8 +58,11 @@ + + #if defined(HAVE_64BIT_OS) + typedef unsigned long long int SizeT; ++typedef long long int RangeT; ++ + #else + typedef unsigned int SizeT; ++typedef int RangeT; + #endif + //typedef size_t SizeT; + typedef unsigned int UInt; +@@ -273,42 +276,46 @@ + GDLArray() throw() : buf( NULL), sz( 0) {} + GDLArray( const GDLArray& cp) : sz( cp.size()) + { +- try { buf = (cp.size() > smallArraySize) ? new T[ cp.size()] : scalar; } +- catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } +-#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++ try { ++ buf = (cp.size() > smallArraySize) ? new T[ cp.size()] : scalar; ++ } catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i smallArraySize) ? new T[ s] : scalar; } +- catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } ++ try { ++ buf = (s > smallArraySize) ? new T[ s] : scalar; ++ } catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } + } + GDLArray( T val, SizeT s) : sz( s) + { +- try { buf = (s > smallArraySize) ? new T[ s] : scalar; } +- catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } +-#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++ try { ++ buf = (s > smallArraySize) ? new T[ s] : scalar; ++ } catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i smallArraySize) ? new T[ s]: scalar; } +- catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } +-#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++ try { ++ buf = (s > smallArraySize) ? new T[ s]: scalar; ++ } catch (std::bad_alloc&) { ThrowGDLException("Array requires more memory than GDL can address"); } ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; ismallArraySize) ? new T[ sz] : scalar; +-#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) ++/*#pragma omp parallel if (sz >= CpuTPOOL_MIN_ELTS && (CpuTPOOL_MAX_ELTS == 0 || CpuTPOOL_MAX_ELTS <= sz)) + { +-#pragma omp for ++#pragma omp for*/ + for( SizeT i=0; i progAST_guard( progAST); ++ ++ // necessary for correct FOR loop handling ++ assert( dynamic_cast(caller) != NULL); ++ EnvUDT* env = static_cast(caller); ++ int nForLoopsIn = env->NForLoops(); ++ int nForLoops = ProgNode::NumberForLoops( progAST, nForLoopsIn); ++ env->ResizeForLoops( nForLoops); ++ env->ResizeForLoops( nForLoopsIn); ++ ++ RetCode retCode = caller->Interpreter()->execute( progAST); ++ } ++ ++ + BaseGDL* widget_base( EnvT* e) + { + SizeT nParam = e->NParam(); +@@ -131,7 +158,7 @@ + if ( e->KeywordPresent( mapIx)) + if ( !e->KeywordSet( mapIx)) + mapWid = false; +- std::cout << "Map in widget_base: " << mapWid << std::endl; ++ // std::cout << "Map in widget_base: " << mapWid << std::endl; + + bool no_copy = e->KeywordSet( no_copyIx); + bool scroll = e->KeywordSet( scrollIx); +@@ -316,10 +343,50 @@ + + button->SetWidgetType( "BUTTON"); + ++ button->SetButtonOff(); ++ + return new DLongGDL( button->WidgetID()); + } + + ++ // WIDGET_DROPLIST ++ BaseGDL* widget_droplist( EnvT* e) ++ { ++ DLongGDL* p0L = e->GetParAs( 0); ++ WidgetIDT parentID = (*p0L)[0]; ++ GDLWidget *widget = GDLWidget::GetWidget( parentID); ++ ++ DLong xsize = -1; ++ static int xsizeIx = e->KeywordIx( "XSIZE"); ++ e->AssureLongScalarKWIfPresent( xsizeIx, xsize); ++ ++ static int titleIx = e->KeywordIx( "TITLE"); ++ DString title = ""; ++ e->AssureStringScalarKWIfPresent( titleIx, title); ++ ++ static int valueIx = e->KeywordIx( "VALUE"); ++ // DStringGDL* value = e->IfDefGetKWAs( valueIx); ++ BaseGDL* value = e->GetKW( valueIx); ++ if( value != NULL) ++ value = value->Dup(); ++ ++ static int uvalueIx = e->KeywordIx( "UVALUE"); ++ BaseGDL* uvalue = e->GetKW( uvalueIx); ++ if( uvalue != NULL) ++ uvalue = uvalue->Dup(); ++ ++ GDLWidgetLabel* label = ++ new GDLWidgetLabel( parentID, uvalue, title, xsize); ++ ++ DLong style = wxCB_READONLY; ++ GDLWidgetDropList* droplist = new GDLWidgetDropList( parentID, uvalue, value, ++ title, xsize, style); ++ droplist->SetWidgetType( "DROPLIST"); ++ ++ return new DLongGDL( droplist->WidgetID()); ++ } ++ ++ + // WIDGET_TEXT + BaseGDL* widget_text( EnvT* e) + { +@@ -551,8 +618,8 @@ + DLong select; + // int i; cin >> i; + +- while ( 1) { +- std::cout << "In PollEvents loop" << std::endl; ++ while ( 1) { // outer while loop ++ std::cout << "In PollEvents loop (widget_event)" << std::endl; + while ( 1) { + // Sleep a bit to prevent CPU overuse + wxMilliSleep( 50); +@@ -560,7 +627,7 @@ + break; + } + +- std::cout << "break from PollEvents" << std::endl; ++ std::cout << "break from PollEvents (widget_event)" << std::endl; + std::cout << "top: " << top << std::endl; + std::cout << "id: " << id << std::endl; + +@@ -587,9 +654,12 @@ + delete e; + } + ++ executeString2( caller, &istr); ++ ++ /* + RefDNode theAST; + +- GDLLexer lexer(istr, ""); ++ GDLLexer lexer(istr, "", GDLParser::NONE); + GDLParser& parser = lexer.Parser(); + parser.interactive(); + +@@ -602,11 +672,22 @@ + ProgNodeP progAST = ProgNode::NewProgNode( trAST); + auto_ptr< ProgNode> progAST_guard( progAST); + +- GDLInterpreter::RetCode retCode = ++ // necessary for correct FOR loop handling ++ assert( dynamic_cast(caller) != NULL); ++ EnvUDT* env = static_cast(caller); ++ int nForLoopsIn = env->NForLoops(); ++ int nForLoops = ProgNode::NumberForLoops( progAST, nForLoopsIn); ++ env->ResizeForLoops( nForLoops); ++ ++ RetCode retCode = + caller->Interpreter()->execute( progAST); + ++ env->ResizeForLoops( nForLoopsIn); ++ */ ++ + // Return from GDL/IDL event handler procedure +- std::cout << "return from event handler" << std::endl << std::endl; ++ std::cout << "return from event handler (widget_event)" << ++ std::endl << std::endl; + + if ( GDLWidget::GetWidget( top) == NULL) { + std::cout << "widget NULLed" << std::endl; +@@ -619,7 +700,8 @@ + buttonWidget->SetManaged( false); + + lasttop = top; +- } ++ } // outer while loop ++ + return new DLongGDL( 0); + } + +@@ -663,6 +745,27 @@ + static int setvalueIx = e->KeywordIx( "SET_VALUE"); + bool setvalue = e->KeywordPresent( setvalueIx); + ++ static int getvalueIx = e->KeywordIx( "GET_VALUE"); ++ bool getvalue = e->KeywordPresent( getvalueIx); ++ ++ static int setunameIx = e->KeywordIx( "SET_UNAME"); ++ bool setuname = e->KeywordPresent( setunameIx); ++ DString uname = ""; ++ e->AssureStringScalarKWIfPresent( setunameIx, uname); ++ ++ static int prosetvalueIx = e->KeywordIx( "PRO_SET_VALUE"); ++ bool prosetvalue = e->KeywordPresent( prosetvalueIx); ++ DString setvaluepro = ""; ++ e->AssureStringScalarKWIfPresent( prosetvalueIx, setvaluepro); ++ ++ static int funcgetvalueIx = e->KeywordIx( "FUNC_GET_VALUE"); ++ bool funcgetvalue = e->KeywordPresent( funcgetvalueIx); ++ DString setvaluefunc = ""; ++ e->AssureStringScalarKWIfPresent( funcgetvalueIx, setvaluefunc); ++ ++ static int setbuttonIx = e->KeywordIx( "SET_BUTTON"); ++ bool setbutton = e->KeywordPresent( setbuttonIx); ++ + if ( realize) { + widget->Realize( map); + } +@@ -672,6 +775,7 @@ + } + + if ( xmanActCom) { ++ cout << "Set xmanager active command: " << widgetID << endl; + widget->SetXmanagerActiveCommand(); + } + +@@ -685,56 +789,160 @@ + widget->SetEventPro( eventPro); + } + ++ + if ( getuvalue) { + BaseGDL** uvalueKW = &e->GetKW( getuvalueIx); + delete (*uvalueKW); + +- *uvalueKW = widget->GetUvalue(); ++ BaseGDL *widval = widget->GetUvalue(); ++ // *uvalueKW = widget->GetUvalue(); ++ *uvalueKW = widval->Dup(); ++ ++ /* + if ( *uvalueKW != NULL) { + if( (*uvalueKW)->Type() == STRING) + *uvalueKW = new DStringGDL( (*( DStringGDL*) (*uvalueKW))[0]); + if( (*uvalueKW)->Type() == LONG) + *uvalueKW = new DLongGDL( (*( DLongGDL*) (*uvalueKW))[0]); ++ if( (*uvalueKW)->Type() == STRUCT) { ++ DStructGDL* s = static_cast( *uvalueKW); ++ // DStructGDL* parStruct = dynamic_cast( *uvalueKW); ++ cout << s->Desc()->Name() << endl; ++ } + } ++ */ ++ + } + + if ( setuvalue) { + BaseGDL* uvalue = e->GetKW( setuvalueIx); ++ if( uvalue->Type() == STRUCT) { ++ // cout << "Structure uvalue" << endl; ++ //DStructGDL* s1 = static_cast( uvalue); ++ //cout << s1->Desc()->Name() << endl; ++ } + if( uvalue != NULL) uvalue = uvalue->Dup(); + widget->SetUvalue( uvalue); + } + ++ if ( setuname) { ++ widget->SetUname( uname); ++ } + +- if ( setvalue) { +- DString value = ""; +- e->AssureStringScalarKWIfPresent( setvalueIx, value); ++ if ( prosetvalue) { ++ widget->SetProValue( setvaluepro); ++ } + ++ if ( funcgetvalue) { ++ widget->SetFuncValue( setvaluefunc); ++ } ++ ++ if ( setbutton) { ++ DLong buttonVal; ++ e->AssureLongScalarKWIfPresent( setbuttonIx, buttonVal); ++ if ( buttonVal == 0) ++ widget->SetButtonOff(); ++ else ++ widget->SetButtonOn(); ++ } ++ ++ if ( setvalue) { + DString wType = widget->GetWidgetType(); ++ ++ if ( wType == "") { ++ BaseGDL* value = e->GetKW( setvalueIx); ++ if( value != NULL) value = value->Dup(); ++ ++ DString setProName = widget->GetProValue(); ++ if ( setProName != "") { ++ ++ // Build call to SETV procedure ++ ostringstream ostr; ++ ostr << setProName.c_str() << ", " << widgetID << ", ["; ++ ++ DLongGDL* values = e->IfDefGetKWAs( setvalueIx); ++ DLong nEl = values->N_Elements(); ++ for( SizeT i=0; istr(); ++ istringstream istr(line+"\n"); ++ ++ // Call SETV procedure ++ EnvBaseT* caller = e->Caller(); ++ e->Interpreter()->CallStack().pop_back(); ++ executeString2( caller, &istr); ++ } ++ ++ ++ widget->SetVvalue( value); ++ } ++ + if ( wType == "TEXT") { +- std::cout << "settextvalue: " << value.c_str() << std::endl; ++ DString value = ""; ++ e->AssureStringScalarKWIfPresent( setvalueIx, value); ++ // std::cout << "settextvalue: " << value.c_str() << std::endl; + GDLWidgetText *textWidget = ( GDLWidgetText *) widget; + textWidget->SetTextValue( value); + } + + if ( wType == "LABEL") { +- std::cout << "setlabelvalue: " << value.c_str() << std::endl; ++ DString value = ""; ++ e->AssureStringScalarKWIfPresent( setvalueIx, value); ++ // std::cout << "setlabelvalue: " << value.c_str() << std::endl; + GDLWidgetLabel *labelWidget = ( GDLWidgetLabel *) widget; + labelWidget->SetLabelValue( value); + } + } +- } + ++ if ( getvalue) { ++ BaseGDL** valueKW = &e->GetKW( getvalueIx); ++ delete (*valueKW); ++ ++ DString getFuncName = widget->GetFuncValue(); ++ if ( getFuncName != "") { ++ StackGuard guard( e->Interpreter()->CallStack()); ++ ++ DString callF; ++ // this is a function name -> convert to UPPERCASE ++ callF = getFuncName.c_str(); ++ callF = StrUpCase( callF); ++ ++ SizeT funIx = GDLInterpreter::GetFunIx( callF); ++ EnvUDT* newEnv= new EnvUDT( e, funList[ funIx], NULL); ++ ++ // add parameter ++ newEnv->SetNextPar( new DLongGDL(widgetID)); // pass as local ++ e->Interpreter()->CallStack().push_back( newEnv); ++ ++ // make the call ++ BaseGDL* res = e->Interpreter()-> ++ call_fun(static_cast(newEnv->GetPro())->GetTree()); ++ ++ // set the keyword to the function's return value ++ *valueKW = new DIntGDL( (*( DIntGDL*) (res))[0]); ++ } else { ++ // "Regular" getvalue ++ BaseGDL** valueKW = &e->GetKW( getvalueIx); ++ delete (*valueKW); ++ ++ *valueKW = widget->GetVvalue(); ++ if ( *valueKW != NULL) { ++ if( (*valueKW)->Type() == STRING) ++ *valueKW = new DStringGDL( (*( DStringGDL*) (*valueKW))[0]); ++ if( (*valueKW)->Type() == LONG) ++ *valueKW = new DLongGDL( (*( DLongGDL*) (*valueKW))[0]); ++ } else { ++ DLongGDL* res = new DLongGDL( 0); ++ *valueKW = res; ++ } ++ } ++ } ++ } + + } // namespace + + #endif +- +- +-/* +- // Get Parent Widget +- GDLWidget *parent = GDLWidget::GetParent( widgetID); +- DLong nChildren = parent->GetChild( -1); +- if ( nChildren != 0) { +- for( SizeT j=0; jGetChild( j) == widgetID) return new DLongGDL( 1); +-*/ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/src/widget.hpp cvs/gdl/src/widget.hpp +--- gdl-0.9rc4/src/widget.hpp 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/src/widget.hpp 2010-04-16 11:22:54.000000000 -0600 +@@ -28,6 +28,7 @@ + + BaseGDL* widget_base( EnvT* e); + BaseGDL* widget_button( EnvT* e); ++ BaseGDL* widget_droplist( EnvT* e); + BaseGDL* widget_text( EnvT* e); + BaseGDL* widget_label( EnvT* e); + BaseGDL* widget_info( EnvT* e); +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/checks cvs/gdl/testsuite/checks +--- gdl-0.9rc4/testsuite/checks 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/checks 2010-04-07 10:29:37.000000000 -0600 +@@ -0,0 +1,15 @@ ++#!/bin/bash ++ ++# SA: checking if every .pro file is listed in the Makefile.am ++test \ ++ "`fgrep '.pro' Makefile.am | tr '\\' ' ' | tr "\n" ' ' | tr -s ' '`" \ ++ = \ ++ " `LC_COLLATE=C ls *.pro | tr "\n" ' ' | tr -s ' '`" && exit ++echo "----------------------------------------------------------------" ++echo "REASON: list of .pro files vs. entries in testsuite/Makefile.am:" ++LC_COLLATE=C ls -1 *.pro \ ++ | awk '{ print " " $0 " \\" }' \ ++ | diff /dev/stdin Makefile.am \ ++ | fgrep .pro | tr '<' '-' | tr '\\' ' ' | tr -s ' ' ++echo "----------------------------------------------------------------" ++exit 1 +Only in gdl-0.9rc4/testsuite: Makefile +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/Makefile.am cvs/gdl/testsuite/Makefile.am +--- gdl-0.9rc4/testsuite/Makefile.am 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/Makefile.am 2010-06-03 09:06:40.528740590 -0600 +@@ -1,10 +1,26 @@ + TESTS_ENVIRONMENT = $(top_srcdir)/testsuite/try $(top_srcdir) + TESTS = \ +- test_zeropoly.pro \ +- test_url.pro \ +- test_multiroots.pro \ + test_angles.pro \ +- test_wavelet.pro \ + test_base64.pro \ + test_constants.pro \ +- test_nestedloop.pro ++ test_device.pro \ ++ test_fft.pro \ ++ test_fix.pro \ ++ test_gc.pro \ ++ test_get_screen_size.pro \ ++ test_hist_2d.pro \ ++ test_idl8.pro \ ++ test_interpol.pro \ ++ test_multiroots.pro \ ++ test_nestedloop.pro \ ++ test_product.pro \ ++ test_rebin.pro \ ++ test_spher_harm.pro \ ++ test_spl_init.pro \ ++ test_str_functions.pro \ ++ test_suite.pro \ ++ test_url.pro \ ++ test_wavelet.pro \ ++ test_zeropoly.pro \ ++ test_zzz.pro \ ++ checks +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/Makefile.in cvs/gdl/testsuite/Makefile.in +--- gdl-0.9rc4/testsuite/Makefile.in 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/Makefile.in 2010-06-03 09:06:40.531800797 -0600 +@@ -34,7 +34,7 @@ + build_triplet = @build@ + host_triplet = @host@ + subdir = testsuite +-DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ++DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + am__aclocal_m4_deps = $(top_srcdir)/configure.in + am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +@@ -175,14 +175,30 @@ + wxConfig = @wxConfig@ + TESTS_ENVIRONMENT = $(top_srcdir)/testsuite/try $(top_srcdir) + TESTS = \ +- test_zeropoly.pro \ +- test_url.pro \ +- test_multiroots.pro \ + test_angles.pro \ +- test_wavelet.pro \ + test_base64.pro \ + test_constants.pro \ +- test_nestedloop.pro ++ test_device.pro \ ++ test_fft.pro \ ++ test_fix.pro \ ++ test_gc.pro \ ++ test_get_screen_size.pro \ ++ test_hist_2d.pro \ ++ test_idl8.pro \ ++ test_interpol.pro \ ++ test_multiroots.pro \ ++ test_nestedloop.pro \ ++ test_product.pro \ ++ test_rebin.pro \ ++ test_spher_harm.pro \ ++ test_spl_init.pro \ ++ test_str_functions.pro \ ++ test_suite.pro \ ++ test_url.pro \ ++ test_wavelet.pro \ ++ test_zeropoly.pro \ ++ test_zzz.pro \ ++ checks + + all: all-am + +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/README cvs/gdl/testsuite/README +--- gdl-0.9rc4/testsuite/README 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/README 2010-02-17 04:15:12.000000000 -0700 +@@ -0,0 +1,48 @@ ++How to add a new test-routine to the automatic "make check" rule: ++-------------------------------------------------------------------- ++ ++The list of GDL routines to be executed during the make-check run ++is defined (implicitly, through a list of .pro files) in the ++Makefile.am file. After adding a new item (filename) to the list, ++please rerun "automake" being in the root folder of the source tree. ++ ++Each test routine is invoked using the GDL "-e" command-line option ++by the "try" shell script in the testsuite directory. "make" decides ++on the status of a test basing on the exit code of this script: ++- "success" for exit code 0 ++- "ignorable failure" for code 77 ++- "failure" for any other exit code, e.g. 1 ++The "try" script should, in principle, exit with the GDL exit code. ++Therefore, a failure of a GDL test should be indicated by e.g.: ++ ++ if ( ...true if test failed... ) begin ++ message, 'reason for the failure', /continue ++ exit, status=1 ++ endif ++ ++An ignorable failure can be indicated by e.g.: ++ ++ if (!XXX_exists()) then begin ++ message, 'GDL was built w/o support for XXX - skipping', /conti ++ exit, status=77 ++ endif ++ ++Any GDL error (e.g. parser error or library-routine-triggered error) ++causing GDL to return to the $MAIN$ level will cause make to assume ++_success_! (GDL exits normally in this case). Any GDL error causing ++GDL to stop execution on an other-than-$MAIN$ level will bring the ++GDL interpreter prompt. ++ ++The name of the file must match the name of the test routine, e.g. for ++the example above: testsuite/test_dummy.pro ++ ++GDL segfaults, assertion-exits, std::terminate() exits, etc. are handled ++as failures by make. ++ ++The "try" script always uses the gdl binary in the build tree - not the ++one installed in the system. The "try" script also sets appropriate env. ++variables so that the GDL-written library routines are taken from the ++source tree as well (e.g. src/pro/mean.pro). ++ ++Sylwester Arabas ++February 2010 +Binary files gdl-0.9rc4/testsuite/Saturn.jpg and cvs/gdl/testsuite/Saturn.jpg differ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_constants.pro cvs/gdl/testsuite/test_constants.pro +--- gdl-0.9rc4/testsuite/test_constants.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/test_constants.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -1,445 +1,485 @@ +-; by Sylwester Arabas +-pro test_constants +- +- cnsts = strarr(28) +- units = strarr(28) +- +- cnsts[0:5] = ['amu','atm', 'AU', 'Avogadro', 'Boltzman', 'C' ] +- units[0:5] = ['kg', 'N/m2','m', '1/mole', 'J/K', 'm/s'] +- +- ;cnsts[6] = ['Catalan'] +- ;units[6] = ['1'] +- +- cnsts[7:10] = ['E', 'ElectronCharge', 'ElectronMass', 'ElectronVolt'] +- units[7:10] = ['1', 'C', 'kg', 'J'] +- +- cnsts[11:15] = ['Euler', 'Faraday', 'FineStructure', 'Gamma', 'Gas'] +- units[11:15] = ['1', 'C/mole', '1', '1', 'J/mole/K'] +- +- cnsts[16:20] = ['Gravity', 'Hbar', 'PerfectGasVolume', 'Pi', 'Planck'] +- units[16:20] = ['N*m2/kg2', 'J*s', 'm3 / mole', '1', 'J*s'] +- +- cnsts[21:24] = ['ProtonMass', 'Rydberg', 'Speedlight', 'StandardGravity'] +- units[21:24] = ['kg', 'm-1', 'm/s', 'm/s2'] +- +- cnsts[25:27] = ['StandardPressure', 'StefanBoltzman', 'WaterTriple'] +- units[25:27] = ['N/m2', 'W/K4 /m2', 'K'] +- +- ; testing all possible calling sequences with the default units +- for i = 0, n_elements(cnsts) - 1 do if strlen(cnsts[i]) ne 0 then begin +- a = imsl_constant(cnsts[i]) +- b = imsl_constant(cnsts[i], units[i]) +- a = imsl_constant(cnsts[i], /double) +- b = imsl_constant(cnsts[i], units[i], /double) +- if a ne b then begin +- message, 'FAILED: ' + cnsts[i] + ' [' + units[i] + ']', /conti +- exit, status=1 ++; ++; Created by Sylwester Arabas ++; Modifications by AC on 30 March 2010 ++; ++pro TEST_CONSTANTS, test=test ++; ++has_udunits = ~ (EXECUTE("a=IMSL_CONSTANT('c','m/s')") eq 0) ++; ++cnsts = STRARR(28) ++units = STRARR(28) ++; ++cnsts[0:5] = ['amu','atm', 'AU', 'Avogadro', 'Boltzman', 'C' ] ++units[0:5] = ['kg', 'N/m2','m', '1/mole', 'J/K', 'm/s'] ++;; ++;;cnsts[6] = ['Catalan'] ++;;units[6] = ['1'] ++;; ++cnsts[7:10] = ['E', 'ElectronCharge', 'ElectronMass', 'ElectronVolt'] ++units[7:10] = ['1', 'C', 'kg', 'J'] ++; ++cnsts[11:15] = ['Euler', 'Faraday', 'FineStructure', 'Gamma', 'Gas'] ++units[11:15] = ['1', 'C/mole', '1', '1', 'J/mole/K'] ++; ++cnsts[16:20] = ['Gravity', 'Hbar', 'PerfectGasVolume', 'Pi', 'Planck'] ++units[16:20] = ['N*m2/kg2', 'J*s', 'm3 / mole', '1', 'J*s'] ++; ++cnsts[21:24] = ['ProtonMass', 'Rydberg', 'Speedlight', 'StandardGravity'] ++units[21:24] = ['kg', 'm-1', 'm/s', 'm/s2'] ++; ++cnsts[25:27] = ['StandardPressure', 'StefanBoltzman', 'WaterTriple'] ++units[25:27] = ['N/m2', 'W/K4 /m2', 'K'] ++;; ++;; testing all possible calling sequences with the default units ++;; ++for i = 0, n_elements(cnsts) - 1 do if strlen(cnsts[i]) NE 0 then begin ++ a = IMSL_CONSTANT(cnsts[i]) ++ a = IMSL_CONSTANT(cnsts[i], /double) ++ if has_udunits then begin ++ b = IMSL_CONSTANT(cnsts[i], units[i]) ++ b = IMSL_CONSTANT(cnsts[i], units[i], /double) ++ if a NE b then begin ++ MESSAGE, 'FAILED: ' + cnsts[i] + ' [' + units[i] + ']', /conti ++ EXIT, status=1 ++ endif + endif +- endif +- +- ; testing unit conversion +- ; - time +- u = 'm/day' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/hour' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/hr' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/min' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/minute' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/s' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/sec' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/second' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm/year' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - frequency +- u = 'm*Hz' & if ~finite(imsl_constant('c', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - mass +- u = 'AMU' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'g' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'gram' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'lb' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'pound' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +-; u = 'ounce' & if ~finite(imsl_constant('electronmass', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++endif ++;; ++;; testing unit conversion ++;; ++if has_udunits then begin ++ ;; ++ ;; - time ++ ;; ++ u = 'm/day' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/hour' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/hr' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/min' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/minute' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/s' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/sec' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/second' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm/year' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - frequency ++ ;; ++ u = 'm*Hz' & if ~FINITE(IMSL_CONSTANT('c', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - mass ++ ;; ++ u = 'AMU' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'g' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'gram' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'lb' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'pound' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++; u = 'ounce' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +-; u = 'oz' & if ~finite(imsl_constant('electronmass', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++; u = 'oz' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +- u = 'slug' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - distance +- u = 'Angstrom' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +-; u = 'AU' & if ~finite(imsl_constant('AU', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++ u = 'slug' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - distance ++ ;; ++ u = 'Angstrom' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++; u = 'AU' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +- u = 'feet' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'foot' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'in' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'inch' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'm' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'meter' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'metre' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'micron' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'mile' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +-; u = 'mill' & if ~finite(imsl_constant('AU', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++ u = 'feet' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'foot' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'in' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'inch' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'm' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'meter' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'metre' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'micron' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'mile' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++; u = 'mill' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +- u = 'parsec' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'yard' & if ~finite(imsl_constant('AU', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - area +- u = 'N/acre' & if ~finite(imsl_constant('ATM', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - volume +- u = 'l/mole' & if ~finite(imsl_constant('PerfectGasVolume', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'liter/mole'& if ~finite(imsl_constant('PerfectGasVolume', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'litre/mole'& if ~finite(imsl_constant('PerfectGasVolume', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - force +- u = 'dyne/m^2' & if ~finite(imsl_constant('ATM', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'N/m^2' & if ~finite(imsl_constant('ATM', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Newton/m^2'& if ~finite(imsl_constant('ATM', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - energy +- u = 'BTU' & if ~finite(imsl_constant('ElectronVolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Erg' & if ~finite(imsl_constant('ElectronVolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'J' & if ~finite(imsl_constant('ElectronVolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Joule' & if ~finite(imsl_constant('ElectronVolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - work +- u = 'W*s^2' & if ~finite(imsl_constant('Hbar', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'watt*s^2' & if ~finite(imsl_constant('Hbar', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - pressure +-; u = 'ATM' & if ~finite(imsl_constant('ATM', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++ u = 'parsec' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'yard' & if ~FINITE(IMSL_CONSTANT('AU', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - area ++ ;; ++ u = 'N/acre' & if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - volume ++ ;; ++ u = 'l/mole' & if ~FINITE(IMSL_CONSTANT('PerfectGasVolume', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'liter/mole'& if ~FINITE(IMSL_CONSTANT('PerfectGasVolume', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'litre/mole'& if ~FINITE(IMSL_CONSTANT('PerfectGasVolume', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - force ++ ;; ++ u = 'dyne/m^2' & if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'N/m^2' & if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Newton/m^2'& if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - energy ++ ;; ++ u = 'BTU' & if ~FINITE(IMSL_CONSTANT('ElectronVolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Erg' & if ~FINITE(IMSL_CONSTANT('ElectronVolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'J' & if ~FINITE(IMSL_CONSTANT('ElectronVolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Joule' & if ~FINITE(IMSL_CONSTANT('ElectronVolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - work ++ ;; ++ u = 'W*s^2' & if ~FINITE(IMSL_CONSTANT('Hbar', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'watt*s^2' & if ~FINITE(IMSL_CONSTANT('Hbar', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - pressure ++ ;; ++; u = 'ATM' & if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +- u = 'atmosphere' & if ~finite(imsl_constant('ATM', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'bar' & if ~finite(imsl_constant('ATM', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - temperature +- u = 'degC' & if ~finite(imsl_constant('WaterTriple', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Celsius' & if ~finite(imsl_constant('WaterTriple', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'degF' & if ~finite(imsl_constant('WaterTriple', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +-; u = 'Fahrenheit' & if ~finite(imsl_constant('WaterTriple', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++ u = 'atmosphere' & if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'bar' & if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - temperature ++ ;; ++ u = 'degC' & if ~FINITE(IMSL_CONSTANT('WaterTriple', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Celsius' & if ~FINITE(IMSL_CONSTANT('WaterTriple', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'degF' & if ~FINITE(IMSL_CONSTANT('WaterTriple', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++; u = 'Fahrenheit' & if ~FINITE(IMSL_CONSTANT('WaterTriple', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +- u = 'degK' & if ~finite(imsl_constant('WaterTriple', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Kelvin' & if ~finite(imsl_constant('WaterTriple', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - viscosity +-; u = 'stoke/m' & if ~finite(imsl_constant('Speedlight', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++ u = 'degK' & if ~FINITE(IMSL_CONSTANT('WaterTriple', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Kelvin' & if ~FINITE(IMSL_CONSTANT('WaterTriple', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - viscosity ++ ;; ++; u = 'stoke/m' & if ~FINITE(IMSL_CONSTANT('Speedlight', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +- u = 'poise/s' & if ~finite(imsl_constant('ATM', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - charge +-; u = 'Abcoulomb' & if ~finite(imsl_constant('electroncharge', u)) then begin +-; message, 'FAILED! ' + u, /conti +-; exit, status=1 ++ u = 'poise/s' & if ~FINITE(IMSL_CONSTANT('ATM', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - charge ++ ;; ++; u = 'Abcoulomb' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++; MESSAGE, 'FAILED! ' + u, /conti ++; EXIT, status=1 + ; endif +- u = 'C' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Coulomb' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'statcoulomb' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - current +- u = 'A*s' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'ampere*s' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'abampere*s' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'statampere*s' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - voltage +- u = 'J/Abvolt' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'J/V' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'J/volt' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - magnetic induction +- u = 'T*C*s' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Tesla*C*s' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Weber*A' & if ~finite(imsl_constant('electronvolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Wb*A' & if ~finite(imsl_constant('electronvolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; - other units +- u = '1/mole' & if ~finite(imsl_constant('avogadro', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'farad*V' & if ~finite(imsl_constant('electroncharge', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Gauss*C*s' & if ~finite(imsl_constant('electronmass', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Henry*C2/s' & if ~finite(imsl_constant('planck', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Maxwell*A' & if ~finite(imsl_constant('electronvolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- u = 'Ohm*s*A^2' & if ~finite(imsl_constant('electronvolt', u)) then begin +- message, 'FAILED! ' + u, /conti +- exit, status=1 +- endif +- +- ; testing prefixes ++ u = 'C' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Coulomb' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'statcoulomb' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - current ++ ;; ++ u = 'A*s' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'ampere*s' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'abampere*s' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'statampere*s' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - voltage ++ ;; ++ u = 'J/Abvolt' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'J/V' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'J/volt' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - magnetic induction ++ ;; ++ u = 'T*C*s' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Tesla*C*s' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Weber*A' & if ~FINITE(IMSL_CONSTANT('electronvolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Wb*A' & if ~FINITE(IMSL_CONSTANT('electronvolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; - other units ++ ;; ++ u = '1/mole' & if ~FINITE(IMSL_CONSTANT('avogadro', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'farad*V' & if ~FINITE(IMSL_CONSTANT('electroncharge', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Gauss*C*s' & if ~FINITE(IMSL_CONSTANT('electronmass', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Henry*C2/s' & if ~FINITE(IMSL_CONSTANT('planck', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Maxwell*A' & if ~FINITE(IMSL_CONSTANT('electronvolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ u = 'Ohm*s*A^2' & if ~FINITE(IMSL_CONSTANT('electronvolt', u)) then begin ++ MESSAGE, 'FAILED! ' + u, /conti ++ EXIT, status=1 ++ endif ++ ;; ++ ;; testing prefixes ++ ;; + eps = 1d-6 +- au = imsl_constant('AU', /d) +- if imsl_constant('AU', 'parsec', /d) - au * 1d18 gt eps then begin +- message, 'FAILED! a', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'parsec', /d) - au * 1d15 gt eps then begin +- message, 'FAILED! f', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'pm', /d) ne au * 1d12 then begin +- message, 'FAILED! p', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'nm', /d) ne au * 1d9 then begin +- message, 'FAILED! n', /conti +- exit, status=1 +- endif +-; if imsl_constant('AU', 'um', /d) ne au * 1d6 then begin +-; message, 'FAILED! u', /conti +-; exit, status=1 ++ au = IMSL_CONSTANT('AU', /d) ++ if IMSL_CONSTANT('AU', 'parsec', /d) - au * 1d18 GT eps then begin ++ MESSAGE, 'FAILED! a', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'parsec', /d) - au * 1d15 GT eps then begin ++ MESSAGE, 'FAILED! f', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'pm', /d) NE au * 1d12 then begin ++ MESSAGE, 'FAILED! p', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'nm', /d) NE au * 1d9 then begin ++ MESSAGE, 'FAILED! n', /conti ++ EXIT, status=1 ++ endif ++; if IMSL_CONSTANT('AU', 'um', /d) NE au * 1d6 then begin ++; MESSAGE, 'FAILED! u', /conti ++; EXIT, status=1 + ; endif +- if imsl_constant('AU', 'mm', /d) ne au * 1d3 then begin +- message, 'FAILED! m', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'cm', /d) ne au * 1d2 then begin +- message, 'FAILED! c', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'dm', /d) ne au * 1d1 then begin +- message, 'FAILED! d', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'dam', /d) ne au * 1d-1 then begin +- message, 'FAILED! da', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'km', /d) ne au * 1d-3 then begin +- message, 'FAILED! k', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'Gm', /d) ne au * 1d-9 then begin +- message, 'FAILED! g', /conti +- exit, status=1 +- endif +- if imsl_constant('AU', 'Tm', /d) ne au * 1d-12 then begin +- message, 'FAILED! t', /conti +- exit, status=1 +- endif +- +- ; testing if PI = PI +- if imsl_constant('pi') ne !PI then begin +- message, 'FAILED! (PI != PI)', /conti +- exit, status=1 +- endif +- if imsl_constant('pi', /double) ne !DPI then begin +- message, 'FAILED! (DPI != DPI)', /conti +- exit, status=1 +- endif +- ++ if IMSL_CONSTANT('AU', 'mm', /d) NE au * 1d3 then begin ++ MESSAGE, 'FAILED! m', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'cm', /d) NE au * 1d2 then begin ++ MESSAGE, 'FAILED! c', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'dm', /d) NE au * 1d1 then begin ++ MESSAGE, 'FAILED! d', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'dam', /d) NE au * 1d-1 then begin ++ MESSAGE, 'FAILED! da', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'km', /d) NE au * 1d-3 then begin ++ MESSAGE, 'FAILED! k', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'Gm', /d) NE au * 1d-9 then begin ++ MESSAGE, 'FAILED! g', /conti ++ EXIT, status=1 ++ endif ++ if IMSL_CONSTANT('AU', 'Tm', /d) NE au * 1d-12 then begin ++ MESSAGE, 'FAILED! t', /conti ++ EXIT, status=1 ++ endif ++ ++endif ++ ++;; ++;; testing if PI = PI ++;; ++if IMSL_CONSTANT('pi') NE !PI then begin ++ MESSAGE, 'FAILED! (PI != PI)', /conti ++ EXIT, status=1 ++endif ++if IMSL_CONSTANT('pi', /double) NE !DPI then begin ++ MESSAGE, 'FAILED! (DPI != DPI)', /conti ++ EXIT, status=1 ++endif ++; ++if KEYWORD_SET(test) then STOP ++; ++if (~has_udunits) then begin ++ MESSAGE, 'Some checks skipped (GDL was compiled without support for UDUNITS)', /conti ++ EXIT, status=77 ++endif ++; + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_device.pro cvs/gdl/testsuite/test_device.pro +--- gdl-0.9rc4/testsuite/test_device.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_device.pro 2010-04-20 02:14:07.000000000 -0600 +@@ -0,0 +1,29 @@ ++pro test_device ++ ++ set_plot, 'ps' ++ ++ device, xsize=10 ++ if !D.X_SIZE ne 10000 then begin ++ message, '!D.X_SIZE ne 10000', /conti ++ exit, status=1 ++ endif ++ ++ device, ysize=20 ++ if !D.Y_SIZE ne 20000 then begin ++ message, '!D.Y_SIZE ne 20000', /conti ++ exit, status=1 ++ endif ++ ++ device, xsize=10, /inches ++ if !D.X_SIZE ne 25400 then begin ++ message, '!D.X_SIZE ne 25400', /conti ++ exit, status=1 ++ endif ++ ++ device, ysize=20, /inches ++ if !D.Y_SIZE ne 50800 then begin ++ message, '!D.Y_SIZE ne 50800', /conti ++ exit, status=1 ++ endif ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_fft.pro cvs/gdl/testsuite/test_fft.pro +--- gdl-0.9rc4/testsuite/test_fft.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_fft.pro 2010-03-30 06:48:16.000000000 -0600 +@@ -0,0 +1,149 @@ ++; ++; Under GPL 2 or later ++; Thibaut Mermet and Alain Coulais ++; June 2009 and February 2010. ++; ++; Testing the FFT function : ++; do the FFT computes : ++; -- (1) somethings ++; -- (2) at the expected place ++; We need such a function because one version of GDL rc2 ++; does suffer from a bug for few types (double ?) where ++; computations always return "0". It was hard to check ++; because most was OK and also we can used 2 libraries for FFT: GSL or FFTw. ++; ++; ------------------------------------------- ++; ++; This is a preliminary but important version of TEST_FFT ++; ++; ------------------------------------------- ++; ++; expected types for outputs from FFT are "6" (complex) or "9" (Dcomplex) ++; ++pro TEST_FFT_ALL_TYPES, test=test, help=help, $ ++ verbose=verbose, quiet=quiet ++; ++if KEYWORD_SET(help) then begin ++ print, 'pro TEST_FFT_ALL_TYPES, test=test, help=help, $' ++ print, ' verbose=verbose, quiet=quiet' ++endif ++; ++print, 'Running TEST_FFT_ALL_TYPES (for 13 input types)' ++; ++nb_pb=0 ++for ii=0, 15 do begin ++ if ii EQ 8 then CONTINUE ;; Struc ++ if ii EQ 10 then CONTINUE ;; Pointer ++ if ii EQ 11 then CONTINUE ;; Objref ++ ;; ++ input=MAKE_ARRAY(1024,type=ii) ++ result=FFT(input) ++ type=SIZE(result,/type) ++ if ((type EQ 6) or (type EQ 9)) then begin ++ message=', OK' ++ endif else begin ++ message=', Problem' ++ nb_pb=nb_pb+1 ++ endelse ++ if NOT(KEYWORD_SET(quiet)) OR KEYWORD_SET(verbose) then begin ++ print, 'Input type :', ii, ', Output type :', type, message ++ endif ++endfor ++; ++if (nb_pb GT 0) then begin ++ MESSAGE, STRING(nb_pb)+' problem(s) found in TEST_FFT_ALL_TYPES',/continue ++ EXIT, status=1 ++endif else begin ++ MESSAGE, 'No problem found in TEST_FFT_ALL_TYPES',/continue ++endelse ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; ------------------------------------------- ++; ++pro TEST_FFT_GO_AND_BACK, dimension=dimension, nbp=nbp, $ ++ verbose=verbose, quiet=quiet, $ ++ test=test, help=help, debug=debug ++; ++if KEYWORD_SET(help) then begin ++ print, 'pro TEST_FFT_GO_AND_BACK, dimension=dimension, nbp=nbp, $' ++ print, ' verbose=verbose, quiet=quiet, $' ++ print, ' test=test, help=help, debug=debug' ++ return ++end ++; ++print, '' & ++mess='Running TEST_FFT_GO_AND_BACK (for 13 input types)' ++;;if N_ELEMENTS(dimension) GT 3 then begin ++;; MESSAGE, 'Sorry, we are not ready for high Dimensions cases' ++;; EXIT, status=1 ++;;end ++if N_ELEMENTS(dimension) EQ 0 then begin ++ if N_ELEMENTS(nbp) EQ 0 then nbp=1024 ++ if nbp LE 0 then begin ++ MESSAGE, 'Nbp= must be positive (>0)' ++ EXIT, status=1 ++ endif ++ dimension=[nbp] ++endif ++mess=mess+' in '+STRING(N_ELEMENTS(dimension))+'D case, with size:' ++print, STRCOMPRESS(mess), dimension ++; ++nb_pb=0 ++; ++; We will point a Dirac somewhere in the array ... ++glitch=[5,7,12] ++glitch_index=glitch[0] ++for ii=1, N_ELEMENTS(dimension)-1 do begin ++ glitch_index=glitch_index+glitch[ii mod 3]*dimension[ii-1] ++endfor ++if KEYWORD_SET(debug) then print, glitch_index ++; ++for ii=0, 15 do begin ++ if ii EQ 8 then CONTINUE ;; Struc ++ if ii EQ 10 then CONTINUE ;; Pointer ++ if ii EQ 11 then CONTINUE ;; Objref ++ ;; ++ input=MAKE_ARRAY(dimension,type=ii) ++ input[glitch_index]=1 ++ ;; ++ result1=FFT(input,1) ++ result2=FFT(result1,-1) ++ error=TOTAL(ABS(input-result2)) ++ message=', OK' ++ if (error GT 1e-3) then begin ++ message=', Problems' ++ nb_pb=nb_pb+1 ++ endif ++ if NOT(KEYWORD_SET(quiet)) OR KEYWORD_SET(verbose) then begin ++ print, format='(A,i4,A,i4,A,G10.4,A)', 'Input type :', ii, $ ++ ', Output type :', SIZE(result2,/type), ', error: ', error, message ++ endif ++endfor ++; ++if (nb_pb GT 0) then begin ++ MESSAGE, STRING(nb_pb)+' problem(s) found in TEST_FFT_GO_AND_BACK', /continue ++ EXIT, status=1 ++endif else begin ++ MESSAGE, 'No problem found in TEST_FFT_GO_AND_BACK', /continue ++endelse ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; ------------------------------------------- ++; ++pro TEST_FFT, quiet=quiet, verbose=verbose ++; ++if NOT(KEYWORD_SET(quiet)) AND NOT(KEYWORD_SET(verbose)) then quiet=1 ++; ++TEST_FFT_ALL_TYPES, quiet=quiet, verbose=verbose ++TEST_FFT_GO_AND_BACK, quiet=quiet, verbose=verbose ++TEST_FFT_GO_AND_BACK, dim=[1024,1024], quiet=quiet, verbose=verbose ++TEST_FFT_GO_AND_BACK, dim=[512,2048], quiet=quiet, verbose=verbose ++TEST_FFT_GO_AND_BACK, dim=[128,64,128], quiet=quiet, verbose=verbose ++; ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_fix.pro cvs/gdl/testsuite/test_fix.pro +--- gdl-0.9rc4/testsuite/test_fix.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/test_fix.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -28,7 +28,7 @@ + endif + end + ; +-pro TEST_FIX_ONE_VALUE, value=value, verbose=verbose, all_types=all_types ++function TEST_FIX_ONE_VALUE, value=value, verbose=verbose, all_types=all_types + ; + if KEYWORD_SET(verbose) then quiet=0 else quiet=1 + +@@ -48,7 +48,7 @@ + + if (x LT 0.) then begin + print, 'Positive input mandatory !' +- return ++ return, 0 + endif + ; + separateur= '---------------------------' +@@ -95,14 +95,19 @@ + print, separateur + print, 'Bad news ! At least one problem encoutered !' + print, 'Please rerun this test with keyword /verbose !' ++ return, 0 + endif + ++return, 1 ++ + end + + + pro TEST_FIX, verbose=verbose, all_types=all_types +-TEST_FIX_ONE_VALUE, value=1.001, verbose=verbose, all_types=all_types +-TEST_FIX_ONE_VALUE, value=10.1, verbose=verbose, all_types=all_types +-TEST_FIX_ONE_VALUE, value=1000.1, verbose=verbose, all_types=all_types +-TEST_FIX_ONE_VALUE, value=1000.1e5, verbose=verbose, all_types=all_types ++ ok = 1 ++ ok and= TEST_FIX_ONE_VALUE(value=1.001, verbose=verbose, all_types=all_types) ++ ok and= TEST_FIX_ONE_VALUE(value=10.1, verbose=verbose, all_types=all_types) ++ ok and= TEST_FIX_ONE_VALUE(value=1000.1, verbose=verbose, all_types=all_types) ++ ok and= TEST_FIX_ONE_VALUE(value=1000.1e5, verbose=verbose, all_types=all_types) ++ if ~ok then exit, status=1 + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_gc.pro cvs/gdl/testsuite/test_gc.pro +--- gdl-0.9rc4/testsuite/test_gc.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_gc.pro 2010-03-22 14:44:23.000000000 -0600 +@@ -0,0 +1,28 @@ ++pro test_gc ++ ++ a = total(memory() * [0,1,-1]) ; n_alloc - n_free ++ if total(memory() * [0,1,-1]) - a ne 1 then begin ; 1 for storing the 1 (? - hope I'm right ;)) ++ message, 'A (problem with memory() ?)', /conti ++ exit, status=1 ++ endif ++ ++ b = ptr_new(a) ++ if total(memory() * [0,1,-1]) - a ne 3 then begin ; 3 for storing the 3, the copy of a, and the b ++ message, 'B (problem with memory() ?)', /conti ++ exit, status=1 ++ endif ++ ++ b = ptr_new(a, /no_copy) ++ if total(memory() * [0,1,-1]) - *b ne 2 then begin ; 2 for storing the 2, and the b ++ message, 'C (problem with GC)', /conti ++ exit, status=1 ++ endif ++ ++ c = ptr_new(ptr_new(1)) ++ c = 0. ++ if total(memory() * [0,1,-1]) - *b ne 3 then begin ; 3 for storing the 3, the b, and the c ++ message, 'D (problem with GC)', /conti ++ exit, status=1 ++ endif ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_get_screen_size.pro cvs/gdl/testsuite/test_get_screen_size.pro +--- gdl-0.9rc4/testsuite/test_get_screen_size.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/test_get_screen_size.pro 2010-05-21 10:24:00.764905763 -0600 +@@ -1,18 +1,81 @@ + ; +-; AC 18/10/2009 +-; under GNU/GPL 2 or later ++; AC 18/10/2009 under GNU/GPL 2 or later ++; ++; resived 03/05/2010 for integration in the "make check" testsuite ++; ++; purpose: quickly testing the GET_SCREEN_SIZE() function ++; ++; --------------------------------------------------- ++; ++pro DEMO_GET_SCREEN_SIZE + ; +-pro TEST_GET_SCREEN_SIZE +- + print, 'basic test (call without Display name)' + taille=GET_SCREEN_SIZE(resolution=resolution) + print, 'Screen Size (in pixels) :', taille + print, 'Pixel Size (in mm) :', resolution +- ++; + print, 'On current Display, using ":0" as name' + display=':0' + taille=GET_SCREEN_SIZE(display, resolution=resolution) + print, 'Screen Size (in pixels) :', taille + print, 'Pixel Size (in mm) :', resolution +- ++; ++end ++; ++; --------------------------------------------------- ++; ++pro TESTING_GET_SCREEN_SIZE, test=test, exit_on_error=exit_on_error ++; ++print, 'basic test (call without Display name)' ++taille=GET_SCREEN_SIZE(resolution=resolution) ++print, 'Screen Size (in pixels) :', taille ++print, 'Pixel Size (in mm) :', resolution ++; ++; are the values "reasonnables" ? ++; 1/ positives values ++; 2/ (non blocking) quasi square pixels ++; 3/ (non blocking) non excessive aspect ratio for the whole screen ++; ++nb_doubts=0 ++nb_pbs=0 ++if (taille[0] LE 0) then nb_pbs=nb_pbs+1 ++if (taille[1] LE 0) then nb_pbs=nb_pbs+1 ++if (resolution[0] LE 0) then nb_pbs=nb_pbs+1 ++if (resolution[1] LE 0) then nb_pbs=nb_pbs+1 ++; ++pixel_aspect_ratio=resolution[1]/resolution[0] ++if ((pixel_aspect_ratio LT 0.95) OR (pixel_aspect_ratio GT 1.05)) then begin ++ nb_doubts=nb_doubts+1 ++ MESSAGE, /continue, 'the pixels of this screen are not square !' ++endif ++; ++screen_aspect_ratio=taille[1]/taille[0] ++if ((screen_aspect_ratio LT 0.5) OR (screen_aspect_ratio GT 2.)) then begin ++ nb_doubts=nb_doubts+1 ++ MESSAGE, /continue, 'this screen has strange aspect ration !! (> 2)' ++endif ++; ++if (nb_pbs GT 0) then begin ++ MESSAGE, STRING(nb_pbs)+' problem(s) found (size(s) <= 0 !!)', /continue ++ if KEYWORD_SET(exit_on_error) then EXIT, status=1 ++endif else begin ++ MESSAGE, 'No problem found', /continue ++endelse ++; ++if (nb_doubts GT 0) then begin ++ MESSAGE, STRING(nb_doubts)+' doubt(s) found (see the values)', /continue ++endif else begin ++ MESSAGE, 'No doubt found', /continue ++endelse ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; --------------------------------------------------- ++; ++pro TEST_GET_SCREEN_SIZE ++; ++TESTING_GET_SCREEN_SIZE, /exit_on_error ++; + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_hist_2d.pro cvs/gdl/testsuite/test_hist_2d.pro +--- gdl-0.9rc4/testsuite/test_hist_2d.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_hist_2d.pro 2010-04-07 09:04:28.000000000 -0600 +@@ -0,0 +1,67 @@ ++; by Sylwester Arabas ++ ++pro ensure_equal, checkno, a, b ++ if ~array_equal(size(a), size(b)) || ~array_equal(a, b, /no_typeconv) then begin ++ message, "check " + checkno + " failed", /conti ++ exit, status=1 ++ endif ++end ++ ++pro test_hist_2d ++ ++ message, 'basic tests...', /conti ++ ensure_equal, '01', hist_2d([1],[1]), [[0,0],[0,1l]] ; \ ++ ensure_equal, '02', hist_2d([0],[1],max1=.1), [[0],[1l]] ; |- dimensions check ++ ensure_equal, '03', hist_2d([1],[0],max2=.1), reform([0,1l],2,1) ; / ++ ensure_equal, '04', hist_2d([1,1],[1,1,1]), [[0,0],[0,2l]] ; - non-equal array length ++ ensure_equal, '05', hist_2d(dist(2),dist(2),max2=1), [[1,0],[0,2l]] ; - max2 kw check ++ ensure_equal, '06', hist_2d(dist(2),dist(2),max2=2), [[1,0],[0,3],[0,0l]]; - max2 kw check ++ ensure_equal, '07', hist_2d(dist(2),dist(2),max1=1), [[1,0],[0,2l]] ; - max1 kw check ++ ensure_equal, '08', hist_2d(dist(2),dist(2),max1=2), [[1,0,0],[0,3,0l]] ; - max1 kw check ++ ensure_equal, '09', hist_2d(dist(2),dist(2),bin1=2), [[1],[3l]] ; - bin1 kw check ++ ensure_equal, '10', hist_2d(dist(2),dist(2),bin2=2), reform([1,3l],2,1) ; - bin2 kw check ++ ++ ; result should always be a 2D long array ++ data = [ $ ++ ptr_new(1b), $ ++ ptr_new([-3,4]), $ ++ ptr_new(-10 + dindgen(20)), $ ++ ptr_new(findgen(2,3,1,1,3)), $ ++ ptr_new(randomn(seed, 3, 3)), $ ++ ptr_new(1000*randomu(seed, 2,1,1,1,2)), $ ++ ptr_new([1, !VALUES.D_NAN, !VALUES.D_NAN]), $ ++ ptr_new([-10,-9]) $ ++ ] ++ bins = [ptr_new(1b), ptr_new(.1)] ++ mins = [ptr_new(10b), ptr_new(-.1)] ++ maxs = [ptr_new(12b), ptr_new(13.)] ++ for i = 0, n_elements(data) - 1 do begin; first data array ++ message, 'case ' + strtrim(string(i + 1), 2) + ' / ' + strtrim(string(n_elements(data)), 2), /conti ++ for j = 0, n_elements(data) - 1 do begin; second data array ++ for mi1=0,1 do for mi2=0,1 do for ma1=0,1 do for ma2=0,1 do for bi1=0,1 do for bi2=0,1 do begin ++ for bare = 0, 1 do begin; with optional arguments or not ++ a = bare $ ++ ? hist_2d(*(data[i]), *(data[j])) $ ++ : hist_2d(*(data[i]), *(data[j]), $ ++ min1=*(mins[mi1]), $ ++ min2=*(mins[mi2]), $ ++ max1=*(maxs[ma1]), $ ++ max2=*(maxs[ma2]), $ ++ bin1=*(bins[bi1]), $ ++ bin2=*(bins[bi2]) $ ++ ) ++ if (size(a))[0] ne 2 || size(a,/type) ne 3 then begin ++ message, "ERROR", /conti ++ exit, status=1 ++ endif ++ endfor ++ endfor ++ endfor ++ endfor ++ ++ for i = 0, n_elements(data) - 1 do ptr_free, data[i] ++ for i = 0, n_elements(mins) - 1 do ptr_free, mins[i] ++ for i = 0, n_elements(maxs) - 1 do ptr_free, maxs[i] ++ for i = 0, n_elements(bins) - 1 do ptr_free, bins[i] ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_idl8.pro cvs/gdl/testsuite/test_idl8.pro +--- gdl-0.9rc4/testsuite/test_idl8.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_idl8.pro 2010-04-08 01:21:15.000000000 -0600 +@@ -0,0 +1,45 @@ ++pro o__define ++ struct = {o, a:0} ++end ++ ++function o::aFun, v ++ return, v ++end ++ ++pro o::aPro, v ++ v = 2 ++end ++ ++pro test_idl8 ++ ++ a = [1, 2, 3] ++ ++ message, 'testing FOREACH statement', /conti ++ foreach i of a do i = 0 ; should do nothing ++ sum = 0 ++ foreach i of a do begin ++ sum += i ++ end ++ if sum ne total(a) then begin ++ message, '1+2+3 != 6', /conti ++ exit, status=1 ++ endif ++ ++ message, 'testing negative array indices (for ranges)', /conti ++ if total(a[-2: -1]) ne total(a[n_elements(a) - 2 : n_elements(a) - 1]) then begin ++ message, '2+3 != 5', /conti ++ exit, status=1 ++ endif ++ ++ message, 'testing the dot operator for member routine access', /conti ++ o = obj_new('o') ++ if o.aFun(1) ne 1 then begin ++ exit, status=1 ++ endif ++ o.aPro, v ++ if v ne 2 then begin ++ exit, status=1 ++ endif ++ obj_destroy, o ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_interpol.pro cvs/gdl/testsuite/test_interpol.pro +--- gdl-0.9rc4/testsuite/test_interpol.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_interpol.pro 2010-04-09 04:30:38.000000000 -0600 +@@ -0,0 +1,39 @@ ++; by Sylwester Arabas ++pro test_interpol ++ ++ ; test data - a parabola probed at four points ++ x = [0.,1.,2.,3.] ++ y = x*x ++ ++ ; 2-parameter case, linear interpolation, sanity check ++ if ~array_equal(y, interpol(y, 4)) then begin ++ message, '2p, linear', /conti ++ exit, status=1 ++ endif ++ ++ ; 2-parameter case, linear vs. spline interpolation ++ wh = where(interpol(y, 7, /spline) gt interpol(y, 7), cnt) ++ if cnt ne 0 then begin ++ message, '2p, spline', /conti ++ exit, status=1 ++ endif ++ ++ ; 3-parameter case, linear vs. spline interpolation ++ mid = [.5,1.5,2.5] ++ wh = where(interpol(y, x, mid, /spline) gt interpol(y, x, mid), cnt) ++ if cnt ne 0 then begin ++ message, '3p, spline', /conti ++ exit, status=1 ++ endif ++ ++ ; ensuring interpol(/spline) returns the same as spl_interp() ++ ; (intentionally swapping x,y with y,x) ++ if ~array_equal( $ ++ interpol(x, y, mid, /spline), $ ++ spl_interp(y, x, spl_init(y, x), mid) $ ++ ) then begin ++ message, 'interpol(/spline) != spl_interp', /conti ++ exit, status=1 ++ endif ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_known_bugs.pro cvs/gdl/testsuite/test_known_bugs.pro +--- gdl-0.9rc4/testsuite/test_known_bugs.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_known_bugs.pro 2010-04-02 08:50:58.000000000 -0600 +@@ -0,0 +1,101 @@ ++; ++; AC 02 April 2010 ++; ++; We put here some well known problems in order to help ++; beginners to setup well installed/compiled GDL ++; ++; this program can be used in any versions of GDL ++; It should help you to found important bugs and ++; solution to avoid them. ++; ++; ----------------------------------------------- ++; ++pro TEST_BUG_LENNY, verbose=verbose ++; ++if KEYWORD_SET(verbose) then begin ++ print, 'A bug related to ImageMagick and Plplot exists in' ++ print, 'Debian Lenny and (maybe) in recent Ubuntu (9.10, 10.4).' ++ print, 'If GDL crashs here, please re-compiled PLPlot library' ++ print, 'using option -DENABLE_DYNDRIVERS=OFF in cmake' ++endif ++; ++WINDOW ++WDELETE ++; ++if KEYWORD_SET(verbose) then begin ++ print, 'will crash here if plplot not well compiled (on some plateforms !)' ++endif ++; ++WINDOW ++WDELETE ++; ++print, 'test TEST_BUG_LENNY passed' ++; ++end ++; ++; ----------------------------------------------- ++; ++pro TEST_BUG_FFT, verbose=verbose ++; ++if KEYWORD_SET(verbose) then begin ++ print, 'Old version of GDL do have, in the important FFT procedure,' ++ print, 'some bugs and bad managment of some type (Integer, Complex) in input' ++ print, 'This call helps you to quickly know if you must upgrade to version >= gdl-0.9rc4' ++endif ++; ++a=L64INDGEN(16) ++b=FFT(a) ++if TOTAL(ABS(a-b)) EQ 0 then begin ++ print, 'You are using an old version of GDL, please upgrade to gdl >= gdl-0.9rc4' ++ print, '(using FFTw library is better)' ++ print, 'test TEST_BUG_FFT *NOT* passed' ++ exit, 1 ++endif ++; ++print, 'test TEST_BUG_FFT passed' ++; ++end ++; ++; ----------------------------------------------- ++; ++pro TEST_BUG_SAVE_RESTORE, verbose=verbose ++; ++if KEYWORD_SET(verbose) then begin ++ print, 'A change in the CMSR library in May 2009 affects the behavior of SAVE/RESTORE in GDL' ++ print, 'If this test failed, please use an old version of the library' ++ print, 'or change line 286c279 in CMRESTORE ' ++ print, 'bad if nnames EQ 0 AND n_par EQ 0 then kall = 1' ++ print, 'good if nnames EQ 0 then kall = 1' ++endif ++; ++a=1 ++b=1. ++SAVE, file='DemoGDL.xdr', a, b ++RESTORE, file='DemoGDL.xdr', /verbose ++; ++print, 'test TEST_BUG_SAVE_RESTORE passed' ++; ++end ++; ++; ----------------------------------------------- ++; ++pro TEST_KNOWN_BUGS, verbose=verbose, quiet=quiet ++; ++if NOT(KEYWORD_SET(quiet)) then begin ++ print, 'Despite strong efforts, GDL cannot take into account' ++ print, 'all tricks and problems in dependances and related softwares (libraries).' ++ print, 'In some cases, on some distributions, we know we have' ++ print, 'reproducible crashs and, with those programs, we try to help you to know' ++ print, 'wether you will suffer from some problems' ++ print, '' ++ print, 'If GDL crashes when running first time this procedure, please re-run GDL and call:' ++ print, 'TEST_KNOWN_BUGS, /verbose' ++ print, 'in order to receive detailed informations about your problem' ++endif ++; ++TEST_BUG_LENNY, verbose=verbose ++TEST_BUG_FFT, verbose=verbose ++TEST_BUG_SAVE_RESTORE, verbose=verbose ++; ++end ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_product.pro cvs/gdl/testsuite/test_product.pro +--- gdl-0.9rc4/testsuite/test_product.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_product.pro 2010-05-21 10:24:01.329908063 -0600 +@@ -0,0 +1,198 @@ ++; ++; AC 04/02/2010 under GNU GPL v2/3 ++; ++; Test of PRODUCT, some options are mandatory ++; for READFITS routine in Astron package ++; ++pro TEST_PRODUCT_BASIC ++ ++a=[1,2,3,4,5] ++ ++print, 'input :', a ++print, PRODUCT(a) ++print, PRODUCT(a,/cumul) ++print, PRODUCT(a,/int) ++print, PRODUCT(a,/cumul,/int) ++; ++print, 'Same data but with NaN ...' ++; ++a=FINDGEN(5)+1 ++a[2]=!values.f_nan ++print, 'input :', a ++print, PRODUCT(a,/nan) ++print, PRODUCT(a,/cumul,/nan) ++print, PRODUCT(a,/int,/nan) ++print, PRODUCT(a,/cumul,/int,/nan) ++; ++end ++; ++; --------------------------- ++; ++pro TEST_PRODUCT_1D, help=help, nan=nan, no_format=no_format ++; ++if KEYWORD_SET(help) then begin ++ print, 'pro TEST_PRODUCT_1D, help=help, nan=nan, no_format=no_format' ++ return ++endif ++ ++if NOT(KEYWORD_SET(no_format)) then begin ++ f4='(A,4G12)' & i4='(A,4I12)' ++ fi='(A,G12)' & i1='(A,I12)' ++endif else begin ++ ;; not ready in GDL (AC 11/02/2010) ++ f4='' & f1='' ++ i4='' & i1='' ++endelse ++; ++txt0='input ' ++txt1='cumul ' ++txt2='product ' ++txtNaN='(with /Nan) :' ++txtNon='(NONE /Nan) :' ++ vide=' :' ++txt0=txt0+vide ++; ++print, 'Reference WITHOUT Infinity nor NaN' ++; ++a=FINDGEN(4)+1 ++; ++print, format=f1, txt0, a ++print, format=i4, txt1+txtNon, PRODUCT(a,/int,/cum) ++print, format=i4, txt1+txtNaN, PRODUCT(a,/int,/cum,/nan) ++print, format=i1, txt2+txtNon, PRODUCT(a,/int) ++print, format=i1, txt2+txtNaN, PRODUCT(a,/int,/nan) ++; ++print, 'Running WITH Infinity OR NaN (/nan)' ++; ++b=a ++b[1]=!values.f_infinity ++if KEYWORD_SET(nan) then b[1]=!values.f_nan ++; ++print, format=f1, txt0, b ++print, format=i4, txt1+txtNon, PRODUCT(b,/int,/cum) ++print, format=i4, txt1+txtNaN, PRODUCT(b,/int,/cum,/nan) ++print, format=i1, txt2+txtNon, PRODUCT(b,/int) ++print, format=i1, txt2+txtNaN, PRODUCT(b,/int,/nan) ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; --------------------------------- ++; ++pro TEST_PRODUCT_2D, dim=dim, test=test ++ ++print, 'Reference WITHOUT dim and WITHOUT Infinity nor NaN' ++ ++a=FINDGEN(2,3)+1 ++ ++print, PRODUCT(a,/int) ++print, PRODUCT(a,/int,/nan) ++print, PRODUCT(a,/int,/cum) ++print, PRODUCT(a,/int,/cum,/nan) ++ ++print, 'data WITHOUT dim and WITH Infinity nor NaN' ++ ++b=a ++b[1]=!values.f_infinity ++ ++print, PRODUCT(b,/int) ++print, PRODUCT(b,/int,/nan) ++print, PRODUCT(b,/int,/cum) ++print, PRODUCT(b,/int,/cum,/nan) ++ ++dim=1 ++ ++print, 'Reference WITHOUT dim and WITHOUT Infinity nor NaN' ++ ++a=FINDGEN(2,3)+1 ++ ++print, PRODUCT(a,dim,/int) ++print, PRODUCT(a,dim,/int,/nan) ++print, PRODUCT(a,dim,/int,/cum) ++print, PRODUCT(a,dim,/int,/cum,/nan) ++ ++print, 'data WITHOUT dim and WITH Infinity nor NaN' ++ ++b=a ++b[1]=!values.f_infinity ++ ++print, PRODUCT(b,dim,/int) ++print, PRODUCT(b,dim,/int,/nan) ++print, PRODUCT(b,dim,/int,/cum) ++print, PRODUCT(b,dim,/int,/cum,/nan) ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; --------------------------------------------------- ++; ++pro TEST_PRODUCT_ALL_TYPE, test=test, nan=nan, $ ++ verbose=verbose, very_verbose=very_verbose, $ ++ exit_on_error=exit_on_error ++; list of TYPE ++; http://idlastro.gsfc.nasa.gov/idl_html_help/SIZE.html ++; ++a=INDGEN(5)+1 ++; ++; not ready now, pb with INT types ... ++if KEYWORD_SET(nan) then begin ++ print, 'Sorry, this option is not ready now' ++ ;a[2]=!value.f_nan ++endif ++; ++ref1=PRODUCT(a) ++ref2=PRODUCT(a,/int) ++ref3=PRODUCT(a,/cumul) ++ref4=PRODUCT(a,/cumul,/int) ++tref3=TOTAL(ref3) ++tref4=TOTAL(ref4) ++; ++for ii=1, 15 do begin ++ if ii EQ 7 then CONTINUE ;; String ++ if ii EQ 8 then CONTINUE ;; Struc ++ if ii EQ 10 then CONTINUE ;; Pointer ++ if ii EQ 11 then CONTINUE ;; Objref ++ ;; ++ a=1b+INDGEN(5, type=ii) ++ ;; ++ err='' ++ if (ABS(ref1- PRODUCT(a)) GT 1e-6) then err=err+'Erreur 1, ' ++ if (ABS(tref3-TOTAL(PRODUCT(a,/cumul))) GT 1e-6) then err=err+'Erreur 2, ' ++ if (ABS(ref2- PRODUCT(a,/int)) GT 1e-6) then err=err+'Erreur 3, ' ++ if (ABS(tref4-TOTAL(PRODUCT(a,/int, /cumul))) GT 1e-6) then err=err+'Erreur 4, ' ++ ;; ++ if STRLEN(err) EQ 0 then begin ++ err='None' ++ endif else begin ++ if KEYWORD_SET(exit_on_error) then begin ++ MESSAGE, err + '(type: ' + SIZE(A,/type) + ')', /conti ++ EXIT, status=1 ++ endif ++ endelse ++ ;; ++ if KEYWORD_SET(verbose) then begin ++ print, 'current TYPE : ', SIZE(A,/type), ', Type of Errors: ', err ++ endif ++ if KEYWORD_SET(very_verbose) then begin ++ print, 'raw :', PRODUCT(a) ++ print, '/cumul :', PRODUCT(a,/cumul) ++ print, '/int :', PRODUCT(a,/int) ++ print, '/int, /cumul :', PRODUCT(a,/cumul,/int) ++ endif ++endfor ++; ++if KEYWORD_SET(exit_on_error) then MESSAGE, /continue, 'All tests OK' ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; --------------------------------------------------- ++; ++; SA: for inclusion in the "make check" rule ++pro TEST_PRODUCT ++ TEST_PRODUCT_BASIC ++ TEST_PRODUCT_ALL_TYPE, /exit_on_error ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_read_jpeg.pro cvs/gdl/testsuite/test_read_jpeg.pro +--- gdl-0.9rc4/testsuite/test_read_jpeg.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_read_jpeg.pro 2010-04-14 09:07:58.000000000 -0600 +@@ -0,0 +1,109 @@ ++; ++; AC 28/01/2010 ++; ++; quick test reading back and displaying a JPEG ++; ++; What is tested ? ++; -- reading back a small (600x259) JPEG image ++; -- using well positions index in TVSCL ++; ++pro TEST_READ_JPEG, filename=filename, path=path, $ ++ help=help, test=test, debug=debug, verbose=verbose ++; ++if KEYWORD_SET(help) then begin ++ print, 'pro TEST_READ_JPEG, filename=filename, path=path, factor=factor, $' ++ print, ' help=help, test=test, debug=debug, verbose=verbose' ++ print, '' ++ print, 'You can provide any JPEG image using FILENAME=' ++ print, 'We look in !Path. You can provide alternate paths with PATH=' ++ return ++endif ++; ++if N_ELEMENTS(path) EQ 0 then path=!path ++if N_ELEMENTS(filename) EQ 0 then filename='Saturn.jpg' ++; ++title0='the 3 channels in greyscale' ++title1='<<'+filename+'>> in Colors' ++; ++liste_of_files=FILE_SEARCH(STRSPLIT(path,':',/ex),filename) ++; ++if (N_ELEMENTS(liste_of_files) EQ 1) then begin ++ if (STRLEN(liste_of_files) EQ 0) then begin ++ MESSAGE, /continue, 'No file founded ...' ++ MESSAGE, /continue, 'File : '+filename ++ MESSAGE, /continue, 'Path : '+path ++ return ++ endif ++ one_file_and_path=liste_of_files ++endif ++if N_ELEMENTS(liste_of_files) GT 1 then begin ++ MESSAGE, /continue, $ ++ 'Warning: more than one file found, we used the first one !' ++ one_file_and_path=liste_of_files[0] ++endif ++; ++if KEYWORD_SET(verbose) then begin ++ MESSAGE, 'reading : '+one_file_and_path, /continue ++endif ++; ++READ_JPEG, one_file_and_path, image ++; ++xy_img=(SIZE(image,/dim))[1:2] ++xy_screen=GET_SCREEN_SIZE() ++loose=50 ; perte (surtout en vertical: la/les barre(s) de menu KDE/Gnome ++xy_screen=xy_screen-loose ++; ++vertical=-1 ++; rentre-t-on dans de l'horizontal ? ++if (xy_screen[0] GT 3*xy_img[0]) AND (xy_screen[1] GT xy_img[1]) then begin ++ vertical=0 ++ xy_win0=xy_img ++ xy_win0[0]=xy_win0[0]*3 ++ xy_win1=xy_img ++endif ++; rentre-t-on dans du vertical ? (on prefere ce mode-ci) ++if (xy_screen[0] GT xy_img[0]) AND (xy_screen[1] GT 3*xy_img[1]) then begin ++ vertical=1 ++ xy_win0=xy_img ++ xy_win0[1]=xy_win0[1]*3 ++ xy_win1=xy_img ++endif ++; ++if (vertical EQ -1) then begin ++ MESSAGE, /continue, 'Soo small screen/too big image ! automatic rescaling !!' ++ MESSAGE, /continue, 'Some part of the image may be cut (top and right sides)' ++ ;; ++ factor_h_x=ROUND(1+xy_img[0]*3/xy_screen[0]) ++ factor_h_y=ROUND(1+xy_img[1]/xy_screen[1]) ++ factor_v_x=ROUND(1+xy_img[0]/xy_screen[0]) ++ factor_v_y=ROUND(1+xy_img[1]*3/xy_screen[1]) ++ factor_h=MAX([factor_h_x,factor_h_y]) ++ factor_v=MAX([factor_v_x,factor_v_y]) ++ factor=MIN([factor_h,factor_v],vertical) ++ ;; ++ xy_win1=xy_img/factor ++ image=REBIN(image[*,0:xy_win1[0]*factor-1,0:xy_win1[1]*factor-1],3,xy_win1[0],xy_win1[1]) ++ ;; ++ xy_win0=xy_img/factor ++ if (vertical EQ 1) then begin ++ xy_win0[1]=xy_win0[1]*3 ++ endif else begin ++ xy_win0[0]=xy_win0[0]*3 ++ endelse ++endif ++; ++; just a trick to be able to test for small screens ++if KEYWORD_SET(debug) then half=debug ++; ++WINDOW, 0, xsize=xy_win0[0], ysize=xy_win0[1], title=title0 ++TVSCL, image[0,*,*], 0 ++TVSCL, image[1,*,*], 1 ++TVSCL, image[2,*,*], 2 ++; ++WINDOW, 1, xsize=xy_win1[0], ysize=xy_win1[1], title=title1 ++TVSCL, image, /true ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++ +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_rebin.pro cvs/gdl/testsuite/test_rebin.pro +--- gdl-0.9rc4/testsuite/test_rebin.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_rebin.pro 2010-02-20 13:46:27.000000000 -0700 +@@ -0,0 +1,11 @@ ++; by Sylwester Arabas ++pro test_rebin ++ ; testing the two ways of specifying new dimensions: ++ a = randomn(seed,2,3,4,5) ++ if $ ++ ~array_equal(size(a), size(rebin(a,2,3,4,5))) || $ ++ ~array_equal(size(a), size(rebin(a,[2,3,4,5]))) || $ ++ ~array_equal([4,6,8,10], size(rebin(a,4,6,8,10), /dim)) || $ ++ ~array_equal([4,6,8,10], size(rebin(a,[4,6,8,10]), /dim)) $ ++ then exit, status=1 ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_spher_harm.pro cvs/gdl/testsuite/test_spher_harm.pro +--- gdl-0.9rc4/testsuite/test_spher_harm.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_spher_harm.pro 2010-05-31 04:59:21.000000000 -0600 +@@ -0,0 +1,105 @@ ++; by Sylwester Arabas ++ ++; this one does not perform any sanity checks, and is intedned ++; only for testing the C++ implementation as done below ++function spher_harm_gdl, theta, phi, l, m ++ return, sqrt( $ ++ (2. * l + 1) / 4. / !PI * factorial(l - abs(m)) / factorial(l + abs(m)) $ ++ ) * legendre(cos(theta), l, abs(m)) * exp(complex(0, m * phi)) * (m lt 0 ? -1. : 1.)^m ++end ++ ++; tests SPHER_HARM (and btw FACTORIAL and LEGENDRE) ++pro test_spher_harm ++ ++ ; testing output shape ++ if size(spher_harm(0.,0.,0,0), /dimensions) ne 0 then begin ++ message, 'spher_harm(scalar, ...) should be scalar', /conti ++ exit, status=1 ++ endif ++ if size(spher_harm([0.],[0.],0,0), /dimensions) ne 1 then begin ++ message, 'spher_harm([scalar], ...) should be vector', /conti ++ exit, status=1 ++ endif ++ if n_elements(spher_harm([0.,0.,0.],0.,0,0)) ne 3 then begin ++ message, 'spher_harm(vector, scalar, ...) should be vector', /conti ++ exit, status=1 ++ endif ++ if n_elements(spher_harm(0.,[0.,0.,0.],0,0)) ne 3 then begin ++ message, 'spher_harm(scalar, vector, ...) should be vector', /conti ++ exit, status=1 ++ endif ++ ++ ; testing output type ++ in = [ $ ++ ptr_new(1b), $ ++ ptr_new(1), $ ++ ptr_new(1l), $ ++ ptr_new(1.), $ ++ ptr_new(1d), $ ++ ptr_new(complex(1,1)), $ ++ ptr_new(dcomplex(1,1)), $ ++ ptr_new([1b]), $ ++ ptr_new([1]), $ ++ ptr_new([1l]), $ ++ ptr_new([1.]), $ ++ ptr_new([1d]), $ ++ ptr_new([complex(1,1)]), $ ++ ptr_new([dcomplex(1,1)]) $ ++ ] ++ foreach i of in do begin ++ if (size(spher_harm(*i, 0d, 0, 0), /type) ne 9) then begin ++ message, 'spher_harm(*, double, ...) should be dcomplex' ++ exit, status=1 ++ endif ++ if (size(spher_harm(*i, 0., 0, 0, /double), /type) ne 9) then begin ++ message, 'spher_harm(*, *, ..., /double) should be dcomplex' ++ exit, status=1 ++ endif ++ if size(*i, /type) ne 9 && size(*i, /type) ne 5 then begin ++ if (size(spher_harm(*i, 0., 0, 0), /type) ne 6) then begin ++ message, 'spher_harm(not double, not double, ...) should be complex' ++ exit, status=1 ++ endif ++ endif ++ endforeach ++ foreach i of in do ptr_free, i ++ ++ ; testing output values against GDL-computed harmonics ++ thetas = findgen(10.) ++ phis = dindgen(5.) ++ ls = indgen(2) ++ eps = 1e-7 ++ foreach theta of thetas do foreach phi of phis do foreach l of ls do begin ++ foreach m of indgen(2*l+1) - l do begin ++ ; scalar computations ++ if abs(spher_harm(theta, phi, l, m) - spher_harm_gdl(theta, phi, l, m)) gt eps then begin ++ message, 'spher_harm() != spher_harm_gdl()', /conti ++ exit, status=1 ++ endif ++ ++ ; vector computations ++ if total(abs(spher_harm(thetas, phi, l, m) - spher_harm_gdl(thetas, phi, l, m))) gt eps then begin ++ message, 'spher_harm(vector, scalar, ...) != spher_harm_gdl(vector, scalar, ...)', /conti ++ exit, status=1 ++ endif ++ if total(abs(spher_harm(theta, phis, l, m) - spher_harm_gdl(theta, phis, l, m))) gt eps then begin ++ message, 'spher_harm(scalar, vector, ...) != spher_harm_gdl(scalar, vector, ...)', /conti ++ exit, status=1 ++ endif ++ if total(abs(spher_harm(theta, phis, l, m) - spher_harm_gdl(theta, phis, l, m))) gt eps then begin ++ message, 'spher_harm(vector, vector, ...) != spher_harm_gdl(vector, vector, ...)', /conti ++ exit, status=1 ++ endif ++ ++ ; one more check for negative-m case ++ if m lt 0 then begin ++ if spher_harm(theta, phi, l, m) ne (-1)^(-m) * conj(spher_harm(theta, phi, l, -m)) then begin ++ message, 'spher_harm(..., -m) != -1^m * conj(spher_harm(..., m))', /conti ++ exit, status=1 ++ endif ++ endif ++ ++ endforeach ++ endforeach ++ ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_spl_init.pro cvs/gdl/testsuite/test_spl_init.pro +--- gdl-0.9rc4/testsuite/test_spl_init.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_spl_init.pro 2010-05-31 07:20:34.000000000 -0600 +@@ -0,0 +1,163 @@ ++; ++; testsuite for the SPL_INIT function ++; Lea Noreskal and Alain Coulais ++; Mai 2010 ++; under GNU GPL 2 or later ++; ++pro TEST_SPL_INIT, test=test, help=help ++; ++if KEYWORD_SET(help) then begin ++ print, 'pro TEST_SPL_INIT, test=test, help=help' ++ return ++endif ++; ++; generating well known input ++x=(FINDGEN(21)/20.)*2.0*!PI ++y=SIN(X) ++a=FINDGEN(5) ++b=MAKE_ARRAY(7,/DOUBLE, VALUE = 1) ++c=[1,2,!values.f_nan,4,5] ++; ++status=0 ++; ++; ------------------------------- ++; Result equal to NaN ++; ++; YP0=NaN ++result=SPL_INIT(X, Y, YP0 = !values.f_nan, YPN_1 = 0.0) ++ ++if (TOTAL(FINITE(result, /NaN)) NE N_ELEMENTS(result) ) then begin ++ MESSAGE, 'result ne NaN', /continue ++ EXIT, status=1 ++endif ++; ++; YPN_1=NaN ++; ++result=SPL_INIT(X, Y, YP0 = 0.0, YPN_1 = !values.f_nan) ++; ++if (TOTAL(FINITE(result, /NaN)) NE N_ELEMENTS(result) ) then begin ++ MESSAGE, 'result ne NaN', /continue ++ EXIT, status=1 ++endif ++ ++ ++; YP0=YPN_1=NaN ++result=SPL_INIT(X, Y, YP0 = !values.f_nan, YPN_1 = !values.f_nan) ++ ++if (TOTAL(FINITE(result, /NaN)) NE N_ELEMENTS(result) ) then begin ++ MESSAGE, 'result ne NaN', /continue ++ EXIT, status=1 ++endif ++; ++; X contains a Nan value ++; ++result=SPL_INIT(c, a) ++if (TOTAL(FINITE(result, /NaN)) NE N_ELEMENTS(result) ) then begin ++ MESSAGE, 'result ne NaN', /continue ++ EXIT, status=1 ++endif ++ ++; Y contains a Nan value ++result=SPL_INIT(A, C) ++if (TOTAL(FINITE(result, /NaN)) NE N_ELEMENTS(result) ) then begin ++ MESSAGE, 'result ne NaN', /continue ++ EXIT, status=1 ++endif ++ ++; At least two consecutive X values are identical ++result=SPL_INIT(B, B) ++if (TOTAL(FINITE(result, /NaN)) NE N_ELEMENTS(result) ) then begin ++ MESSAGE, 'result ne NaN', /continue ++ EXIT, status=1 ++endif ++; ++; ------------------------------- ++; When giving 0 value as keyword, sould return same results ++; than without keywords ++; ++yy=MAKE_ARRAY(N_ELEMENTS(X),/DOUBLE, VALUE = 1) ++; ++kwyp0=0.0 ++kwyn1=0.0 ++; ++;without key words (reference) ++XY=SPL_INIT(X, yy) ++if (ARRAY_EQUAL(XY,0) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : SPL_INIT(X,Y) wrong result', /continue ++ EXIT, status=1 ++endif ++ ++;with key word YP0 ++XYP=SPL_INIT(X, yy, YP0 = kwyp0) ++if (ARRAY_EQUAL(XYP,0) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : SPL_INIT(X,Y,YP0) wrong result', /continue ++ EXIT, status=1 ++endif ++ ++;with YPN_1 ++XYPN=SPL_INIT(X, yy, YPN_1 = kwyn1) ++if (ARRAY_EQUAL(XYPN,0) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : SPL_INIT(X,Y,YPN_1) wrong result', /continue ++ EXIT, status=1 ++endif ++ ++;with key words YP0 and YPN_1 ++result=SPL_INIT(X, yy, YP0 = kwyp0, YPN_1 = kwyn1) ++if (ARRAY_EQUAL(result,0) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : SPL_INIT(X,Y,YP0,YPN_1) wrong result', /continue ++ EXIT, status=1 ++endif ++; ++; ------------------------------- ++; When input X and Y do not have the same number of elements ... ++; ++; n_element(X) lt n_element(Y) ++result=SPL_INIT(A,B) ++if (ARRAY_EQUAL(result,0) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : n_element(X) lt n_element(Y)', /continue ++ EXIT, status=1 ++endif ++; ++; n_element(X) gt n_element(Y) ++; result undefined ++result=SPL_INIT(Y,B) ++; if (ARRAY_EQUAL(result,0) EQ 0 ) then begin ++;MESSAGE, 'SPL_INIT error : n_element(X) gt n_element(Y)', /continue ++;EXIT, status=1 ++;endif ++; ++; ------------------------------- ++; Cases with YP0 or YPN_1 equal infinity... ++; ++;with key words YP0=infinity and YPN_1 != infinity ++result=SPL_INIT(X, yy, YP0 = !values.F_INFINITY, YPN_1 = kwyn1) ++;result=SPL_INIT(X,yy,YPN_1=0.0)=XYPN? ++; ++if (ARRAY_EQUAL(XYPN,result) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : YP0==inf and YPN_1 != inf', /continue ++ EXIT, status=1 ++endif ++; ++;with key words YP0=infinity and YPN_1 != infinity ++result=SPL_INIT(X, yy, YP0 = kwyp0 , YPN_1 = !values.F_INFINITY) ++;result=SPL_INIT(X,yy,YP0=-1.1) =XYP? ++; ++if (ARRAY_EQUAL(XYP,result) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : YP0!=inf and YPN_1 == inf', /continue ++ EXIT, status=1 ++endif ++; ++; with keywords YP0=YPN_1=INFINITY ++result=SPL_INIT(X, yy, YP0 = !values.f_infinity, YPN_1 = !values.f_infinity) ++;result=SPL_INIT(X,yy) =XY? ++; ++if (ARRAY_EQUAL(XY,result) EQ 0 ) then begin ++ MESSAGE, 'SPL_INIT error : YP0==YPN_1 == inf', /continue ++ EXIT, status=1 ++endif ++; ++MESSAGE, 'No (real) problem found in TEST_SPL_INIT', /continue ++; ++if KEYWORD_SET(test) then STOP ++; ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_str_functions.pro cvs/gdl/testsuite/test_str_functions.pro +--- gdl-0.9rc4/testsuite/test_str_functions.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_str_functions.pro 2010-04-16 08:41:32.000000000 -0600 +@@ -0,0 +1,80 @@ ++; ++; Alain Coulais, 16 Avril 2010 ++; ++; Few basic tests on functions working on Strings ++; ++pro TEST_STRMID, exit_on_error=exit_on_error, test=test ++; ++a='azerty' ++flag_pb=0 ++; ++if NOT(STRCMP(a,STRMID(a,0))) then flag_pb=1 ++if NOT(STRCMP(a,STRMID(a,0,100))) then flag_pb=flag_pb+1 ++; ++res=STRMID(a,3) ++if NOT(STRCMP(res,'rty')) then flag_pb=flag_pb+1 ++; ++if flag_pb GT 0 then begin ++ MESSAGE, /continue, STRING(flag_pb)+' ERROR(s) found in STRMID' ++ if KEYWORD_SET(exit_on_error) then EXIT, status=1 ++endif else begin ++ MESSAGE, /continue, 'No ERROR found in STRMID' ++endelse ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; --------------- ++; ++; return "0" when the arrays of substrings are different, else return "1" ++function STRCMP_MULTI, str1, str2, debug=debug ++; ++if N_ELEMENTS(str1) NE N_ELEMENTS(str2) then return, 0 ++; ++for ii=0, N_ELEMENTS(str1)-1 do begin ++ if KEYWORD_SET(debug) then print, ii, str1[ii],str2[ii] ++ if NOT(STRCMP(str1[ii],str2[ii])) then return, 0 ++endfor ++return, 1 ++end ++; ++; ----------------------- ++; ++pro TEST_STRSPLIT, exit_on_error=exit_on_error, test=test, debug=debug ++; ++str = 'rouge&&bleu&&jaune&&pair&impair' ++expected_res1=['rouge','bleu','jaune','pair','impair'] ++expected_res2=['rouge','bleu','jaune','pair&impair'] ++; ++flag_pb=0 ++res1=STRSPLIT(str,'&&',/EXTRACT) ++if NOT(STRCMP_MULTI(res1,expected_res1,debug=debug)) then flag_pb=flag_pb+1 ++; ++res2=STRSPLIT(str,'&&',/EXTRACT,/REGEX) ++if NOT(STRCMP_MULTI(res2,expected_res2,debug=debug)) then flag_pb=flag_pb+1 ++; ++str2 = '<4>What<1>a<7>tangled<3>web<2>we<6>weave.' ++expected_res=['What','a','tangled','web','we','weave.'] ++res = STRSPLIT(str2,'<[0-9]+>',/EXTRACT,/REGEX) ++if NOT(STRCMP_MULTI(res,expected_res,debug=debug)) then flag_pb=flag_pb+1 ++; ++if flag_pb GT 0 then begin ++ MESSAGE, /continue, STRING(flag_pb)+' ERROR(s) found in STRSPLIT' ++ if KEYWORD_SET(exit_on_error) then EXIT, status=1 ++endif else begin ++ MESSAGE, /continue, 'No ERROR found in STRSPLIT' ++endelse ++; ++if KEYWORD_SET(test) then STOP ++; ++end ++; ++; --------------- ++; ++pro TEST_STR_FUNCTIONS ++; ++TEST_STRMID, /exit_on_error ++TEST_STRSPLIT, /exit_on_error ++; ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_suite.pro cvs/gdl/testsuite/test_suite.pro +--- gdl-0.9rc4/testsuite/test_suite.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/test_suite.pro 2010-05-21 10:24:01.372906136 -0600 +@@ -2,24 +2,27 @@ + + pro if_test + +-if 1 then $ +- if 0 then begin & end $ +-else if 1 then $ +- if 0 then begin & end $ +-else a=1e ++ if 1 then $ ++ if 0 then begin & end $ ++ else if 1 then $ ++ if 0 then begin & end $ ++ else a=1e ++ ++ if a ne 1e then begin ++ message, '***IF: ERROR', /conti ++ exit, status=1 ++ endif + +-if a ne 1e then print,'***IF: ERROR' +- +-print,'IF: OK' ++ print, 'IF: OK' + end + + + pro switch_test + +-a='abc' ++ a='abc' + +-;; empty +-switch a of ++ ;; empty ++ switch a of + + 1: + complex(1): begin & end +@@ -27,897 +30,1364 @@ + 'abc': + 1.0: begin & end + else: +-endswitch ++ endswitch + +-switch a of ++ switch a of + +- 1: print,'***SWITCH: ERROR' +- complex(1): print,'***SWITCH: ERROR' +- 'def': print,'***SWITCH: ERROR' ++ 1: begin ++ message, '***SWITCH: ERROR', /conti ++ exit, status=1 ++ end ++ complex(1): begin ++ message, '***SWITCH: ERROR', /conti ++ exit, status=1 ++ end ++ 'def': begin ++ message, '***SWITCH: ERROR', /conti ++ exit, status=1 ++ end + 'abc': begin + abc = 1 + end + 1.0: fall = abc+1 + else: e=1 +-endswitch ++ endswitch + +-if abc ne 1 then print,'***SWITCH: ERROR' +-if fall ne abc+1 then print,'***SWITCH: ERROR' +-if e ne 1 then print,'***SWITCH: ERROR' +- +-switch 1 of +- 0: print,"***SWITCH: ERROR" +- 0: print,"***SWITCH: ERROR" +- 1: +-endswitch ++ if abc ne 1 then begin ++ message, '***SWITCH: ERROR', /conti ++ exit, status=1 ++ endif ++ if fall ne abc+1 then begin ++ message, '***SWITCH: ERROR', /conti ++ exit, status=1 ++ endif ++ if e ne 1 then begin ++ message, '***SWITCH: ERROR', /conti ++ exit, status=1 ++ endif ++ ++ switch 1 of ++ 0: begin ++ message, "***SWITCH: ERROR", /conti ++ exit, status=1 ++ end ++ 0: begin ++ message, "***SWITCH: ERROR", /conti ++ exit, status=1 ++ end ++ 1: ++ endswitch + +-print,'SWITCH: OK' ++ print,'SWITCH: OK' + end + + pro case_test + +-a='abc' ++ a='abc' + +-case a of ++ case a of + +- 1: print,'***CASE: ERROR' +- complex(1): print,'***CASE: ERROR' +- 'def': print,'***CASE: ERROR' ++ 1: begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end ++ complex(1): begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end ++ 'def': begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end + 'abc': begin + c=1 + end +- 1.0: print,'***CASE: ERROR' +- else: print,'***CASE: ERROR' +-endcase +- +-if c ne 1 then print,'***CASE: ERROR' +- +-case a of ++ 1.0: begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end ++ else: begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end ++ endcase + +- 1: print,'***CASE: ERROR' +- complex(1): print,'***CASE: ERROR' +- 'def': print,'***CASE: ERROR' ++ if c ne 1 then begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ endif ++ ++ case a of ++ ++ 1: begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end ++ complex(1): begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end ++ 'def': begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end + 'a': begin +- print,'***CASE: ERROR' ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ end ++ 1.0d: begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 + end +- 1.0d: print,'***CASE: ERROR' + else: e=1 +-end ++ end + +-if e ne 1 then print,'***CASE: ERROR' ++ if e ne 1 then begin ++ message, '***CASE: ERROR', /conti ++ exit, status=1 ++ endif ++ ++ case 1 of ++ 0: begin ++ message, "***CASE: ERROR", /conti ++ exit, status=1 ++ end ++ 0: begin ++ message, "***CASE: ERROR", /conti ++ exit, status=1 ++ end ++ 1: ++ endcase + +-case 1 of +- 0: print,"***CASE: ERROR" +- 0: print,"***CASE: ERROR" +- 1: +-endcase ++ print, 'CASE: OK' + +-print,'CASE: OK' + end + + pro while_test + +-i=0 +-while i lt 100 do begin +-i=i+1 +-endwhile ++ i=0 ++ while i lt 100 do begin ++ i=i+1 ++ endwhile ++ ++ if i eq 100 then print,'WHILE: OK' else begin ++ message, '***WHILE: ERROR', /conti ++ exit, status=1 ++ endelse + +-if i eq 100 then print,'WHILE: OK' else print,'***WHILE: ERROR' + end + + pro for_test + +-c=0 +-for i=0,99 do c=c+1 +- +-if c ne 100 then print,'***FOR: ERROR' ++ c=0 ++ for i=0,99 do c=c+1 + +-c=0 +-for i=0,990,10 do c=c+1 ++ if c ne 100 then begin ++ message, '***FOR: ERROR', /conti ++ exit, status=1 ++ endif ++ ++ c=0 ++ for i=0,990,10 do c=c+1 ++ ++ if c ne 100 then begin ++ message, '***FOR: Step: ERROR', /conti ++ exit, status=1 ++ endif ++ ++ a=0 ++ for i=0, 0 do begin ++ for j=0, 1 do begin ++ if i eq 0 then continue ++ endfor ++ a = 1 ++ endfor ++ if a eq 0 then begin ++ message, '***FOR: CONTINUE: ERROR', /conti ++ exit, status=1 ++ endif + +-if c ne 100 then print,'***FOR: Step: ERROR' ++ print, 'FOR: OK' + +-a=0 +-for i=0, 0 do begin +- for j=0, 1 do begin +- if i eq 0 then continue +- endfor +- a = 1 +-endfor +-if a eq 0 then print,'***FOR: CONTINUE: ERROR' +-print,'FOR: OK' + end + + pro repeat_test + +-i=0 +-repeat begin +-i=i+1 +-endrep until (i eq 100) +- +-repeat begin +-endrep until (i eq 100) +- +-repeat begin +-endrep until 1 ++ i=0 ++ repeat begin ++ i=i+1 ++ endrep until (i eq 100) ++ ++ repeat begin ++ endrep until (i eq 100) ++ ++ repeat begin ++ endrep until 1 ++ ++ if i eq 100 then print,'REPEAT: OK' else begin ++ message, '***REPEAT: ERROR', /conti ++ exit, status=1 ++ endelse + +-if i eq 100 then print,'REPEAT: OK' else print,'***REPEAT: ERROR' + end + + pro goto_test + +-;; simple +-goto,jump11 +-print,'***GOTO: Error' +-jump21: +-goto,jump31 +-print,'***GOTO: Error' +-jump11: +-goto,jump21 +-print,'***GOTO: Error' +-jump31: +- +- +-count=0 +-;; within loop +-for i=0,10 do begin +- +-goto,jump1 +-print,'***GOTO: Error1' +-jump2: +-goto,jump3 +-print,'***GOTO: Error2' +-jump1: +-goto,jump2 +-print,'***GOTO: Error3' +-jump3: +-goto,jump4 ; even to jump out of the block and in again is ok +-jump5: ++ ;; simple ++ goto,jump11 ++ message, '***GOTO: Error', /conti ++ exit, status=1 ++ jump21: ++ goto,jump31 ++ message, '***GOTO: Error', /conti ++ exit, status=1 ++ jump11: ++ goto,jump21 ++ message, '***GOTO: Error', /conti ++ exit, status=1 ++ jump31: ++ ++ ++ count=0 ++ ;; within loop ++ for i=0,10 do begin ++ ++ goto,jump1 ++ message, '***GOTO: Error1', /conti ++ exit, status=1 ++ jump2: ++ goto,jump3 ++ message, '***GOTO: Error2', /conti ++ exit, status=1 ++ jump1: ++ goto,jump2 ++ message, '***GOTO: Error3', /conti ++ exit, status=1 ++ jump3: ++ goto,jump4 ; even to jump out of the block and in again is ok ++ jump5: ++ ++ if 0 then goto,jump5 else goto,jump7 ++ message, '***GOTO: Error4', /conti ++ exit, status=1 + +-if 0 then goto,jump5 else goto,jump7 +-print,'***GOTO: Error4' ++ jump7: + +-jump7: +- +-if 1 then begin ++ if 1 then begin + + goto,jump8 +- print,'***GOTO: Error5' +-jump8: +- +-endif else begin +- +- print,'***GOTO: Error6' +-endelse ++ message, '***GOTO: Error5', /conti ++ exit, status=1 ++ jump8: ++ ++ endif else begin ++ ++ message, '***GOTO: Error6', /conti ++ exit, status=1 ++ endelse ++ ++ ++ count=count+1 ++ endfor ++ ++ goto,jump6 ++ jump4: ++ goto,jump5 ++ jump6: ++ ++ if count ne 11 then begin ++ message, '***GOTO: ERROR7', /conti ++ exit, status=1 ++ endif + +- +-count=count+1 +-endfor +- +-goto,jump6 +-jump4: +-goto,jump5 +-jump6: +- +-if count ne 11 then print,'***GOTO: ERROR7' +- +-IF (1)then begin ++ IF (1)then begin + +- IF (1)then begin ++ IF (1)then begin + ;print,"Going to Label1" + goto, Label1 +- end else begin +- print,'***GOTO: ERROR8' +- end ++ end else begin ++ message, '***GOTO: ERROR8', /conti ++ exit, status=1 ++ end + +- Label1: +-end ++ Label1: ++ end + +- +-print,'GOTO: OK' ++ print,'GOTO: OK' + + end + + function ret99 +-return,99b ++ return,99b + end + + function ret,a +-return,a ++ return,a + end + + function retEq,a +-return,(a=3) ++ return,(a=3) + end + + function retTag,a +-return,(a.t=3) ++ return,(a.t=3) + end + + function ret2,b +-return,ret(b) ++ return,ret(b) + end + + function ret3,b +-return,ret2(b) ++ return,ret2(b) + end + + function retOverwriteLocal +-a=[['m','a'],['r','c']] +-return,reform(a,4,/OVERWRITE) ++ a=[['m','a'],['r','c']] ++ return,reform(a,4,/OVERWRITE) + end + function retOverwriteGlobal,a +-return,reform(a,4,/OVERWRITE) ++ return,reform(a,4,/OVERWRITE) + end + function retOverwriteExpression +-a=[['m','a'],['r','c']] +-return,reform(a[*],4,/OVERWRITE) ++ a=[['m','a'],['r','c']] ++ return,reform(a[*],4,/OVERWRITE) + end + + pro ret_test + +-if ret99() ne 99.0 then print,'***RET: ERROR1' +-if retEq(u) ne 3 then print,'***RET: ERROR2' +-(retEq(u2)) = 4 +-if u2 ne 4 then print,'***RET: ERROR4' +- +- +-(ret3(u3))=7 +-if u3 ne 7 then print,'***RET: ERROR5' +- +-s={t:0} +-if retTag(s) ne 3 then print,'***RET: ERROR6' +-;(ret(s))=2 +- +-n = retOverwriteLocal() +-if n[2] ne "r" then print,'***RET: ERROR7' +- +-a=[[1,2],[3,4]] +-(retOverwriteGlobal(a))-- +-if a[1] ne 1 then print,'***RET: ERROR8' ++ if ret99() ne 99.0 then begin ++ message, '***RET: ERROR1', /conti ++ exit, status=1 ++ endif ++ if retEq(u) ne 3 then begin ++ message, '***RET: ERROR2', /conti ++ exit, status=1 ++ endif ++ (retEq(u2)) = 4 ++ if u2 ne 4 then begin ++ message, '***RET: ERROR4', /conti ++ exit, status=1 ++ endif ++ ++ ++ (ret3(u3))=7 ++ if u3 ne 7 then begin ++ message, '***RET: ERROR5', /conti ++ exit, status=1 ++ endif ++ ++ s={t:0} ++ if retTag(s) ne 3 then begin ++ message, '***RET: ERROR6', /conti ++ exit, status=1 ++ endif ++ ;(ret(s))=2 ++ ++ n = retOverwriteLocal() ++ if n[2] ne "r" then begin ++ message, '***RET: ERROR7', /conti ++ exit, status=1 ++ endif ++ ++ a=[[1,2],[3,4]] ++ (retOverwriteGlobal(a))-- ++ if a[1] ne 1 then begin ++ message, '***RET: ERROR8', /conti ++ exit, status=1 ++ endif ++ ++ n = retOverwriteExpression() ++ if n[2] ne "r" then begin ++ message, '***RET: ERROR9', /conti ++ exit, status=1 ++ endif ++ ++ a=1 ++ c=ret(4*(3+reform(a,1,/OVERWRITE)+1)*2) ++ if a ne 1 then begin ++ message, '***RET: ERROR10', /conti ++ exit, status=1 ++ endif ++ if c ne 40 then begin ++ message, '***RET: ERROR11', /conti ++ exit, status=1 ++ endif ++ ++ common ret_common,aa ++ ++ aa=1 ++ c=ret(4*(3+reform(aa,1,/OVERWRITE)+1)*2) ++ if aa ne 1 then begin ++ message, '***RET: ERROR12', /conti ++ exit, status=1 ++ endif ++ if c ne 40 then begin ++ message, '***RET: ERROR13', /conti ++ exit, status=1 ++ endif + +-n = retOverwriteExpression() +-if n[2] ne "r" then print,'***RET: ERROR9' ++ print,'RET: OK'; + +-a=1 +-c=ret(4*(3+reform(a,1,/OVERWRITE)+1)*2) +-if a ne 1 then print,'***RET: ERROR10' +-if c ne 40 then print,'***RET: ERROR11' +- +-common ret_common,aa +- +-aa=1 +-c=ret(4*(3+reform(aa,1,/OVERWRITE)+1)*2) +-if aa ne 1 then print,'***RET: ERROR12' +-if c ne 40 then print,'***RET: ERROR13' +- +-print,'RET: OK'; + end + + + pro struct_test + +-s={s:"a string",tag: indgen(5),c:complex(1,2)} +- +-if s.tag[ 3] ne 3 then print,'***STRUCT: ERROR1' +- +-s={s1,tag: indgen(5),s:s} ++ s={s:"a string",tag: indgen(5),c:complex(1,2)} + +-if s.tag[ 3] ne 3 then print,'***STRUCT: ERROR1b' ++ if s.tag[ 3] ne 3 then begin ++ message, '***STRUCT: ERROR1', /conti ++ exit, status=1 ++ endif ++ ++ s={s1,tag: indgen(5),s:s} ++ ++ if s.tag[ 3] ne 3 then begin ++ message, '***STRUCT: ERROR1b', /conti ++ exit, status=1 ++ endif ++ ++ s.tag++ ++ ++ if s.tag[ 3] ne 4 then begin ++ message, '***STRUCT: ERROR2', /conti ++ exit, status=1 ++ endif ++ ++ s.tag = 9 ++ ++ if s.tag[ 3] ne 9 then begin ++ message, '***STRUCT: ERROR3', /conti ++ exit, status=1 ++ endif ++ ++ s.tag = [10,11,12] ++ ++ if s.tag[ 2] ne 12 then begin ++ message, '***STRUCT: ERROR4', /conti ++ exit, status=1 ++ endif ++ ++ ss=[s,s] ++ ++ ss[*].tag=indgen(5,2) ++ ++ if ss[1].tag[2] ne 7 then begin ++ message, '***STRUCT: ERROR5', /conti ++ exit, status=1 ++ endif ++ ++ s={s:indgen(5),$ ++ t:"string",$ ++ u:complexarr(3,5),$ ++ v:dcomplexarr(99,2),$ ++ x:sindgen(100)$ ++ } ++ ss={ss:s,s2:s} ++ sss={sss:ss,ss:[s,s]} ++ ++ sa = s ++ for i=0,2 do begin ++ sa={s1:sa,s2:[sa,sa]} ++ endfor ++ sa = {named,t:s} ++ for i=0,3 do begin ++ sa={s1:sa,s2:[sa,sa]} ++ endfor ++ sa=0 ++ ++ ;p=ptr_new( sss) ++ ;((*p).sss.ss)[2] = 5 ++ ;print,((*p).ss)[2] ++ ++ sss.sss.ss.s[2] = 10 ++ if sss.sss.ss.s[2] ne 10 then begin ++ message, '***STRUCT: ERROR6', /conti ++ exit, status=1 ++ endif ++ ++ (ret(sss)).sss.ss.s[1] = 11 ++ if sss.sss.ss.s[1] ne 11 then begin ++ message, '***STRUCT: ERROR7', /conti ++ exit, status=1 ++ endif ++ if (ret(sss)).sss.ss.s[3] ne 3 then begin ++ message, '***STRUCT: ERROR8', /conti ++ exit, status=1 ++ endif ++ ++ (ret(sss)).sss.(0).s[1] = 11 ++ if sss.(0).ss.s[1] ne 11 then begin ++ message, '***STRUCT: ERROR9', /conti ++ exit, status=1 ++ endif ++ ++ if ({a:3}).a ne 3 then begin ++ print, '***STRUCT: ERROR10', /conti ++ exit, status=1 ++ endif ++ ++ ;; array and struct ++ s4=[sss,sss] ++ s5=[[s4],[s4]] ++ if s5[1,1].sss.ss.s[3] ne 3 then begin ++ print, '***STRUCT: ERROR11', /conti ++ exit, status=1 ++ endif + +-s.tag++ ++ a = {a0, var1: 0, var2: 0.0d0} ++ b = {a0, '0L', ' 1.0'} + +-if s.tag[ 3] ne 4 then print,'***STRUCT: ERROR2' ++ print,'STRUCT: OK' + +-s.tag = 9 +- +-if s.tag[ 3] ne 9 then print,'***STRUCT: ERROR3' +- +-s.tag = [10,11,12] +- +-if s.tag[ 2] ne 12 then print,'***STRUCT: ERROR4' +- +-ss=[s,s] +- +-ss[*].tag=indgen(5,2) +- +-if ss[1].tag[2] ne 7 then print,'***STRUCT: ERROR5' +- +-s={s:indgen(5),$ +-t:"string",$ +-u:complexarr(3,5),$ +-v:dcomplexarr(99,2),$ +-x:sindgen(100)$ +-} +-ss={ss:s,s2:s} +-sss={sss:ss,ss:[s,s]} +- +-sa = s +-for i=0,2 do begin +-sa={s1:sa,s2:[sa,sa]} +-endfor +-sa = {named,t:s} +-for i=0,3 do begin +-sa={s1:sa,s2:[sa,sa]} +-endfor +-sa=0 +- +-;p=ptr_new( sss) +-;((*p).sss.ss)[2] = 5 +-;print,((*p).ss)[2] +- +-sss.sss.ss.s[2] = 10 +-if sss.sss.ss.s[2] ne 10 then print,'***STRUCT: ERROR6' +- +-(ret(sss)).sss.ss.s[1] = 11 +-if sss.sss.ss.s[1] ne 11 then print,'***STRUCT: ERROR7' +-if (ret(sss)).sss.ss.s[3] ne 3 then print,'***STRUCT: ERROR8' +- +-(ret(sss)).sss.(0).s[1] = 11 +-if sss.(0).ss.s[1] ne 11 then print,'***STRUCT: ERROR9' +- +-if ({a:3}).a ne 3 then print,'***STRUCT: ERROR10' +- +-;; array and struct +-s4=[sss,sss] +-s5=[[s4],[s4]] +-if s5[1,1].sss.ss.s[3] ne 3 then print,'***STRUCT: ERROR11' +- +-a = {a0, var1: 0, var2: 0.0d0} +-b = {a0, '0L', ' 1.0'} +- +-print,'STRUCT: OK' + end + + pro multi,a,b,c +-b=9 +-if a ne 9 then print,'***MULTI: ERROR1' +-if c ne 9 then print,'***MULTI: ERROR2' ++ b=9 ++ if a ne 9 then begin ++ message, '***MULTI: ERROR1', /conti ++ exit, status=1 ++ endif ++ if c ne 9 then begin ++ message, '***MULTI: ERROR2', /conti ++ exit, status=1 ++ endif + end + + pro multi_test +-multi,a,a,a +-if a ne 9 then print,'***MULTI: ERROR3' +-print,'MULTI: OK' ++ multi,a,a,a ++ if a ne 9 then begin ++ message, '***MULTI: ERROR3', /conti ++ exit, status=1 ++ endif ++ print,'MULTI: OK' + end + + function o::init +-self.a=9 +-return,1 ++ self.a=9 ++ return,1 + end + + function o::get +-return,self.a ++ return,self.a + end + + pro o::test +-self.a=1 +-if self.a ne 1 then print,'***OBJECT: ERROR1' +-self[0].a=2 +-if self[0].a ne 2 then print,'***OBJECT: ERROR2' +-(self).a[0]=3 +-if (self[0]).a[[-2]] ne 3 then print,'***OBJECT: ERROR3' +-if self[[0]].a ne 3 then print,'***OBJECT: ERROR4' +-;; would be legal in GDL (but IDL complains) +-;if (self[[0]]).a ne 3 then print,'***OBJECT: ERROR5' ++ self.a=1 ++ if self.a ne 1 then begin ++ message, '***OBJECT: ERROR1', /conti ++ exit, status=1 ++ endif ++ self[0].a=2 ++ if self[0].a ne 2 then begin ++ message, '***OBJECT: ERROR2', /conti ++ exit, status=1 ++ endif ++ (self).a[0]=3 ++ if (self[0]).a[[-2]] ne 3 then begin ++ message, '***OBJECT: ERROR3', /conti ++ exit, status=1 ++ endif ++ if self[[0]].a ne 3 then begin ++ message, '***OBJECT: ERROR4', /conti ++ exit, status=1 ++ endif ++ ;; would be legal in GDL (but IDL complains) ++ ;if (self[[0]]).a ne 3 then begin ++ ; message, '***OBJECT: ERROR5', /conti ++ ; exit, status=1 ++ ;endif + end + + pro o::cleanup +-common object_test,o_cleanup +-o_cleanup=-1 ++ common object_test,o_cleanup ++ o_cleanup=-1 + end + + pro object_test + +-common object_test +- +-;; object +-s={o,a:0} +-obj=obj_new('o') +- +-if obj->get() ne 9 then print,'***OBJECT: ERROR6' ++ common object_test + +-obj->test +-(obj)->test +-obj[0]->test +-(obj[0])->test ++ ;; object ++ s={o,a:0} ++ obj=obj_new('o') ++ ++ if obj->get() ne 9 then begin ++ message, '***OBJECT: ERROR6', /conti ++ exit, status=1 ++ endif ++ ++ obj->test ++ (obj)->test ++ obj[0]->test ++ (obj[0])->test ++ ++ if not obj_valid( obj) then begin ++ message, '***OBJECT: ERROR7', /conti ++ exit, status=1 ++ endif ++ ++ obj_destroy,obj ++ ++ if obj_valid( obj) then begin ++ message, '***OBJECT: ERROR8', /conti ++ exit, status=1 ++ endif ++ if o_cleanup ne -1 then begin ++ message, '***OBJECT: ERROR9', /conti ++ exit, status=1 ++ endif + +-if not obj_valid( obj) then print,'***OBJECT: ERROR7' +- +-obj_destroy,obj +- +-if obj_valid( obj) then print,'***OBJECT: ERROR8' +-if o_cleanup ne -1 then print,'***OBJECT: ERROR9' +- +-print,'OBJECT: OK' ++ print,'OBJECT: OK' + end + + pro ct1 +-common tc,x,y,z +-if x ne 3 then print,'***COMMON: ERROR1' +-y=7 ++ common tc,x,y,z ++ if x ne 3 then begin ++ message, '***COMMON: ERROR1', /conti ++ exit, status=1 ++ endif ++ y=7 + end + + pro ct2 +-common tc +-if x ne 3 then print,'***COMMON: ERROR2' +-if y ne 7 then print,'***COMMON: ERROR3' +-z=9 ++ common tc ++ if x ne 3 then begin ++ message, '***COMMON: ERROR2', /conti ++ exit, status=1 ++ endif ++ if y ne 7 then begin ++ message, '***COMMON: ERROR3', /conti ++ exit, status=1 ++ endif ++ z=9 + end + + function ct3 +-common tc3,a +-return,a ++ common tc3,a ++ return,a + end + + pro common_test +-common tc,a,b,c +-common tc,d,e,f +-common tc +- +-a=3 +-ct1 +-ct2 +- +-if a ne 3 then print,'***COMMON: ERROR4' +-if b ne 7 then print,'***COMMON: ERROR5' +-if c ne 9 then print,'***COMMON: ERROR6' +-if d ne 3 then print,'***COMMON: ERROR7' +-if e ne 7 then print,'***COMMON: ERROR8' +-if f ne 9 then print,'***COMMON: ERROR9' +-if x ne 3 then print,'***COMMON: ERROR10' +-if y ne 7 then print,'***COMMON: ERROR11' +-if z ne 9 then print,'***COMMON: ERROR12' ++ common tc,a,b,c ++ common tc,d,e,f ++ common tc ++ ++ a=3 ++ ct1 ++ ct2 ++ ++ if a ne 3 then begin ++ message, '***COMMON: ERROR4', /conti ++ exit, status=1 ++ endif ++ if b ne 7 then begin ++ message, '***COMMON: ERROR5', /conti ++ exit, status=1 ++ endif ++ if c ne 9 then begin ++ message, '***COMMON: ERROR6', /conti ++ exit, status=1 ++ endif ++ if d ne 3 then begin ++ message, '***COMMON: ERROR7', /conti ++ exit, status=1 ++ endif ++ if e ne 7 then begin ++ message, '***COMMON: ERROR8', /conti ++ exit, status=1 ++ endif ++ if f ne 9 then begin ++ message, '***COMMON: ERROR9', /conti ++ exit, status=1 ++ endif ++ if x ne 3 then begin ++ message, '***COMMON: ERROR10', /conti ++ exit, status=1 ++ endif ++ if y ne 7 then begin ++ message, '***COMMON: ERROR11', /conti ++ exit, status=1 ++ endif ++ if z ne 9 then begin ++ message, '***COMMON: ERROR12', /conti ++ exit, status=1 ++ endif ++ ++ (ct3()) = 2 ++ if ct3() ne 2 then begin ++ message, '***COMMON: ERROR13', /conti ++ exit, status=1 ++ endif + +-(ct3()) = 2 +-if ct3() ne 2 then print,'***COMMON: ERROR13' ++ print,'COMMON: OK' + +-print,'COMMON: OK' + end + + pro set22,a,X=x +-a=2 +-x=2 ++ a=2 ++ x=2 + end + + pro ref_test,MEMCHECK=mCheck + +-set22,b +-if b ne 2 then print,"***REF: ERROR1" ++ set22,b ++ if b ne 2 then begin ++ message, "***REF: ERROR1", /conti ++ exit, status=1 ++ endif + +-if not keyword_set( mCheck) then begin ++ if not keyword_set( mCheck) then begin + + p=ptr_new(/alloc) + set22,*p +- if *p ne 2 then print,"***REF: ERROR2" ++ if *p ne 2 then begin ++ message, "***REF: ERROR2", /conti ++ exit, status=1 ++ endif + ptr_free,p + + p=ptr_new(/alloc) + pp=ptr_new(p) + set22,**pp +- if **pp ne 2 then print,"***REF: ERROR3" ++ if **pp ne 2 then begin ++ message, "***REF: ERROR3", /conti ++ exit, status=1 ++ endif + ptr_free,p,pp + +-endif +- +-a=indgen(3) +-set22,reform(a,1,3,/OVERWRITE) +-if a ne 2 then print,"***REF: ERROR4" +- +-a=4 & x=4 +-set22,a++,X=x++ +-if a ne 5 or x ne 5 then print,"***REF: ERROR5" ++ endif + +-a=1 & x=1 +-set22,++a,X=++x +-if a ne 2 or x ne 2 then print,"***REF: ERROR6" ++ a=indgen(3) ++ set22,reform(a,1,3,/OVERWRITE) ++ if a ne 2 then begin ++ message, "***REF: ERROR4", /conti ++ exit, statis=1 ++ endif ++ ++ a=4 & x=4 ++ set22,a++,X=x++ ++ if a ne 5 or x ne 5 then begin ++ message, "***REF: ERROR5", /conti ++ exit, status=1 ++ endif ++ ++ a=1 & x=1 ++ set22,++a,X=++x ++ if a ne 2 or x ne 2 then begin ++ message, "***REF: ERROR6", /conti ++ exit, status=1 ++ endif ++ ++ a=1 & x=1 ++ set22,(a=4),X=(x=4) ++ if a ne 2 or x ne 2 then begin ++ message, "***REF: ERROR7", /conti ++ exit, status=1 ++ endif ++ ++ a=4 & x=4 ++ set22,++(a=1),X=++(x=1) ++ if a ne 2 or x ne 2 then begin ++ message, "***REF: ERROR8", /conti ++ exit, status=1 ++ endif ++ ++ set22,++(a[0]=4),X=++(x[0]=4) ++ if a ne 5 or x ne 5 then begin ++ message, "***REF: ERROR9", /conti ++ exit, status=1 ++ endif + +-a=1 & x=1 +-set22,(a=4),X=(x=4) +-if a ne 2 or x ne 2 then print,"***REF: ERROR7" ++ print,'REF: OK' + +-a=4 & x=4 +-set22,++(a=1),X=++(x=1) +-if a ne 2 or x ne 2 then print,"***REF: ERROR8" +- +-set22,++(a[0]=4),X=++(x[0]=4) +-if a ne 5 or x ne 5 then print,"***REF: ERROR9" +- +-print,'REF: OK' + end + + function base::init +-common inheritance,baseInit,baseCleanup,derivInit,derivCleanup +-baseInit=1 +-return,1 ++ common inheritance,baseInit,baseCleanup,derivInit,derivCleanup ++ baseInit=1 ++ return,1 + end + pro base::cleanup +-common inheritance,baseInit,baseCleanup,derivInit,derivCleanup +-baseCleanup=1 ++ common inheritance,baseInit,baseCleanup,derivInit,derivCleanup ++ baseCleanup=1 + end + pro base::set +-self.b='base' ++ self.b='base' + end + pro base::setbase +-self.b='base' ++ self.b='base' + end + function base::get +-return,self.b ++ return,self.b + end + + function deriv::init +-common inheritance,baseInit,baseCleanup,derivInit,derivCleanup +-r=self->base::init() +-derivInit=1 +-return,1 ++ common inheritance,baseInit,baseCleanup,derivInit,derivCleanup ++ r=self->base::init() ++ derivInit=1 ++ return,1 + end + pro deriv::cleanup +-common inheritance,baseInit,baseCleanup,derivInit,derivCleanup +-self->base::cleanup +-derivCleanup=1 ++ common inheritance,baseInit,baseCleanup,derivInit,derivCleanup ++ self->base::cleanup ++ derivCleanup=1 + end + pro deriv::set +-self.b='deriv' ++ self.b='deriv' + end + + pro inheritance_test + +-base={ base, b: ''} +-deriv={ deriv, INHERITS base, d: ''} ++ base={ base, b: ''} ++ deriv={ deriv, INHERITS base, d: ''} + +-common inheritance ++ common inheritance + +-o=obj_new( 'deriv') +-if baseInit ne 1 then print,'***INHERITANCE: ERROR1' +-if derivInit ne 1 then print,'***INHERITANCE: ERROR2' +- +-o->setbase +-if o->get() ne 'base' then print,'***INHERITANCE: ERROR3' +-o->set +-if o->get() ne 'deriv' then print,'***INHERITANCE: ERROR4' +-o->base::set +-if o->get() ne 'base' then print,'***INHERITANCE: ERROR5' +- +-obj_destroy, o +-if baseInit ne 1 then print,'***INHERITANCE: ERROR6' +-if derivInit ne 1 then print,'***INHERITANCE: ERROR7' ++ o=obj_new( 'deriv') ++ if baseInit ne 1 then begin ++ message, '***INHERITANCE: ERROR1', /conti ++ exit, status=1 ++ endif ++ if derivInit ne 1 then begin ++ message, '***INHERITANCE: ERROR2', /conti ++ exit, status=1 ++ endif ++ ++ o->setbase ++ if o->get() ne 'base' then begin ++ message, '***INHERITANCE: ERROR3', /conti ++ exit, status=1 ++ endif ++ o->set ++ if o->get() ne 'deriv' then begin ++ message, '***INHERITANCE: ERROR4', /conti ++ exit, status=1 ++ endif ++ o->base::set ++ if o->get() ne 'base' then begin ++ message, '***INHERITANCE: ERROR5', /conti ++ exit, status=1 ++ endif ++ ++ obj_destroy, o ++ if baseInit ne 1 then begin ++ message, '***INHERITANCE: ERROR6', /conti ++ exit, status=1 ++ endif ++ if derivInit ne 1 then begin ++ message, '***INHERITANCE: ERROR7', /conti ++ exit, status=1 ++ endif + +-print,'INHERITANCE: OK' ++ print,'INHERITANCE: OK' + end + + function syntax_test,a,b,c +-return,byte(a,b,c) ++ return,byte(a,b,c) + end + + pro syntax_test + +-s={a:0} +- +-t=s[0].a +-t=s[[0]].a +-t=(s[0]).a +-t=(s[[0]]).a ++ s={a:0} + +-b=(a=2) +-if b ne 2 then print,'***SYNTAX_TEST: ERROR1' ++ t=s[0].a ++ t=s[[0]].a ++ t=(s[0]).a ++ t=(s[[0]]).a ++ ++ b=(a=2) ++ if b ne 2 then begin ++ message, '***SYNTAX_TEST: ERROR1', /conti ++ exit, status=1 ++ endif + +-a=(byte(1,0,1))[0] +-a=(syntax_test(1,0,1))[0] ++ a=(byte(1,0,1))[0] ++ a=(syntax_test(1,0,1))[0] + +-;((a=4)) syntax error +-;(a=2)=3 forbidden in GDL (as it hardly makes sense) ++ ;((a=4)) syntax error ++ ;(a=2)=3 forbidden in GDL (as it hardly makes sense) + + end + + pro inc_test + +-a=1 +- +-(ret(a))++ +-++(ret(a)) +- +-if a ne 3 then print,"***INC: ERROR1" +- +-b = intarr(3) ++ a=1 + +-b[1]++ +-++b[1] +-(b[1])++ +-++(b[1]) ++ (ret(a))++ ++ ++(ret(a)) + +-if b[1] ne 4 then print,"***INC: ERROR2" ++ if a ne 3 then begin ++ message, "***INC: ERROR1", /conti ++ exit, status=1 ++ endif ++ ++ b = intarr(3) ++ ++ b[1]++ ++ ++b[1] ++ (b[1])++ ++ ++(b[1]) ++ ++ if b[1] ne 4 then begin ++ message, "***INC: ERROR2", /conti ++ exit, status=1 ++ endif ++ ++ b[[1,2]]+=1 ++ if b[1] ne 5 then begin ++ message, "***INC: ERROR3", /conti ++ exit, status=1 ++ endif ++ ++ (a=2)++ ++ if a ne 3 then begin ++ message, '***INC_TEST: ERROR4', /conti ++ exit, status=1 ++ endif ++ ++ ((a=2))++ ++ if a ne 3 then begin ++ message, '***INC_TEST: ERROR5', /conti ++ exit, status=1 ++ endif ++ ++ ++(a=2) ++ if a ne 3 then begin ++ message, '***INC_TEST: ERROR6', /conti ++ exit, status=1 ++ endif ++ ++ ++((a=2)) ++ if a ne 3 then begin ++ message, '***INC_TEST: ERROR7', /conti ++ exit, status=1 ++ endif + +-b[[1,2]]+=1 +-if b[1] ne 5 then print,"***INC: ERROR3" ++ print,'INC: OK' + +-(a=2)++ +-if a ne 3 then print,'***INC_TEST: ERROR4' +- +-((a=2))++ +-if a ne 3 then print,'***INC_TEST: ERROR5' +- +-++(a=2) +-if a ne 3 then print,'***INC_TEST: ERROR6' +- +-++((a=2)) +-if a ne 3 then print,'***INC_TEST: ERROR7' +- +-print,'INC: OK' + end + + +- + pro continuebreak_test + +-repeat begin ++ repeat begin + + goto,start + +- print,'***CONTINUE/BREAK: ERROR2' ++ message, '***CONTINUE/BREAK: ERROR2', /conti ++ exit, status=1 + +-start: ++ start: + + for i=0,40,2 do begin + +- if i lt 6 then continue +- +- if i lt 6 then print,'***CONTINUE/BREAK: ERROR1' ++ if i lt 6 then continue + +- if i gt 10 then break +- +- if i gt 10 then print,'***CONTINUE/BREAK: ERROR2' +- +- goto,in1 +- print,'***CONTINUE/BREAK: ERROR2' +- goto,out1 +-in1: ++ if i lt 6 then begin ++ message, '***CONTINUE/BREAK: ERROR1', /conti ++ exit, status=1 ++ endif ++ ++ if i gt 10 then break ++ ++ if i gt 10 then begin ++ message, '***CONTINUE/BREAK: ERROR2', /conti ++ exit, status=1 ++ endif ++ ++ goto,in1 ++ message, '***CONTINUE/BREAK: ERROR2', /conti ++ exit, status=1 ++ goto,out1 ++ in1: + + endfor + +-goto,out2 +-out1: +-out2: ++ goto,out2 ++ out1: ++ out2: ++ ++ endrep until 1 + +-endrep until 1 ++ print,'CONTINUE/BREAK: OK' + +-print,'CONTINUE/BREAK: OK' + end + + + pro e2,A=a,B=b +-if a ne 'a' then print,'EXTRA: ERROR1' +-if b ne 'b' then print,'EXTRA: ERROR2' ++ if a ne 'a' then begin ++ message, 'EXTRA: ERROR1', /conti ++ exit, status=1 ++ endif ++ if b ne 'b' then begin ++ message, 'EXTRA: ERROR2', /conti ++ exit, status=1 ++ endif + end + + pro eref,_REF_EXTRA=ex +-e2,_EXTRA=ex ++ e2,_EXTRA=ex + end + + pro eval,_EXTRA=ex +-e2,_EXTRA=ex ++ e2,_EXTRA=ex + end + + pro e1,R2=a,R1=b +-a=1 +-b=2 ++ a=1 ++ b=2 + end + + pro eret,_REF_EXTRA=ex +-e1,_EXTRA=ex ++ e1,_EXTRA=ex + end + + + pro extra_test,_REF_EXTRA=ex + +-eval,b='b',a='a',c=u ;; +-eref,b='b',a='a',c=u ++ eval,b='b',a='a',c=u ;; ++ eref,b='b',a='a',c=u + +-eret,r1=r1,r2=r2 ++ eret,r1=r1,r2=r2 + +-if r1 ne 2 then print,'***EXTRA: ERROR3' +-if r2 ne 1 then print,'***EXTRA: ERROR4' ++ if r1 ne 2 then begin ++ message, '***EXTRA: ERROR3', /conti ++ exit, status=1 ++ endif ++ if r2 ne 1 then begin ++ message, '***EXTRA: ERROR4', /conti ++ exit, status=1 ++ endif ++ ++ print,'EXTRA: OK' + +-print,'EXTRA: OK' + end + + pro expr_test + +-a=0 +-a++ +-a *= 2 +-a ^= 2 +-b = a+2*3-(9*2)+9 +-if b ne 1 then print,'***EXPR: ERROR1' +- +-a=indgen(6,6,6) +-a[3,3,3]=-1 +-if a[3,3,3] ne -1 then print,'***EXPR: ERROR2' +- +-a=a+100 +-if a[3,3,3] ne 99 then print,'***EXPR: ERROR2a' +- +-a[*]=a[*]-100 +-if a[3,3,3] ne -1 then print,'***EXPR: ERROR2b' +- +- +-sdef={s,a:intarr(3),s:strarr(3)} +-s1={s,indgen(3),s:sindgen(3)} +-if s1.a[1] ne 1 then print,'***EXPR: ERROR3' +-s2={s} +-sArr=[s2,s2] +-sArr[1].s[1]='test' +-if sArr[1].s[1] ne 'test' then print,'***EXPR: ERROR4' +- +-a=1 +-c=4*(3+reform(a,1,/OVERWRITE)+1)*2 +-if c ne 40 then print,'***EXPR: ERROR5' +-if a ne 1 then print,'***EXPR: ERROR6' ++ a=0 ++ a++ ++ a *= 2 ++ a ^= 2 ++ b = a+2*3-(9*2)+9 ++ if b ne 1 then begin ++ message, '***EXPR: ERROR1', /conti ++ exit, status=1 ++ endif ++ ++ a=indgen(6,6,6) ++ a[3,3,3]=-1 ++ if a[3,3,3] ne -1 then begin ++ message, '***EXPR: ERROR2', /conti ++ exit, status=1 ++ endif ++ ++ a=a+100 ++ if a[3,3,3] ne 99 then begin ++ message, '***EXPR: ERROR2a', /conti ++ exit, status=1 ++ endif ++ ++ a[*]=a[*]-100 ++ if a[3,3,3] ne -1 then begin ++ message, '***EXPR: ERROR2b', /conti ++ exit, status=1 ++ endif ++ ++ sdef={s,a:intarr(3),s:strarr(3)} ++ s1={s,indgen(3),s:sindgen(3)} ++ if s1.a[1] ne 1 then begin ++ message, '***EXPR: ERROR3', /conti ++ exit, status=1 ++ endif ++ s2={s} ++ sArr=[s2,s2] ++ sArr[1].s[1]='test' ++ if sArr[1].s[1] ne 'test' then begin ++ message, '***EXPR: ERROR4', /conti ++ exit, status=1 ++ endif ++ ++ a=1 ++ c=4*(3+reform(a,1,/OVERWRITE)+1)*2 ++ if c ne 40 then begin ++ message, '***EXPR: ERROR5', /conti ++ exit, status=1 ++ endif ++ if a ne 1 then begin ++ message, '***EXPR: ERROR6', /conti ++ exit, status=1 ++ endif ++ ++ if ~1 and ~2 && ~3 and 4 || ~ 5 ne 0 then begin ++ message, '***EXPR: ERROR7', /conti ++ exit, status=1 ++ endif + +-if ~1 and ~2 && ~3 and 4 || ~ 5 ne 0 then print,'***EXPR: ERROR7' ++ print,'EXPR: OK' + +-print,'EXPR: OK' + end + + function fac,n + +-if n le 1 then return,1 ++ if n le 1 then return,1 + +-return,fac(n-1)*n ++ return,fac(n-1)*n + + end + + pro recursion_test + +-if fac( 5) ne 120 then print,"***RECURSION: ERROR" ++ if fac( 5) ne 120 then begin ++ message, "***RECURSION: ERROR", /conti ++ exit, status=1 ++ endif + +-print,'RECURSION: OK' ++ print,'RECURSION: OK' + end + + pro index_test + +-b=byte( "abcdefg") +-d=bytarr(20) +-d[10]=b +- +-if string( d[10:16]) ne "abcdefg" then print,"***INDEX: ERROR1" +- +-i=indgen(3,3) +-s=[[-1],[-2]] ++ b=byte( "abcdefg") ++ d=bytarr(20) ++ d[10]=b ++ ++ if string( d[10:16]) ne "abcdefg" then begin ++ message, "***INDEX: ERROR1", /conti ++ exit, status=1 ++ endif ++ ++ i=indgen(3,3) ++ s=[[-1],[-2]] ++ ++ i[1,1]=s ++ ++ if i[1,2] ne -2 then begin ++ message, "***INDEX: ERROR2", /conti ++ exit, status=1 ++ endif ++ ++ c=intarr(3) ++ (((c[1])))=1 ++ if c[1] ne 1 then begin ++ message, '***INDEX: ERROR3', /conti ++ exit, status=1 ++ endif + +-i[1,1]=s ++ print,'ARRAY INDEXING: OK' + +-if i[1,2] ne -2 then print,"***INDEX: ERROR2" +- +-c=intarr(3) +-(((c[1])))=1 +-if c[1] ne 1 then print,'***INDEX: ERROR3' +- +-print,'ARRAY INDEXING: OK' + end + + pro operator_test + +-a=indgen(4) +-b=indgen(4) ++ a=indgen(4) ++ b=indgen(4) + +-c=a#b ++ c=a#b + +-if c[2,3] ne 6 then print,"***OPERATOR: ERROR1" ++ if c[2,3] ne 6 then begin ++ message, "***OPERATOR: ERROR1", /conti ++ exit, status=1 ++ endif + +-b=indgen(4,2) ++ b=indgen(4,2) + +-c=a#b ++ c=a#b + +-if c[0,1] ne 38 then print,"***OPERATOR: ERROR2" ++ if c[0,1] ne 38 then begin ++ message, "***OPERATOR: ERROR2", /conti ++ exit, status=1 ++ endif + +-a=indgen(2,4) +-b=indgen(4) ++ a=indgen(2,4) ++ b=indgen(4) + +-c=a#b ++ c=a#b + +-if c[1] ne 34 then print,"***OPERATOR: ERROR3" ++ if c[1] ne 34 then begin ++ message, "***OPERATOR: ERROR3", /conti ++ exit, status=1 ++ endif + +-b=indgen(4,2) ++ b=indgen(4,2) + +-c=a#b ++ c=a#b + +-if c[0,1] ne 76 then print,"***OPERATOR: ERROR4" ++ if c[0,1] ne 76 then begin ++ message, "***OPERATOR: ERROR4", /conti ++ exit, status=1 ++ endif + +-x=indgen(10) # transpose(intarr(10)+1) ++ x=indgen(10) # transpose(intarr(10)+1) + +-if x[9,9] ne 9 then print,"***OPERATOR: ERROR5" ++ if x[9,9] ne 9 then begin ++ message, "***OPERATOR: ERROR5", /conti ++ exit, status=1 ++ endif + +-;; with scalar +-r= 4 # indgen(1,4) +-if r[0,2] ne 8 then print,"***OPERATOR: ERROR6" ++ ;; with scalar ++ r= 4 # indgen(1,4) ++ if r[0,2] ne 8 then begin ++ message, "***OPERATOR: ERROR6", /conti ++ exit, status=1 ++ endif + +-r= indgen(4) # 4 +-if r[1] ne 4 then print,"***OPERATOR: ERROR7" ++ r= indgen(4) # 4 ++ if r[1] ne 4 then begin ++ message, "***OPERATOR: ERROR7", /conti ++ exit, status=1 ++ endif + ++ print,'OPERATORS: OK' + +-print,'OPERATORS: OK' + end + + pro assignment_test + +-c = indgen( 4, 4) ++ c = indgen( 4, 4) ++ ++ t = intarr( 5, 5) ++ t[0,0] = c ++ if t[3,3] ne 15 then begin ++ message, "***ASSIGNMENT: ERROR1", /conti ++ exit, status=1 ++ endif ++ ++ t = intarr( 5, 5) ++ t[0,1] = c ++ if t[3,3] ne 11 then begin ++ message, "***ASSIGNMENT: ERROR2", /conti ++ exit, status=1 ++ endif ++ ++ t = intarr( 5, 5) ++ t[1,0] = c ++ if t[3,3] ne 14 then begin ++ message, "***ASSIGNMENT: ERROR3", /conti ++ exit, status=1 ++ endif ++ ++ t = intarr( 5, 5) ++ t[1,1] = c ++ if t[3,3] ne 10 then begin ++ message, "***ASSIGNMENT: ERROR4", /conti ++ exit, status=1 ++ endif ++ ++ t = intarr( 5, 5) ++ a=indgen(3,3) ++ t[1,1]=a ++ if t[2,2] ne 4 then begin ++ message, "***ASSIGNMENT: ERROR5", /conti ++ exit, status=1 ++ endif ++ ++ t = intarr( 5, 5) ++ a=indgen(3,3) ++ t[1]=a ++ if t[3,0] ne 2 then begin ++ message, "***ASSIGNMENT: ERROR6", /conti ++ exit, status=1 ++ endif ++ ++ a=(1?0:9) ++ b=0 ++ (1?a:b) = 2 ++ if a ne 2 then begin ++ message, "***ASSIGNMENT: ERROR7", /conti ++ exit, status=1 ++ endif ++ ++ ++ ((a=3))=2 ++ if a ne 2 then begin ++ message, "***ASSIGNMENT: ERROR8", /conti ++ exit, status=1 ++ endif ++ ++ A=create_struct("boo",dblarr(10),"foo",dblarr(10)) ++ B=replicate(A,30) ++ data=findgen(30) ++ B[0:29].boo[3] = data[0:29] ++ if B[29].boo[3] ne 29.0 then begin ++ message, "***ASSIGNMENT: ERROR9", /conti ++ exit, status=1 ++ endif + +-t = intarr( 5, 5) +-t[0,0] = c +-if t[3,3] ne 15 then print,"***ASSIGNMENT: ERROR1" +- +-t = intarr( 5, 5) +-t[0,1] = c +-if t[3,3] ne 11 then print,"***ASSIGNMENT: ERROR2" +- +-t = intarr( 5, 5) +-t[1,0] = c +-if t[3,3] ne 14 then print,"***ASSIGNMENT: ERROR3" +- +-t = intarr( 5, 5) +-t[1,1] = c +-if t[3,3] ne 10 then print,"***ASSIGNMENT: ERROR4" +- +-t = intarr( 5, 5) +-a=indgen(3,3) +-t[1,1]=a +-if t[2,2] ne 4 then print,"***ASSIGNMENT: ERROR5" +- +-t = intarr( 5, 5) +-a=indgen(3,3) +-t[1]=a +-if t[3,0] ne 2 then print,"***ASSIGNMENT: ERROR6" +- +-a=(1?0:9) +-b=0 +-(1?a:b) = 2 +-if a ne 2 then print,"***ASSIGNMENT: ERROR7" +- +- +-((a=3))=2 +-if a ne 2 then print,"***ASSIGNMENT: ERROR8" +- +-A=create_struct("boo",dblarr(10),"foo",dblarr(10)) +-B=replicate(A,30) +-data=findgen(30) +-B[0:29].boo[3] = data[0:29] +-if B[29].boo[3] ne 29.0 then print,"***ASSIGNMENT: ERROR9" ++ print,"ASSIGNMENT: OK" + +-print,"ASSIGNMENT: OK" + end + + pro left_libfunction_test + +-u=indgen(4) ++ u=indgen(4) + +-(reform(u,4,/OVERWRITE))++ ++ (reform(u,4,/OVERWRITE))++ + +-if u[2] ne 3 then print,"***LEFT_LIBFUNCTION: ERROR1" ++ if u[2] ne 3 then begin ++ message, "***LEFT_LIBFUNCTION: ERROR1", /conti ++ exit, status=1 ++ endif + +-print,"LEFT_LIBFUNCTION: OK" ++ print,"LEFT_LIBFUNCTION: OK" + end + + pro stride_index_test + +-a=lindgen( 11, 20, 31) ++ a=lindgen( 11, 20, 31) + +-;print,total( a[1:*:3]) ++ ;print,total( a[1:*:3]) + +-if total( a[1:10:4, 2:16:2, 5:29:5]) ne 408480. then print,"***STRIDE_INDEX: ERROR 1" +-if total( a[*, 2:14:2, 20:29:5]) ne 776622. then print,"***STRIDE_INDEX: ERROR 2" +-if total( a[1:6:2, *, 17:29:5]) ne 890550. then print,"***STRIDE_INDEX: ERROR 3" +-if total( a[[7,1], 2:16:2, 5:29:5]) ne 272240. then print,"***STRIDE_INDEX: ERROR 4" +-if total( a[3:9:2, [7,1], 2:*:4]) ne 228480. then print,"***STRIDE_INDEX: ERROR " +-if total( a[*, 5:*:5, [7,1]]) ne 65670. then print,"***STRIDE_INDEX: ERROR 5" +-if total( a[5:7, 2:16:2, 5:29:5]) ne 408600. then print,"***STRIDE_INDEX: ERROR 6" +-if total( a[3:9:2, 5:7, 2:*:4]) ne 344832. then print,"***STRIDE_INDEX: ERROR 7" +-if total( a[*, 5:*:5, 5:7]) ne 142065. then print,"***STRIDE_INDEX: ERROR 8" +- +-b=lindgen(50) +-if total( b[1:32:7]) ne 75. then print,"***STRIDE_INDEX: ERROR 9" +-if total( b[1:*:3]) ne 425. then print,"***STRIDE_INDEX: ERROR 10" ++ if total( a[1:10:4, 2:16:2, 5:29:5]) ne 408480. then begin ++ message, "***STRIDE_INDEX: ERROR 1", /conti ++ exit, status=1 ++ endif ++ if total( a[*, 2:14:2, 20:29:5]) ne 776622. then begin ++ message, "***STRIDE_INDEX: ERROR 2", /conti ++ exit, status=1 ++ endif ++ if total( a[1:6:2, *, 17:29:5]) ne 890550. then begin ++ message, "***STRIDE_INDEX: ERROR 3", /conti ++ exit, status=1 ++ endif ++ if total( a[[7,1], 2:16:2, 5:29:5]) ne 272240. then begin ++ message, "***STRIDE_INDEX: ERROR 4", /conti ++ exit, status=1 ++ endif ++ if total( a[3:9:2, [7,1], 2:*:4]) ne 228480. then begin ++ message, "***STRIDE_INDEX: ERROR ", /conti ++ exit, status=1 ++ endif ++ if total( a[*, 5:*:5, [7,1]]) ne 65670. then begin ++ message, "***STRIDE_INDEX: ERROR 5", /conti ++ exit, status=1 ++ endif ++ if total( a[5:7, 2:16:2, 5:29:5]) ne 408600. then begin ++ message, "***STRIDE_INDEX: ERROR 6", /conti ++ exit, status=1 ++ endif ++ if total( a[3:9:2, 5:7, 2:*:4]) ne 344832. then begin ++ message, "***STRIDE_INDEX: ERROR 7", /conti ++ exit, status=1 ++ endif ++ if total( a[*, 5:*:5, 5:7]) ne 142065. then begin ++ message, "***STRIDE_INDEX: ERROR 8", /conti ++ exit, status=1 ++ endif ++ ++ b=lindgen(50) ++ if total( b[1:32:7]) ne 75. then begin ++ message, "***STRIDE_INDEX: ERROR 9", /conti ++ exit, status=1 ++ endif ++ if total( b[1:*:3]) ne 425. then begin ++ message, "***STRIDE_INDEX: ERROR 10", /conti ++ exit, status=1 ++ endif ++ ++ print,"STRIDE_INDEX: OK" + +-print,"STRIDE_INDEX: OK" + end + + ;; set MEMCHECK to perform a memory leak check +@@ -926,37 +1396,37 @@ + ;; with MEMCHECK set, no ptr and object allocations are made + pro test_suite,MEMCHECK=mCheck + +-s=systime(1) ++ s=systime(1) + +-switch_test +-case_test +-while_test +-for_test +-repeat_test +-goto_test +-ret_test +-struct_test +-multi_test +-if not keyword_set( mCheck) then object_test +-common_test +-ref_test,MEMCHECK=mCheck +-syntax_test +-inc_test +-if not keyword_set( mCheck) then inheritance_test +-continuebreak_test +-extra_test +-expr_test +-recursion_test +-index_test +-operator_test +-assignment_test +-left_libfunction_test +-stride_index_test ++ if_test ++ switch_test ++ case_test ++ while_test ++ for_test ++ repeat_test ++ goto_test ++ ret_test ++ struct_test ++ multi_test ++ if not keyword_set( mCheck) then object_test ++ common_test ++ ref_test,MEMCHECK=mCheck ++ syntax_test ++ inc_test ++ if not keyword_set( mCheck) then inheritance_test ++ continuebreak_test ++ extra_test ++ expr_test ++ recursion_test ++ index_test ++ operator_test ++ assignment_test ++ left_libfunction_test ++ stride_index_test + +-print,"TEST_SUITE finished. Time: ",systime(1)-s ++ print,"TEST_SUITE finished. Time: ",systime(1)-s + end + +- + ;; main program + print,'TEST_SUITE main program called.' + test_suite +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_tv.pro cvs/gdl/testsuite/test_tv.pro +--- gdl-0.9rc4/testsuite/test_tv.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/test_tv.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -40,6 +40,77 @@ + end + ; ------------------------------------- + ; ++pro TEST_TV_DAMIER_COLOR, numwin, noclose=noclose, test=test, debug=debug, help=help ++; ++if KEYWORD_SET(help) then begin ++ print, 'pro TEST_TV_DAMIER_COLOR, noclose=noclose, test=test, debug=debug, help=help' ++ return ++end ++; ++if N_PARAMS() EQ 0 then numwin=0 ++; ++units=64 ++nbx=10 ++nby=8 ++WINDOW, numwin, xsi=units*nbx, ysi=units*nby ++; ++vignette=DIST(units) ++; ++offset_line=0 ++nb_cells=nbx*nby ++for ii=0, (nb_cells/2-1) do begin ++ offset_line=(ii / (nbx/2)) mod 2 ++ if KEYWORD_SET(debug) then print, ii, offset_line, 2*ii+offset_line ++ LOADCT, ii ++ TVSCL, vignette, 2*ii+offset_line ++endfor ++; ++if NOT(KEYWORD_SET(noclose)) then begin ++ rep='' ++ READ, 'press any key to finish (and closing all windows)', rep ++ WDELETE, numwin ++endif ++; ++if KEYWORD_SET(test) then STOP ++;; ++end ++; ------------------------------------- ++; ++pro TEST_TV_DAMIER, numwin, noclose=noclose, test=test, debug=debug ++; ++if KEYWORD_SET(help) then begin ++ print, 'pro TEST_TV_DAMIER, numwin, noclose=noclose, test=test, debug=debug, help=help' ++ return ++end ++; ++if N_PARAMS() EQ 0 then numwin=0 ++; ++units=64 ++nbx=8 ++nby=8 ++WINDOW, numwin, xsi=units*nbx, ysi=units*nby ++; ++vignette=DIST(units) ++; ++offset_line=0 ++nb_cells=nbx*nby ++for ii=0, (nb_cells/2-1) do begin ++ offset_line=(ii / (nbx/2)) mod 2 ++ if KEYWORD_SET(debug) then print, ii, offset_line, 2*ii+offset_line ++ TVSCL, vignette, 2*ii+offset_line ++endfor ++; ++if NOT(KEYWORD_SET(noclose)) then begin ++ rep='' ++ READ, 'press any key to finish (and closing all windows)', rep ++ WDELETE, numwin ++endif ++; ++if KEYWORD_SET(test) then STOP ++;; ++end ++; ------------------------------------- ++; + pro TEST_TV, noclose=noclose, test=test + ; + xdim=350 +@@ -61,11 +132,14 @@ + MY_WINDOW, 5, b3 + MY_WINDOW, 6, REFORM(b3) + ; ++TEST_TV_DAMIER, 8, /noclose ++TEST_TV_DAMIER_COLOR, 9, /noclose ++; + if NOT(KEYWORD_SET(noclose)) then begin + rep='' + READ, 'press any key to finish (and closing all windows)', rep + ;; +- WDELETE, 0, 1, 2, 3, 4, 5, 6 ++ WDELETE, 0, 1, 2, 3, 4, 5, 6, 8, 9 + endif + ; + if KEYWORD_SET(test) then STOP +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_url.pro cvs/gdl/testsuite/test_url.pro +--- gdl-0.9rc4/testsuite/test_url.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/test_url.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -8,17 +8,18 @@ + ; PHP is free software available at http://www.php.net/software/ + ; - examples of IPv6 addresses from the RFC2732 (Format for Literal IPv6 Addresses in URL's) + ; (http://www.faqs.org/rfcs/rfc2732.html) +-pro test_url +- +- ; TODO: testing of parse-errors: +- ; GDL> print, parse_url('a://:000000') +- ; % PARSE_URL: port cannot be longer then 5 characters +- ; GDL> print, parse_url('a://:00000') +- ; % PARSE_URL: invalid host +- +- sample_urls = [ $ +- ; examples from PHP test script +- '', $ ; IDL 6.4 fails (syntax error) ++; ++pro TEST_URL, debug=debug ++; ++; TODO: testing of parse-errors: ++; GDL> print, parse_url('a://:000000') ++; % PARSE_URL: port cannot be longer then 5 characters ++; GDL> print, parse_url('a://:00000') ++; % PARSE_URL: invalid host ++; ++sample_urls = [ $ ++ ;; examples from PHP test script ++ '', $ ; IDL 6.4 fails (syntax error) + '64.246.30.37', $ + 'http://64.246.30.37', $ + 'http://64.246.30.37/', $ +@@ -177,15 +178,36 @@ + '{ http [2010:836B:4179::836B:4179] }', $ + '{ http www.google.com / }' $ + ] ++; ++if KEYWORD_SET(test) OR KEYWORD_SET(debug) then STOP ++; ++nb_errors=0 ++for i = 0, N_ELEMENTS(sample_urls) - 1 do begin ++ s = STRING(PARSE_URL(sample_urls[i]), /print) ++ ++ ; STRING(/PRINT) returns an array if the string length exceedes the number of columns in a terminal ++ if N_ELEMENTS(s) NE 1 then begin ++ ss = '' ++ for ii = 0, n_elements(s) - 1 do ss += s[ii] ++ s = ss ++ endif + +- for i = 0, n_elements(sample_urls) - 1 do begin +- s = string(parse_url(sample_urls[i]), /print) +- if s ne expected[i] then begin +- message, 'test failed for URL: ' + sample_urls[i], /continue +- message, ' expected: ' + expected[i], /continue +- message, ' got: ' + s, /continue +- ;help, parse_url(sample_urls[i]), /stru +- exit, status=1 +- endif +- endfor ++ if (s NE expected[i]) then begin ++ MESSAGE, 'test failed for URL: ' + sample_urls[i], /continue ++ MESSAGE, ' expected: ' + expected[i], /continue ++ MESSAGE, ' got: ' + s, /continue ++ ;;help, parse_url(sample_urls[i]), /stru ++ ;;EXIT, status=1 ++ nb_errors=nb_errors+1 ++ CONTINUE ++ endif ++endfor ++; ++if (nb_errors GT 0) then begin ++ print, 'Number of errors founded :', nb_errors ++ EXIT, status=1 ++endif ++; ++if KEYWORD_SET(test) then STOP ++; + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_zeropoly.pro cvs/gdl/testsuite/test_zeropoly.pro +--- gdl-0.9rc4/testsuite/test_zeropoly.pro 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/test_zeropoly.pro 2010-04-16 11:22:54.000000000 -0600 +@@ -44,4 +44,8 @@ + endif + endfor + ++ ; freeing heap vars ++ foreach i of c do ptr_free, i ++ foreach i of c do ptr_free, i ++ + end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/test_zzz.pro cvs/gdl/testsuite/test_zzz.pro +--- gdl-0.9rc4/testsuite/test_zzz.pro 1969-12-31 17:00:00.000000000 -0700 ++++ cvs/gdl/testsuite/test_zzz.pro 2010-04-07 10:29:37.000000000 -0600 +@@ -0,0 +1,5 @@ ++; the name 'zzz' is chosen to place this test at the end of the list ++pro test_zzz ++ spawn, './checks', exit_status=status ++ exit, status=status ++end +diff -ru --unidirectional-new-file --exclude=CVS gdl-0.9rc4/testsuite/try cvs/gdl/testsuite/try +--- gdl-0.9rc4/testsuite/try 2010-02-02 11:13:51.000000000 -0700 ++++ cvs/gdl/testsuite/try 2010-04-16 11:22:54.000000000 -0600 +@@ -8,9 +8,12 @@ + # expected contents/behaviour of the GDL file: + # - the script to be tried shoud exit with a non-zero status if failed + # (if the scripts exits with status 77, automake will ignore the failure) +-# - the file should containg a procedure with a named in accordance with the ++# - the file should contain a procedure named in accordance with the + # file name, e.g. test_wavelet in test_wavelet.pro + # - the procedure should not need any arguments/keywords + ++# a quick & dirty way of making the "checks" script work ++test "x$2" = "x./checks" && exit ++ + IDL_PATH="" IDL_STARTUP="" GDL_STARTUP="" GDL_PATH=$1/src/pro:$1/testsuite \ + $1/src/gdl -quiet -e `echo $2 | cut -d/ -f2 | cut -d. -f1` diff --git a/gdl-0.9rc4-python.patch b/gdl-0.9rc4-python.patch deleted file mode 100644 index 542f20e..0000000 --- a/gdl-0.9rc4-python.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- gdl-0.9rc4/src/pythongdl.cpp.python 2010-02-02 11:13:51.000000000 -0700 -+++ gdl-0.9rc4/src/pythongdl.cpp 2010-02-04 09:29:30.855905623 -0700 -@@ -176,7 +176,7 @@ - if( kwDict != NULL) - { - PyObject *key, *value; -- int dictPos = 0; -+ Py_ssize_t dictPos = 0; - - int nKW = PyDict_Size( kwDict); - -@@ -242,7 +242,7 @@ - if( kwDict != NULL) - { - PyObject *key, *value; -- int dictPos = 0; -+ Py_ssize_t dictPos = 0; - - int nKW = PyDict_Size( kwDict); - for( SizeT k=0; k= 14 +BuildRequires: antlr-C++ + %else BuildRequires: antlr + %endif %global plplot_config %{nil} %else %global plplot_config --enable-oldplplot @@ -78,14 +81,13 @@ Provides: %{name}-runtime = %{version}-%{release} %prep %setup -q -n %{name}-%{version}rc4 -%patch0 -p1 -b .wx-config -%patch1 -p1 -b .GDLLexer -%patch2 -p1 -b .python +%patch0 -p1 -b .cvs +%patch1 -p1 -b .wx-config %if !0%{?rhel} -#patch3 -p1 -b .antlr -%patch4 -p1 -b .antlr-auto +#patch4 -p1 -b .antlr +%patch5 -p1 -b .antlr-auto %endif -%patch5 -p1 -b .wx +#patch6 -p1 -b .wx %if !0%{?rhel} rm -rf src/antlr %endif @@ -167,6 +169,11 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Thu Jun 3 2010 Orion Poplawski - 0.9-0.13.rc4 +- Update to today's cvs +- Drop GLDLexer and python patches +- BR antlr-C++ on Fedora 14+ + * Mon Mar 22 2010 Orion Poplawski - 0.9-0.12.rc4 - Drop unused BR on proj-devel (bug #572616)