git-svn-id: svn://db.shs.com.ru/libs@99 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -15,8 +15,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall")
|
|||||||
if (DEBUG)
|
if (DEBUG)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3")
|
||||||
endif ()
|
endif ()
|
||||||
set(CPPS_UTILS "cdutils_core.cpp" "cdutils_k_types.cpp" "cdutils_k.cpp")
|
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.h")
|
set(HDRS_UTILS "cdutils_core.h" "cdutils_k_types.h" "cdutils_k_parser.h" "cdutils_k.h")
|
||||||
if (DEFINED ENV{QNX_HOST})
|
if (DEFINED ENV{QNX_HOST})
|
||||||
add_library(${PROJECT_NAME} STATIC ${CPPS_UTILS} ${HDRS_UTILS})
|
add_library(${PROJECT_NAME} STATIC ${CPPS_UTILS} ${HDRS_UTILS})
|
||||||
else ()
|
else ()
|
||||||
@@ -28,8 +28,9 @@ add_executable(cdutilsngtest "cdutilstest.cpp")
|
|||||||
add_definitions(-DCDPULT)
|
add_definitions(-DCDPULT)
|
||||||
target_link_libraries(cdutilsngtest ${PIP_LIBRARY} ${PROJECT_NAME})
|
target_link_libraries(cdutilsngtest ${PIP_LIBRARY} ${PROJECT_NAME})
|
||||||
|
|
||||||
# if (NOT DEFINED ENV{QNX_HOST})
|
if (NOT DEFINED ENV{QNX_HOST})
|
||||||
# if (PULT)
|
if (PULT)
|
||||||
|
add_subdirectory(pult)
|
||||||
# find_package(Qt4 REQUIRED)
|
# find_package(Qt4 REQUIRED)
|
||||||
# find_package(OpenGL REQUIRED)
|
# find_package(OpenGL REQUIRED)
|
||||||
# include_directories(${QT_INCLUDES})
|
# 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})
|
# 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)
|
# 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})
|
# target_link_libraries(${KX_PULT_NAME} ${LIBS} ${PROJECT_NAME})
|
||||||
# endif ()
|
endif ()
|
||||||
# endif ()
|
endif ()
|
||||||
# if (LIB)
|
# if (LIB)
|
||||||
# if (WIN32)
|
# if (WIN32)
|
||||||
# set(CMAKE_INSTALL_PREFIX ${MINGW_DIR})
|
# set(CMAKE_INSTALL_PREFIX ${MINGW_DIR})
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "cdutils_core.h"
|
#include "cdutils_core.h"
|
||||||
|
#include "cdutils_k_parser.h"
|
||||||
#include "piconfig.h"
|
#include "piconfig.h"
|
||||||
|
|
||||||
using namespace CDUtils;
|
using namespace CDUtils;
|
||||||
@@ -82,14 +83,14 @@ Core::Core(const char * conf) {
|
|||||||
PIString s(conf);
|
PIString s(conf);
|
||||||
connection.configureFromString(&s);
|
connection.configureFromString(&s);
|
||||||
connection.start();
|
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_[2] = KType(2, "1", "2", "comm");
|
||||||
k_[4] = KType(4, "-0.6", "-6/10", "mment");
|
k_[4] = KType(4, "-0.6", "-6/10", "mment");
|
||||||
k_.section(10)[5] = KType(5, "8", "2*2*2", "88");
|
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(10).section(50)[100] = KType(100, "8", "2*2*2", "88");
|
||||||
k_.section(11)[3] = KType(3, "1", "1", "88");
|
k_.section(11)[3] = KType(3, "1", "1", "88");
|
||||||
k_.section(11)[4] = KType(4, "0", "0", "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;
|
//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) {
|
void CDUtils::Core::dataReceived(const PIString & from, const PIByteArray & data) {
|
||||||
piCout << from << data;
|
piCout << from << data;
|
||||||
if (data.size_s() < 4) return;
|
if (data.size_s() < 4) return;
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ public:
|
|||||||
|
|
||||||
void k_write(PIIODevice * d);
|
void k_write(PIIODevice * d);
|
||||||
void k_read(PIIODevice * d);
|
void k_read(PIIODevice * d);
|
||||||
|
void k_parse(PIIODevice * d);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Core(const char * conf =
|
Core(const char * conf =
|
||||||
|
|||||||
@@ -53,3 +53,8 @@ void KInterface::write(PIIODevice * d) {
|
|||||||
void KInterface::read(PIIODevice * d) {
|
void KInterface::read(PIIODevice * d) {
|
||||||
core->k_read(d);
|
core->k_read(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void KInterface::parse(PIIODevice * d) {
|
||||||
|
core->k_parse(d);
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ public:
|
|||||||
EVENT_HANDLER(void, request);
|
EVENT_HANDLER(void, request);
|
||||||
void write(PIIODevice * d);
|
void write(PIIODevice * d);
|
||||||
void read(PIIODevice * d);
|
void read(PIIODevice * d);
|
||||||
|
void parse(PIIODevice * d);
|
||||||
private:
|
private:
|
||||||
Core * core;
|
Core * core;
|
||||||
|
|
||||||
|
|||||||
152
cd_utils/cdutils_k_parser.cpp
Normal file
152
cd_utils/cdutils_k_parser.cpp
Normal file
@@ -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<int> enumValues(const PIString & e, const PIMap<PIString, KSection> & sections) {
|
||||||
|
PIVector<int> 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<PIString, KSection> sections;
|
||||||
|
PIMap<PIString, int> 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<int> 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");
|
||||||
|
}
|
||||||
18
cd_utils/cdutils_k_parser.h
Normal file
18
cd_utils/cdutils_k_parser.h
Normal file
@@ -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
|
||||||
@@ -8,6 +8,7 @@ class PIIODevice;
|
|||||||
|
|
||||||
namespace CDUtils {
|
namespace CDUtils {
|
||||||
|
|
||||||
|
class KSection;
|
||||||
|
|
||||||
class KType {
|
class KType {
|
||||||
public:
|
public:
|
||||||
@@ -23,6 +24,8 @@ public:
|
|||||||
|
|
||||||
operator double() const {return value_d;}
|
operator double() const {return value_d;}
|
||||||
|
|
||||||
|
PIString name;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int index_;
|
int index_;
|
||||||
PIString value_s, formula_, comment_;
|
PIString value_s, formula_, comment_;
|
||||||
@@ -45,6 +48,10 @@ public:
|
|||||||
KSection & section(int v) {return s[v];}
|
KSection & section(int v) {return s[v];}
|
||||||
const KSection section(int v) const {return s[v];}
|
const KSection section(int v) const {return s[v];}
|
||||||
|
|
||||||
|
PIVector<int> indexes() const {return k.keys();}
|
||||||
|
|
||||||
|
PIString name;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
KSection(PIMap<int, KType> k_, PIMap<int, KSection> s_) {
|
KSection(PIMap<int, KType> k_, PIMap<int, KSection> s_) {
|
||||||
k = k_;
|
k = k_;
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
#include "cdutils_k.h"
|
#include "cdutils_k.h"
|
||||||
|
#include "cdutils_core.h"
|
||||||
#include "piethernet.h"
|
#include "piethernet.h"
|
||||||
#include "piiostring.h"
|
#include "piiostring.h"
|
||||||
|
#include "pifile.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
PIEthernet eth;
|
PIEthernet eth;
|
||||||
eth.send("127.0.0.1:16102", PIByteArray("data\n", 5));
|
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:26102", PIByteArray("data\n", 5));
|
||||||
eth.send("127.0.0.1:36102", 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.f = 120+3 #s comment\n\
|
||||||
1.v = 123\n\
|
1.v = 123\n\
|
||||||
2.f = 2 #s comm\n\
|
2.f = 2 #s comm\n\
|
||||||
@@ -27,14 +29,20 @@ int main(int argc, char *argv[]) {
|
|||||||
4.v = 0 #s 88 \n\
|
4.v = 0 #s 88 \n\
|
||||||
6.f = 0\n\
|
6.f = 0\n\
|
||||||
6.v = 0 #s 881 \n\
|
6.v = 0 #s 881 \n\
|
||||||
[]\n\
|
[]\n";
|
||||||
";
|
|
||||||
PIIOString ios(&s);
|
PIIOString ios(&s);
|
||||||
CDUtils::K.read(&ios);
|
CDUtils::K.read(&ios);
|
||||||
|
|
||||||
s.clear();
|
s.clear();
|
||||||
PIIOString iosw(&s);
|
PIIOString iosw(&s);
|
||||||
CDUtils::K.write(&iosw);
|
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;
|
piCout << s;
|
||||||
//piMSleep(1000);
|
//piMSleep(1000);
|
||||||
//CDUtils::Core::instance()->test();
|
//CDUtils::Core::instance()->test();
|
||||||
|
|||||||
4
cd_utils/clean.bat
Normal file
4
cd_utils/clean.bat
Normal file
@@ -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
|
||||||
1
cd_utils/make_lib.bat
Normal file
1
cd_utils/make_lib.bat
Normal file
@@ -0,0 +1 @@
|
|||||||
|
cmake -G "MinGW Makefiles" -DLIB=1 && make install . %*
|
||||||
Reference in New Issue
Block a user