+ const char *pch = *pCh;
+ const char *pchs, *pche;
+ TemplateParam *Parm = (TemplateParam *) malloc(sizeof(TemplateParam));
+ char quote = '\0';
+
+ /* Skip leading whitespaces */
+ while ((*pch == ' ' )||
+ (*pch == '\t')||
+ (*pch == '\r')||
+ (*pch == '\n')) pch ++;
+ if (*pch == '"')
+ quote = '"';
+ else if (*pch == '\'')
+ quote = '\'';
+ if (quote != '\0') {
+ pch ++;
+ pchs = pch;
+ Parm->Type = TYPE_STR;
+ while (pch <= pe &&
+ ((*pch != quote) ||
+ ( (pch > pchs) && (*(pch - 1) == '\\'))
+ )) {
+ pch ++;
+ }
+ pche = pch;
+ if (*pch != quote) {
+ lprintf(1, "Error evaluating template param [%s]\n", *pCh);
+ pch ++;
+ free(Parm);
+ return NULL;
+ }
+ else {
+ StrBufPeek(Buf, pch, -1, '\0');
+ Parm->Start = pchs;
+ Parm->len = pche - pchs;
+ pch ++; /* move after trailing quote */
+ }
+ }
+ else {
+ Parm->Type = TYPE_LONG;
+ pchs = pch;
+ while ((pch <= pe) &&
+ (isdigit(*pch) ||
+ (*pch == '+') ||
+ (*pch == '-')))
+ pch ++;
+ pch ++;
+ if (pch - pchs > 1){
+ StrBufPeek(Buf, pch, -1, '\0');
+ Parm->lvalue = atol(pchs);
+ Parm->Start = pchs;
+ pch++;
+ }
+ else {
+ Parm->lvalue = 0;
+ lprintf(1, "Error evalating template long param [%s]", *pCh);
+ free(Parm);
+ return NULL;
+ }
+ }
+ while ((*pch == ' ' )||
+ (*pch == '\t')||
+ (*pch == '\r')||
+ (*pch == '\n')) pch ++;
+
+ *pCh = pch;
+ return Parm;
+}
+
+WCTemplateToken *NewTemplateSubstitute(StrBuf *Buf,
+ const char *pStart,
+ const char *pTmplStart,
+ const char *pTmplEnd)
+{
+ const char *pch;
+ TemplateParam *Param;