Example #1
0
void qspRestoreLocalVars(QSPVar *savedVars, int varsCount, QSPVarsGroup *savedGroups, int groupsCount)
{
	QSPVar *var;
	int i, j, ind;
	if (savedVars)
	{
		ind = 0;
		for (i = groupsCount - 1; i >= 0; --i)
		{
			for (j = savedGroups[i].VarsCount - 1; j >= 0; --j)
			{
				if (!(var = qspVarReference(savedGroups[i].Vars[j].Name, QSP_TRUE)))
				{
					while (ind < varsCount)
					{
						qspEmptyVar(savedVars + ind);
						++ind;
					}
					free(savedVars);
					return;
				}
				qspMoveVar(&savedGroups[i].Vars[j], var);
				qspMoveVar(var, savedVars + ind);
				++ind;
			}
		}
		free(savedVars);
	}
}
Example #2
0
void qspRestoreVarsList(QSPVar *vars, int varsCount)
{
	int i;
	QSPVar *var;
	if (vars)
	{
		for (i = 0; i < varsCount; ++i)
		{
			if (!(var = qspVarReference(vars[i].Name, QSP_TRUE)))
			{
				while (i < varsCount)
				{
					free(vars[i].Name);
					qspEmptyVar(vars + i);
					++i;
				}
				free(vars);
				return;
			}
			free(vars[i].Name);
			qspEmptyVar(var);
			qspMoveVar(var, vars + i);
		}
		free(vars);
	}
}
/* Получить значения указанного элемента массива */
AS3_Val QSPGetVarValues(void *param, AS3_Val args)
{
	char *name;
	int ind;
	QSP_CHAR *nameWC;
	char *strUTF8;
	QSPVar *var;
	AS3_Val res;
	AS3_ArrayValue(args, "StrType, IntType", &name, &ind);
	if (qspIsExitOnError && qspErrorNum) return AS3_Null();
	qspResetError();
	nameWC = qspC2W(name);
	var = qspVarReference(nameWC, QSP_FALSE);
	free(nameWC);
	if (qspErrorNum || ind < 0 || ind >= var->ValsCount) return AS3_Null();
	if (var->Values[ind].Str)
	{
		strUTF8 = qspW2C(var->Values[ind].Str);
		res = AS3_Object("numVal:IntType, strVal:StrType", var->Values[ind].Num, strUTF8);
		free(strUTF8);
	}
	else
		res = AS3_Object("numVal:IntType, strVal:StrType", var->Values[ind].Num, 0);
	return res;
}
Example #4
0
int qspPrepareLocalVars(QSPVar **vars)
{
	QSPVar *var, *savedVars;
	int i, j, ind, varsCount = 0;
	for (i = qspSavedVarsGroupsCount - 1; i >= 0; --i)
		varsCount += qspSavedVarsGroups[i].VarsCount;
	if (!varsCount)
	{
		*vars = 0;
		return 0;
	}
	savedVars = (QSPVar *)malloc(varsCount * sizeof(QSPVar));
	ind = 0;
	for (i = qspSavedVarsGroupsCount - 1; i >= 0; --i)
	{
		for (j = qspSavedVarsGroups[i].VarsCount - 1; j >= 0; --j)
		{
			if (!(var = qspVarReference(qspSavedVarsGroups[i].Vars[j].Name, QSP_TRUE)))
			{
				while (--ind >= 0)
					qspEmptyVar(savedVars + ind);
				free(savedVars);
				return 0;
			}
			qspMoveVar(savedVars + ind, var);
			qspMoveVar(var, &qspSavedVarsGroups[i].Vars[j]);
			++ind;
		}
	}
	*vars = savedVars;
	return varsCount;
}
Example #5
0
static QSPVar *qspGetVarData(QSP_CHAR *s, QSP_BOOL isSet, int *index)
{
	QSPVar *var;
	QSPVariant ind;
	int oldRefreshCount;
	QSP_CHAR *temp, *rPos, *lPos = qspStrChar(s, QSP_LSBRACK[0]);
	if (lPos)
	{
		rPos = qspStrPos(lPos, QSP_RSBRACK, QSP_FALSE);
		if (!rPos)
		{
			qspSetError(QSP_ERR_BRACKNOTFOUND);
			return 0;
		}
		*lPos = 0;
		var = qspVarReference(s, isSet);
		*lPos = QSP_LSBRACK[0];
		if (!var) return 0;
		temp = qspSkipSpaces(lPos + 1);
		if (temp == rPos)
		{
			if (isSet)
				*index = var->ValsCount;
			else
				*index = (var->ValsCount ? var->ValsCount - 1 : 0);
		}
		else
		{
			oldRefreshCount = qspRefreshCount;
			*rPos = 0;
			ind = qspExprValue(temp);
			*rPos = QSP_RSBRACK[0];
			if (qspRefreshCount != oldRefreshCount || qspErrorNum) return 0;
			if (ind.IsStr)
			{
				*index = qspGetVarTextIndex(var, QSP_STR(ind), isSet);
				free(QSP_STR(ind));
			}
			else
				*index = QSP_NUM(ind);
		}
		return var;
	}
	*index = 0;
	return qspVarReference(s, isSet);
}
Example #6
0
QSPVar *qspVarReferenceWithType(QSP_CHAR *name, QSP_BOOL isCreate, QSP_BOOL *isString)
{
	QSPVar *var;
	QSP_CHAR *varName = qspDelSpcCanRetSelf(name);
	if (isString) *isString = (*varName == QSP_STRCHAR[0]);
	var = qspVarReference(varName, isCreate);
	if (varName != name) free(varName);
	return var;
}
Example #7
0
int qspGetVarNumValue(const QSP_CHAR *name) {
  QSPVar *var;
  if (var = qspVarReference(name, QSP_FALSE)) {
    if (var->ValsCount)
      return var->Values->Num;
  } else
    qspResetError();
  return 0;
}
Example #8
0
/* Получить количество элементов массива */
QSP_BOOL QSPGetVarValuesCount(const QSP_CHAR *name, int *count)
{
	QSPVar *var;
	if (qspIsExitOnError && qspErrorNum) return QSP_FALSE;
	qspResetError();
	var = qspVarReference((QSP_CHAR *)name, QSP_FALSE);
	if (qspErrorNum) return QSP_FALSE;
	*count = var->ValsCount;
	return QSP_TRUE;
}
Example #9
0
/* Получить значения указанного элемента массива */
QSP_BOOL QSPGetVarValues(const QSP_CHAR *name, int ind, int *numVal, QSP_CHAR **strVal)
{
	QSPVar *var;
	if (qspIsExitOnError && qspErrorNum) return QSP_FALSE;
	qspResetError();
	var = qspVarReference((QSP_CHAR *)name, QSP_FALSE);
	if (qspErrorNum || ind < 0 || ind >= var->ValsCount) return QSP_FALSE;
	*numVal = var->Values[ind].Num;
	*strVal = var->Values[ind].Str;
	return QSP_TRUE;
}
Example #10
0
void qspPrepareGlobalVars() {
  int i, j;
  QSPVar *var;
  for (i = qspSavedVarsGroupsCount - 1; i >= 0; --i) {
    for (j = qspSavedVarsGroups[i].VarsCount - 1; j >= 0; --j) {
      if (!(var =
                qspVarReference(qspSavedVarsGroups[i].Vars[j].Name, QSP_TRUE)))
        return;
      qspEmptyVar(var);
      qspMoveVar(var, &qspSavedVarsGroups[i].Vars[j]);
    }
  }
}
Example #11
0
const QSP_CHAR *qspGetVarStrValue(QSP_CHAR *name) {
  QSP_CHAR *text;
  QSPVar *var;
  if (var = qspVarReference(name, QSP_FALSE)) {
    if (var->ValsCount) {
      text = var->Values->Str;
      if (text)
        return text;
    }
  } else
    qspResetError();
  return QSP_FMT("");
}
/* Получить количество элементов массива */
AS3_Val QSPGetVarValuesCount(void *param, AS3_Val args)
{
	char *name;
	QSP_CHAR *nameWC;
	QSPVar *var;
	AS3_ArrayValue(args, "StrType", &name);
	if (qspIsExitOnError && qspErrorNum) return AS3_Null();
	qspResetError();
	nameWC = qspC2W(name);
	var = qspVarReference(nameWC, QSP_FALSE);
	free(nameWC);
	if (qspErrorNum) return AS3_Null();
	return AS3_Int(var->ValsCount);
}
/* Получить количество элементов массива */
void QSPGetVarValuesCount(QSP_BOOL *res, const QSP_CHAR *name, int *count)
{
	QSPVar *var;
	if (qspIsExitOnError && qspErrorNum)
	{
		*res = QSP_FALSE;
		return;
	}
	qspResetError();
	var = qspVarReference((QSP_CHAR *)name, QSP_FALSE);
	if (qspErrorNum)
	{
		*res = QSP_FALSE;
		return;
	}
	*count = var->ValsCount;
	*res = QSP_TRUE;
}
Example #14
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];
	}
}