From d80b78929111c522a604c99214c3b25eecc61139 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Thu, 23 Jun 2016 15:04:40 +0200 Subject: First signs of a C89 datamodel --- CMakeLists.txt | 2 + config.h.in | 1 + src/uscxml/plugins/Factory.cpp | 11 + src/uscxml/plugins/datamodel/CMakeLists.txt | 10 + src/uscxml/plugins/datamodel/c89/C89DataModel.cpp | 96 +++ src/uscxml/plugins/datamodel/c89/C89DataModel.h | 91 +++ test/w3c/confC89.xsl | 748 ++++++++++++++++++++++ test/w3c/convert-tests.sh | 6 + 8 files changed, 965 insertions(+) create mode 100644 src/uscxml/plugins/datamodel/c89/C89DataModel.cpp create mode 100644 src/uscxml/plugins/datamodel/c89/C89DataModel.h create mode 100644 test/w3c/confC89.xsl diff --git a/CMakeLists.txt b/CMakeLists.txt index f5946d2..e95e7e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -370,6 +370,8 @@ if (WITH_DM_LUA) endif() endif() +OPTION(WITH_DM_C89 "Do build with C89 datamodel support" ON) + add_subdirectory(src/uscxml) add_subdirectory(src/bindings) diff --git a/config.h.in b/config.h.in index 31530e1..074b072 100644 --- a/config.h.in +++ b/config.h.in @@ -68,6 +68,7 @@ #cmakedefine WITH_DM_ECMA_V8 #cmakedefine WITH_DM_ECMA_JSC #cmakedefine WITH_DM_LUA +#cmakedefine WITH_DM_C89 /** Optional libraries we found */ #cmakedefine UMUNDO_FOUND diff --git a/src/uscxml/plugins/Factory.cpp b/src/uscxml/plugins/Factory.cpp index e551a61..4dabab6 100644 --- a/src/uscxml/plugins/Factory.cpp +++ b/src/uscxml/plugins/Factory.cpp @@ -52,6 +52,10 @@ # include "uscxml/plugins/datamodel/lua/LuaDataModel.h" #endif +#ifdef WITH_DM_C89 +# include "uscxml/plugins/datamodel/c89/C89DataModel.h" +#endif + #ifdef WITH_INV_SCXML # include "uscxml/plugins/invoker/scxml/USCXMLInvoker.h" @@ -120,6 +124,13 @@ void Factory::registerPlugins() { } #endif +#ifdef WITH_DM_C89 + { + C89DataModel* dataModel = new C89DataModel(); + registerDataModel(dataModel); + } +#endif + { NULLDataModel* dataModel = new NULLDataModel(); registerDataModel(dataModel); diff --git a/src/uscxml/plugins/datamodel/CMakeLists.txt b/src/uscxml/plugins/datamodel/CMakeLists.txt index c597acc..561d06c 100644 --- a/src/uscxml/plugins/datamodel/CMakeLists.txt +++ b/src/uscxml/plugins/datamodel/CMakeLists.txt @@ -47,6 +47,16 @@ if (LUA_FOUND) list (APPEND USCXML_OPT_LIBS ${LUA_LIBRARY}) endif() +if (ON) + set(USCXML_DATAMODELS "c89 ${USCXML_DATAMODELS}") + # Lua ecmascript datamodel + file(GLOB C89_DATAMODEL + c89/*.cpp + c89/*.h + ) + list (APPEND USCXML_FILES ${C89_DATAMODEL}) +endif() + if (NOT SWIG_FOUND) message(STATUS "No swig binary found, not generating DOM classes") elseif(SWIG_VERSION VERSION_LESS 3.0.8) diff --git a/src/uscxml/plugins/datamodel/c89/C89DataModel.cpp b/src/uscxml/plugins/datamodel/c89/C89DataModel.cpp new file mode 100644 index 0000000..f490673 --- /dev/null +++ b/src/uscxml/plugins/datamodel/c89/C89DataModel.cpp @@ -0,0 +1,96 @@ +/** + * @file + * @author 2016 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * 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. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see . + * @endcond + */ + +#include "uscxml/Common.h" +#include "uscxml/util/URL.h" +#include "uscxml/util/String.h" + +#include "C89DataModel.h" + +#include "uscxml/messages/Event.h" +#include "uscxml/util/DOM.h" +#include +#include + +namespace uscxml { + +C89DataModel::C89DataModel() { +} + +std::shared_ptr C89DataModel::create(DataModelCallbacks* callbacks) { + std::shared_ptr dm(new C89DataModel()); + return dm; +} + +C89DataModel::~C89DataModel() { +} + +void C89DataModel::addExtension(DataModelExtension* ext) { + ERROR_EXECUTION_THROW("Extensions unimplemented in C89 datamodel"); +} + +void C89DataModel::setEvent(const Event& event) { +} + +Data C89DataModel::evalAsData(const std::string& content) { + Data data; + return data; +} + +bool C89DataModel::isValidSyntax(const std::string& expr) { + return true; +} + +uint32_t C89DataModel::getLength(const std::string& expr) { + return 0; +} + +void C89DataModel::setForeach(const std::string& item, + const std::string& array, + const std::string& index, + uint32_t iteration) { +} + +bool C89DataModel::isDeclared(const std::string& expr) { + return true; +} + + +void C89DataModel::assign(const std::string& location, const Data& data) { +} + +void C89DataModel::init(const std::string& location, const Data& data) { +} + +bool C89DataModel::evalAsBool(const std::string& expr) { + return false; +} + +Data C89DataModel::getAsData(const std::string& content) { + Data data; + return data; +} + + +std::string C89DataModel::andExpressions(std::list exprs) { + return ""; +} + + +} diff --git a/src/uscxml/plugins/datamodel/c89/C89DataModel.h b/src/uscxml/plugins/datamodel/c89/C89DataModel.h new file mode 100644 index 0000000..c239d76 --- /dev/null +++ b/src/uscxml/plugins/datamodel/c89/C89DataModel.h @@ -0,0 +1,91 @@ +/** + * @file + * @author 2016 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * 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. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see . + * @endcond + */ + +#ifndef C89DATAMODEL_H_A0FF45FA +#define C89DATAMODEL_H_A0FF45FA + +#include "uscxml/plugins/DataModelImpl.h" +#include + + +#ifdef BUILD_AS_PLUGINS +#include "uscxml/plugins/Plugins.h" +#endif + + +namespace uscxml { +class Event; +class Data; +} + +namespace uscxml { + +/** + * @ingroup datamodel + * C89 (ANSI-C) data-model. + */ + +class C89DataModel : public DataModelImpl { +public: + C89DataModel(); + virtual ~C89DataModel(); + virtual std::shared_ptr create(DataModelCallbacks* callbacks); + + virtual void addExtension(DataModelExtension* ext); + + virtual std::list getNames() { + std::list names; + names.push_back("c89"); + names.push_back("ansi-c"); + return names; + } + + virtual bool isValidSyntax(const std::string& expr); + + virtual void setEvent(const Event& event); + + // foreach + virtual uint32_t getLength(const std::string& expr); + virtual void setForeach(const std::string& item, + const std::string& array, + const std::string& index, + uint32_t iteration); + + virtual bool evalAsBool(const std::string& expr); + virtual Data evalAsData(const std::string& expr); + virtual Data getAsData(const std::string& content); + + virtual bool isDeclared(const std::string& expr); + + virtual void assign(const std::string& location, const Data& data); + virtual void init(const std::string& location, const Data& data); + + virtual std::string andExpressions(std::list); + +protected: + +}; + +#ifdef BUILD_AS_PLUGINS +PLUMA_INHERIT_PROVIDER(C89DataModel, DataModelImpl); +#endif + +} + +#endif /* end of include guard: C89DATAMODEL_H_A0FF45FA */ diff --git a/test/w3c/confC89.xsl b/test/w3c/confC89.xsl new file mode 100644 index 0000000..de55ffd --- /dev/null +++ b/test/w3c/confC89.xsl @@ -0,0 +1,748 @@ + + + + + + + + + + + + + + + + + + pass + + + + + + + + + + + + + + fail + + + + + + + + + + + + + c89 + + + + + + Var + + + + + + Var + + + + + + Var + + + + + foo.bar.baz + + + + + + + + + + + + + + + + + + Var + + + + + '' + + + + + Var + + + + + Var + + + + + + + + + + + Var.bar + + + + + + return + + + + + + Var + Var + 1 + + + + + + + Var + Var + Var + + + + + + +Var +Var + Var + + + + + + baz + + + + + #_scxml_foo + + + + + xyz + + + + + foo + + +123 + + + + 27 + + + + + 27 + + + + + 27 + + + + + + _event.name + + + + _event.type + + + + _event.sendid + + + + _event. + + + + + _event.raw + + + + + + _event.data. + + + + + _event.data. + + + + _event.data.Var + + + + + _ioprocessors['http://www.w3.org/TR/scxml/#SCXMLEventProcessor'].location + + + + + + + Var + + + + + Var + + + + + Var + + + + + Var + + + + + 's' + + + + + Var + + + + + Var + + + + + Var + + + + + Var + + + + + "foo + + + + + + + + + + + Var + + + == + + + + + + + + + + + + + Var + + + == + + Var + + + + + + + + + + + + Var + + + == + + + + + + + + + + + + + + Var===Var + + + + + + + + + + Var==Var + + + + + + + + + +Var + +== +'' + + + + + + + + + Var + + + = + + Var + + + + + + + + Var == 123 + + + + + _event.name == '' + + + + + + + + _event.data['Var'] + + + == + + + + + + + + + + + + + + + + +Var + +== + + + + + + + + + _event.data == + + + + + _event.data == 123 + + + + typeof _event.data === 'undefined' + + + + + _name === '' + + + + + + + + +(function(str, starts){if (starts === '') return true;if (str == null || starts == null) return false;str = String(str); starts = String(starts);return str.length >= starts.length && str.slice(0, starts.length) === starts;})(Var, Var) + + + + + + + In('') + + + + + return + + + + + Var + + + + + typeof Var === 'undefined' + + + + + + + + + + !Var + + + + + true + + + + + false + + + + + 'name' in _event && 'type' in _event && 'sendid' in _event && 'origin' in _event && 'origintype' in _event && 'invokeid' in _event && 'data' in _event + + + + + in _event.data + + + + + typeof _event. === 'undefined' + + + + + _event.language == 'ecmascript' + + + + + _event.origintype == '' + + + + + + + + + + + + + + D:\W3C\SCXMLTests\test300.js + + + + D:\foo + + + + + + + _event.origin + _event.origintype + + + + + +[1,2,3] + + + + Var + + + + + Var + + + + + + 1, 2, 3] + + + + + 7 + + + + Var + + + + + 'continue' + + + + Var + + + + + + Var + [].concat(Var, [4]) + + + + + + [[,],[,]] + + + + + + Var + + item + index + + + + + + + + + + Var + +[0][0]== && [0][1] == && [1][0] == && [1][1] == + + + + + + + + + + SITE_SPECIFIC_ADDRESS + + + + + + + + + + _ioprocessors['basichttp']['location'] + + + + _ioprocessors['basichttp']['location'] + + + + + _event.raw.search('POST') !== -1 + + + + + + +Var + + + + + + + _event.type === 'external' + + + + + +_event.raw.search(/Var=/) !== -1 + + + + + + _event.raw.search('=') !== -1 + + + + _event.raw.search(//) !== -1 + + + + + + _event.raw.match(/=(\S+)$/)[1] + + + + + _event.raw.match(/Var=(\S+)$/)[1] + + + + txt.match(/\n\n(.*)/)[2].split('&')[].split('=')[0] + + + + txt.match(/\n\n(.*)/)[2].split('&')[].split('=')[1] + + + + + '<message source="' + _ioprocessors['basichttp'] + '"' ++ 'xmlns:scxml="http://www.w3.org/2005/07/scxml" version="1.0" xmlns:xsi=:http://www.w3.org/2001/XMLSchema-instance" +xsi:schemaLocation="http://www.w3.org/2005/07/scxml scxml-message.xsd" sourcetype=:scxml"' ++' 'name="name"' + '"' + + '"' + />' + + + + + + 'address=' + _ioprocessors['basichttp'] + "'" + + + + + + _event.raw.match(/\n\naddress=(.*)$/) + + \ No newline at end of file diff --git a/test/w3c/convert-tests.sh b/test/w3c/convert-tests.sh index b8deeac..9e23efd 100755 --- a/test/w3c/convert-tests.sh +++ b/test/w3c/convert-tests.sh @@ -13,6 +13,9 @@ while [ "$1" != "" ]; do ecma ) ECMA=$1 shift ;; + c89 ) + C89=$1 + shift ;; lua ) LUA=$1 shift ;; @@ -48,6 +51,9 @@ do if [ "$ECMA" != "" ]; then echo -n "ecma " && $TRANSFORM $TXML confEcma.xsl -o:ecma/$TARGETFILE fi + if [ "$C89" != "" ]; then + echo -n "c89 " && $TRANSFORM $TXML confC89.xsl -o:c89/$TARGETFILE + fi if [ "$JEXL" != "" ]; then echo -n "jexl " && $TRANSFORM $TXML confJEXL.xsl -o:jexl/$TARGETFILE fi -- cgit v0.12