Oi, heres a little thing I whipped together before the loadini() thing was added, but I don't think that even has all the features as this.
This the script for my TIniFile which I use for things like my NPC Dialog system. Also for saving and loading mud objects.
Added comments to the script.
PHP Code:
// Loads an INI File into the object.
public function load(filename) {
// Declaring the temp variables
temp.file = 0;
temp.i = 0;
temp.key = 0;
temp.e = 0;
temp.var = 0;
temp.val = 0;
// Load all the lines from the file.
file.loadlines(filename);
// Stop the loading if the file has no lines.
if (file.size() < 1) {
return;
}
for (i = 0; i < file.size(); i ++) {
// If the line starts with a semi-colon, skip it. (For comments)
if (file[i].starts(";"))
continue;
// Checking if the line is an INI section header (key)
if (!file[i].starts("[") && !file[i].ends("]")) {
// Check to see if a section has been found, can't load variables without one.
if (key == null)
continue;
// Get the position of the equal sign on the line.
e = file[i].pos("=");
// Skip the line if it doesn't exist
if (e < 0)
continue;
// If the line starts with an equal sign, append to last variable loaded.
// This is good for long multi-line amounts of text.
if (e == 0 && var != null) {
val = file[i].substring(1, -1);
this.(@ key).(@ var) @= val;
}
// If the equal sign isn't at the beginning, set a variable in the right section
// <varname>=<value>
else {
var = file[i].substring(0, e);
val = file[i].substring(e+1, -1);
this.(@ key).(@ var) = val;
}
}
else {
// Set the INI section.
key = file[i].substring(1, file[i].length() - 2);
}
}
}
// Saves this object as an INI file
public function save(filename) {
// Declaring temp variables, and getting dynamic variables in the object
temp.output = 0;
temp.i = 0;
temp.e = 0;
temp.keys = this.getdynamicvarnames();
temp.vars = 0;
for (i = 0; i < keys.size(); i ++) {
// If the dynamic variable is actually a value, skip it
if (this.(@ keys[i]).type() != -1)
continue;
// Write the section header
output.add("[" @ keys[i] @ "]");
// Get the dynamic variables for the section
vars = this.(@ keys[i]).getdynamicvarnames();
for (e = 0; e < vars.size(); e ++) {
// Add a line for the variable if its not zero.
if (this.(@ keys[i]).(@ vars[e]) != null) {
output.add(vars[e] @ "=" @ this.(@ keys[i]).(@ vars[e]));
}
}
}
// write the lines
output.savelines(filename, 0);
}
// Clears all values for a certain INI section.
public function clearkey(keyname) {
temp.i = 0;
temp.vars = 0;
// Stop the function if its an actual object.
if (this.(@ keyname).type() != -1)
return;
vars = this.(@ keyname).getdynamicvarnames();
for (i = 0; i < vars.size(); i ++) {
this.(@ keyname).(@ vars[i]) = null;
}
}
// Copies variables from an INI section to an object (like object.loadvars())
public function copyvars(keyname, object) {
// Stop the function if 'object' isn't an actual object.
if (object.type() != 2)
return;
// Stop the function if this.keyname is an object.
if (this.(@ keyname).type() != -1)
return;
for (temp.i: this.(@ keyname).getdynamicvarnames()) {
object.(@ i) = this.(@ keyname).(@ i);
}
}
I like INI files because the text editor in RC color-codes them for you
Heres files that it works with:
PHP Code:
// A TMudObject
[items]
i0=gold,600,"0,",0,0
i1=sword,1,"0,",0,0
i2=longsword,1,"0,","name_pre,","Rusted,"
[object]
health=50
id=Inverness
mana=100
maxhealth=50
maxmana=100
type=player
version=3
weight=14400
[spells]
s0=flare
s1=fireball
PHP Code:
// Feature example
[section1]
var1=value
var2=Multi
= Line
= Text.
= Do not forget your spaces =P
[section2]
var3=value
;This is a comment
var4=3.14
If you haven't caught on yet, stuff can be read with inifileobject.sectionname.variable