Beispiel #1
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;
}
Beispiel #2
0
QSP_CHAR *qspStrPos(QSP_CHAR *txt, QSP_CHAR *str, QSP_BOOL isIsolated)
{
	QSP_BOOL isLastDelim;
	int strLen, c1, c2, c3;
	QSP_CHAR quot, *pos = qspStrStr(txt, str);
	if (!pos) return 0;
	if (!(isIsolated || qspStrPBrk(txt, QSP_QUOTS QSP_LQUOT QSP_LRBRACK QSP_LSBRACK))) return pos;
	strLen = qspStrLen(str);
	pos = qspStrEnd(txt) - strLen + 1;
	c1 = c2 = c3 = 0;
	isLastDelim = QSP_TRUE;
	while (txt < pos)
	{
		if (qspIsInList(QSP_QUOTS, *txt))
		{
			quot = *txt;
			while (++txt < pos)
				if (*txt == quot && *(++txt) != quot) break;
			if (txt >= pos) return 0;
			isLastDelim = QSP_TRUE;
		}
		if (*txt == QSP_LRBRACK[0])
			++c1;
		else if (*txt == QSP_RRBRACK[0])
		{
			if (c1) --c1;
		}
		else if (*txt == QSP_LSBRACK[0])
			++c2;
		else if (*txt == QSP_RSBRACK[0])
		{
			if (c2) --c2;
		}
		else if (*txt == QSP_LQUOT[0])
			++c3;
		else if (*txt == QSP_RQUOT[0])
		{
			if (c3) --c3;
		}
		if (!(c1 || c2 || c3))
		{
			if (isIsolated)
			{
				if (qspIsInList(QSP_DELIMS, *txt))
					isLastDelim = QSP_TRUE;
				else if (isLastDelim)
				{
					if (qspIsInListEOL(QSP_DELIMS, txt[strLen]) && !qspStrsNComp(txt, str, strLen)) return txt;
					isLastDelim = QSP_FALSE;
				}
			}
			else if (!qspStrsNComp(txt, str, strLen))
				return txt;
		}
		++txt;
	}
	return 0;
}