[Libguestfs] [PATCH] builder: proper consider subkeys in index files

Pino Toscano ptoscano at redhat.com
Tue Jan 21 18:04:37 UTC 2014


On Tuesday 21 January 2014 16:37:20 Richard W.M. Jones wrote:
> On Tue, Jan 21, 2014 at 05:18:27PM +0100, Pino Toscano wrote:
> > +      sv = caml_copy_string (fields->subkey ? fields->subkey : "");
> > 
> >        Store_field (v, 1, sv);
> 
> Heh, sure would be nice if this was an option type :-)
> 
> I believe the following should work:
> 
> (1) Change CAMLlocal4 (..) at the top of the function to:
> 
>   CAMLlocal5 (rv, v, sv, sv2, fv);
> 
> (2) Then the new code is:
> 
>   if (fields->subkey) {                      /* Some subkey */
>     sv2 = caml_copy_string (fields->subkey);
>     sv = caml_alloc (1, 0);
>     Store_field (sv, 0, sv2);
>   } else                                     /* None */
>     sv = Val_int (0);
>   Store_field (v, 1, sv);
> 
> Also you will need to make the corresponding adjustment to the field
> 
> type, ie. (string, string option, string) instead of this:
> > +and field = string * string * string    (* key + subkey + value *)

Indeed, they work that way. It seemed not totally clear for the 
documentations I've read.

> >      let entries =
> >      
> >        List.map (
> >        
> >          fun (n, fields) ->
> > 
> > +          let find_elem key subkey fields =
> > +            match List.filter (
> > +                fun (iterkey, itersubkey, itervalue) ->
> > +                  iterkey = key && itersubkey = subkey
> > +              ) fields with
> > +            | [] -> raise Not_found
> > +            | (_, _, value) :: _ -> value in
> > 
> >            let printable_name =
> > 
> > -            try Some (List.assoc "name" fields) with Not_found ->
> > None in
> > +            try Some (find_elem "name" "" fields) with
> > Not_found -> None in
> What you could do here, which is a bit nicer, is (earlier on):
> 
>   let fields = List.map (fun (k,sk,v) -> (k,sk),v) fields in
> 
> Delete the find_elem function and use instead:
> 
> -        try Some (List.assoc "name" fields) with Not_found -> None in
> +        try Some (List.assoc ("name",None) fields) with Not_found ->
> None in
> 
> etc. since List.assoc works for any key type, not just strings.

Ah OK.

-- 
Pino Toscano




More information about the Libguestfs mailing list