Exemple #1
0
static void qspSetVar(QSP_CHAR *name, QSPVariant *val, QSP_CHAR op) {
  QSPVariant oldVal;
  QSPVar *var;
  int index;
  if (!(var = qspGetVarData(name, QSP_TRUE, &index)))
    return;
  if (op == QSP_EQUAL[0]) {
    if (qspConvertVariantTo(val, *name == QSP_STRCHAR[0])) {
      qspSetError(QSP_ERR_TYPEMISMATCH);
      return;
    }
    qspSetVarValueByReference(var, index, val);
  } else if (op == QSP_ADD[0]) {
    oldVal = qspGetVarValueByReference(var, index, *name == QSP_STRCHAR[0]);
    if (oldVal.IsStr && val->IsStr)
      QSP_STR(oldVal) = qspGetAddText(QSP_STR(oldVal), QSP_PSTR(val), -1, -1);
    else if (qspIsCanConvertToNum(&oldVal) && qspIsCanConvertToNum(val)) {
      qspConvertVariantTo(&oldVal, QSP_FALSE);
      qspConvertVariantTo(val, QSP_FALSE);
      QSP_NUM(oldVal) += QSP_PNUM(val);
      qspConvertVariantTo(&oldVal, *name == QSP_STRCHAR[0]);
    } else {
      if (!oldVal.IsStr) {
        qspSetError(QSP_ERR_TYPEMISMATCH);
        return;
      }
      qspConvertVariantTo(val, QSP_TRUE);
      QSP_STR(oldVal) = qspGetAddText(QSP_STR(oldVal), QSP_PSTR(val), -1, -1);
    }
    qspSetVarValueByReference(var, index, &oldVal);
    if (oldVal.IsStr)
      free(QSP_STR(oldVal));
  } else if (qspIsInList(QSP_SUB QSP_DIV QSP_MUL, op)) {
    if (qspConvertVariantTo(val, QSP_FALSE)) {
      qspSetError(QSP_ERR_TYPEMISMATCH);
      return;
    }
    oldVal = qspGetVarValueByReference(var, index, *name == QSP_STRCHAR[0]);
    if (qspConvertVariantTo(&oldVal, QSP_FALSE)) {
      qspSetError(QSP_ERR_TYPEMISMATCH);
      free(QSP_STR(oldVal));
      return;
    }
    if (op == QSP_SUB[0])
      QSP_NUM(oldVal) -= QSP_PNUM(val);
    else if (op == QSP_DIV[0]) {
      if (!QSP_PNUM(val)) {
        qspSetError(QSP_ERR_DIVBYZERO);
        return;
      }
      QSP_NUM(oldVal) /= QSP_PNUM(val);
    } else
      QSP_NUM(oldVal) *= QSP_PNUM(val);
    qspConvertVariantTo(&oldVal, *name == QSP_STRCHAR[0]);
    qspSetVarValueByReference(var, index, &oldVal);
    if (oldVal.IsStr)
      free(QSP_STR(oldVal));
  }
}
Exemple #2
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);
}
Exemple #3
0
QSP_CHAR *qspReplaceText(QSP_CHAR *txt, QSP_CHAR *searchTxt, QSP_CHAR *repTxt)
{
	int txtLen, oldTxtLen, bufSize, searchLen, repLen, len;
	QSP_CHAR *newTxt, *pos = qspStrStr(txt, searchTxt);
	if (!pos) return qspGetNewText(txt, -1);
	bufSize = 256;
	txtLen = oldTxtLen = 0;
	searchLen = qspStrLen(searchTxt);
	repLen = qspStrLen(repTxt);
	newTxt = (QSP_CHAR *)malloc(bufSize * sizeof(QSP_CHAR));
	do
	{
		len = (int)(pos - txt);
		if ((txtLen += len + repLen) >= bufSize)
		{
			bufSize = txtLen + 128;
			newTxt = (QSP_CHAR *)realloc(newTxt, bufSize * sizeof(QSP_CHAR));
		}
		qspStrNCopy(newTxt + oldTxtLen, txt, len);
		qspStrCopy(newTxt + oldTxtLen + len, repTxt);
		oldTxtLen = txtLen;
		txt = pos + searchLen;
		pos = qspStrStr(txt, searchTxt);
	} while (pos);
	return qspGetAddText(newTxt, txt, txtLen, -1);
}
static void qspPlayFile(QSP_CHAR *s, int volume, QSP_BOOL isAddToPlayList)
{
	int len;
	QSP_CHAR buf[4], *file;
	if (!qspIsAnyString(s)) return;
	if (volume < 0)
		volume = 0;
	else if (volume > 100)
		volume = 100;
	file = qspGetAbsFromRelPath(s);
	qspCallPlayFile(file, volume);
	free(file);
	if (isAddToPlayList)
	{
		if (qspPLFilesCount == QSP_MAXPLFILES)
		{
			qspRefreshPlayList();
			if (qspPLFilesCount == QSP_MAXPLFILES) return;
		}
		len = qspAddText(&file, s, 0, -1, QSP_TRUE);
		if (volume != 100)
		{
			len = qspAddText(&file, QSP_PLVOLUMEDELIM, len, 1, QSP_FALSE);
			file = qspGetAddText(file, qspNumToStr(buf, volume), len, -1);
		}
		qspPLFiles[qspPLFilesCount++] = file;
	}
}
Exemple #5
0
void qspSetVarValueByReference(QSPVar *var, int ind, QSPVariant *val) {
  int count, oldCount = var->ValsCount;
  if (ind >= oldCount) {
    count = var->ValsCount = ind + 1;
    var->Values =
        (QSPVarValue *)realloc(var->Values, count * sizeof(QSPVarValue));
    while (oldCount < count) {
      var->Values[oldCount].Num = 0;
      var->Values[oldCount].Str = nullptr;
      ++oldCount;
    }
  }
  if (ind >= 0) {
    if (val->IsStr)
      var->Values[ind].Str =
          qspGetAddText(var->Values[ind].Str, QSP_PSTR(val), 0, -1);
    else
      var->Values[ind].Num = QSP_PNUM(val);
  }
}