+ if(type == functionDoc)
+ {
+ const char * name = RSearchString(function.name, "::", strlen(function.name), true, false);
+ if(name) name += 2; else name = function.name;
+ fnDoc = nsDoc.functions ? nsDoc.functions[name] : null;
+ if(!empty && !fnDoc)
+ {
+ if(!nsDoc.functions) nsDoc.functions = { };
+ nsDoc.functions[name] = fnDoc = { };
+ }
+ }
+ else if(type == methodDoc)
+ {
+ mdDoc = clDoc.methods ? clDoc.methods[method.name] : null;
+ if(!empty && !mdDoc)
+ {
+ if(!clDoc.methods && !empty) clDoc.methods = { };
+ clDoc.methods[method.name] = mdDoc = { };
+ }
+ }
+
+ if(!empty || mdDoc || fnDoc || (type == classDoc && clDoc) || (type == nameSpaceDoc && nsDoc))
+ {
+ switch(item)
+ {
+ case description:
+ if(type == methodDoc) { mdDoc.description = contents; contents = null; }
+ else if(type == functionDoc) { fnDoc.description = contents; contents = null; }
+ else if(type == classDoc) { clDoc.description = contents; contents = null; }
+ else { nsDoc.description = contents; contents = null; }
+ break;
+ case usage:
+ if(type == methodDoc) { mdDoc.usage = contents; contents = null; }
+ else if(type == functionDoc) { fnDoc.usage = contents; contents = null; }
+ else if(type == classDoc) { clDoc.usage = contents; contents = null; }
+ break;
+ case remarks:
+ if(type == methodDoc) { mdDoc.remarks = contents; contents = null; }
+ else if(type == functionDoc) { fnDoc.remarks = contents; contents = null; }
+ else if(type == classDoc) { clDoc.remarks = contents; contents = null; }
+ break;
+ case example:
+ if(type == methodDoc) { mdDoc.example = contents; contents = null; }
+ else if(type == functionDoc) { fnDoc.example = contents; contents = null; }
+ else if(type == classDoc) { clDoc.example = contents; contents = null; }
+ break;
+ case seeAlso:
+ if(type == methodDoc) { mdDoc.also = contents; contents = null; }
+ else if(type == functionDoc) { fnDoc.also = contents; contents = null; }
+ else if(type == classDoc) { clDoc.also = contents; contents = null; }
+ break;
+ case returnValue:
+ if(type == methodDoc) { mdDoc.returnValue = contents; contents = null; }
+ else if(type == functionDoc) { fnDoc.returnValue = contents; contents = null; }
+ break;
+ case enumerationValue:
+ {
+ ValueDoc itDoc = clDoc.values ? clDoc.values[((NamedLink)data).name] : null;
+ if(!empty || itDoc)
+ {
+ if(!empty && !itDoc)
+ {
+ if(!clDoc.values) clDoc.values = { };
+ clDoc.values[((NamedLink)data).name] = itDoc = { };
+ }
+ itDoc.description = contents; contents = null;
+ if(itDoc.isEmpty)
+ {
+ MapIterator<String, ValueDoc> it { map = clDoc.values };
+ if(it.Index(((NamedLink)data).name, false))
+ it.Remove();
+ delete itDoc;
+ }
+ }
+ break;
+ }
+ case definition:
+ {
+ DefineDoc itDoc = nsDoc.defines ? nsDoc.defines[((Definition)data).name] : null;
+ if(!empty || itDoc)
+ {
+ if(!empty && !itDoc)
+ {
+ if(!nsDoc.defines) nsDoc.defines = { };
+ nsDoc.defines[((Definition)data).name] = itDoc = { };
+ }
+ itDoc.description = contents; contents = null;
+ if(itDoc.isEmpty)
+ {
+ MapIterator<String, DefineDoc> it { map = nsDoc.defines };
+ if(it.Index(((Definition)data).name, false))
+ it.Remove();
+ delete itDoc;
+ }
+ }
+ break;
+ }
+ case conversion:
+ {
+ ConversionDoc itDoc;
+ const char * name = RSearchString(((Property)data).name, "::", strlen(((Property)data).name), true, false);
+ if(name) name += 2; else name = ((Property)data).name;
+ itDoc = clDoc.conversions ? clDoc.conversions[name] : null;
+ if(!empty || itDoc)
+ {
+ if(!empty && !itDoc)
+ {
+ if(!clDoc.conversions) clDoc.conversions = { };
+ clDoc.conversions[name] = itDoc = { };
+ }
+ itDoc.description = contents; contents = null;
+ if(itDoc.isEmpty)
+ {
+ MapIterator<String, ConversionDoc> it { map = clDoc.conversions };
+ if(it.Index(name, false))
+ it.Remove();
+ delete itDoc;
+ }
+ }
+ break;
+ }
+ case memberDescription:
+ {
+ FieldDoc itDoc = clDoc.fields ? clDoc.fields[((DataMember)data).name] : null;
+ if(!empty || itDoc)
+ {
+ if(!empty && !itDoc)
+ {
+ if(!clDoc.fields) clDoc.fields = { };
+ clDoc.fields[((DataMember)data).name] = itDoc = { };
+ }
+ itDoc.description = contents; contents = null;
+ if(itDoc.isEmpty)
+ {
+ MapIterator<String, FieldDoc> it { map = clDoc.fields };
+ if(it.Index(((DataMember)data).name, false))
+ it.Remove();
+ delete itDoc;
+ }
+ }
+ break;
+ }
+ case propertyDescription:
+ {
+ PropertyDoc itDoc = clDoc.properties ? clDoc.properties[((Property)data).name] : null;
+ if(!empty || itDoc)
+ {
+ if(!empty && !itDoc)
+ {
+ if(!clDoc.properties) clDoc.properties = { };
+ clDoc.properties[((Property)data).name] = itDoc = { };
+ }
+ itDoc.description = contents, contents = null;
+ if(itDoc.isEmpty)
+ {
+ MapIterator<String, PropertyDoc> it { map = clDoc.properties };
+ if(it.Index(((Property)data).name, false))
+ it.Remove();
+ delete itDoc;
+ }
+ }
+ break;
+ }
+ case parameter:
+ {
+ if(type == functionDoc || type == methodDoc)
+ {
+ Map<String, ParameterDoc> * parameters = (type == functionDoc) ? &fnDoc.parameters : &mdDoc.parameters;
+ char * name = ((Type)data).name;
+ ParameterDoc itDoc = *parameters ? (*parameters)[name] : null;
+ int position = 0;
+ Type prev = data;
+ while(prev) position++, prev = prev.prev;
+
+ if(!empty || itDoc)
+ {
+ if(!empty && !itDoc)
+ {
+ if(!*parameters) *parameters = { };
+ (*parameters)[name] = itDoc = { };
+ }
+ itDoc.description = contents; contents = null;
+ itDoc.position = position;
+ if(itDoc.isEmpty)
+ {
+ MapIterator<String, ParameterDoc> it { map = *parameters };
+ if(it.Index(((Type)data).name, false))
+ it.Remove();
+ delete itDoc;
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ if(type == functionDoc && fnDoc && fnDoc.isEmpty)
+ {
+ MapIterator<String, FunctionDoc> it { map = nsDoc.functions };
+ const char * name = RSearchString(function.name, "::", strlen(function.name), true, false);
+ if(name) name += 2; else name = function.name;
+ if(it.Index(name, false))
+ it.Remove();
+ delete fnDoc;
+ }
+ else if(type == methodDoc && mdDoc && mdDoc.isEmpty)
+ {
+ MapIterator<String, MethodDoc> it { map = clDoc.methods };
+ if(it.Index(method.name, false))
+ it.Remove();
+ delete mdDoc;
+ }
+ if(nsDoc)
+ {
+ if(nsDoc.functions && !nsDoc.functions.count) delete nsDoc.functions;
+ if(nsDoc.defines && !nsDoc.defines.count) delete nsDoc.defines;
+ }
+ if(clDoc)
+ {
+ if(clDoc && clDoc.conversions && !clDoc.conversions.count) delete clDoc.conversions;
+ if(clDoc && clDoc.properties && !clDoc.properties.count) delete clDoc.properties;
+ if(clDoc && clDoc.fields && !clDoc.fields.count) delete clDoc.fields;
+ if(clDoc && clDoc.methods && !clDoc.methods.count) delete clDoc.methods;
+ if(clDoc && clDoc.values && !clDoc.values.count) delete clDoc.values;
+ }
+
+ if(clDoc || nsDoc)
+ {
+ char dirPath[MAX_LOCATION];
+ StripLastDirectory(docPath, dirPath);
+ if(FileExists(docPath))
+ DeleteFile(docPath);
+ if(cl ? (clDoc && !clDoc.isEmpty) : (nsDoc && !nsDoc.isEmpty))