openclonk/planet/System.ocg/Proplists.c

75 lines
2.1 KiB
C

/**
Proplists.c
General helper functions that create or work with proplists.
@author Guenther, Maikel, Marky
*/
/*
Adds the contents of one proplist to the other.
Usually you can do this by using a prototype, but
this is not possible when you receive a second proplist
from another function.
@par original This proplist will be expanded.
@par additional These are the additional contents.
@par no_overwrite By default the function overwrites
existing properties in the original proplist,
as it would happen if you derive from a prototype.
If this parameter is 'true' the function will report
an error instead of overwriting a parameter.
@return proplist The original proplist. This is in fact the same
proplist that was passed as an argument, the functions just
returns it for convenience.
*/
global func AddProperties(proplist original, proplist additional, bool no_overwrite)
{
if (original == nil)
{
FatalError("Cannot add properties to 'nil'");
}
if (additional == nil)
{
FatalError("Adding proplist 'nil' to another proplist makes no sense.");
}
for (var property in GetProperties(additional))
{
if (no_overwrite && (original[property] != nil)) // about to overwrite?
{
FatalError(Format("Cancelling overwrite of property '%s', original value %v, with new value %v", property, original[property], additional[property]));
}
else
{
original[property] = additional[property];
}
}
return original;
}
// Turns a property into a writable one. This for example useful if an object
// inherits a property from a definition which should not stay read-only.
global func MakePropertyWritable(name, obj)
{
obj = obj ?? this;
if (GetType(obj[name]) == C4V_Array)
{
obj[name] = obj[name][:];
var len = GetLength(obj[name]);
for (var i = 0; i < len; ++i)
MakePropertyWritable(i, obj[name]);
}
if (GetType(obj[name]) == C4V_PropList)
{
obj[name] = new obj[name] {};
var properties = GetProperties(obj[name]);
var len = GetLength(properties);
for (var i = 0; i < len; ++i)
MakePropertyWritable(properties[i], obj[name]);
}
return;
}