Ejemplo n.º 1
0
QSP_CHAR *qspFormatText(QSP_CHAR *txt, QSP_BOOL canReturnSelf)
{
	QSPVariant val;
	QSP_CHAR *newTxt, *lPos, *rPos;
	int oldRefreshCount, len, txtLen, oldTxtLen, bufSize;
	if (qspGetVarNumValue(QSP_FMT("DISABLESUBEX")))
	{
		if (canReturnSelf) return txt;
		return qspGetNewText(txt, -1);
	}
	lPos = qspStrStr(txt, QSP_LSUBEX);
	if (!lPos)
	{
		if (canReturnSelf) return txt;
		return qspGetNewText(txt, -1);
	}
	bufSize = 256;
	newTxt = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR));
	txtLen = oldTxtLen = 0;
	oldRefreshCount = qspRefreshCount;
	do
	{
		len = (int)(lPos - txt);
		if ((txtLen += len) >= bufSize)
		{
			bufSize = txtLen + 128;
			newTxt = (QSP_CHAR *)realloc(newTxt, bufSize * sizeof(QSP_CHAR));
		}
		qspStrNCopy(newTxt + oldTxtLen, txt, len);
		oldTxtLen = txtLen;
		txt = lPos + QSP_LEN(QSP_LSUBEX);
		rPos = qspStrPos(txt, QSP_RSUBEX, QSP_FALSE);
		if (!rPos)
		{
			qspSetError(QSP_ERR_BRACKNOTFOUND);
			free(newTxt);
			return 0;
		}
		*rPos = 0;
		val = qspExprValue(txt);
		*rPos = QSP_RSUBEX[0];
		if (qspRefreshCount != oldRefreshCount || qspErrorNum)
		{
			free(newTxt);
			return 0;
		}
		qspConvertVariantTo(&val, QSP_TRUE);
		if ((txtLen += qspStrLen(QSP_STR(val))) >= bufSize)
		{
			bufSize = txtLen + 128;
			newTxt = (QSP_CHAR *)realloc(newTxt, bufSize * sizeof(QSP_CHAR));
		}
		qspStrCopy(newTxt + oldTxtLen, QSP_STR(val));
		free(QSP_STR(val));
		oldTxtLen = txtLen;
		txt = rPos + QSP_LEN(QSP_RSUBEX);
		lPos = qspStrStr(txt, QSP_LSUBEX);
	} while (lPos);
	return qspGetAddText(newTxt, txt, txtLen, -1);
}
Ejemplo n.º 2
0
int qspCodeWriteIntVal(QSP_CHAR **s, int len, int val, QSP_BOOL isCode)
{
	QSP_CHAR buf[12], *temp;
	qspNumToStr(buf, val);
	if (isCode)
	{
		temp = qspCodeReCode(buf, QSP_TRUE);
		len = qspAddText(s, temp, len, -1, QSP_FALSE);
		free(temp);
	}
	else
		len = qspAddText(s, buf, len, -1, QSP_FALSE);
	return qspAddText(s, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE);
}
Ejemplo n.º 3
0
QSP_CHAR *qspGetAllActionsAsCode()
{
	int len = 0, count, i;
	QSP_CHAR *res, *temp;
	res = qspGetNewText(QSP_FMT(""), 0);
	for (i = 0; i < qspCurActionsCount; ++i)
	{
		len = qspAddText(&res, QSP_FMT("ACT '"), len, 5, QSP_FALSE);
		temp = qspReplaceText(qspCurActions[i].Desc, QSP_FMT("'"), QSP_FMT("''"));
		len = qspAddText(&res, temp, len, -1, QSP_FALSE);
		free(temp);
		if (qspCurActions[i].Image)
		{
			len = qspAddText(&res, QSP_FMT("','"), len, 3, QSP_FALSE);
			temp = qspReplaceText(qspCurActions[i].Image + qspQstPathLen, QSP_FMT("'"), QSP_FMT("''"));
			len = qspAddText(&res, temp, len, -1, QSP_FALSE);
			free(temp);
		}
		len = qspAddText(&res, QSP_FMT("':"), len, 2, QSP_FALSE);
		count = qspCurActions[i].OnPressLinesCount;
		if (count == 1 && qspIsAnyString(qspCurActions[i].OnPressLines->Str))
			len = qspAddText(&res, qspCurActions[i].OnPressLines->Str, len, -1, QSP_FALSE);
		else
		{
			if (count >= 2)
			{
				len = qspAddText(&res, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE);
				temp = qspJoinPrepLines(qspCurActions[i].OnPressLines, count, QSP_STRSDELIM);
				len = qspAddText(&res, temp, len, -1, QSP_FALSE);
				free(temp);
			}
			len = qspAddText(&res, QSP_STRSDELIM QSP_FMT("END"), len, QSP_LEN(QSP_STRSDELIM) + 3, QSP_FALSE);
		}
		len = qspAddText(&res, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE);
	}
	return res;
}
Ejemplo n.º 4
0
int qspCodeWriteVal(QSP_CHAR **s, int len, QSP_CHAR *val, QSP_BOOL isCode)
{
	QSP_CHAR *temp;
	if (val)
	{
		if (isCode)
		{
			temp = qspCodeReCode(val, QSP_TRUE);
			len = qspAddText(s, temp, len, -1, QSP_FALSE);
			free(temp);
		}
		else
			len = qspAddText(s, val, len, -1, QSP_FALSE);
	}
	return qspAddText(s, QSP_STRSDELIM, len, QSP_LEN(QSP_STRSDELIM), QSP_FALSE);
}
Ejemplo n.º 5
0
void qspStatementSetVarValue(QSP_CHAR *s)
{
	QSPVariant v;
	int oldRefreshCount;
	QSP_CHAR ch, *name, *pos = qspStrPos(s, QSP_EQUAL, QSP_FALSE);
	if (!pos)
	{
		qspSetError(QSP_ERR_EQNOTFOUND);
		return;
	}
	oldRefreshCount = qspRefreshCount;
	v = qspExprValue(pos + QSP_LEN(QSP_EQUAL));
	if (qspRefreshCount != oldRefreshCount || qspErrorNum) return;
	if (pos != s && qspIsInList(QSP_ADD QSP_SUB QSP_DIV QSP_MUL, *(pos - 1))) --pos;
	ch = *pos;
	*pos = 0;
	name = qspDelSpcCanRetSelf(s);
	qspSetVarValue(name, &v, ch);
	*pos = ch;
	if (name != s) free(name);
	if (v.IsStr) free(QSP_STR(v));
}
Ejemplo n.º 6
0
void qspStatementLocal(QSP_CHAR *s)
{
	QSPVariant v;
	QSPVar *var;
	QSP_BOOL isVarFound;
	QSP_CHAR *curPos, *varName, *commaPos, *eqPos;
	int i, groupInd, count, bufSize, oldRefreshCount;
	s = qspSkipSpaces(s);
	if (!(*s))
	{
		qspSetError(QSP_ERR_SYNTAX);
		return;
	}
	groupInd = qspSavedVarsGroupsCount - 1;
	count = bufSize = qspSavedVarsGroups[groupInd].VarsCount;
	isVarFound = QSP_FALSE;
	curPos = s;
	eqPos = qspStrPos(curPos, QSP_EQUAL, QSP_FALSE);
	if (eqPos) *eqPos = 0;
	while (1)
	{
		/* Skip type char */
		if (*curPos == QSP_STRCHAR[0]) ++curPos;
		/* Get variable's name */
		commaPos = qspStrPos(curPos, QSP_COMMA, QSP_FALSE);
		if (commaPos)
		{
			*commaPos = 0;
			varName = (eqPos ? qspGetVarNameOnly(curPos) : qspDelSpc(curPos));
			*commaPos = QSP_COMMA[0];
		}
		else
			varName = (eqPos ? qspGetVarNameOnly(curPos) : qspDelSpc(curPos));
		qspUpperStr(varName);
		/* Check for the existence */
		for (i = 0; i < count; ++i)
		{
			if (!qspStrsComp(varName, qspSavedVarsGroups[groupInd].Vars[i].Name))
			{
				isVarFound = QSP_TRUE;
				break;
			}
		}
		/* Get variable's data */
		if (isVarFound)
		{
			/* Already exists */
			isVarFound = QSP_FALSE;
			free(varName);
		}
		else
		{
			/* Add variable to the local group */
			if (!(var = qspVarReference(varName, QSP_FALSE)))
			{
				free(varName);
				if (eqPos) *eqPos = QSP_EQUAL[0];
				return;
			}
			if (count >= bufSize)
			{
				bufSize = count + 4;
				qspSavedVarsGroups[groupInd].Vars = (QSPVar *)realloc(qspSavedVarsGroups[groupInd].Vars, bufSize * sizeof(QSPVar));
			}
			qspMoveVar(qspSavedVarsGroups[groupInd].Vars + count, var);
			qspSavedVarsGroups[groupInd].Vars[count].Name = varName;
			qspSavedVarsGroups[groupInd].VarsCount = ++count;
		}
		if (!commaPos) break;
		curPos = qspSkipSpaces(commaPos + QSP_LEN(QSP_COMMA));
		if (!(*curPos))
		{
			qspSetError(QSP_ERR_SYNTAX);
			if (eqPos) *eqPos = QSP_EQUAL[0];
			return;
		}
	}
	if (eqPos)
	{
		oldRefreshCount = qspRefreshCount;
		v = qspExprValue(eqPos + QSP_LEN(QSP_EQUAL));
		if (qspRefreshCount != oldRefreshCount || qspErrorNum)
		{
			*eqPos = QSP_EQUAL[0];
			return;
		}
		varName = qspDelSpcCanRetSelf(s);
		qspSetVarValue(varName, &v, QSP_EQUAL[0]);
		if (varName != s) free(varName);
		if (v.IsStr) free(QSP_STR(v));
		*eqPos = QSP_EQUAL[0];
	}
}
Ejemplo n.º 7
0
static void qspSetVarValue(QSP_CHAR *name, QSPVariant *v, QSP_CHAR op)
{
	QSPVariant v2;
	QSP_BOOL isSingleValue, notFirstValue = QSP_FALSE;
	QSP_CHAR *newValPos, *newCommaPos, *valPos, *commaPos = name;
	int oldRefreshCount = qspRefreshCount;
	if (v->IsStr)
	{
		valPos = QSP_PSTR(v);
		isSingleValue = QSP_FALSE; /* Multiple values by default */
	}
	else
		isSingleValue = QSP_TRUE;
	while (1)
	{
		newCommaPos = qspStrPos(commaPos, QSP_COMMA, QSP_FALSE);
		if (newCommaPos)
		{
			*newCommaPos = 0;
			if (isSingleValue)
			{
				if (notFirstValue)
					qspSetVar(commaPos, &v2, op);
				else
					qspSetVar(commaPos, v, op);
				if (qspRefreshCount != oldRefreshCount || qspErrorNum)
				{
					*newCommaPos = QSP_COMMA[0];
					break;
				}
			}
			else
			{
				newValPos = qspStrStr(valPos, QSP_VALSDELIM);
				if (newValPos)
				{
					notFirstValue = QSP_TRUE;
					v2.IsStr = QSP_TRUE;
					QSP_STR(v2) = qspGetNewText(valPos, (int)(newValPos - valPos));
					qspSetVar(commaPos, &v2, op);
					if (qspRefreshCount != oldRefreshCount || qspErrorNum)
					{
						*newCommaPos = QSP_COMMA[0];
						break;
					}
					if (v2.IsStr) free(QSP_STR(v2));
					valPos = newValPos + QSP_LEN(QSP_VALSDELIM);
				}
				else /* The last value */
				{
					isSingleValue = QSP_TRUE;
					if (notFirstValue)
					{
						v2.IsStr = QSP_TRUE;
						QSP_STR(v2) = qspGetNewText(valPos, -1);
						qspSetVar(commaPos, &v2, op);
					}
					else
						qspSetVar(commaPos, v, op);
					if (qspRefreshCount != oldRefreshCount || qspErrorNum)
					{
						*newCommaPos = QSP_COMMA[0];
						break;
					}
				}
			}
			*newCommaPos = QSP_COMMA[0];
		}
		else /* The last variable */
		{
			if (notFirstValue) /* Not a first value */
			{
				if (!isSingleValue)
				{
					v2.IsStr = QSP_TRUE;
					QSP_STR(v2) = qspGetNewText(valPos, -1);
				}
				qspSetVar(commaPos, &v2, op);
			}
			else
				qspSetVar(commaPos, v, op);
			break;
		}
		commaPos = newCommaPos + QSP_LEN(QSP_COMMA);
	}
	if (notFirstValue && v2.IsStr) free(QSP_STR(v2));
}