void qspMoveVar(QSPVar *dest, QSPVar *src) { dest->Values = src->Values; dest->ValsCount = src->ValsCount; dest->Indices = src->Indices; dest->IndsCount = src->IndsCount; dest->IndsBufSize = src->IndsBufSize; qspInitVarData(src); }
void qspClearVars(QSP_BOOL isFirst) { int i; QSPVar *var = qspVars; for (i = 0; i < QSP_VARSCOUNT; ++i) { if (isFirst) qspInitVarData(var); else { if (var->Name) free(var->Name); qspEmptyVar(var); } var->Name = nullptr; ++var; } }
void qspEmptyVar(QSPVar *var) { int count; if (var->Values) { count = var->ValsCount; while (--count >= 0) if (var->Values[count].Str) free(var->Values[count].Str); free(var->Values); } if (var->Indices) { count = var->IndsCount; while (--count >= 0) free(var->Indices[count].Str); free(var->Indices); } qspInitVarData(var); }
static void qspCopyVar(QSPVar *dest, QSPVar *src, int start, int count) { QSP_CHAR *str; int i, maxCount, newInd; if (start < 0) start = 0; maxCount = src->ValsCount - start; if (count <= 0 || maxCount <= 0) { qspInitVarData(dest); return; } if (count < maxCount) maxCount = count; dest->ValsCount = maxCount; dest->Values = (QSPVarValue *)malloc(maxCount * sizeof(QSPVarValue)); for (i = 0; i < maxCount; ++i) { dest->Values[i].Num = src->Values[i + start].Num; str = src->Values[i + start].Str; dest->Values[i].Str = (str ? qspGetNewText(str, -1) : 0); } dest->IndsBufSize = 0; dest->Indices = 0; count = 0; for (i = 0; i < src->IndsCount; ++i) { newInd = src->Indices[i].Index - start; if (newInd >= 0 && newInd < maxCount) { if (count >= dest->IndsBufSize) { dest->IndsBufSize = count + 16; dest->Indices = (QSPVarIndex *)realloc(dest->Indices, dest->IndsBufSize * sizeof(QSPVarIndex)); } dest->Indices[count].Index = newInd; dest->Indices[count].Str = qspGetNewText(src->Indices[i].Str, -1); ++count; } } dest->IndsCount = count; }