XMLGeneratorSchema.Mod 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. MODULE XMLGeneratorSchema; (** Stefan Walthert *)
  2. (** AUTHOR "swalthert"; PURPOSE "XCCS: XML Component Configuration Schema"; *)
  3. IMPORT
  4. Modules, KernelLog, XMLObjects, XML, XMLScanner, XMLParser, Files;
  5. PROCEDURE OpenGeneratorSchema*(CONST xgsName: ARRAY OF CHAR): XML.ElementRegistry;
  6. VAR xgsFile: Files.File; scanner: XMLScanner.Scanner; parser: XMLParser.Parser; doc: XML.Document;
  7. root: XML.Element; name, moduleName, procedureName, generator, elementName: XML.String; contents: XMLObjects.Enumerator; content: ANY;
  8. module: Modules.Module; generatorProc : XML.GeneratorProcedure;
  9. res: WORD; i: LONGINT; msg: ARRAY 1024 OF CHAR; er: XML.ElementRegistry;
  10. reader: Files.Reader;
  11. BEGIN
  12. xgsFile := Files.Old(xgsName);
  13. IF xgsFile = NIL THEN RETURN NIL END;
  14. NEW(reader, xgsFile, 0);
  15. NEW(scanner, reader); NEW(parser, scanner);
  16. doc := parser.Parse();
  17. root := doc.GetRoot();
  18. name := root.GetName();
  19. IF name^ = "generator-schema" THEN
  20. contents := root.GetContents();
  21. NEW(er);
  22. WHILE contents.HasMoreElements() DO
  23. content := contents.GetNext();
  24. IF content IS XML.Element THEN
  25. generator := content(XML.Element).GetAttributeValue("generator");
  26. IF generator # NIL THEN
  27. NEW(moduleName, LEN(generator));
  28. i := 0;
  29. WHILE (i < LEN(moduleName) - 1) & (generator[i] # '.') DO
  30. moduleName[i] := generator[i]; INC(i)
  31. END;
  32. moduleName[i] := 0X; INC(i);
  33. module := Modules.ThisModule(moduleName^, res, msg);
  34. IF module # NIL THEN
  35. NEW(procedureName, LEN(generator));
  36. res := i;
  37. WHILE i < LEN(procedureName) - 1 DO
  38. procedureName[i - res] := generator[i]; INC(i)
  39. END;
  40. procedureName[i - res] := 0X;
  41. elementName := content(XML.Element).GetName();
  42. GETPROCEDURE(moduleName^, procedureName^, generatorProc);
  43. IF (generatorProc # NIL) THEN
  44. er.RegisterElement(elementName^, generatorProc)
  45. ELSE
  46. KernelLog.Enter; KernelLog.String('Procedure "');
  47. KernelLog.String(name^); KernelLog.String('" not found'); KernelLog.Exit
  48. END
  49. ELSE
  50. KernelLog.Enter; KernelLog.String('Module "'); KernelLog.String(name^); KernelLog.String('" not found'); KernelLog.Exit
  51. END
  52. ELSE
  53. KernelLog.Enter; KernelLog.String("generator attribute not specified ('generator = "); KernelLog.Char(22X);
  54. KernelLog.String("Module.Generator"); KernelLog.Char(22X); KernelLog.String("')"); KernelLog.Exit
  55. END
  56. END
  57. END
  58. ELSE
  59. KernelLog.String("wrong document name: '"); KernelLog.String(name^); KernelLog.String("' instead of 'generator-schema'");
  60. END;
  61. RETURN er
  62. END OpenGeneratorSchema;
  63. END XMLGeneratorSchema.