Common::String getTextFromAnyVar(const Variable &from) { switch (from.varType) { case SVT_STRING: return from.varData.theString; case SVT_FASTARRAY: { Common::String builder = "FAST:"; Common::String builder2 = ""; Common::String grabText = ""; for (int i = 0; i < from.varData.fastArray->size; i++) { builder2 = builder + " "; grabText = getTextFromAnyVar(from.varData.fastArray->fastVariables[i]); builder.clear(); builder = builder2 + grabText; } return builder; } case SVT_STACK: { Common::String builder = "ARRAY:"; Common::String builder2 = ""; Common::String grabText = ""; VariableStack *stacky = from.varData.theStack->first; while (stacky) { builder2 = builder + " "; grabText = getTextFromAnyVar(stacky->thisVar); builder.clear(); builder = builder2 + grabText; stacky = stacky->next; } return builder; } case SVT_INT: { Common::String buff = Common::String::format("%i", from.varData.intValue); return buff; } case SVT_FILE: { return resourceNameFromNum(from.varData.intValue); } case SVT_OBJTYPE: { ObjectType *thisType = g_sludge->_objMan->findObjectType(from.varData.intValue); if (thisType) return thisType->screenName; break; } default: break; } return typeName[from.varType]; }
void addVariablesInSecond(Variable &var1, Variable &var2) { if (var1.varType == SVT_INT && var2.varType == SVT_INT) { var2.varData.intValue += var1.varData.intValue; } else { Common::String string1 = getTextFromAnyVar(var1); Common::String string2 = getTextFromAnyVar(var2); unlinkVar(var2); var2.varData.theString = createCString(string1 + string2); var2.varType = SVT_STRING; } }
void addVariablesInSecond (variable & var1, variable & var2) { if (var1.varType == SVT_INT && var2.varType == SVT_INT) { var2.varData.intValue += var1.varData.intValue; } else { char * string1 = getTextFromAnyVar (var1); char * string2 = getTextFromAnyVar (var2); unlinkVar (var2); var2.varData.theString = joinStrings (string1, string2); var2.varType = SVT_STRING; delete[] string1; delete[] string2; } }
bool copyStack (const variable & from, variable & to) { to.varType = SVT_STACK; to.varData.theStack = new stackHandler; if (! checkNew (to.varData.theStack)) return false; to.varData.theStack -> first = NULL; to.varData.theStack -> last = NULL; to.varData.theStack -> timesUsed = 1; variableStack * a = from.varData.theStack -> first; #if DEBUG_STACKINESS { char * str = getTextFromAnyVar(from); stackDebug((stackfp, "in copyStack, copying %s\n", str)); delete[] str; } #endif while (a) { addVarToStack (a -> thisVar, to.varData.theStack -> first); if (to.varData.theStack -> last == NULL) { #if DEBUG_STACKINESS stackDebug((stackfp, "LAST")); #endif to.varData.theStack -> last = to.varData.theStack -> first; } #if DEBUG_STACKINESS { char * str = getTextFromAnyVar(a->thisVar); stackDebug((stackfp, "\ta->thisVar = %s (%p)\n", str, to.varData.theStack->first)); delete[] str; } #endif a = a -> next; } #if DEBUG_STACKINESS { char * str = getTextFromAnyVar(to); stackDebug((stackfp, "finished copy, got %s\n", str)); delete[] str; stackDebug((stackfp, "first = %p\n", to.varData.theStack->first)); stackDebug((stackfp, "last = %p\n", to.varData.theStack->last)); } #endif return true; }
bool stackToFile(const Common::String &filename, const Variable &from) { #if 0 FILE *fp = fopen(filename, saveEncoding ? "wb" : "wt"); if (!fp) return fatal("Can't create file", filename); VariableStack *hereWeAre = from.varData.theStack -> first; encode1 = (byte)saveEncoding & 255; encode2 = (byte)(saveEncoding >> 8); if (saveEncoding) { fprintf(fp, "[Custom data (encoded)]\r\n"); writeStringEncoded(UTF8_CHECKER, fp); } else { fprintf(fp, "[Custom data (ASCII)]\n"); } while (hereWeAre) { if (saveEncoding) { switch (hereWeAre -> thisVar.varType) { case SVT_STRING: fputc(encode1, fp); writeStringEncoded(hereWeAre -> thisVar.varData.theString, fp); break; case SVT_INT: // Small enough to be stored as a char if (hereWeAre -> thisVar.varData.intValue >= 0 && hereWeAre -> thisVar.varData.intValue < 256) { fputc(2 ^ encode1, fp); fputc(hereWeAre -> thisVar.varData.intValue, fp); } else { fputc(1 ^ encode1, fp); fp->writeUint32LE(hereWeAre -> thisVar.varData.intValue); } break; default: fatal("Can't create an encoded custom data file containing anything other than numbers and strings", filename); fclose(fp); return false; } } else { char *makeSureItsText = getTextFromAnyVar(hereWeAre -> thisVar); if (makeSureItsText == NULL) break; fprintf(fp, "%s\n", makeSureItsText); delete makeSureItsText; } hereWeAre = hereWeAre -> next; } fclose(fp); #endif return true; }
char * getTextFromAnyVar (const variable & from) { switch (from.varType) { case SVT_STRING: return copyString (from.varData.theString); case SVT_FASTARRAY: { char * builder = copyString ("FAST:"); char * builder2; char * grabText; for (int i = 0; i < from.varData.fastArray -> size; i ++) { builder2 = joinStrings (builder, " "); if (! builder2) return NULL; delete builder; grabText = getTextFromAnyVar (from.varData.fastArray -> fastVariables[i]); builder = joinStrings (builder2, grabText); if (! builder) return NULL; delete grabText; grabText = NULL; delete builder2; builder2 = NULL; } return builder; } case SVT_STACK: { char * builder = copyString ("ARRAY:"); char * builder2; char * grabText; variableStack * stacky = from.varData.theStack -> first; while (stacky) { builder2 = joinStrings (builder, " "); if (! builder2) return NULL; delete builder; grabText = getTextFromAnyVar (stacky -> thisVar); builder = joinStrings (builder2, grabText); if (! builder) return NULL; delete grabText; grabText = NULL; delete builder2; builder2 = NULL; stacky = stacky -> next; } return builder; } case SVT_INT: { char * buff = new char[10]; if (! checkNew (buff)) return NULL; sprintf (buff, "%i", from.varData.intValue); return buff; } case SVT_FILE: { // char * buff = new char[15]; // if (! checkNew (buff)) return NULL; // sprintf (buff, "FILE %i", from.varData.intValue); return joinStrings ("", resourceNameFromNum (from.varData.intValue)); } /* case SVT_ANIM: { char * buff = new char[20]; if (! checkNew (buff)) return NULL; sprintf (buff, "%p", from.varData.animHandler); return buff; }*/ case SVT_OBJTYPE: { objectType * thisType = findObjectType (from.varData.intValue); if (thisType) return copyString (thisType -> screenName); } default: break; } return copyString (typeName[from.varType]); }