Пример #1
0
int qspObjIndex(QSP_CHAR *name)
{
	int i, objNameLen, bufSize;
	QSP_CHAR *uName, *buf;
	if (!qspCurObjectsCount) return -1;
	qspUpperStr(uName = qspGetNewText(name, -1));
	bufSize = 32;
	buf = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR));
	for (i = 0; i < qspCurObjectsCount; ++i)
	{
		objNameLen = qspStrLen(qspCurObjects[i].Desc);
		if (objNameLen >= bufSize)
		{
			bufSize = objNameLen + 8;
			buf = (QSP_CHAR *)realloc(buf, bufSize * sizeof(QSP_CHAR));
		}
		qspStrCopy(buf, qspCurObjects[i].Desc);
		qspUpperStr(buf);
		if (!qspStrsComp(buf, uName))
		{
			free(uName);
			free(buf);
			return i;
		}
	}
	free(uName);
	free(buf);
	return -1;
}
Пример #2
0
static int qspActIndex(QSP_CHAR *name)
{
	int i, actNameLen, bufSize;
	QSP_CHAR *uName, *buf;
	if (!qspCurActionsCount) return -1;
	qspUpperStr(uName = qspGetNewText(name, -1));
	bufSize = 64;
	buf = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR));
	for (i = 0; i < qspCurActionsCount; ++i)
	{
		actNameLen = qspStrLen(qspCurActions[i].Desc);
		if (actNameLen >= bufSize)
		{
			bufSize = actNameLen + 16;
			buf = (QSP_CHAR *)realloc(buf, bufSize * sizeof(QSP_CHAR));
		}
		qspStrCopy(buf, qspCurActions[i].Desc);
		qspUpperStr(buf);
		if (!qspStrsComp(buf, uName))
		{
			free(uName);
			free(buf);
			return i;
		}
	}
	free(uName);
	free(buf);
	return -1;
}
Пример #3
0
static int qspSearchPlayList(QSP_CHAR *file)
{
	QSP_CHAR *uName, *buf;
	int i, bufSize, itemLen, len;
	if (!qspPLFilesCount) return -1;
	len = qspStrLen(file);
	qspUpperStr(uName = qspGetNewText(file, len));
	bufSize = 32;
	buf = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR));
	for (i = 0; i < qspPLFilesCount; ++i)
	{
		itemLen = qspStrLen(qspPLFiles[i]);
		if (itemLen >= bufSize)
		{
			bufSize = itemLen + 8;
			buf = (QSP_CHAR *)realloc(buf, bufSize * sizeof(QSP_CHAR));
		}
		qspStrCopy(buf, qspPLFiles[i]);
		qspUpperStr(buf);
		if (!qspStrsNComp(buf, uName, len) && qspIsInListEOL(QSP_PLVOLUMEDELIM, buf[len]))
		{
			free(uName);
			free(buf);
			return i;
		}
	}
	free(uName);
	free(buf);
	return -1;
}
Пример #4
0
static int qspActIndex(QSPString name)
{
	QSPString uName, bufName;
	int i, actNameLen, bufSize;
	QSP_CHAR *buf;
	if (!qspCurActionsCount) return -1;
	uName = qspGetNewText(name);
	qspUpperStr(&uName);
	bufSize = 64;
	buf = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR));
	for (i = 0; i < qspCurActionsCount; ++i)
	{
		actNameLen = qspStrLen(qspCurActions[i].Desc);
		if (actNameLen > bufSize)
		{
			bufSize = actNameLen + 16;
			buf = (QSP_CHAR *)realloc(buf, bufSize * sizeof(QSP_CHAR));
		}
		memcpy(buf, qspCurActions[i].Desc.Str, actNameLen * sizeof(QSP_CHAR));
		bufName = qspStringFromLen(buf, actNameLen);
		qspUpperStr(&bufName);
		if (!qspStrsComp(bufName, uName))
		{
			qspFreeString(uName);
			free(buf);
			return i;
		}
	}
	qspFreeString(uName);
	free(buf);
	return -1;
}
Пример #5
0
static int qspGetVarTextIndex(QSPVar *var, QSP_CHAR *str, QSP_BOOL isCreate) {
  QSP_CHAR *uStr;
  QSPVarIndex *ind;
  int i, n = var->IndsCount;
  qspUpperStr(uStr = qspGetNewText(str, -1));
  if (n > 0) {
    ind = (QSPVarIndex *)bsearch(uStr, var->Indices, n, sizeof(QSPVarIndex),
                                 qspIndStringCompare);
    if (ind) {
      free(uStr);
      return ind->Index;
    }
  }
  if (isCreate) {
    var->IndsCount++;
    if (n >= var->IndsBufSize) {
      var->IndsBufSize = n + 8;
      var->Indices = (QSPVarIndex *)realloc(
          var->Indices, var->IndsBufSize * sizeof(QSPVarIndex));
    }
    i = n - 1;
    while (i >= 0 && qspStrsComp(var->Indices[i].Str, uStr) > 0) {
      var->Indices[i + 1] = var->Indices[i];
      --i;
    }
    ++i;
    n = var->ValsCount;
    var->Indices[i].Str = uStr;
    var->Indices[i].Index = n;
    return n;
  }
  free(uStr);
  return -1;
}
Пример #6
0
QSPVar *qspVarReference(const QSP_CHAR *name, QSP_BOOL isCreate) {
  int i;
  QSPVar *var;
  QSP_CHAR *uName;
  unsigned char bCode;
  if (*name == QSP_STRCHAR[0])
    ++name;
  if (!(*name) || qspIsDigit(*name) || qspStrPBrk(name, QSP_DELIMS)) {
    qspSetError(QSP_ERR_NOTCORRECTNAME);
    return nullptr;
  }
  qspUpperStr(uName = qspGetNewText(name, -1));
  bCode = 0;
  for (i = 0; uName[i]; ++i)
    bCode = qspRand8[bCode ^ (unsigned char)uName[i]];
  var = qspVars + QSP_VARSSEEK * bCode;
  for (i = 0; i < QSP_VARSSEEK; ++i) {
    if (!var->Name) {
      if (isCreate)
        var->Name = uName;
      else
        free(uName);
      return var;
    }
    if (!qspStrsComp(var->Name, uName)) {
      free(uName);
      return var;
    }
    ++var;
  }
  free(uName);
  qspSetError(QSP_ERR_TOOMANYVARS);
  return nullptr;
}
Пример #7
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];
	}
}