diff --git a/.gitignore b/.gitignore index d77399d..b6391d0 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ gdl-0.9rc4.tar.gz /gdl-0.9.6.tar.gz /gdl-0.9.6v2.tgz /gdl-0.9.7.tgz +/gdl-0.9.8.tgz diff --git a/gdl-alias.patch b/gdl-alias.patch new file mode 100644 index 0000000..39db1c1 --- /dev/null +++ b/gdl-alias.patch @@ -0,0 +1,54 @@ +diff -up gdl-0.9.8/src/basic_pro_jmg.cpp.alias gdl-0.9.8/src/basic_pro_jmg.cpp +--- gdl-0.9.8/src/basic_pro_jmg.cpp.alias 2018-04-11 19:20:07.670748377 -0600 ++++ gdl-0.9.8/src/basic_pro_jmg.cpp 2018-04-12 09:01:16.578294989 -0600 +@@ -23,6 +23,7 @@ + + #include "envt.hpp" + #include "dinterpreter.hpp" ++#include "prognode.hpp" + #include "basic_pro_jmg.hpp" + + #define MAXNDLL 40 +@@ -38,8 +39,8 @@ namespace lib { + + using namespace std; + +- void (*dynPro[MAXNDLL/2])( EnvT* e); +- BaseGDL*(*dynFun[MAXNDLL/2])( EnvT* e); ++ LibPro dynPro[MAXNDLL/2]; ++ LibFun dynFun[MAXNDLL/2]; + + void point_lun( EnvT* e) + { +@@ -141,11 +142,11 @@ namespace lib { + + #if defined(_WIN32) && !defined(__CYGWIN__) + if (funcType == 0) { +- (void* &) dynPro[count_pro] = +- (void *) GetProcAddress(module[count], entryName.c_str()); ++ dynPro[count_pro] = ++ (LibPro) GetProcAddress(module[count], entryName.c_str()); + } else if (funcType == 1) { +- (BaseGDL* &) dynFun[count_fun] = +- (BaseGDL*) GetProcAddress(module[count], entryName.c_str()); ++ dynFun[count_fun] = ++ (LibFun) GetProcAddress(module[count], entryName.c_str()); + } else { + printf("Improper function type: %d\n", funcType); + FreeLibrary(module[count]); +@@ -153,11 +154,11 @@ namespace lib { + } + #else + if (funcType == 0) { +- (void* &) dynPro[count_pro] = +- (void *) dlsym(module[count], entryName.c_str()); ++ dynPro[count_pro] = ++ (LibPro) dlsym(module[count], entryName.c_str()); + } else if (funcType == 1) { +- (BaseGDL* &) dynFun[count_fun] = +- (BaseGDL*) dlsym(module[count], entryName.c_str()); ++ dynFun[count_fun] = ++ (LibFun) dlsym(module[count], entryName.c_str()); + } else { + printf("Improper function type: %d\n", funcType); + dlclose(module[count]); diff --git a/gdl-array.patch b/gdl-array.patch deleted file mode 100644 index 3b425db..0000000 --- a/gdl-array.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 965eb0af7a532740637c96ac31f7fc5d022d1953 Mon Sep 17 00:00:00 2001 -From: Gilles Duvert -Date: Tue, 24 Jan 2017 10:05:41 +0000 -Subject: [PATCH] reverted to previous version since correction of bug#709 was - making a mess with array dimensions. - ---- - src/accessdesc.hpp | 3 ++- - src/dimension.hpp | 16 +++++++++------- - 2 files changed, 11 insertions(+), 8 deletions(-) - -diff --git a/src/accessdesc.hpp b/src/accessdesc.hpp -index 0309d11..b4d78a9 100644 ---- a/src/accessdesc.hpp -+++ b/src/accessdesc.hpp -@@ -317,7 +317,8 @@ class DotAccessDescT - // dim >> topDim; - dim >> ix[d]->GetDim(); - } -- dim.Purge(); -+// Was added to solve bug 709 but may have side effects. -+// dim.Purge(); - } - - private: -diff --git a/src/dimension.hpp b/src/dimension.hpp -index 6469648..1345ff5 100644 ---- a/src/dimension.hpp -+++ b/src/dimension.hpp -@@ -378,13 +378,15 @@ class dimension - // throw away unused ranks (ie. ranks == 1) - void Purge() - { -- //old version: produce bug #709 --// for(; rank>1 && dim[rank-1] <= 1; --rank); -- int m=rank-1; -- for (; m>0; --m) if (dim[m]<=1) { -- for (int j=m; j1 && dim[rank-1] <= 1; --rank); -+// However those following lines are too strict: test=fltarr(1, 1, 114) & help,test -+// gives: TEST FLOAT = Array[1, 114] instead of good answer TEST FLOAT = Array[1, 1, 114] -+// int m=rank-1; -+// for (; m>0; --m) if (dim[m]<=1) { -+// for (int j=m; jResizeForLoops( nForLoopsIn); + +@@ -6456,7 +6456,7 @@ template sta + try { + oStruct = e->GetObjHeap( objRef); + } +- catch ( GDLInterpreter::HeapException ) ++ catch ( GDLInterpreter::HeapException& ) + { // non valid object + if( count) + e->SetKW( countIx, new DLongGDL( 0)); +diff -up gdl-0.9.8/src/dinterpreter.cpp.catch gdl-0.9.8/src/dinterpreter.cpp +--- gdl-0.9.8/src/dinterpreter.cpp.catch 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/dinterpreter.cpp 2018-03-26 16:53:15.635298830 -0600 +@@ -143,7 +143,7 @@ DStructGDL* GDLInterpreter::ObjectStruct + try { + oStructGDL= GetObjHeap( o); + } +- catch ( HeapException) ++ catch ( HeapException&) + { + throw GDLException( mp, "Object not valid: "+Name(self)); + } +@@ -578,12 +578,12 @@ bool GDLInterpreter::CompileFile(const s + return false; + } + } +- catch( GDLException e) ++ catch( GDLException& e) + { + ReportCompileError( e, f); + return false; + } +- catch( ANTLRException e) ++ catch( ANTLRException& e) + { + cerr << "Lexer/Parser exception: " << e.getMessage() << endl; + return false; +@@ -612,13 +612,13 @@ bool GDLInterpreter::CompileFile(const s + + if( treeParser.ActiveProCompiled()) RetAll(); + } +- catch( GDLException e) ++ catch( GDLException& e) + { + ReportCompileError( e, f); + if( treeParser.ActiveProCompiled()) RetAll(); + return false; + } +- catch( ANTLRException e) ++ catch( ANTLRException& e) + { + cerr << "Compiler exception: " << e.getMessage() << endl; + if( treeParser.ActiveProCompiled()) RetAll(); +@@ -705,7 +705,7 @@ DInterpreter::CommandCode DInterpreter:: + // default is more verbose + CompileFile( argstr); //, origstr); + } +- catch( RetAllException) ++ catch( RetAllException&) + { + // delay the RetAllException until finished + retAll = true; +@@ -771,7 +771,7 @@ DInterpreter::CommandCode DInterpreter:: + // default is more verbose + CompileFile( argstr); //, origstr); + } +- catch( RetAllException) ++ catch( RetAllException&) + { + // delay the RetAllException until finished + retAll = true; +diff -up gdl-0.9.8/src/getfmtast.cpp.catch gdl-0.9.8/src/getfmtast.cpp +--- gdl-0.9.8/src/getfmtast.cpp.catch 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/getfmtast.cpp 2018-03-26 16:54:32.793899215 -0600 +@@ -68,15 +68,15 @@ RefFMTNode GetFMTAST( DString fmtString) + cout << endl; + #endif + } +- catch( GDLException ex) ++ catch( GDLException& ex) + { + throw GDLException("Format: "+ex.getMessage()); + } +- catch( antlr::ANTLRException ex) ++ catch( antlr::ANTLRException& ex) + { + throw GDLException("Format parser: "+ex.getMessage()); + } +- catch( exception ex) ++ catch( exception& ex) + { + throw GDLException("Format exception: "+string(ex.what())); + } diff --git a/gdl-gcc6.patch b/gdl-gcc6.patch deleted file mode 100644 index 67610f1..0000000 --- a/gdl-gcc6.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff -up gdl-0.9.6/src/specializations.hpp.gcc6 gdl-0.9.6/src/specializations.hpp ---- gdl-0.9.6/src/specializations.hpp.gcc6 2015-08-24 15:26:47.000000000 -0600 -+++ gdl-0.9.6/src/specializations.hpp 2016-03-03 16:30:46.694379312 -0700 -@@ -534,16 +534,6 @@ void Data_::MinMax( DLong* mi - - // default_io.cpp - template<> --std::istream& operator>>(std::istream& i, Data_& data_); --template<> --std::istream& operator>>(std::istream& i, Data_& data_); --template<> --std::istream& operator>>(std::istream& i, Data_& data_); --template<> --std::istream& operator>>(std::istream& i, Data_& data_); --template<> --std::istream& operator>>(std::istream& is, Data_& data_); --template<> - std::ostream& Data_::ToStream(std::ostream& o, SizeT w, SizeT* actPosPtr); - template<> - std::ostream& Data_::ToStream(std::ostream& o, SizeT w, SizeT* actPosPtr); diff --git a/gdl-return.patch b/gdl-return.patch new file mode 100644 index 0000000..f506877 --- /dev/null +++ b/gdl-return.patch @@ -0,0 +1,288 @@ +diff -up gdl-0.9.8/src/basic_fun.cpp.return gdl-0.9.8/src/basic_fun.cpp +--- gdl-0.9.8/src/basic_fun.cpp.return 2018-04-11 16:33:39.117920749 -0600 ++++ gdl-0.9.8/src/basic_fun.cpp 2018-04-11 16:33:39.124920716 -0600 +@@ -4420,6 +4420,7 @@ BaseGDL* where_fun(EnvT* e) { + } + } + } ++ return NULL; // should not reach + } + // uses MergeSort + // 2 parts in the code: without "width" or with "width" (limited to 1D and 2D) +@@ -6249,6 +6250,7 @@ template sta + } + + } else e->Throw("Operand must be integer:" + e->GetParString(0)); ++ return NULL; // should not reach + } + + BaseGDL* shift_fun( EnvT* e) { +@@ -6544,6 +6546,7 @@ template sta + } + return res; + } else e->Throw("Object reference type required in this context: " + e->GetParString(0)); ++ return NULL; // should not reach + } + + BaseGDL* n_tags( EnvT* e) +@@ -8328,6 +8331,7 @@ template sta + } + } + e->Throw("Expecting string or byte array as a first parameter"); ++ return NULL; // should not reach + } + + BaseGDL* get_drive_list(EnvT* e) +@@ -8442,6 +8446,7 @@ template sta + return res; + + } ++ return NULL; // should not reach + } + + // note: changes here MUST be reflected in scope_varfetch_reference() as well +diff -up gdl-0.9.8/src/basic_pro_jmg.cpp.return gdl-0.9.8/src/basic_pro_jmg.cpp +--- gdl-0.9.8/src/basic_pro_jmg.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/basic_pro_jmg.cpp 2018-04-11 19:20:07.670748377 -0600 +@@ -589,6 +589,7 @@ namespace lib { + break; + } + assert( false); ++ return NULL; // Silence warning + } + + +diff -up gdl-0.9.8/src/graphicsdevice.hpp.return gdl-0.9.8/src/graphicsdevice.hpp +--- gdl-0.9.8/src/graphicsdevice.hpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/graphicsdevice.hpp 2018-04-11 19:21:25.832376682 -0600 +@@ -220,8 +220,8 @@ public: + virtual void MaxXYSize(DLong *xsize, DLong *ysize) { + *xsize=1200, *ysize=800; return;} + virtual DLong GetDecomposed() { return -1;} +- virtual BaseGDL* GetFontnames() { ThrowGDLException("DEVICE: Keyword GET_FONTNAMES not allowed for call to: DEVICE" );}//{return NULL;} +- virtual DLong GetFontnum() { ThrowGDLException("DEVICE: Keyword GET_FONTNUM not allowed for call to: DEVICE" );}//{return -1;} ++ virtual BaseGDL* GetFontnames() { ThrowGDLException("DEVICE: Keyword GET_FONTNAMES not allowed for call to: DEVICE" ); return NULL;} ++ virtual DLong GetFontnum() { ThrowGDLException("DEVICE: Keyword GET_FONTNUM not allowed for call to: DEVICE" ); return -1;} + virtual bool SetFont(DString f) {static int warning_sent=1; if (warning_sent) {Warning("SET_FONT not active for this device (FIXME)."); warning_sent=0;} return true;} + virtual DString GetCurrentFont() {return NULL;} + virtual DLong GetGraphicsFunction() { return -1;} +@@ -360,8 +360,8 @@ public: + bool UnsetFocus(); + bool Decomposed(bool value); + DLong GetDecomposed(); +- BaseGDL* GetFontnames(){ ThrowGDLException("DEVICE: Keyword GET_FONTNAMES not allowed for call to: DEVICE" );}//{return NULL;} +- DLong GetFontnum(){ ThrowGDLException("DEVICE: Keyword GET_FONTNUM not allowed for call to: DEVICE" );}//{return -1;} ++ BaseGDL* GetFontnames(){ ThrowGDLException("DEVICE: Keyword GET_FONTNAMES not allowed for call to: DEVICE" ); return NULL;} ++ DLong GetFontnum(){ ThrowGDLException("DEVICE: Keyword GET_FONTNUM not allowed for call to: DEVICE" ); return -1;} + bool SetFont(DString f) {fontname=f; return true;} + DString GetCurrentFont() {return fontname;} + bool SetBackingStore(int value); +diff -up gdl-0.9.8/src/gzstream.hpp.return gdl-0.9.8/src/gzstream.hpp +--- gdl-0.9.8/src/gzstream.hpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/gzstream.hpp 2018-04-11 16:33:39.125920711 -0600 +@@ -75,9 +75,9 @@ public: + std::streampos pubseekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which=std::ios_base::in|std::ios_base::out); + //hacks for not being lost with input gzipped streams + std::streampos getPosition(){return position;} +- std::streampos setPosition(long pos){position=pos;} +- std::streampos incrementPosition(long pos=1){position+=pos;} +- std::streampos decrementPosition(long pos=1){position-=pos;} ++ void setPosition(long pos){position=pos;} ++ void incrementPosition(long pos=1){position+=pos;} ++ void decrementPosition(long pos=1){position-=pos;} + }; + + class gzstreambase : virtual public std::ios { +diff -up gdl-0.9.8/src/hdf_fun.cpp.return gdl-0.9.8/src/hdf_fun.cpp +--- gdl-0.9.8/src/hdf_fun.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/hdf_fun.cpp 2018-04-11 19:22:44.477002324 -0600 +@@ -106,6 +106,7 @@ namespace lib { + return new DLongGDL( Vattach(hdf_id, vg_ref, "r")); + else if (e->KeywordSet( writeIx )) + return new DLongGDL( Vattach(hdf_id, vg_ref, "w")); ++ return NULL; + } + + +diff -up gdl-0.9.8/src/hdf_pro.cpp.return gdl-0.9.8/src/hdf_pro.cpp +--- gdl-0.9.8/src/hdf_pro.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/hdf_pro.cpp 2018-04-11 16:33:39.126920706 -0600 +@@ -34,7 +34,7 @@ namespace lib { + using namespace std; + + template< typename T> +- BaseGDL* hdf_sd_getdata_template( EnvT* e, dimension dim, int32 sds_id, ++ void hdf_sd_getdata_template( EnvT* e, dimension dim, int32 sds_id, + int32 start[], int32 edges[], int32 stride[], + DLongGDL* strideKW) + { +@@ -622,7 +622,7 @@ namespace lib { + } + + template< typename T> +- BaseGDL* hdf_sd_getdscl_template(EnvT* e, DLong dim_size, int32 dim_id) ++ void hdf_sd_getdscl_template(EnvT* e, DLong dim_size, int32 dim_id) + { + T* data = new T(dimension(dim_size), BaseGDL::NOZERO); + SDgetdimscale(dim_id, data->DataAddr()); +diff -up gdl-0.9.8/src/list.cpp.return gdl-0.9.8/src/list.cpp +--- gdl-0.9.8/src/list.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/list.cpp 2018-04-11 19:24:14.900571515 -0600 +@@ -149,6 +149,7 @@ + { + ThrowFromInternalUDSub( e, "SELF object ID <"+i2s(selfID)+"> not found."); + } ++ return NULL; + } + + void LIST__ToStream( DStructGDL* oStructGDL, std::ostream& o, SizeT w, SizeT* actPosPtr) +diff -up gdl-0.9.8/src/magick_cl.cpp.return gdl-0.9.8/src/magick_cl.cpp +--- gdl-0.9.8/src/magick_cl.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/magick_cl.cpp 2018-04-11 19:27:37.564602966 -0600 +@@ -125,6 +125,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + + BaseGDL * magick_ping(EnvT* e) { +@@ -332,6 +333,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + + //CLOSE, magic_id +@@ -411,6 +413,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + + //MAGICK_READCOLORMAPRGB, mid, red, green, blue +@@ -572,6 +575,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + + // MAGICK_WRITE, mid, gdlImageArray, rgb=rgb +@@ -706,6 +710,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + + //magickNumber=MAGICK_MAGICK(mid [, "imageType"]) +@@ -727,6 +732,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + + //nrows=MAGICK_ROWS(mid) +@@ -740,6 +746,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + + //ncols=MAGICK_COLUMNS(mid) +@@ -753,6 +760,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } ++ return NULL; + } + //bool=MAGICK_INDEXEDCOLOR(mid) + BaseGDL* magick_IndexedColor(EnvT* e) { +@@ -769,7 +777,7 @@ namespace lib { + } catch (Exception &error_) { + e->Throw(error_.what()); + } +- ++ return NULL; + } + + //MAGICK_QUALITY, mid, quality +diff -up gdl-0.9.8/src/math_fun_jmg.cpp.return gdl-0.9.8/src/math_fun_jmg.cpp +--- gdl-0.9.8/src/math_fun_jmg.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/math_fun_jmg.cpp 2018-04-11 19:29:36.258031486 -0600 +@@ -288,6 +288,7 @@ extern "C" { + return res; + } + assert( false); ++ return NULL; + } + }; + +diff -up gdl-0.9.8/src/math_fun_ng.cpp.return gdl-0.9.8/src/math_fun_ng.cpp +--- gdl-0.9.8/src/math_fun_ng.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/math_fun_ng.cpp 2018-04-11 19:30:57.610639792 -0600 +@@ -371,6 +371,7 @@ namespace lib { + return Yout; + } + assert( false); ++ return NULL; + }// RK4_fun + + }//namespace +diff -up gdl-0.9.8/src/plotting_convert_coord.cpp.return gdl-0.9.8/src/plotting_convert_coord.cpp +--- gdl-0.9.8/src/plotting_convert_coord.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/plotting_convert_coord.cpp 2018-04-11 20:42:10.177037332 -0600 +@@ -368,6 +368,7 @@ namespace lib { + delete res; + return res1; + } ++ return NULL; // Should not reach + } + + //THE FOLLOWING ARE POSSIBLY THE WORST WAY TO DO THE JOB. At least they are to be used *only* +diff -up gdl-0.9.8/src/pythongdl.cpp.return gdl-0.9.8/src/pythongdl.cpp +--- gdl-0.9.8/src/pythongdl.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/pythongdl.cpp 2018-04-11 16:33:39.127920702 -0600 +@@ -272,6 +272,7 @@ int GDLEventHandlerPy() + GDLEventHandler(); + if( oldInputHook != NULL) + (*oldInputHook)(); ++ return 0; + } + + // Execute a GDL subroutine +diff -up gdl-0.9.8/src/triangulation.cpp.return gdl-0.9.8/src/triangulation.cpp +--- gdl-0.9.8/src/triangulation.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/triangulation.cpp 2018-04-11 20:43:03.965777173 -0600 +@@ -1108,6 +1108,7 @@ namespace lib { + BaseGDL* qgrid3_fun ( EnvT* e) + { + e->Throw("Please Write this function in GDL."); ++ return NULL; + } + #endif + } +diff -up gdl-0.9.8/src/widget.cpp.return gdl-0.9.8/src/widget.cpp +--- gdl-0.9.8/src/widget.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/widget.cpp 2018-04-11 20:45:36.447036861 -0600 +@@ -45,6 +45,7 @@ wxRealPoint GetRequestedUnitConversionFa + if (the_units==0) return wxRealPoint(1,1); + if (the_units==1) return wxRealPoint(sx*25.4,sy*25.4); + if (the_units==2) return wxRealPoint(sx*10.0,sy*10.0); ++ return wxRealPoint(0,0); // Should not reach + } + + void GDLWidget::ChangeUnitConversionFactor( EnvT* e) +@@ -2231,6 +2232,7 @@ endwait: + } + } while (infinity); + #endif ++ return NULL; // Should not reach + } + + void widget_control( EnvT* e ) { diff --git a/gdl-saverestore.patch b/gdl-saverestore.patch new file mode 100644 index 0000000..ffaff91 --- /dev/null +++ b/gdl-saverestore.patch @@ -0,0 +1,11 @@ +diff -up gdl-0.9.8/src/saverestore.cpp.return gdl-0.9.8/src/saverestore.cpp +--- gdl-0.9.8/src/saverestore.cpp.return 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/saverestore.cpp 2018-04-11 16:33:39.129920693 -0600 +@@ -164,6 +164,7 @@ namespace lib { + + uint32_t writeEnd(XDR *xdrs) { + uint32_t cur=writeNewRecordHeader(xdrs, 6); ++ return cur; + } + + int getVersion(XDR* xdrs) { diff --git a/gdl-sign.patch b/gdl-sign.patch new file mode 100644 index 0000000..2f459eb --- /dev/null +++ b/gdl-sign.patch @@ -0,0 +1,63 @@ +diff -up gdl-0.9.8/src/dinterpreter.cpp.sign gdl-0.9.8/src/dinterpreter.cpp +--- gdl-0.9.8/src/dinterpreter.cpp.sign 2018-04-14 20:29:23.612484457 -0600 ++++ gdl-0.9.8/src/dinterpreter.cpp 2018-04-14 20:29:23.628484629 -0600 +@@ -666,7 +666,7 @@ DInterpreter::CommandCode DInterpreter:: + DInterpreter::CommandCode DInterpreter::CmdCompile( const string& command) + { + string cmdstr = command; +- int sppos = cmdstr.find(" ",0); ++ size_t sppos = cmdstr.find(" ",0); + if (sppos == string::npos) + { + cout << "Interactive COMPILE not implemented yet." << endl; +@@ -676,7 +676,7 @@ DInterpreter::CommandCode DInterpreter:: + bool retAll = false; // Remember if Retall is needed + + // Parse each file name +- int pos = sppos + 1; ++ size_t pos = sppos + 1; + while (pos < command.length()) + { + sppos = command.find(" ",pos); +@@ -737,7 +737,7 @@ DInterpreter::CommandCode DInterpreter:: + bool retAll = false; // Remember if Retall is needed + + // Parse each file name +- int pos = sppos + 1; ++ size_t pos = sppos + 1; + while (pos < command.length()) + { + sppos = command.find(" ",pos); +@@ -799,7 +799,7 @@ DInterpreter::CommandCode DInterpreter:: + { + string cmdstr = command; + string args; +- int sppos = cmdstr.find(" ",0); ++ size_t sppos = cmdstr.find(" ",0); + if (sppos != string::npos) { + args = cmdstr.substr(sppos+1); + cmdstr = cmdstr.substr(0, sppos); +diff -up gdl-0.9.8/src/GDLLexer.cpp.sign gdl-0.9.8/src/GDLLexer.cpp +--- gdl-0.9.8/src/GDLLexer.cpp.sign 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/GDLLexer.cpp 2018-04-14 20:30:05.656936102 -0600 +@@ -434,7 +434,7 @@ void GDLLexer::mINCLUDE(bool _createToke + std::string name = f->getText(); + + // find comments on the same line +- long pos = name.find_first_of(';', 0); ++ size_t pos = name.find_first_of(';', 0); + if( pos != std::string::npos) // remove them + name = name.substr(0, pos); + +diff -up gdl-0.9.8/src/GDLParser.cpp.sign gdl-0.9.8/src/GDLParser.cpp +--- gdl-0.9.8/src/GDLParser.cpp.sign 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/GDLParser.cpp 2018-04-14 20:29:23.630484650 -0600 +@@ -6773,7 +6773,7 @@ void GDLParser::arrayindex_list() { + antlr::ASTPair currentAST; + RefDNode arrayindex_list_AST = RefDNode(antlr::nullAST); + +- int rank = 1; ++ SizeT rank = 1; + + + if ((LA(1) == LSQUARE)) { diff --git a/gdl-std.patch b/gdl-std.patch new file mode 100644 index 0000000..d60ec37 --- /dev/null +++ b/gdl-std.patch @@ -0,0 +1,11 @@ +diff -up gdl-0.9.8/src/basic_fun.cpp.std gdl-0.9.8/src/basic_fun.cpp +--- gdl-0.9.8/src/basic_fun.cpp.std 2018-04-11 09:17:16.200257202 -0600 ++++ gdl-0.9.8/src/basic_fun.cpp 2018-04-11 09:20:12.854448333 -0600 +@@ -111,6 +111,7 @@ namespace lib { + std::vector command_line_args; + + // using namespace std; ++ using std::isinf; + using std::isnan; + using namespace antlr; + diff --git a/gdl-uninit.patch b/gdl-uninit.patch new file mode 100644 index 0000000..002ec09 --- /dev/null +++ b/gdl-uninit.patch @@ -0,0 +1,12 @@ +diff -up gdl-0.9.8/src/GDLInterpreter.cpp.uninit gdl-0.9.8/src/GDLInterpreter.cpp +--- gdl-0.9.8/src/GDLInterpreter.cpp.uninit 2018-04-11 16:33:42.112906758 -0600 ++++ gdl-0.9.8/src/GDLInterpreter.cpp 2018-04-11 22:14:29.401901171 -0600 +@@ -2905,7 +2905,7 @@ void GDLInterpreter::tag_array_expr(Prog + BaseGDL* GDLInterpreter::r_dot_indexable_expr(ProgNodeP _t, + DotAccessDescT* aD + ) { +- BaseGDL* res; ++ BaseGDL* res = NULL; + ProgNodeP r_dot_indexable_expr_AST_in = (_t == ProgNodeP(ASTNULL)) ? ProgNodeP(antlr::nullAST) : _t; + + switch ( _t->getType()) { diff --git a/gdl-vector.patch b/gdl-vector.patch new file mode 100644 index 0000000..a183dd9 --- /dev/null +++ b/gdl-vector.patch @@ -0,0 +1,25 @@ +diff -up gdl-0.9.8/src/medianfilter.cpp.vector gdl-0.9.8/src/medianfilter.cpp +--- gdl-0.9.8/src/medianfilter.cpp.vector 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/medianfilter.cpp 2018-05-20 15:19:38.072948145 -0600 +@@ -673,8 +673,8 @@ static inline void histogram_add( const + #elif defined(__ALTIVEC__) + static inline void histogram_add( const uint16_t x[16], uint16_t y[16] ) + { +- *(vector unsigned short*) &y[0] = vec_add( *(vector unsigned short*) &y[0], *(vector unsigned short*) &x[0] ); +- *(vector unsigned short*) &y[8] = vec_add( *(vector unsigned short*) &y[8], *(vector unsigned short*) &x[8] ); ++ *(__vector unsigned short*) &y[0] = vec_add( *(__vector unsigned short*) &y[0], *(__vector unsigned short*) &x[0] ); ++ *(__vector unsigned short*) &y[8] = vec_add( *(__vector unsigned short*) &y[8], *(__vector unsigned short*) &x[8] ); + } + #else + static inline void histogram_add( const uint16_t x[16], uint16_t y[16] ) +@@ -707,8 +707,8 @@ static inline void histogram_sub( const + #elif defined(__ALTIVEC__) + static inline void histogram_sub( const uint16_t x[16], uint16_t y[16] ) + { +- *(vector unsigned short*) &y[0] = vec_sub( *(vector unsigned short*) &y[0], *(vector unsigned short*) &x[0] ); +- *(vector unsigned short*) &y[8] = vec_sub( *(vector unsigned short*) &y[8], *(vector unsigned short*) &x[8] ); ++ *(__vector unsigned short*) &y[0] = vec_sub( *(__vector unsigned short*) &y[0], *(__vector unsigned short*) &x[0] ); ++ *(__vector unsigned short*) &y[8] = vec_sub( *(__vector unsigned short*) &y[8], *(__vector unsigned short*) &x[8] ); + } + #else + static inline void histogram_sub( const uint16_t x[16], uint16_t y[16] ) diff --git a/gdl-warnings.patch b/gdl-warnings.patch new file mode 100644 index 0000000..1ffab49 --- /dev/null +++ b/gdl-warnings.patch @@ -0,0 +1,30 @@ +diff -up gdl-0.9.8/src/gdlc.g.warnings gdl-0.9.8/src/gdlc.g +--- gdl-0.9.8/src/gdlc.g.warnings 2018-03-26 03:57:27.000000000 -0600 ++++ gdl-0.9.8/src/gdlc.g 2018-04-14 21:04:41.196663086 -0600 +@@ -1217,7 +1217,7 @@ numeric_constant!// + + arrayindex_list + { +- int rank = 1; ++ SizeT rank = 1; + } + : LSQUARE! arrayindex ({++rank <= MAXRANK}? COMMA! arrayindex)* RSQUARE! + | { IsRelaxed()}? LBRACE! arrayindex +@@ -1948,7 +1948,7 @@ tokens { + { + // Stuff for include files (@filename) + private: +- std::auto_ptr inputFile; // stores ifsteam* and deletes ++ std::unique_ptr inputFile; // stores ifsteam* and deletes + // it when it is deleted itself + + antlr::TokenStreamSelector* selector; +@@ -2071,7 +2071,7 @@ INCLUDE! + std::string name = f->getText(); + + // find comments on the same line +- long pos = name.find_first_of(';', 0); ++ size_t pos = name.find_first_of(';', 0); + if( pos != std::string::npos) // remove them + name = name.substr(0, pos); + diff --git a/gdl.spec b/gdl.spec index a1b70b9..ddecb61 100644 --- a/gdl.spec +++ b/gdl.spec @@ -1,6 +1,6 @@ Name: gdl -Version: 0.9.7 -Release: 11%{?dist} +Version: 0.9.8 +Release: 1%{?dist} Summary: GNU Data Language Group: Applications/Engineering @@ -10,16 +10,30 @@ Source0: http://downloads.sourceforge.net/gnudatalanguage/%{name}-%{versi Source1: gdl.csh Source2: gdl.sh Source3: makecvstarball +Source4: xorg.conf # Build with system antlr library. Request for upstream change here: # https://sourceforge.net/tracker/index.php?func=detail&aid=2685215&group_id=97659&atid=618686 Patch1: gdl-antlr.patch -# Fix problem with arra generation -Patch2: gdl-array.patch -# Fix build with gcc 6 -# https://sourceforge.net/p/gnudatalanguage/bugs/686/ -# https://sourceforge.net/p/gnudatalanguage/bugs/688/ -Patch4: gdl-gcc6.patch - +# Catch by reference +# https://github.com/gnudatalanguage/gdl/pull/5 +Patch2: gdl-catch.patch +# https://github.com/gnudatalanguage/gdl/pull/142 +Patch3: gdl-std.patch +# Silence some (harmless) warnings about return values +Patch4: gdl-return.patch +# https://github.com/gnudatalanguage/gdl/pull/274 +Patch5: gdl-sign.patch +# https://github.com/gnudatalanguage/gdl/pull/275 +Patch6: gdl-uninit.patch +# Fix -Wstrict-aliasing warning +# https://github.com/gnudatalanguage/gdl/pull/162 +Patch7: gdl-alias.patch +# https://github.com/gnudatalanguage/gdl/pull/276 +Patch8: gdl-warnings.patch +# +Patch9: gdl-vector.patch +# Fix test_save_restore segfault with gcc 8 +Patch10: gdl-saverestore.patch #RHEL5 doesn't have the needed antlr version/headers, has old plplot %if 0%{?rhel} == 5 @@ -49,6 +63,7 @@ BuildRequires: grib_api-static %endif %endif BuildRequires: eigen3-static +BuildRequires: libtirpc-devel #TODO - Build with mpi support #BuildRequires: mpich2-devel BuildRequires: pslib-devel @@ -61,7 +76,7 @@ BuildRequires: udunits2-devel BuildRequires: wxGTK-devel BuildRequires: cmake # For tests -BuildRequires: xorg-x11-server-Xvfb +BuildRequires: xorg-x11-drv-dummy BuildRequires: metacity # Needed to pull in drivers Requires: plplot @@ -110,8 +125,17 @@ Provides: %{name}-runtime = %{version}-%{release} %setup -q -n %{name}-%{version} rm -rf src/antlr %patch1 -p1 -b .antlr -%patch2 -p1 -b .array -%patch4 -p1 -b .gcc6 +%patch2 -p1 -b .catch +%patch3 -p1 -b .std +%patch4 -p1 -b .return +%patch5 -p1 -b .sign +%patch6 -p1 -b .uninit +%patch7 -p1 -b .alias +%patch8 -p1 -b .warnings +%patch9 -p1 -b .vector +%patch10 -p1 -b .saverestore +# Stray link +rm src/gdl pushd src for f in *.g @@ -140,12 +164,12 @@ mkdir build build-python #Build the standalone executable pushd build %{cmake} %{cmake_opts} .. -make %{?_smp_mflags} +make #{?_smp_mflags} popd #Build the python module pushd build-python %{cmake} %{cmake_opts} -DPYTHON_MODULE=ON .. -make %{?_smp_mflags} +make #{?_smp_mflags} popd @@ -168,37 +192,57 @@ install -m 0644 %SOURCE2 $RPM_BUILD_ROOT/%{_sysconfdir}/profile.d %check cd build -# test_bug_3275334 and window_background appear to need to read from display -# test_bug_3147146 failure -# https://sourceforge.net/p/gnudatalanguage/bugs/619/ -# test_bug_3285659 failure -# https://sourceforge.net/p/gnudatalanguage/bugs/387/ -# test_routine_names failure -# https://sourceforge.net/p/gnudatalanguage/bugs/647/ -# test_zip - https://sourceforge.net/p/gnudatalanguage/bugs/632/ -cat > xrun.sh <<'EOF' +cp %SOURCE4 . +if [ -x /usr/libexec/Xorg ]; then + Xorg=/usr/libexec/Xorg +elif [ -x /usr/libexec/Xorg.bin ]; then + Xorg=/usr/libexec/Xorg.bin +else + Xorg=/usr/bin/Xorg +fi +$Xorg -noreset +extension GLX +extension RANDR +extension RENDER -logfile ./xorg.log -config ./xorg.conf -configdir . :99 & +export DISPLAY=:99 + metacity & sleep 2 -failing_tests='test_(bug_3275334|sem|window_background)' -%ifarch aarch64 ppc +# fft_leak - https://github.com/gnudatalanguage/gdl/issues/147 +# file_delete - https://github.com/gnudatalanguage/gdl/issues/148 +# fix - https://github.com/gnudatalanguage/gdl/issues/149 +# formats - https://github.com/gnudatalanguage/gdl/issues/144 +# n_tags - https://github.com/gnudatalanguage/gdl/issues/150 +# obj_isa - https://github.com/gnudatalanguage/gdl/issues/151 +# parse_url - https://github.com/gnudatalanguage/gdl/issues/153 +# resolve_routine - https://github.com/gnudatalanguage/gdl/issues/146 +# rounding - https://github.com/gnudatalanguage/gdl/issues/154 +# total - https://github.com/gnudatalanguage/gdl/issues/155 +failing_tests='test_(fft_leak|file_delete|finite|fix|formats|idlneturl|make_dll|n_tags|obj_isa|parse_url|resolve_routine|rounding|total)' +%ifarch aarch64 ppc %{power64} # test_fix fails currently on arm # https://sourceforge.net/p/gnudatalanguage/bugs/622/ # https://bugzilla.redhat.com/show_bug.cgi?id=990749 failing_tests="$failing_tests|test_fix" %endif +%ifarch aarch64 +failing_tests="$failing_tests|test_(l64|xdr)" +%endif %ifarch %{arm} # These fail on 32-bit: test_formats test_xdr -failing_tests="$failing_tests|test_(fix|formats|xdr)" +failing_tests="$failing_tests|test_(fix|formats)" %endif %ifarch %{ix86} # These fail on 32-bit: test_formats test_xdr -failing_tests="$failing_tests|test_(formats|xdr)" +failing_tests="$failing_tests|test_(formats|l64|sem|xdr)" +%endif +%ifarch s390x +eailing_tests="$failing_tests|test_(save_restore|window_background)" %endif make check ARGS="-V -E '$failing_tests'" +%ifnarch s390x +# test_save_restore hangs on s390x make check ARGS="-V -R '$failing_tests'" || : -EOF -chmod +x xrun.sh -xvfb-run ./xrun.sh +%endif +kill %1 || : +cat xorg.log %files @@ -216,6 +260,14 @@ xvfb-run ./xrun.sh %changelog +* Sun May 20 2018 Orion Poplawski - 0.9.8-1 +- Update to 0.9.8 +- Drop parallel make for now +- Use libtirpc +- Switch to Xorg dummy driver for tests, fail build on test failure +- Add patch to fix ppc64 altivec vector usage +- Add patches to fix various warnings + * Thu Mar 01 2018 Iryna Shcherbina - 0.9.7-11 - Update Python 2 dependency declarations to new packaging standards (See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3) diff --git a/sources b/sources index 275bfae..f616f2e 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (gdl-0.9.7.tgz) = 1fef5ccccb31bdb39b5f855ba030fd7bed6b3deacf9aefce7f5afcd7ca48f5d25dfe20d32eb1d1fd25a533f69cabc341d1146e2f8e41f6c986163a9b84fda03b +SHA512 (gdl-0.9.8.tgz) = df7728b6e79a8e812ed022f7fb60d23ad331337d15a77c94d1666a5a1ab63e14c1607520a752ceff999eb65bbde12fa9fffd8d82806455b1c0651cb5f2d92a10 diff --git a/xorg.conf b/xorg.conf new file mode 100644 index 0000000..39bc48a --- /dev/null +++ b/xorg.conf @@ -0,0 +1,135 @@ +# This xorg configuration file is meant to be used +# to start a dummy X11 server for graphical testing. + +Section "ServerFlags" + Option "DontVTSwitch" "true" + Option "AllowMouseOpenFail" "true" + Option "PciForceNone" "true" + Option "AutoEnableDevices" "false" + Option "AutoAddDevices" "false" +EndSection + +Section "InputDevice" + Identifier "dummy_mouse" + Option "CorePointer" "true" + Driver "void" +EndSection + +Section "InputDevice" + Identifier "dummy_keyboard" + Option "CoreKeyboard" "true" + Driver "void" +EndSection + +Section "Device" + Identifier "dummy_videocard" + Driver "dummy" + Option "ConstantDPI" "true" + #VideoRam 4096000 + #VideoRam 256000 + VideoRam 192000 +EndSection + +Section "Monitor" + Identifier "dummy_monitor" + HorizSync 5.0 - 1000.0 + VertRefresh 5.0 - 200.0 + #This can be used to get a specific DPI, but only for the default resolution: + #DisplaySize 508 317 + #NOTE: the highest modes will not work without increasing the VideoRam + # for the dummy video card. + Modeline "32768x32768" 15226.50 32768 35800 39488 46208 32768 32771 32781 32953 + Modeline "32768x16384" 7516.25 32768 35544 39192 45616 16384 16387 16397 16478 + Modeline "16384x8192" 2101.93 16384 16416 24400 24432 8192 8390 8403 8602 + Modeline "8192x4096" 424.46 8192 8224 9832 9864 4096 4195 4202 4301 + Modeline "5496x1200" 199.13 5496 5528 6280 6312 1200 1228 1233 1261 + Modeline "5280x1080" 169.96 5280 5312 5952 5984 1080 1105 1110 1135 + Modeline "5280x1200" 191.40 5280 5312 6032 6064 1200 1228 1233 1261 + Modeline "5120x3200" 199.75 5120 5152 5904 5936 3200 3277 3283 3361 + Modeline "4800x1200" 64.42 4800 4832 5072 5104 1200 1229 1231 1261 + Modeline "3840x2880" 133.43 3840 3872 4376 4408 2880 2950 2955 3025 + Modeline "3840x2560" 116.93 3840 3872 4312 4344 2560 2622 2627 2689 + Modeline "3840x2048" 91.45 3840 3872 4216 4248 2048 2097 2101 2151 + Modeline "3840x1080" 100.38 3840 3848 4216 4592 1080 1081 1084 1093 + Modeline "3600x1200" 106.06 3600 3632 3984 4368 1200 1201 1204 1214 + Modeline "3288x1080" 39.76 3288 3320 3464 3496 1080 1106 1108 1135 + Modeline "2048x2048" 49.47 2048 2080 2264 2296 2048 2097 2101 2151 + Modeline "2048x1536" 80.06 2048 2104 2312 2576 1536 1537 1540 1554 + Modeline "2560x1600" 47.12 2560 2592 2768 2800 1600 1639 1642 1681 + Modeline "2560x1440" 42.12 2560 2592 2752 2784 1440 1475 1478 1513 + Modeline "1920x1440" 69.47 1920 1960 2152 2384 1440 1441 1444 1457 + Modeline "1920x1200" 26.28 1920 1952 2048 2080 1200 1229 1231 1261 + Modeline "1920x1080" 23.53 1920 1952 2040 2072 1080 1106 1108 1135 + Modeline "1680x1050" 20.08 1680 1712 1784 1816 1050 1075 1077 1103 + Modeline "1600x1200" 22.04 1600 1632 1712 1744 1200 1229 1231 1261 + Modeline "1600x900" 33.92 1600 1632 1760 1792 900 921 924 946 + Modeline "1440x900" 30.66 1440 1472 1584 1616 900 921 924 946 + ModeLine "1366x768" 72.00 1366 1414 1446 1494 768 771 777 803 + Modeline "1280x1024" 31.50 1280 1312 1424 1456 1024 1048 1052 1076 + Modeline "1280x800" 24.15 1280 1312 1400 1432 800 819 822 841 + Modeline "1280x768" 23.11 1280 1312 1392 1424 768 786 789 807 + Modeline "1360x768" 24.49 1360 1392 1480 1512 768 786 789 807 + Modeline "1024x768" 18.71 1024 1056 1120 1152 768 786 789 807 + Modeline "768x1024" 19.50 768 800 872 904 1024 1048 1052 1076 + + + #common resolutions for android devices (both orientations): + Modeline "800x1280" 25.89 800 832 928 960 1280 1310 1315 1345 + Modeline "1280x800" 24.15 1280 1312 1400 1432 800 819 822 841 + Modeline "720x1280" 30.22 720 752 864 896 1280 1309 1315 1345 + Modeline "1280x720" 27.41 1280 1312 1416 1448 720 737 740 757 + Modeline "768x1024" 24.93 768 800 888 920 1024 1047 1052 1076 + Modeline "1024x768" 23.77 1024 1056 1144 1176 768 785 789 807 + Modeline "600x1024" 19.90 600 632 704 736 1024 1047 1052 1076 + Modeline "1024x600" 18.26 1024 1056 1120 1152 600 614 617 631 + Modeline "536x960" 16.74 536 568 624 656 960 982 986 1009 + Modeline "960x536" 15.23 960 992 1048 1080 536 548 551 563 + Modeline "600x800" 15.17 600 632 688 720 800 818 822 841 + Modeline "800x600" 14.50 800 832 880 912 600 614 617 631 + Modeline "480x854" 13.34 480 512 560 592 854 873 877 897 + Modeline "848x480" 12.09 848 880 920 952 480 491 493 505 + Modeline "480x800" 12.43 480 512 552 584 800 818 822 841 + Modeline "800x480" 11.46 800 832 872 904 480 491 493 505 + #resolutions for android devices (both orientations) + #minus the status bar + #38px status bar (and width rounded up) + Modeline "800x1242" 25.03 800 832 920 952 1242 1271 1275 1305 + Modeline "1280x762" 22.93 1280 1312 1392 1424 762 780 783 801 + Modeline "720x1242" 29.20 720 752 856 888 1242 1271 1276 1305 + Modeline "1280x682" 25.85 1280 1312 1408 1440 682 698 701 717 + Modeline "768x986" 23.90 768 800 888 920 986 1009 1013 1036 + Modeline "1024x730" 22.50 1024 1056 1136 1168 730 747 750 767 + Modeline "600x986" 19.07 600 632 704 736 986 1009 1013 1036 + Modeline "1024x562" 17.03 1024 1056 1120 1152 562 575 578 591 + Modeline "536x922" 16.01 536 568 624 656 922 943 947 969 + Modeline "960x498" 14.09 960 992 1040 1072 498 509 511 523 + Modeline "600x762" 14.39 600 632 680 712 762 779 783 801 + Modeline "800x562" 13.52 800 832 880 912 562 575 578 591 + Modeline "480x810" 12.59 480 512 552 584 810 828 832 851 + Modeline "848x442" 11.09 848 880 920 952 442 452 454 465 + Modeline "480x762" 11.79 480 512 552 584 762 779 783 801 +EndSection + +Section "Screen" + Identifier "dummy_screen" + Device "dummy_videocard" + Monitor "dummy_monitor" + DefaultDepth 24 + SubSection "Display" + Viewport 0 0 + Depth 24 + #Modes "32768x32768" "32768x16384" "16384x8192" "8192x4096" "5120x3200" "3840x2880" "3840x2560" "3840x2048" "2048x2048" "2560x1600" "1920x1440" "1920x1200" "1920x1080" "1600x1200" "1680x1050" "1600x900" "1400x1050" "1440x900" "1280x1024" "1366x768" "1280x800" "1024x768" "1024x600" "800x600" "320x200" + Modes "5120x3200" "3840x2880" "3840x2560" "3840x2048" "2048x2048" "2560x1600" "1920x1440" "1920x1200" "1920x1080" "1600x1200" "1680x1050" "1600x900" "1400x1050" "1440x900" "1280x1024" "1366x768" "1280x800" "1024x768" "1024x600" "800x600" "320x200" + #Virtual 32000 32000 + #Virtual 16384 8192 + Virtual 8192 4096 + #Virtual 5120 3200 + EndSubSection +EndSection + +Section "ServerLayout" + Identifier "dummy_layout" + Screen "dummy_screen" + InputDevice "dummy_mouse" + InputDevice "dummy_keyboard" +EndSection