diff options
-rw-r--r-- | gentoobrowse-api/domain/portage-models.ice | 1 | ||||
-rw-r--r-- | gentoobrowse-api/service/Jamfile.jam | 3 | ||||
-rw-r--r-- | gentoobrowse-api/service/converters.cpp | 22 | ||||
-rw-r--r-- | gentoobrowse-api/service/unpackPqTextArray.h | 27 | ||||
-rw-r--r-- | gentoobrowse-api/service/unpackPqTextArray.ll | 64 |
5 files changed, 117 insertions, 0 deletions
diff --git a/gentoobrowse-api/domain/portage-models.ice b/gentoobrowse-api/domain/portage-models.ice index 744cbf5..4f98ce3 100644 --- a/gentoobrowse-api/domain/portage-models.ice +++ b/gentoobrowse-api/domain/portage-models.ice @@ -5,6 +5,7 @@ module Gentoo { sequence<byte> Image; + sequence<string> StringList; class Category { ["slicer:db:pkey"] diff --git a/gentoobrowse-api/service/Jamfile.jam b/gentoobrowse-api/service/Jamfile.jam index b29063e..777c453 100644 --- a/gentoobrowse-api/service/Jamfile.jam +++ b/gentoobrowse-api/service/Jamfile.jam @@ -1,8 +1,10 @@ import generators ; import type ; +import lex ; lib gentoobrowse-service : [ glob *.cpp ] + [ glob *.ll ] [ glob-tree *.sql ] [ glob ../domain/*.ice ] : @@ -18,6 +20,7 @@ lib gentoobrowse-service : <library>..//boost_thread <library>..//boost_date_time <library>../..//glibmm + <include>. : : <include>. <implicit-dependency>../api//gentoobrowse-api diff --git a/gentoobrowse-api/service/converters.cpp b/gentoobrowse-api/service/converters.cpp new file mode 100644 index 0000000..b0ffacf --- /dev/null +++ b/gentoobrowse-api/service/converters.cpp @@ -0,0 +1,22 @@ +#include <portage-models.h> +#include "unpackPqTextArray.h" +#include <string> + +namespace Slicer { + ::Gentoo::StringList + unpackPqTextArray(const std::string & s) + { + ::Gentoo::StringList list; + std::stringstream ss(s); + ::Portage::Utils::UnpackPqTextArray l(ss, list); + l.yylex(); + return list; + } + + std::string + packPqTextArray(const ::Gentoo::StringList &) + { + return std::string(); + } +} + diff --git a/gentoobrowse-api/service/unpackPqTextArray.h b/gentoobrowse-api/service/unpackPqTextArray.h new file mode 100644 index 0000000..246be71 --- /dev/null +++ b/gentoobrowse-api/service/unpackPqTextArray.h @@ -0,0 +1,27 @@ +#ifndef JSONFLEXLEXER_H +#define JSONFLEXLEXER_H + +#include <portage-models.h> +#ifndef yyFlexLexer +#define yyFlexLexer pqBaseFlexLexer +#include <FlexLexer.h> +#endif + +namespace Portage { + namespace Utils { + class UnpackPqTextArray : public yyFlexLexer { + public: + UnpackPqTextArray(std::istream &, ::Gentoo::StringList & sl); + + int yylex() override; + void LexerError(const char * msg) override; + + private: + ::Gentoo::StringList & list; + }; + } +} + +#endif + + diff --git a/gentoobrowse-api/service/unpackPqTextArray.ll b/gentoobrowse-api/service/unpackPqTextArray.ll new file mode 100644 index 0000000..6281063 --- /dev/null +++ b/gentoobrowse-api/service/unpackPqTextArray.ll @@ -0,0 +1,64 @@ +%option batch +%option c++ +%option noyywrap +%option 8bit +%option stack +%option yylineno +%option yyclass="Portage::Utils::UnpackPqTextArray" +%option prefix="pqBase" + +%{ +#include "unpackPqTextArray.h" +#include <boost/algorithm/string/trim.hpp> +#pragma GCC diagnostic ignored "-Wsign-compare" +%} + +begin "{" +end "}" +comma , +unquoted [^,\"}]+ +quoted (\"[^\"]+\") + +%x FIRST +%x AFTER +%x NEXT + +%% + +{begin} { + yy_push_state(FIRST); +} +<FIRST,AFTER>{end} { + yy_pop_state(); +} +<FIRST,NEXT>{unquoted} { + list.push_back(YYText()); + BEGIN(AFTER); +} +<FIRST,NEXT>{quoted} { + list.push_back(YYText()); + boost::algorithm::trim_if(list.back(), [](auto c){ return c == '"'; }); + BEGIN(AFTER); +} +<AFTER>{comma} { + BEGIN(NEXT); +} + +%% + +namespace Portage { + namespace Utils { + UnpackPqTextArray::UnpackPqTextArray(std::istream & f, ::Gentoo::StringList & sl) : + yyFlexLexer(&f, NULL), + list(sl) + { + } + + void + UnpackPqTextArray::LexerError(const char * msg) + { + throw std::runtime_error(msg); + } + } +} + |