123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- MODULE XMLGeneratorSchema; (** Stefan Walthert *)
- (** AUTHOR "swalthert"; PURPOSE "XCCS: XML Component Configuration Schema"; *)
- IMPORT
- Modules, KernelLog, XMLObjects, XML, XMLScanner, XMLParser, Files;
- PROCEDURE OpenGeneratorSchema*(CONST xgsName: ARRAY OF CHAR): XML.ElementRegistry;
- VAR xgsFile: Files.File; scanner: XMLScanner.Scanner; parser: XMLParser.Parser; doc: XML.Document;
- root: XML.Element; name, moduleName, procedureName, generator, elementName: XML.String; contents: XMLObjects.Enumerator; content: ANY;
- module: Modules.Module; generatorProc : XML.GeneratorProcedure;
- res: WORD; i: LONGINT; msg: ARRAY 1024 OF CHAR; er: XML.ElementRegistry;
- reader: Files.Reader;
- BEGIN
- xgsFile := Files.Old(xgsName);
- IF xgsFile = NIL THEN RETURN NIL END;
- NEW(reader, xgsFile, 0);
- NEW(scanner, reader); NEW(parser, scanner);
- doc := parser.Parse();
- root := doc.GetRoot();
- name := root.GetName();
- IF name^ = "generator-schema" THEN
- contents := root.GetContents();
- NEW(er);
- WHILE contents.HasMoreElements() DO
- content := contents.GetNext();
- IF content IS XML.Element THEN
- generator := content(XML.Element).GetAttributeValue("generator");
- IF generator # NIL THEN
- NEW(moduleName, LEN(generator));
- i := 0;
- WHILE (i < LEN(moduleName) - 1) & (generator[i] # '.') DO
- moduleName[i] := generator[i]; INC(i)
- END;
- moduleName[i] := 0X; INC(i);
- module := Modules.ThisModule(moduleName^, res, msg);
- IF module # NIL THEN
- NEW(procedureName, LEN(generator));
- res := i;
- WHILE i < LEN(procedureName) - 1 DO
- procedureName[i - res] := generator[i]; INC(i)
- END;
- procedureName[i - res] := 0X;
- elementName := content(XML.Element).GetName();
- GETPROCEDURE(moduleName^, procedureName^, generatorProc);
- IF (generatorProc # NIL) THEN
- er.RegisterElement(elementName^, generatorProc)
- ELSE
- KernelLog.Enter; KernelLog.String('Procedure "');
- KernelLog.String(name^); KernelLog.String('" not found'); KernelLog.Exit
- END
- ELSE
- KernelLog.Enter; KernelLog.String('Module "'); KernelLog.String(name^); KernelLog.String('" not found'); KernelLog.Exit
- END
- ELSE
- KernelLog.Enter; KernelLog.String("generator attribute not specified ('generator = "); KernelLog.Char(22X);
- KernelLog.String("Module.Generator"); KernelLog.Char(22X); KernelLog.String("')"); KernelLog.Exit
- END
- END
- END
- ELSE
- KernelLog.String("wrong document name: '"); KernelLog.String(name^); KernelLog.String("' instead of 'generator-schema'");
- END;
- RETURN er
- END OpenGeneratorSchema;
- END XMLGeneratorSchema.
|