PIString:: mid and cutMid does nothing if "start" < 0
This commit is contained in:
@@ -483,59 +483,65 @@ bool PIString::operator >(const PIString & str) const {
|
|||||||
//! \~\details
|
//! \~\details
|
||||||
//! \~english
|
//! \~english
|
||||||
//! If "len" < 0 then returns substring from symbol "start" to end.
|
//! If "len" < 0 then returns substring from symbol "start" to end.
|
||||||
|
//! "start" should be >= 0.
|
||||||
//! \~russian
|
//! \~russian
|
||||||
//! Если "len" < 0 тогда возвращается подстрока от символа "start" и до конца.
|
//! Если "len" < 0 тогда возвращается подстрока от символа "start" и до конца.
|
||||||
|
//! "start" должен быть >= 0.
|
||||||
//! \~\code
|
//! \~\code
|
||||||
//! PIString s("0123456789");
|
//! PIString s("0123456789");
|
||||||
//! piCout << s.mid(-2, -1); // s = "0123456789"
|
//! piCout << s.mid(0, -1); // s = "0123456789"
|
||||||
//! piCout << s.mid(-2, 4); // s = "01"
|
//! piCout << s.mid(0, 2); // s = "01"
|
||||||
//! piCout << s.mid(3, -1); // s = "3456789"
|
//! piCout << s.mid(3); // s = "3456789"
|
||||||
//! piCout << s.mid(3, 4); // s = "3456"
|
//! piCout << s.mid(3, 4); // s = "3456"
|
||||||
//! piCout << s.mid(7, 1); // s = "7"
|
//! piCout << s.mid(7, 1); // s = "7"
|
||||||
//! piCout << s.mid(7, 4); // s = "789"
|
//! piCout << s.mid(7, 4); // s = "789"
|
||||||
|
//! piCout << s.mid(-1); // s = ""
|
||||||
//! \endcode
|
//! \endcode
|
||||||
//! \~\sa \a left(), \a right()
|
//! \~\sa \a left(), \a right()
|
||||||
PIString PIString::mid(const int start, const int len) const {
|
PIString PIString::mid(int start, int len) const {
|
||||||
//PIString str;
|
if (len == 0 || start >= length()) return PIString();
|
||||||
int s = start, l = len;
|
if (start < 0) {
|
||||||
if (l == 0 || s >= length()) return PIString();
|
return PIString();
|
||||||
if (s < 0) {
|
|
||||||
l += s;
|
|
||||||
s = 0;
|
|
||||||
}
|
}
|
||||||
if (l < 0) {
|
if (len < 0) {
|
||||||
return PIString(d.data(s), size_s() - s);
|
return PIString(d.data(start), size_s() - start);
|
||||||
} else {
|
} else {
|
||||||
if (l > length() - s) l = length() - s;
|
if (len > length() - start) len = length() - start;
|
||||||
return PIString(d.data(s), l);
|
return PIString(d.data(start), len);
|
||||||
}
|
}
|
||||||
return PIString();
|
return PIString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! \~\details
|
//! \~\details
|
||||||
|
//! \~english
|
||||||
|
//! If "len" < 0 then remove substring from symbol "start" to end.
|
||||||
|
//! "start" should be >= 0.
|
||||||
|
//! \~russian
|
||||||
|
//! Если "len" < 0 тогда удаляется подстрока от символа "start" и до конца.
|
||||||
|
//! "start" должен быть >= 0.
|
||||||
//! \~\code
|
//! \~\code
|
||||||
//! PIString s("0123456789");
|
//! PIString s("0123456789");
|
||||||
//! s.cutMid(1, 3);
|
//! s.cutMid(1, 3);
|
||||||
//! piCout << s; // s = "0456789"
|
//! piCout << s; // s = "0456789"
|
||||||
//! s.cutMid(-1, 3);
|
//! s.cutMid(0, 2);
|
||||||
//! piCout << s; // s = "56789"
|
//! piCout << s; // s = "56789"
|
||||||
//! s.cutMid(3, -1);
|
//! s.cutMid(3, -1);
|
||||||
//! piCout << s; // s = "567"
|
//! piCout << s; // s = "567"
|
||||||
|
//! s.cutMid(-1, -1);
|
||||||
|
//! piCout << s; // s = "567"
|
||||||
//! \endcode
|
//! \endcode
|
||||||
//! \~\sa \a cutLeft(), \a cutRight()
|
//! \~\sa \a cutLeft(), \a cutRight()
|
||||||
PIString & PIString::cutMid(const int start, const int len) {
|
PIString & PIString::cutMid(int start, int len) {
|
||||||
int s = start, l = len;
|
if (len == 0) return *this;
|
||||||
if (l == 0) return *this;
|
if (start < 0) {
|
||||||
if (s < 0) {
|
return *this;
|
||||||
l += s;
|
|
||||||
s = 0;
|
|
||||||
}
|
}
|
||||||
if (l < 0) {
|
if (len < 0) {
|
||||||
d.remove(s, size() - s);
|
d.remove(start, size() - start);
|
||||||
} else {
|
} else {
|
||||||
if (l > length() - s) l = length() - s;
|
if (len > length() - start) len = length() - start;
|
||||||
d.remove(s, l);
|
d.remove(start, len);
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -433,11 +433,11 @@ public:
|
|||||||
|
|
||||||
//! \~english Returns part of string from character at index "start" and maximum length "len".
|
//! \~english Returns part of string from character at index "start" and maximum length "len".
|
||||||
//! \~russian Возвращает подстроку от символа "start" и максимальной длиной "len".
|
//! \~russian Возвращает подстроку от символа "start" и максимальной длиной "len".
|
||||||
PIString mid(const int start, const int len = -1) const;
|
PIString mid(int start, int len = -1) const;
|
||||||
|
|
||||||
//! \~english Synonym of \a mid().
|
//! \~english Synonym of \a mid().
|
||||||
//! \~russian Аналог \a mid().
|
//! \~russian Аналог \a mid().
|
||||||
PIString subString(const int start, const int len = -1) const {return mid(start, len);}
|
PIString subString(int start, int len = -1) const {return mid(start, len);}
|
||||||
|
|
||||||
//! \~english Returns part of string from start and maximum length "len".
|
//! \~english Returns part of string from start and maximum length "len".
|
||||||
//! \~russian Возвращает подстроку от начала и максимальной длиной "len".
|
//! \~russian Возвращает подстроку от начала и максимальной длиной "len".
|
||||||
@@ -450,7 +450,7 @@ public:
|
|||||||
//! piCout << s.left(15); // s = "0123456789"
|
//! piCout << s.left(15); // s = "0123456789"
|
||||||
//! \endcode
|
//! \endcode
|
||||||
//! \~\sa \a mid(), \a right()
|
//! \~\sa \a mid(), \a right()
|
||||||
PIString left(const int len) const {return len <= 0 ? PIString() : mid(0, len);}
|
PIString left(int len) const {return len <= 0 ? PIString() : mid(0, len);}
|
||||||
|
|
||||||
//! \~english Returns part of string at end and maximum length "len".
|
//! \~english Returns part of string at end and maximum length "len".
|
||||||
//! \~russian Возвращает подстроку максимальной длиной "len" и до конца.
|
//! \~russian Возвращает подстроку максимальной длиной "len" и до конца.
|
||||||
@@ -463,11 +463,11 @@ public:
|
|||||||
//! piCout << s.right(15); // s = "0123456789"
|
//! piCout << s.right(15); // s = "0123456789"
|
||||||
//! \endcode
|
//! \endcode
|
||||||
//! \~\sa \a mid(), \a left()
|
//! \~\sa \a mid(), \a left()
|
||||||
PIString right(const int len) const {return len <= 0 ? PIString() : mid(size() - len, len);}
|
PIString right(int len) const {return len <= 0 ? PIString() : mid(size() - len, len);}
|
||||||
|
|
||||||
//! \~english Remove part of string from character as index "start" and maximum length "len" and return this string.
|
//! \~english Remove part of string from character as index "start" and maximum length "len" and return this string.
|
||||||
//! \~russian Удаляет часть строки от символа "start" и максимальной длины "len", возвращает эту строку.
|
//! \~russian Удаляет часть строки от символа "start" и максимальной длины "len", возвращает эту строку.
|
||||||
PIString & cutMid(const int start, const int len);
|
PIString & cutMid(int start, int len);
|
||||||
|
|
||||||
//! \~english Remove part of string from start and maximum length "len" and return this string.
|
//! \~english Remove part of string from start and maximum length "len" and return this string.
|
||||||
//! \~russian Удаляет часть строки от начала и максимальной длины "len", возвращает эту строку.
|
//! \~russian Удаляет часть строки от начала и максимальной длины "len", возвращает эту строку.
|
||||||
@@ -482,7 +482,7 @@ public:
|
|||||||
//! piCout << s; // s = ""
|
//! piCout << s; // s = ""
|
||||||
//! \endcode
|
//! \endcode
|
||||||
//! \~\sa \a cutMid(), \a cutRight()
|
//! \~\sa \a cutMid(), \a cutRight()
|
||||||
PIString & cutLeft(const int len) {return len <= 0 ? *this : cutMid(0, len);}
|
PIString & cutLeft(int len) {return len <= 0 ? *this : cutMid(0, len);}
|
||||||
|
|
||||||
//! \~english Remove part of string at end and maximum length "len" and return this string.
|
//! \~english Remove part of string at end and maximum length "len" and return this string.
|
||||||
//! \~russian Удаляет часть строки максимальной длины "len" от конца, возвращает эту строку.
|
//! \~russian Удаляет часть строки максимальной длины "len" от конца, возвращает эту строку.
|
||||||
@@ -497,7 +497,7 @@ public:
|
|||||||
//! piCout << s; // s = ""
|
//! piCout << s; // s = ""
|
||||||
//! \endcode
|
//! \endcode
|
||||||
//! \~\sa \a cutMid(), \a cutLeft()
|
//! \~\sa \a cutMid(), \a cutLeft()
|
||||||
PIString & cutRight(const int len) {return len <= 0 ? *this : cutMid(size() - len, len);}
|
PIString & cutRight(int len) {return len <= 0 ? *this : cutMid(size() - len, len);}
|
||||||
|
|
||||||
//! \~english Remove spaces at the start and at the end of string and return this string.
|
//! \~english Remove spaces at the start and at the end of string and return this string.
|
||||||
//! \~russian Удаляет пробельные символы с начала и конца строки и возвращает эту строку.
|
//! \~russian Удаляет пробельные символы с начала и конца строки и возвращает эту строку.
|
||||||
|
|||||||
51
main.cpp
51
main.cpp
@@ -1,35 +1,32 @@
|
|||||||
#include "pip.h"
|
#include "pip.h"
|
||||||
|
#include "piiostream.h"
|
||||||
|
|
||||||
using namespace PICoutManipulators;
|
using namespace PICoutManipulators;
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char * argv[]) {
|
int main(int argc, char * argv[]) {
|
||||||
PIByteArray ba = PIByteArray::fromHex("AA1122BB11233AA4455");
|
{
|
||||||
PIIOByteArray b;
|
PIString s("0123456789");
|
||||||
b.open(ba);
|
piCout << s.mid(0, -1); // s = "0123456789"
|
||||||
PIPacketExtractor p(&b);
|
piCout << s.mid(0, 2); // s = "01"
|
||||||
p.setSplitMode(PIPacketExtractor::Header);
|
piCout << s.mid(3, -1); // s = "3456789"
|
||||||
p.setHeader(PIByteArray::fromHex("00"));
|
piCout << s.mid(3, 4); // s = "3456"
|
||||||
p.setFooter(PIByteArray::fromHex("AA"));
|
piCout << s.mid(7, 1); // s = "7"
|
||||||
p.setPayloadSize(2);
|
piCout << s.mid(7, 4); // s = "789"
|
||||||
p.setThreadedReadSlot([](const uchar * data, int size, void * d) {
|
piCout << s.mid(-1); // s = ""
|
||||||
return true;
|
//! \endcode
|
||||||
});
|
//! \~\sa \a left(), \a right()
|
||||||
p.setHeaderCheckSlot([](const uchar * src, const uchar * rec, int size)->int {
|
|
||||||
if (*src == *rec) {
|
|
||||||
if (rec[0] == 0xAA) return 2;
|
|
||||||
if (rec[0] == 0xBB) return 3;
|
|
||||||
}
|
}
|
||||||
return -1;
|
|
||||||
});
|
//! \~\details
|
||||||
// p.setPayloadCheckSlot([](const uchar * data, int size) {
|
//! \~\code
|
||||||
// return data[1] == 0xFF;
|
PIString s("0123456789");
|
||||||
// });
|
s.cutMid(1, 3);
|
||||||
CONNECTL(&p, packetReceived, ([](const uchar * data, int size){
|
piCout << s; // s = "0456789"
|
||||||
piCout << PIByteArray(data, size).toHex();
|
s.cutMid(0, 2);
|
||||||
}));
|
piCout << s; // s = "56789"
|
||||||
p.startThreadedRead();
|
s.cutMid(3, -1);
|
||||||
piMSleep(100);
|
piCout << s; // s = "567"
|
||||||
p.stop();
|
s.cutMid(-1, -1);
|
||||||
return 0;
|
piCout << s; // s = "567"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user