From: David T. <hd...@gm...> - 2021-08-13 21:22:21
|
Apologies in advance: couldn't see a way to reply to prior thread on the Sourceforge mailing list site so I'm repeating here. In 2011 (!), @wuttke and @simonov exchanged email about simpler ways of loading yaml files. *Re: [Yaml-core] can I load entire node trees with the C library libyaml ? <https://sourceforge.net/p/yaml/mailman/message/28445947/>* From: Kirill Simonov <xi@re...> - 2011-11-24 15:23:20 Hi Joachim, A high-level API for libyaml was planned, but never finished. I wasn't able to design a satisfactory high-level API for C and it appeared to be easier to expose the low-level interface and construct the document tree in a scripting language. On 11/17/2011 03:37 AM, Joachim Wuttke <j.wuttke@...> wrote: > So far, the best introduction to libyaml I found is > the tutorial by Andrew Poelstra at > http://wpsoftware.net/andrew/pages/libyaml.html <http://wpsoftware.net/andrew/pages/libyaml.html> > It explains two ways of parsing a YAML file, by > token or by event. Both are pretty low level; if > I understand correctly, parsing by event is just > a little less low level than parsing by token. > > In contrast, scripting languages offer a much > simpler way of loading YAML files, basically: > y = YAML.load( URL.open("http://yaml.org";) ) > print y["Projects"]["C/C++ Libraries"][0] > would yield "libyaml". > > Is it possible under C to load in a similar way > an entire YAML file into a node tree? > > There is a yaml_node_type_t, is there any example > how to use it? > > Thanks in advance, Joachim > I have a similar question, but in a C program context. I'm interested in parsing YAML into a tree of key:value nodes for subsequent retrieval and processing. For a prior project I used XML and libxml2 (http://xmlsoft.org/example.html), and while XML has some advantages, YAML is much more readable and (perhaps) easier to code. libxml2 has a number of tools, including an XML parser that yields a tree and functions to retrieve values from the tree given a key and starting node. Has anyone created such a package for YAML? If so, would you be willing to share it? If not, would there be any value to others (apparently not, if no one has done it). It seems that it might be relatively easy to generate the tree from the existing run-parse-tree-suite.c code (though I'm sufficiently new to YAML, and have a very limited use case, that that's probably a naive statement). Thanks for any help you can offer. David |
From: Oliver F. <o.b...@sw...> - 2021-08-15 08:53:03
|
Hi David, did you have a look at the available libraries for C and C++ listed at https://yaml.org/? Oliver Am 13.08.21 um 23:22 schrieb David Todd: > Apologies in advance: couldn't see a way to reply to prior thread on > the Sourceforge mailing list site so I'm repeating here. > > In 2011 (!), @wuttke and @simonov exchanged email about simpler ways > of loading yaml files. > > *Re: [Yaml-core] can I load entire node trees with the C library > libyaml ? <https://sourceforge.net/p/yaml/mailman/message/28445947/>* > From: Kirill Simonov <xi@re...> - 2011-11-24 15:23:20 > Hi Joachim, > > A high-level API for libyaml was planned, but never finished. I wasn't > able to design a satisfactory high-level API for C and it appeared to be > easier to expose the low-level interface and construct the document tree > in a scripting language. > > On 11/17/2011 03:37 AM, Joachim Wuttke<j.wuttke@...> wrote: > > So far, the best introduction to libyaml I found is > > the tutorial by Andrew Poelstra at > > http://wpsoftware.net/andrew/pages/libyaml.html <http://wpsoftware.net/andrew/pages/libyaml.html> > > It explains two ways of parsing a YAML file, by > > token or by event. Both are pretty low level; if > > I understand correctly, parsing by event is just > > a little less low level than parsing by token. > > > > In contrast, scripting languages offer a much > > simpler way of loading YAML files, basically: > > y = YAML.load( URL.open("http://yaml.org";) ) > > print y["Projects"]["C/C++ Libraries"][0] > > would yield "libyaml". > > > > Is it possible under C to load in a similar way > > an entire YAML file into a node tree? > > > > There is a yaml_node_type_t, is there any example > > how to use it? > > > > Thanks in advance, Joachim > > > > > I have a similar question, but in a C program context. I'm interested > in parsing YAML into a tree of key:value nodes for subsequent > retrieval and processing. > > For a prior project I used XML and libxml2 > (http://xmlsoft.org/example.html), and while XML has some advantages, > YAML is much more readable and (perhaps) easier to code. > > libxml2 has a number of tools, including an XML parser that yields a > tree and functions to retrieve values from the tree given a key and > starting node. > > Has anyone created such a package for YAML? If so, would you be > willing to share it? > > If not, would there be any value to others (apparently not, if no one > has done it). It seems that it might be relatively easy to generate > the tree from the existing run-parse-tree-suite.c code (though I'm > sufficiently new to YAML, and have a very limited use case, that > that's probably a naive statement). > > Thanks for any help you can offer. > > David > > > > > > _______________________________________________ > Yaml-core mailing list > Yam...@li... > https://lists.sourceforge.net/lists/listinfo/yaml-core -- N Oliver B. Fischer A Schönhauser Allee 64, 10437 Berlin, Deutschland/Germany P +49 30 44793251 M +49 178 7903538 E o.b...@sw... S oliver.b.fischer J oli...@ja... X http://xing.to/obf |
From: Felix K. <ya...@fl...> - 2021-08-16 19:19:36
|
Hi David, libyaml does contain such an API: https://github.com/yaml/libyaml/blob/master/include/yaml.h#L1457 This gives you a `yaml_document_t` with a root node accessible via `yaml_document_get_root_node`. The API is not well-documented but basically nodes can refer to sub-nodes via an `int` index and you use `yaml_document_get_node` to retrieve subnodes. mapping and sequence nodes store their children in a stack structure – you iterate them via ``` for (yaml_node_item_t *cur = node->data.sequence.start; cur != node->data.sequence.top; ++cur) { // ... } ``` Now if you load in a YAML that contains a mapping with scalar key/value pairs, your root node will be a mapping and the subnodes will be scalars. --- If you want a more convenient API, I did write this utility in the past: https://github.com/flyx/libyaml_constructor It is a code generator that reads in a C header containing type definitions and autogenerates code that loads YAML into those types (using libyaml). With this, you can define how your YAML structure must look via C types and some annotations in the given header. That tool was a part of a project which I abandoned, hence I never did a proper release. However it did work quite well for all I can remember. The compile-time dependency on libclang (to parse your C header) may be a bit of a hurdle. Cheers, Felix |
From: Ingy d. N. <in...@in...> - 2021-08-21 13:28:54
|
Greetings, This mailing list isn't used for much anymore, save high level announcements from time to time. A couple things: - Check out https://github.com/pantoniou/libfyaml/ which is more full featured and under active development. - Join https://matrix.to/#/#chat:yaml.io which is the new best way to engage with the YAML community. - #yaml IRC is still around on the libera.chat IRC network. Cheers, Ingy On Mon, Aug 16, 2021 at 12:19 PM Felix Krause <ya...@fl...> wrote: > Hi David, > > libyaml does contain such an API: > https://github.com/yaml/libyaml/blob/master/include/yaml.h#L1457 > > This gives you a yaml_document_t with a root node accessible via > yaml_document_get_root_node. The API is not well-documented but basically > nodes can refer to sub-nodes via an int index and you use > yaml_document_get_node to retrieve subnodes. > > mapping and sequence nodes store their children in a stack structure – you > iterate them via > > for (yaml_node_item_t *cur = node->data.sequence.start; cur != node->data.sequence.top; ++cur) { > // ... > } > > Now if you load in a YAML that contains a mapping with scalar key/value > pairs, your root node will be a mapping and the subnodes will be scalars. > ------------------------------ > > If you want a more convenient API, I did write this utility in the past: > https://github.com/flyx/libyaml_constructor > > It is a code generator that reads in a C header containing type > definitions and autogenerates code that loads YAML into those types (using > libyaml). With this, you can define how your YAML structure must look via C > types and some annotations in the given header. > > That tool was a part of a project which I abandoned, hence I never did a > proper release. However it did work quite well for all I can remember. The > compile-time dependency on libclang (to parse your C header) may be a bit > of a hurdle. > > Cheers, > Felix > _______________________________________________ > Yaml-core mailing list > Yam...@li... > https://lists.sourceforge.net/lists/listinfo/yaml-core > |
From: David T. <hd...@gm...> - 2021-08-21 20:39:45
|
Thanks for the information, Ingy! I should have realized that the list isn't used much just by the lack of traffic, but I didn't know where to look. And thanks to the pointer to libfyaml. I hadn't seen that package (or, at least hadn't noted it) in by browsing, but just looking at the excellent Readme.md, it looks like it's well documented and functional. I'll give it a try. David On 8/21/21 8:33 AM, Ingy dot Net wrote: > Greetings, > > This mailing list isn't used for much anymore, save high level > announcements from time to time. > > A couple things: > > * Check out https://github.com/pantoniou/libfyaml/ > <https://github.com/pantoniou/libfyaml/> which is more full > featured and under active development. > * Join https://matrix.to/#/#chat:yaml.io > <https://matrix.to/#/#chat:yaml.io> which is the new best way to > engage with the YAML community. > o #yaml IRC is still around on the libera.chat IRC network. > > Cheers, Ingy > > > On Mon, Aug 16, 2021 at 12:19 PM Felix Krause <ya...@fl... > <mailto:ya...@fl...>> wrote: > > Hi David, > > libyaml does contain such an API: > https://github.com/yaml/libyaml/blob/master/include/yaml.h#L1457 > <https://github.com/yaml/libyaml/blob/master/include/yaml.h#L1457> > > This gives you a |yaml_document_t| with a root node accessible via > |yaml_document_get_root_node|. The API is not well-documented but > basically nodes can refer to sub-nodes via an |int| index and you > use |yaml_document_get_node| to retrieve subnodes. > > mapping and sequence nodes store their children in a stack > structure – you iterate them via > > |for (yaml_node_item_t *cur = node->data.sequence.start; cur != > node->data.sequence.top; ++cur) { // ... } | > > Now if you load in a YAML that contains a mapping with scalar > key/value pairs, your root node will be a mapping and the subnodes > will be scalars. > > ------------------------------------------------------------------------ > > If you want a more convenient API, I did write this utility in the > past: https://github.com/flyx/libyaml_constructor > <https://github.com/flyx/libyaml_constructor> > > It is a code generator that reads in a C header containing type > definitions and autogenerates code that loads YAML into those > types (using libyaml). With this, you can define how your YAML > structure must look via C types and some annotations in the given > header. > > That tool was a part of a project which I abandoned, hence I never > did a proper release. However it did work quite well for all I can > remember. The compile-time dependency on libclang (to parse your C > header) may be a bit of a hurdle. > > Cheers, > Felix > > _______________________________________________ > Yaml-core mailing list > Yam...@li... > <mailto:Yam...@li...> > https://lists.sourceforge.net/lists/listinfo/yaml-core > <https://lists.sourceforge.net/lists/listinfo/yaml-core> > |