aqhome: use our own implementation of GWEN_Text_GetWordToBuffer().
use the same flags like the original function (maybe replace the original function in gwen later).
This commit is contained in:
@@ -143,7 +143,7 @@ int GWENHYWFAR_CB test4(GWEN_UNUSED GWEN_TEST_MODULE *mod)
|
|||||||
" secondGroup { # here starts the 2nd group\n"
|
" secondGroup { # here starts the 2nd group\n"
|
||||||
"# this is the second comment\n"
|
"# this is the second comment\n"
|
||||||
" int firstVarOfSecondGroup=\"1234\";\n"
|
" int firstVarOfSecondGroup=\"1234\";\n"
|
||||||
" secondVarOfSecondGroup=\"secondValue\"\n"
|
" secondVarOfSecondGroup=\"s%65condValue\"\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
"}";
|
"}";
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|||||||
@@ -49,7 +49,9 @@ static const char *_readValue(AQH_VARS *vtVar, AQH_VARS_DATATYPE dataType, const
|
|||||||
static AQH_VARS *_mkStringValue(const char *s);
|
static AQH_VARS *_mkStringValue(const char *s);
|
||||||
static AQH_VARS *_mkIntValue(const char *s);
|
static AQH_VARS *_mkIntValue(const char *s);
|
||||||
static AQH_VARS *_mkDoubleValue(const char *s);
|
static AQH_VARS *_mkDoubleValue(const char *s);
|
||||||
|
static const char *_getWordToBuffer(const char *src, const char *delims, GWEN_BUFFER *buf, uint32_t flags);
|
||||||
|
static const char *_skipBlanks(const char *src, const char *delims);
|
||||||
|
static const char *_readEscapeSequence(const char *src, GWEN_BUFFER *wbuf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -143,9 +145,10 @@ const char *_readGroupOrVar(AQH_VARS **pVars, const char *src, GWEN_BUFFER *wbuf
|
|||||||
const char *s;
|
const char *s;
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
rv=GWEN_Text_GetWordToBuffer(src, " ={#\t\r\n", wbuf, _textFlags, &s);
|
GWEN_Buffer_Reset(wbuf);
|
||||||
if (rv<0) {
|
s=_getWordToBuffer(src, " ={#\t\r\n", wbuf, _textFlags);
|
||||||
DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv);
|
if (s==NULL) {
|
||||||
|
DBG_INFO(AQH_LOGDOMAIN, "here");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,7 +193,6 @@ const char *_contAsTypedVar(AQH_VARS **pVars, const char *src, const char *tname
|
|||||||
{
|
{
|
||||||
AQH_VARS_DATATYPE dataType;
|
AQH_VARS_DATATYPE dataType;
|
||||||
const char *s;
|
const char *s;
|
||||||
int rv;
|
|
||||||
|
|
||||||
/* got type, convert to type */
|
/* got type, convert to type */
|
||||||
dataType=AQH_Vars_DataTypeFromString(tname);
|
dataType=AQH_Vars_DataTypeFromString(tname);
|
||||||
@@ -201,9 +203,9 @@ const char *_contAsTypedVar(AQH_VARS **pVars, const char *src, const char *tname
|
|||||||
|
|
||||||
/* read name */
|
/* read name */
|
||||||
GWEN_Buffer_Reset(wbuf);
|
GWEN_Buffer_Reset(wbuf);
|
||||||
rv=GWEN_Text_GetWordToBuffer(src, " \t={#\r\n", wbuf, _textFlags, &s);
|
s=_getWordToBuffer(src, " \t={#\r\n", wbuf, _textFlags);
|
||||||
if (rv<0) {
|
if (s==NULL) {
|
||||||
DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv);
|
DBG_INFO(AQH_LOGDOMAIN, "here");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,14 +262,14 @@ const char *_contAsVar(AQH_VARS **pVars, AQH_VARS_DATATYPE dataType, const char
|
|||||||
|
|
||||||
const char *_readValue(AQH_VARS *vtVar, AQH_VARS_DATATYPE dataType, const char *s, GWEN_BUFFER *wbuf)
|
const char *_readValue(AQH_VARS *vtVar, AQH_VARS_DATATYPE dataType, const char *s, GWEN_BUFFER *wbuf)
|
||||||
{
|
{
|
||||||
int rv;
|
|
||||||
AQH_VARS *vtValue;
|
AQH_VARS *vtValue;
|
||||||
|
|
||||||
rv=GWEN_Text_GetWordToBuffer(s, " \t,;#\r\n", wbuf, _textFlags, &s);
|
s=_getWordToBuffer(s, " \t,;#\r\n", wbuf, _textFlags);
|
||||||
if (rv<0) {
|
if (s==NULL) {
|
||||||
DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv);
|
DBG_INFO(AQH_LOGDOMAIN, "here");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(dataType) {
|
switch(dataType) {
|
||||||
case AQH_Vars_DataType_ValueString: vtValue=_mkStringValue(GWEN_Buffer_GetStart(wbuf)); break;
|
case AQH_Vars_DataType_ValueString: vtValue=_mkStringValue(GWEN_Buffer_GetStart(wbuf)); break;
|
||||||
case AQH_Vars_DataType_ValueInt: vtValue=_mkIntValue(GWEN_Buffer_GetStart(wbuf)); break;
|
case AQH_Vars_DataType_ValueInt: vtValue=_mkIntValue(GWEN_Buffer_GetStart(wbuf)); break;
|
||||||
@@ -283,7 +285,7 @@ const char *_readValue(AQH_VARS *vtVar, AQH_VARS_DATATYPE dataType, const char *
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// @TODO: unescape (write own GWEN_Text_GetWordToBuffer here)
|
||||||
AQH_VARS *_mkStringValue(const char *s)
|
AQH_VARS *_mkStringValue(const char *s)
|
||||||
{
|
{
|
||||||
return AQH_Vars_CreateStringValue(strdup(s));
|
return AQH_Vars_CreateStringValue(strdup(s));
|
||||||
@@ -320,5 +322,123 @@ AQH_VARS *_mkDoubleValue(const char *s)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char *_getWordToBuffer(const char *src, const char *delims, GWEN_BUFFER *buf, uint32_t flags)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* skip leading blanks, if wanted */
|
||||||
|
if (flags & GWEN_TEXT_FLAGS_DEL_LEADING_BLANKS)
|
||||||
|
src=_skipBlanks(src, delims);
|
||||||
|
|
||||||
|
if (*src=='"') {
|
||||||
|
/* inside brackets */
|
||||||
|
if (flags & GWEN_TEXT_FLAGS_DEL_QUOTES)
|
||||||
|
src++;
|
||||||
|
while(*src && strchr(delims, *src)==NULL) {
|
||||||
|
unsigned char x;
|
||||||
|
|
||||||
|
x=(unsigned char)*src;
|
||||||
|
if (x=='"') {
|
||||||
|
if (flags & GWEN_TEXT_FLAGS_DEL_QUOTES)
|
||||||
|
src++;
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (x=='%') {
|
||||||
|
src=_readEscapeSequence(src, buf);
|
||||||
|
if (src==NULL) {
|
||||||
|
DBG_INFO(AQH_LOGDOMAIN, "here");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GWEN_Buffer_AppendByte(buf, x);
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while(*src && strchr(delims, *src)==NULL) {
|
||||||
|
unsigned char x;
|
||||||
|
|
||||||
|
x=*src;
|
||||||
|
if (x=='%') {
|
||||||
|
src=_readEscapeSequence(src, buf);
|
||||||
|
if (src==NULL) {
|
||||||
|
DBG_INFO(AQH_LOGDOMAIN, "here");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
GWEN_Buffer_AppendByte(buf, x);
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
if ((flags & GWEN_TEXT_FLAGS_DEL_MULTIPLE_BLANKS) && isblank(x))
|
||||||
|
src=_skipBlanks(src, delims);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char *_skipBlanks(const char *src, const char *delims)
|
||||||
|
{
|
||||||
|
while (*src && isblank(*src)) {
|
||||||
|
if (strchr(delims, *src)) {
|
||||||
|
return src; /* empty buffer */
|
||||||
|
}
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char *_readEscapeSequence(const char *src, GWEN_BUFFER *wbuf)
|
||||||
|
{
|
||||||
|
if (src[1] && src[2]) {
|
||||||
|
unsigned char d1, d2;
|
||||||
|
unsigned char c;
|
||||||
|
|
||||||
|
src++; /* skip "%" */
|
||||||
|
|
||||||
|
if (!(*src) || !isxdigit((int)*src)) {
|
||||||
|
DBG_ERROR(GWEN_LOGDOMAIN, "Incomplete escape sequence (no digits)");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
d1=(unsigned char)(toupper(*src));
|
||||||
|
src++;
|
||||||
|
|
||||||
|
if (!(*src) || !isxdigit((int)*src)) {
|
||||||
|
DBG_ERROR(GWEN_LOGDOMAIN, "Incomplete escape sequence (only 1 digit)");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
d2=(unsigned char)(toupper(*src));
|
||||||
|
src++;
|
||||||
|
|
||||||
|
d1-='0';
|
||||||
|
if (d1>9)
|
||||||
|
d1-=7;
|
||||||
|
|
||||||
|
d2-='0';
|
||||||
|
if (d2>9)
|
||||||
|
d2-=7;
|
||||||
|
c=((d1<<4) & 0xf0) | (d2 & 0x0f);
|
||||||
|
GWEN_Buffer_AppendByte(wbuf, c);
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
DBG_ERROR(AQH_LOGDOMAIN, "Incomplete escape sequence");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//if ((x>='A' && x<='Z') || (x>='a' && x<='z') || (x>='0' && x<='9') || strchr(_acceptableChars, x))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include "./vars_dbread-t.c"
|
#include "./vars_dbread-t.c"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user