Simba Code:
program fileReader;
type
TFileReader = record
filePath, fileData:string;
end;
TFileObject = record
name, fields:string;
end;
TFileObjectArray = array of TFileObject;
TFileString = string;
function TFileReader.updateData():boolean;
var
fileNum:integer;
begin
fileNum := openFile(self.filePath, false);
if (fileNum > -1) then
begin
readFileString(fileNum, self.fileData, fileSize(fileNum));
result := true;
closeFile(fileNum);
end;
end;
function TFileReader.init(path:String):boolean;
var
fileNum:integer;
begin
self.filePath := path;
result := self.updateData();
end;
function TFileReader.fileExists():boolean;
var
fileNum:integer;
begin
fileNum := openFile(self.filePath, false);
result := (fileNum <> -1);
if (result) then
closeFile(fileNum);
end;
function TFileReader.getObject(objectName:string):TFileString;
begin
result := between('<objectName=' + objectName + '>', '</objectName>', self.fileData);
end;
function Lines(str: string): TStringArray;
var
p, h, i, x, o, m, l, y, z: Integer;
d: TStringArray;
begin
d := [#13#10, #13, #10];
h := High(d);
if ((h > -1) and (str <> '')) then
begin
o := 1;
SetLength(Result, Length(str));
repeat
l := 0;
for x := 0 to h do
begin
p := Pos(d[x], str);
if (p < 1) then
begin
z := High(d);
if ((x <= z) and (x > -1)) then
begin
for y := x to (z - 1) do
d[y] := d[(y + 1)];
SetLength(d, z);
end;
Dec(x);
Dec(h);
end else
if ((l = 0) or (p < l)) then
begin
m := x;
l := p;
end;
end;
if (l > 0) then
begin
Result[i] := Copy(str, 1, (l - 1));
Delete(str, 1, ((l + Length(d[m])) - 1));
Inc(i);
end else
Result[i] := Copy(str, 1, Length(str));
until (l = 0);
SetLength(Result, (i + 1));
end else
Result := [string(str)];
end;
function StartsWith(s, str: string): Boolean;
begin
if ((s <> '') and (str <> '')) then
Result := (s = Copy(str, 1, Length(s)))
else
Result := False;
end;
function TFileReader.getObjects():TStringArray;
var
lns:TstringArray;
i:integer;
begin
lns := lines(self.fileData);
for i := 0 to high(lns) do
if (lns[i] <> '') then
if StartsWith('<objectName=', trim(lns[i])) then
begin
setLength(result, length(result) + 1);
result[high(result)] := between('<objectName=', '>', lns[i]);
end;
end;
function string.firstLetter(s:string):boolean;
begin
if (length(self) > 0) then
if (self[1] = s) then
result := true;
end;
function TFileString.getObjectFields():TStringArray;
var
lns:TStringArray;
i:integer;
begin
lns := lines(self);
for i := 0 to high(lns) do
if (lns[i] <> '') then
if trim(lns[i]).firstLetter('<') then
begin
setLength(result, length(result) + 1);
result[high(result)] := between('<', '>', lns[i]);
end;
end;
function TFileString.getInteger():integer;
begin
try
result := StrToInt(self);
except
result := -1337;
end;
end;
function TFileString.getIntegerArray():TIntegerArray;
var
strArr:TStringArray;
strArrPtr: ^String;
i, len:integer;
begin
if (self = '') then
exit
else begin
self := Replace(self, ']', '', [rfReplaceAll]);
self := Replace(self, '[', '', [rfReplaceAll]);
strArr := explode(',', self);
len := length(strArr);
setLength(result, len);
strArrPtr := @strArr[0];
for i := 0 to (len - 1) do
result[i] := StrToInt((strArrPtr[i])^);
end;
end;
function TFileString.getFieldValue(fieldName:string):TFileString;
begin
result := between('<' + fieldName + '>', '</' + fieldName + '>', self);
end;
function TFileString.getString():string;
begin
result := self;
end;
function TFileString.getStringArray():TStringArray;
var
strArr:TStringArray;
strArrPtr: ^String;
i, len:integer;
begin
if (self = '') then
exit
else begin
self := Replace(self, ']', '', [rfReplaceAll]);
self := Replace(self, '[', '', [rfReplaceAll]);
strArr := explode('^', self);
len := length(strArr);
setLength(result, len);
strArrPtr := @strArr[0];
for i := 0 to (len - 1) do
result[i] := strArrPtr[i]^;
end;
end;
function TFileString.getExtended():Extended;
begin
end;
function TFileString.getExtendedArray():TExtendedArray;
var
strArr:TStringArray;
strArrPtr: ^String;
i, len:integer;
begin
if (self = '') then
exit
else begin
self := Replace(self, ']', '', [rfReplaceAll]);
self := Replace(self, '[', '', [rfReplaceAll]);
strArr := explode(',', self);
len := length(strArr);
setLength(result, len);
strArrPtr := @strArr[0];
for i := 0 to (len - 1) do
result[i] := StrToFloat((strArrPtr[i])^);
end;
end;
function TFileString.getVariant():Variant;
begin
end;
function TFileReader.getObjectFieldValue(obj:string):TFileString;
var
t:TFileString;
params:TStringArray;
begin
params := explode('.', obj);
if (length(params) = 2) then
begin
t := self.getObject(params[0]);
result := t.getFieldValue(params[1]);
end else
writeln(obj, ' are not valid parameters, OBJECTNAME.FIELDNAME');
end;
function TFileReader.createObject(objectName:string;Fields:TStringArray):boolean;
var
fileNum, i:integer;
begin
if (self.fileExists()) then
begin
fileNum := appendFile(self.filePath);
writeFileString(fileNum, #13#10);
writeFileString(fileNum, #13#10 + '<objectName=' + objectName + '>');
for i := 0 to high(Fields) do
writeFileString(fileNum, #13#10 + ' <' + Fields[i] + '>' + '</' + Fields[i] + '>');
writeFileString(fileNum, #13#10 + '</objectName>');
closeFile(fileNum);
result := true;
end;
end;
function TFileReader.createObject(objectName:string):boolean;overload;
begin
result := self.createObject(objectName, ['']);
end;
function TFileReader.changeFieldValue(objectName, fieldName, value:string):boolean;
var
i, k, index, fileNum:integer;
lns, lns2:TStringArray;
foundField:boolean;
begin
self.updateData();
lns := lines(self.fileData);
for i := 0 to high(lns) do
if (lns[i] <> '') then
if StartsWith('<objectName=' + objectName + '>', trim(lns[i])) then
begin
lns2 := lines(between('<objectName=' + objectName + '>', '</objectName>', self.fileData));
for k := 0 to high(lns2) do
begin
if startsWith('<' + fieldName + '>', trim(lns2[k])) then
begin
index := i + k;
foundField := true;
break(2);
end;
end;
end;
if (foundField) then
begin
for i := 0 to high(lns) do
if (i = index) then
lns[i] := '<' + fieldName + '>' + value + '</' + fieldName + '>';
fileNum := rewriteFile(self.filePath, false);
for i := 0 to high(lns) do
if (i = 0) then
writeFileString(fileNum, lns[i])
else
writeFileString(fileNum, #13#10 + lns[i]);
closeFile(fileNum);
result := true
end else
result := false;
end;
var
monsterProfiles:TFileReader;
clashClan:TFileReader;
begin
monsterProfiles.init('C:\Users\rj\Desktop\New Text Document.txt');
monsterProfiles.createObject('Fire Giant', ['color', 'uptext']);
monsterProfiles.changeFieldValue('Fire Giant', 'uptext', '[''ck Fire^k Fire'']');
writeln(monsterProfiles.getObjectFieldValue('Fire Giant.uptext').getStringArray());
end.
Code:
<objectName=Fire Giant>
<color>[3558815,3097206,1579815,3569078]</color>
<tol>[9,11,2,13]</tol>
<filter>40</filter>
<hue>[0.12, 0.16, 1.16, 0.44]</hue>
<sat>[0.77, 1.03, 0.73, 1.67]</sat>
<mod>[0.00, 0.00, 0.00, 0.00]</mod>
<uptext>['ck Fire^k Fire']</uptext>
</objectName>