diff --git a/cd_utils/CMakeLists.txt b/cd_utils/CMakeLists.txt index d7a0fd8..0356fe3 100644 --- a/cd_utils/CMakeLists.txt +++ b/cd_utils/CMakeLists.txt @@ -15,8 +15,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall") if (DEBUG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") endif () -set(CPPS_UTILS "cdutils_core.cpp" "cdutils_k_types.cpp" "cdutils_k.cpp") -set(HDRS_UTILS "cdutils_core.h" "cdutils_k_types.h" "cdutils_k.h") +set(CPPS_UTILS "cdutils_core.cpp" "cdutils_k_types.cpp" "cdutils_k_parser.cpp" "cdutils_k.cpp") +set(HDRS_UTILS "cdutils_core.h" "cdutils_k_types.h" "cdutils_k_parser.h" "cdutils_k.h") if (DEFINED ENV{QNX_HOST}) add_library(${PROJECT_NAME} STATIC ${CPPS_UTILS} ${HDRS_UTILS}) else () @@ -28,8 +28,9 @@ add_executable(cdutilsngtest "cdutilstest.cpp") add_definitions(-DCDPULT) target_link_libraries(cdutilsngtest ${PIP_LIBRARY} ${PROJECT_NAME}) -# if (NOT DEFINED ENV{QNX_HOST}) - # if (PULT) +if (NOT DEFINED ENV{QNX_HOST}) + if (PULT) + add_subdirectory(pult) # find_package(Qt4 REQUIRED) # find_package(OpenGL REQUIRED) # include_directories(${QT_INCLUDES}) @@ -43,8 +44,8 @@ target_link_libraries(cdutilsngtest ${PIP_LIBRARY} ${PROJECT_NAME}) # add_executable(${KX_PULT_NAME} WIN32 ${CPPS} ${CMOCS} ${CUIS} ${RESS} ${MOCS}) # set(LIBS ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} ${OPENGL_LIBRARIES} ${PIP_LIBRARY} qad_graphic qad_utils qad_widgets) # target_link_libraries(${KX_PULT_NAME} ${LIBS} ${PROJECT_NAME}) - # endif () -# endif () + endif () +endif () # if (LIB) # if (WIN32) # set(CMAKE_INSTALL_PREFIX ${MINGW_DIR}) diff --git a/cd_utils/cdutils_core.cpp b/cd_utils/cdutils_core.cpp index c525cad..5c6a38d 100644 --- a/cd_utils/cdutils_core.cpp +++ b/cd_utils/cdutils_core.cpp @@ -1,4 +1,5 @@ #include "cdutils_core.h" +#include "cdutils_k_parser.h" #include "piconfig.h" using namespace CDUtils; @@ -82,14 +83,14 @@ Core::Core(const char * conf) { PIString s(conf); connection.configureFromString(&s); connection.start(); - k_[1] = KType(1, "123", "120+3", "comment"); + /*k_[1] = KType(1, "123", "120+3", "comment"); k_[2] = KType(2, "1", "2", "comm"); k_[4] = KType(4, "-0.6", "-6/10", "mment"); k_.section(10)[5] = KType(5, "8", "2*2*2", "88"); k_.section(10).section(50)[100] = KType(100, "8", "2*2*2", "88"); k_.section(11)[3] = KType(3, "1", "1", "88"); k_.section(11)[4] = KType(4, "0", "0", "88"); - k_.section(11)[6] = KType(6, "0", "0", "88"); + k_.section(11)[6] = KType(6, "0", "0", "88");*/ //piCout << s; } @@ -120,6 +121,11 @@ void Core::k_read(PIIODevice * d) { } +void Core::k_parse(PIIODevice * d) { + k_ = KParser::parse(d); +} + + void CDUtils::Core::dataReceived(const PIString & from, const PIByteArray & data) { piCout << from << data; if (data.size_s() < 4) return; diff --git a/cd_utils/cdutils_core.h b/cd_utils/cdutils_core.h index e31c4c2..40af76a 100644 --- a/cd_utils/cdutils_core.h +++ b/cd_utils/cdutils_core.h @@ -36,6 +36,7 @@ public: void k_write(PIIODevice * d); void k_read(PIIODevice * d); + void k_parse(PIIODevice * d); private: Core(const char * conf = diff --git a/cd_utils/cdutils_k.cpp b/cd_utils/cdutils_k.cpp index e9018ae..ce4b502 100644 --- a/cd_utils/cdutils_k.cpp +++ b/cd_utils/cdutils_k.cpp @@ -53,3 +53,8 @@ void KInterface::write(PIIODevice * d) { void KInterface::read(PIIODevice * d) { core->k_read(d); } + + +void KInterface::parse(PIIODevice * d) { + core->k_parse(d); +} diff --git a/cd_utils/cdutils_k.h b/cd_utils/cdutils_k.h index dc8f073..bc9e363 100644 --- a/cd_utils/cdutils_k.h +++ b/cd_utils/cdutils_k.h @@ -28,6 +28,7 @@ public: EVENT_HANDLER(void, request); void write(PIIODevice * d); void read(PIIODevice * d); + void parse(PIIODevice * d); private: Core * core; diff --git a/cd_utils/cdutils_k_parser.cpp b/cd_utils/cdutils_k_parser.cpp new file mode 100644 index 0000000..7a9240d --- /dev/null +++ b/cd_utils/cdutils_k_parser.cpp @@ -0,0 +1,152 @@ +#include "cdutils_k_parser.h" +#include "cdutils_k_types.h" +#include "piiostring.h" +#include "pifile.h" + +using namespace CDUtils; + +enum Phase { + eName = 1, + eBracketOpen, + eBracketClose, + eMemberName, + eMemberEqual, + eMemberValue, + eMemberComma, + eComment, + eMultiComment +}; + + +void removeComment(PIString & line, PIString * comment = 0) { + int ci = line.find("//"); + if (ci >= 0) { + if (comment) *comment = line.right(line.size_s() - ci - 2).trim(); + line.cutRight(line.size_s() - ci).trim(); + } +} + + +void parseEnumLine(PIString & line, int * value, PIString * comment = 0) { + removeComment(line, comment); + int ci = line.find("="); + if (ci >= 0) { + if (value) *value = line.right(line.size_s() - ci - 1).trim().toInt(); + line.cutRight(line.size_s() - ci).trim(); + } + if (line.trim().endsWith(",")) line.cutRight(1); +} + + +void parseInsert(PIString line, PIString & alias, PIStringList & out) { + out.clear(); + int ci = line.find("="); + if (ci < 0) return; + alias = line.right(line.size_s() - ci - 1).trim(); + line.cutRight(line.size_s() - ci).trim(); + while (line.find("[") > 0) { + int is = line.find("["), ie = line.find("]"); + PIString arr = line.mid(is + 1, ie - is - 1); + out << arr; + line.cutMid(is, ie - is + 1); + } + if (!line.isEmpty()) out.insert(0, line); +} + + +PIVector enumValues(const PIString & e, const PIMap & sections) { + PIVector ret; + if (sections.contains(e)) { + ret = sections[e].indexes(); + } else { + int v = e.toInt(); + if (v < 2) return ret; + for (int i = 0; i < v; ++i) + ret << i; + } + return ret; +} + + +KSection KParser::parse(PIIODevice * d) { + if (!d) return KSection(); + if (!d->canRead()) return KSection(); + KSection cs; + KType ck; + PIMap sections; + PIMap enum_values, cevalues; + PIString content, line, alias, comment; + PIStringList iarr; + if (PIStringAscii(d->className()) == PIStringAscii("PIFile")) content = ((PIFile*)d)->readAll(); + if (PIStringAscii(d->className()) == PIStringAscii("PIIOString")) content = *(((PIIOString*)d)->string()); + PIIOString ios(&content); + int phase = 0; + int cind = -1; + while ((cind = content.find("enum", cind)) >= 0) { + ios.seek(cind); + line = ios.readLine().trim(); + comment.clear(); + removeComment(line, &comment); + if (line.find("{") < 0) { + cind += 4; + continue; + } + line.cutLeft(line.find("enum") + 4).trim(); + line.cutRight(line.size_s() - line.find("{")).trim(); + if (line.isEmpty()) { + cind += 4; + continue; + } + cs = KSection(); + cs.name = line; + piCout << "enum" << cs.name; + int cev = 0; + cevalues.clear(); + while (!ios.isEnd()) { + line = ios.readLine().trim(); + comment.clear(); + removeComment(line, &comment); + if (line.find("}") >= 0) break; + if (line.isEmpty()) { + if (comment.find("=") >= 0) { + parseInsert(comment, alias, iarr); + if (!iarr.isEmpty()) { + if (!enum_values.contains(alias)) { + piCout << "Parse error: can`t find section alias \"" << alias << "\"!"; + return KSection(); + } + if (!sections.contains(iarr.front())) { + piCout << "Parse error: can`t find section \"" << iarr.front() << "\"!"; + return KSection(); + } + piCout << "insert" << alias << iarr; + int aval = enum_values.value(alias); + KSection is = sections.value(iarr.take_front()), ts; + piForeachRC (PIString & a, iarr) { + PIVector evals = enumValues(a, sections); + //piCout << a << evals; + piForeachC (int e, evals) + ts.section(e) = is; + is = ts; + ts = KSection(); + } + cs.section(aval) = is; + } + } + } else { + parseEnumLine(line, &cev, &comment); + //piCout << line << "=" << cev << "//" << comment; + ck = KType(cev, "", "", comment); + ck.name = line; + cs[cev] = ck; + cevalues[ck.name] = cev; + ++cev; + } + } + //piCout << cs.name << cs.k; + sections[cs.name] = cs; + enum_values << cevalues; + cind += 4; + } + return sections.value("KDescription"); +} diff --git a/cd_utils/cdutils_k_parser.h b/cd_utils/cdutils_k_parser.h new file mode 100644 index 0000000..d359d15 --- /dev/null +++ b/cd_utils/cdutils_k_parser.h @@ -0,0 +1,18 @@ +#ifndef CDUTILS_K_PARSER_H +#define CDUTILS_K_PARSER_H + +class PIIODevice; + +namespace CDUtils { + +class KSection; + +namespace KParser { + +KSection parse(PIIODevice * d); + +} + +} + +#endif // CDUTILS_K_PARSER_H diff --git a/cd_utils/cdutils_k_types.h b/cd_utils/cdutils_k_types.h index 5137d91..2fd7835 100644 --- a/cd_utils/cdutils_k_types.h +++ b/cd_utils/cdutils_k_types.h @@ -8,6 +8,7 @@ class PIIODevice; namespace CDUtils { +class KSection; class KType { public: @@ -23,6 +24,8 @@ public: operator double() const {return value_d;} + PIString name; + private: int index_; PIString value_s, formula_, comment_; @@ -45,6 +48,10 @@ public: KSection & section(int v) {return s[v];} const KSection section(int v) const {return s[v];} + PIVector indexes() const {return k.keys();} + + PIString name; + private: KSection(PIMap k_, PIMap s_) { k = k_; diff --git a/cd_utils/cdutilstest.cpp b/cd_utils/cdutilstest.cpp index aecb2d3..f42fd58 100644 --- a/cd_utils/cdutilstest.cpp +++ b/cd_utils/cdutilstest.cpp @@ -1,13 +1,15 @@ #include "cdutils_k.h" +#include "cdutils_core.h" #include "piethernet.h" #include "piiostring.h" +#include "pifile.h" int main(int argc, char *argv[]) { PIEthernet eth; eth.send("127.0.0.1:16102", PIByteArray("data\n", 5)); eth.send("127.0.0.1:26102", PIByteArray("data\n", 5)); eth.send("127.0.0.1:36102", PIByteArray("data\n", 5)); - PIString s = "[k]\n\ + PIString s;/* = "[k]\n\ 1.f = 120+3 #s comment\n\ 1.v = 123\n\ 2.f = 2 #s comm\n\ @@ -27,14 +29,20 @@ int main(int argc, char *argv[]) { 4.v = 0 #s 88 \n\ 6.f = 0\n\ 6.v = 0 #s 881 \n\ - []\n\ -"; + []\n"; PIIOString ios(&s); CDUtils::K.read(&ios); s.clear(); PIIOString iosw(&s); CDUtils::K.write(&iosw); + piCout << s;*/ + PIFile f; + f.open("SH_base.h", PIIODevice::ReadOnly); + CDUtils::K.parse(&f); + PIIOString iosw(&s); + PIFile wf("1.txt", PIIODevice::ReadWrite); + CDUtils::K.write(&wf); piCout << s; //piMSleep(1000); //CDUtils::Core::instance()->test(); diff --git a/cd_utils/clean.bat b/cd_utils/clean.bat new file mode 100644 index 0000000..3a657d9 --- /dev/null +++ b/cd_utils/clean.bat @@ -0,0 +1,4 @@ +#make clean +del /q /f /s CMakeFiles +rmdir /q /s CMakeFiles +del /q /f CMakeCache.txt Makefile cmake_install.cmake install_manifest.txt *.user* *~ *cxx moc_* ui_* qrc_* *.o *.exe *.a *.dll *.lib core *.qrc.depends diff --git a/cd_utils/make_lib.bat b/cd_utils/make_lib.bat new file mode 100644 index 0000000..0148a43 --- /dev/null +++ b/cd_utils/make_lib.bat @@ -0,0 +1 @@ +cmake -G "MinGW Makefiles" -DLIB=1 && make install . %*