diff --git a/examples/yaml_stats/Makefile b/examples/yaml_stats/Makefile new file mode 100644 index 0000000..bf54376 --- /dev/null +++ b/examples/yaml_stats/Makefile @@ -0,0 +1,5 @@ +main: + dmd -w -I../../ -L-L../../ -L-ldyaml yaml_stats.d + +clean: + rm yaml_stats myaml_stats.o diff --git a/examples/yaml_stats/small.yaml b/examples/yaml_stats/small.yaml new file mode 100644 index 0000000..4f5c0ea --- /dev/null +++ b/examples/yaml_stats/small.yaml @@ -0,0 +1,4 @@ +- 1 +- 2 : 'a' + 3 : 'b' +- 4 : [1.0, 2.1, 3.2] diff --git a/examples/yaml_stats/yaml_stats.d b/examples/yaml_stats/yaml_stats.d new file mode 100644 index 0000000..8e60c58 --- /dev/null +++ b/examples/yaml_stats/yaml_stats.d @@ -0,0 +1,104 @@ + +///Example D:YAML application that displays statistics about YAML documents. + +import std.stdio; +import std.string; +import yaml; + + +///Collects statistics about a YAML document and returns them as string. +string statistics(ref Node document) +{ + size_t nodes; + size_t scalars, sequences, mappings; + size_t seqItems, mapPairs; + + size_t[string] tags; + + void crawl(ref Node root) + { + ++nodes; + if((root.tag in tags) is null) + { + tags[root.tag] = 0; + } + ++tags[root.tag]; + + if(root.isScalar) + { + ++scalars; + return; + } + if(root.isSequence) + { + ++sequences; + seqItems += root.length; + foreach(ref Node node; root) + { + crawl(node); + } + return; + } + if(root.isMapping) + { + ++mappings; + mapPairs += root.length; + foreach(ref Node key, ref Node value; root) + { + crawl(key); + crawl(value); + } + return; + } + } + + crawl(document); + + string tagStats = "\nTag statistics:\n"; + foreach(tag, count; tags) + { + tagStats ~= format("\n", tag, " : ", count); + } + + return format( "\nNodes: ", nodes, + "\n\nScalars: ", scalars, + "\nSequences: ", sequences, + "\nMappings: ", mappings, + "\n\nAverage sequence length: ", cast(real)seqItems / sequences, + "\nAverage mapping length: ", cast(real)mapPairs / mappings, + "\n\n", tagStats); +} + +void main(string[] args) +{ + //Help message + if(args.length == 1) + { + writeln("Usage: yaml_stats [YAML_FILE ...]\n"); + writeln("Analyzes YAML files with provided filenames and displays statistics."); + return; + } + + //Print stats about every document in every file. + foreach(file; args[1 .. $]) + { + writeln("\nFile ", file); + writeln("------------------------------------------------------------"); + try + { + auto loader = Loader(file); + + size_t idx = 0; + foreach(ref document; loader) + { + writeln("\nDocument ", idx++); + writeln("----------------------------------------"); + writeln(statistics(document)); + } + } + catch(YAMLException e) + { + writeln("ERROR: ", e.msg); + } + } +}