On Saturday 16 July 2005 00:49, Kenneth Aafløy wrote:
> lørdag 16. juli 2005, 01:14, skrev Andrew de Quincey:
> > OK, I've been thinking about this. It makes it quite hard to do nicely
> > for the section oriented file formats. e.g. for multiplexes.conf:
>> [snip]
>> > When you're parsing the [m], you only know it ends when you hit the [s]
> > entry... this doesn't really fit nicely if you're passing it line by
> > line, and its not really feasible to go back to a line-oriented format
> > for these more complex files. So need to keep more complex state between
> > lines for these... something like:
> >
> > struct multiplex_parser {
> > int state;
> >
> > struct dvbcfg_multiplex* multiplex;
> > struct dvbcfg_service* service;
> > };
> >
> > int dvbcfg_multiplex_parse_line(char* line, struct multiplex_parser*
> > state);
> >
> > The return code will indicate what was just parsed. Its up to you to
> > supply/update/free suitable multiplex and source pointers - they could be
> > malloced(), they could be pointers to a local temporary variables..
> >
> > Unfortunately, parsing the entries will have to allocate temporary space
> > - e.g. for storing a list of dvbcfg_pid entries. Is this ok?
> >
> > I'll be adding a call to zap the contents of a multiplex structure so you
> > could either just let the parsing accumulate values in the multiplex
> > structure OR you could copy them out to some other place, and zap the
> > structure contents each time something is parsed.
> >
> > What do you think?
>> What if you don't think about the file format, but of the general
> structure: Don't mind the XML, it's only used to present the format.
>> <multiplexes ...>
> <multiplex ...>
> <service .../>
> ...
> </multiplex>
> <multiplex .../>
> ....
> </multiplexes>
>> You start with:
>> int dvbcfg_create_parser(struct dvbcfg_parser **);
>> Which allocates a new backend parser, then:
I'm not sure what is the backend and what is the frontend... I was calling the
bit that does the raw parsing the backend, and whatever uses that the
frontend... which may explain my confusion in the following:
> int dvbcfg_get_multiplexes(struct dvbcfg_parser *, struct dvb_multiplexes
> **);
> int dvbcfg_get_next_multiplex(struct dvbcfg_parser *, struct
> dvb_multiplex **);
> int dvbcfg_get_next_service(struct dvbcfg_parser *,
> struct dvb_service **);
I'm not totally sure where these fit in - are they the backend calls to parse
the raw file data?
> A -EOVERFLOW or NULL value in the ptr-ptr parameter says end of list.
> The backend can then choose to pre-parse the multiplexes in
> get_multiplexes, and only keep track of where it is via the parser context.
>> The parsing in the backend itself can be helped with the string parsers
> already present in dvbcfg, but it is actually free to store the data
> in any format it chooses.
I'm not sure how it is free if the above calls are the backend parsing
calls.... hmm, if they're not, sorry I am confused :)
One thing Felix suggested was not limiting how the data is retrieved - which
is why I had it reading the data line by line - so it could be up to the app
to get the data from "somewhere" (the "default" frontend implementation would
read it from a file on disk).