summaryrefslogtreecommitdiff
path: root/src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2014-03-26 19:21:20 +0000
committer <>2014-05-08 15:03:54 +0000
commitfb123f93f9f5ce42c8e5785d2f8e0edaf951740e (patch)
treec2103d76aec5f1f10892cd1d3a38e24f665ae5db /src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp
parent58ed4748338f9466599adfc8a9171280ed99e23f (diff)
downloadVirtualBox-master.tar.gz
Imported from /home/lorry/working-area/delta_VirtualBox/VirtualBox-4.3.10.tar.bz2.HEADVirtualBox-4.3.10master
Diffstat (limited to 'src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp')
-rw-r--r--src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp73
1 files changed, 58 insertions, 15 deletions
diff --git a/src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp b/src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp
index a26a5883..c483966e 100644
--- a/src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp
+++ b/src/VBox/Frontends/VBoxAutostart/VBoxAutostartCfg.cpp
@@ -380,9 +380,15 @@ static int autostartConfigTokenizerGetNextToken(PCFGTOKENIZER pCfgTokenizer,
return autostartConfigTokenizerCreateToken(pCfgTokenizer, NULL, &pCfgTokenizer->pTokenNext);
}
-static const char *autostartConfigTokenToString(PCFGTOKEN pToken)
+/**
+ * Returns a stringified version of the token type.
+ *
+ * @returns Stringified version of the token type.
+ * @param enmType Token type.
+ */
+static const char *autostartConfigTokenTypeToStr(CFGTOKENTYPE enmType)
{
- switch (pToken->enmType)
+ switch (enmType)
{
case CFGTOKENTYPE_COMMA:
return ",";
@@ -395,7 +401,7 @@ static const char *autostartConfigTokenToString(PCFGTOKEN pToken)
case CFGTOKENTYPE_EOF:
return "<EOF>";
case CFGTOKENTYPE_ID:
- return pToken->u.Id.achToken;
+ return "<Identifier>";
default:
AssertFailed();
return "<Invalid>";
@@ -405,6 +411,26 @@ static const char *autostartConfigTokenToString(PCFGTOKEN pToken)
return NULL;
}
+/**
+ * Returns a stringified version of the token.
+ *
+ * @returns Stringified version of the token type.
+ * @param pToken Token.
+ */
+static const char *autostartConfigTokenToString(PCFGTOKEN pToken)
+{
+ if (pToken->enmType == CFGTOKENTYPE_ID)
+ return pToken->u.Id.achToken;
+ else
+ return autostartConfigTokenTypeToStr(pToken->enmType);
+}
+
+/**
+ * Returns the length of the token in characters (without zero terminator).
+ *
+ * @returns Token length.
+ * @param pToken Token.
+ */
static size_t autostartConfigTokenGetLength(PCFGTOKEN pToken)
{
switch (pToken->enmType)
@@ -427,12 +453,19 @@ static size_t autostartConfigTokenGetLength(PCFGTOKEN pToken)
return 0;
}
+/**
+ * Log unexpected token error.
+ *
+ * @returns nothing.
+ * @param pToken The token which caused the error.
+ * @param pszExpected String of the token which was expected.
+ */
static void autostartConfigTokenizerMsgUnexpectedToken(PCFGTOKEN pToken, const char *pszExpected)
{
- RTMsgError("Unexpected token '%s' at %d:%d.%d, expected '%s'",
- autostartConfigTokenToString(pToken),
- pToken->iLine, pToken->cchStart,
- pToken->cchStart + autostartConfigTokenGetLength(pToken) - 1, pszExpected);
+ autostartSvcLogError("Unexpected token '%s' at %d:%d.%d, expected '%s'",
+ autostartConfigTokenToString(pToken),
+ pToken->iLine, pToken->cchStart,
+ pToken->cchStart + autostartConfigTokenGetLength(pToken) - 1, pszExpected);
}
/**
@@ -452,7 +485,7 @@ static int autostartConfigTokenizerCheckAndConsume(PCFGTOKENIZER pCfgTokenizer,
{
if (pCfgToken->enmType != enmType)
{
- autostartConfigTokenizerMsgUnexpectedToken(pCfgToken, "@todo");
+ autostartConfigTokenizerMsgUnexpectedToken(pCfgToken, autostartConfigTokenTypeToStr(enmType));
rc = VERR_INVALID_PARAMETER;
}
@@ -569,6 +602,7 @@ static int autostartConfigParseCompoundNode(PCFGTOKENIZER pCfgTokenizer, const c
return VERR_NO_MEMORY;
pCfgAst->enmType = CFGASTNODETYPE_COMPOUND;
+ pCfgAst->u.Compound.cAstNodes = 0;
pCfgAst->pszKey = RTStrDup(pszScopeId);
if (!pCfgAst->pszKey)
{
@@ -618,10 +652,22 @@ static int autostartConfigParseCompoundNode(PCFGTOKENIZER pCfgTokenizer, const c
/* Add to the current compound node. */
if (RT_SUCCESS(rc))
{
- Assert(idxAstNodeCur < cAstNodesMax);
- pCfgAst->u.Compound.apAstNodes[idxAstNodeCur] = pAstNode;
- idxAstNodeCur++;
- /** @todo: realloc if array is getting to small. */
+ if (pCfgAst->u.Compound.cAstNodes >= cAstNodesMax)
+ {
+ cAstNodesMax += 10;
+
+ PCFGAST pCfgAstNew = (PCFGAST)RTMemRealloc(pCfgAst, RT_OFFSETOF(CFGAST, u.Compound.apAstNodes[cAstNodesMax]));
+ if (!pCfgAstNew)
+ rc = VERR_NO_MEMORY;
+ else
+ pCfgAst = pCfgAstNew;
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ pCfgAst->u.Compound.apAstNodes[pCfgAst->u.Compound.cAstNodes] = pAstNode;
+ pCfgAst->u.Compound.cAstNodes++;
+ }
}
autostartConfigTokenFree(pCfgTokenizer, pToken);
@@ -629,10 +675,7 @@ static int autostartConfigParseCompoundNode(PCFGTOKENIZER pCfgTokenizer, const c
} while (RT_SUCCESS(rc));
if (RT_SUCCESS(rc))
- {
- pCfgAst->u.Compound.cAstNodes = idxAstNodeCur;
*ppCfgAst = pCfgAst;
- }
else
autostartConfigAstDestroy(pCfgAst);