summaryrefslogtreecommitdiffstats
path: root/runtime/ctok.c
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/ctok.c')
-rw-r--r--runtime/ctok.c54
1 files changed, 39 insertions, 15 deletions
diff --git a/runtime/ctok.c b/runtime/ctok.c
index 263e656c..18ddaed2 100644
--- a/runtime/ctok.c
+++ b/runtime/ctok.c
@@ -87,11 +87,12 @@ ctokUngetCharFromStream(ctok_t *pThis, uchar __attribute__((unused)) c)
}
-/* get the next character from the input "stream" (currently just a in-memory
- * string...) -- rgerhards, 2008-02-19
+/* get the next character from the input "stream". Note that this version
+ * does NOT look for comment characters as end-of-stream, so it is suitable
+ * when building constant strings! -- rgerhards, 2010-03-01
*/
-static rsRetVal
-ctokGetCharFromStream(ctok_t *pThis, uchar *pc)
+static inline rsRetVal
+ctokGetCharFromStreamNoComment(ctok_t *pThis, uchar *pc)
{
DEFiRet;
@@ -99,7 +100,7 @@ ctokGetCharFromStream(ctok_t *pThis, uchar *pc)
ASSERT(pc != NULL);
/* end of string or begin of comment terminates the "stream" */
- if(*pThis->pp == '\0' || *pThis->pp == '#') {
+ if(*pThis->pp == '\0') {
ABORT_FINALIZE(RS_RET_EOS);
} else {
*pc = *pThis->pp;
@@ -111,6 +112,28 @@ finalize_it:
}
+/* get the next character from the input "stream" (currently just a in-memory
+ * string...) -- rgerhards, 2008-02-19
+ */
+static rsRetVal
+ctokGetCharFromStream(ctok_t *pThis, uchar *pc)
+{
+ DEFiRet;
+
+ ISOBJ_TYPE_assert(pThis, ctok);
+ ASSERT(pc != NULL);
+
+ CHKiRet(ctokGetCharFromStreamNoComment(pThis, pc));
+ /* begin of comment terminates the "stream"! */
+ if(*pc == '#') {
+ ABORT_FINALIZE(RS_RET_EOS);
+ }
+
+finalize_it:
+ RETiRet;
+}
+
+
/* skip whitespace in the input "stream".
* rgerhards, 2008-02-19
*/
@@ -258,13 +281,13 @@ ctokGetVar(ctok_t *pThis, ctok_token_t *pToken)
pToken->tok = ctok_MSGVAR;
}
- CHKiRet(rsCStrConstruct(&pstrVal));
+ CHKiRet(cstrConstruct(&pstrVal));
/* this loop is quite simple, a variable name is terminated when a non-supported
* character is detected. Note that we currently permit a numerical digit as the
* first char, which is not permitted by ABNF. -- rgerhards, 2009-03-10
*/
while(isalpha(c) || isdigit(c) || (c == '_') || (c == '-')) {
- CHKiRet(rsCStrAppendChar(pstrVal, tolower(c)));
+ CHKiRet(cstrAppendChar(pstrVal, tolower(c)));
CHKiRet(ctokGetCharFromStream(pThis, &c));
}
CHKiRet(ctokUngetCharFromStream(pThis, c)); /* put not processed char back */
@@ -277,7 +300,7 @@ ctokGetVar(ctok_t *pThis, ctok_token_t *pToken)
finalize_it:
if(iRet != RS_RET_OK) {
if(pstrVal != NULL) {
- rsCStrDestruct(&pstrVal);
+ cstrDestruct(&pstrVal);
}
}
@@ -301,23 +324,23 @@ ctokGetSimpStr(ctok_t *pThis, ctok_token_t *pToken)
pToken->tok = ctok_SIMPSTR;
- CHKiRet(rsCStrConstruct(&pstrVal));
- CHKiRet(ctokGetCharFromStream(pThis, &c));
+ CHKiRet(cstrConstruct(&pstrVal));
+ CHKiRet(ctokGetCharFromStreamNoComment(pThis, &c));
/* while we are in escape mode (had a backslash), no sequence
* terminates the loop. If outside, it is terminated by a single quote.
*/
while(bInEsc || c != '\'') {
if(bInEsc) {
- CHKiRet(rsCStrAppendChar(pstrVal, c));
+ CHKiRet(cstrAppendChar(pstrVal, c));
bInEsc = 0;
} else {
if(c == '\\') {
bInEsc = 1;
} else {
- CHKiRet(rsCStrAppendChar(pstrVal, c));
+ CHKiRet(cstrAppendChar(pstrVal, c));
}
}
- CHKiRet(ctokGetCharFromStream(pThis, &c));
+ CHKiRet(ctokGetCharFromStreamNoComment(pThis, &c));
}
CHKiRet(cstrFinalize(pstrVal));
@@ -327,7 +350,7 @@ ctokGetSimpStr(ctok_t *pThis, ctok_token_t *pToken)
finalize_it:
if(iRet != RS_RET_OK) {
if(pstrVal != NULL) {
- rsCStrDestruct(&pstrVal);
+ cstrDestruct(&pstrVal);
}
}
@@ -519,8 +542,9 @@ ctokGetToken(ctok_t *pThis, ctok_token_t **ppToken)
CHKiRet(ctokUngetCharFromStream(pThis, c));
pToken->tok = ctok_FUNCTION;
/* fill function name */
- CHKiRet(rsCStrConstruct(&pstrVal));
+ CHKiRet(cstrConstruct(&pstrVal));
CHKiRet(rsCStrSetSzStr(pstrVal, szWord));
+ CHKiRet(cstrFinalize(pstrVal));
CHKiRet(var.SetString(pToken->pVar, pstrVal));
} else { /* give up... */
dbgprintf("parser has an invalid word (token) '%s'\n", szWord);