vim :set ts=8 :retab
---
generator/generator.ml | 500 ++++++++++++++++++++++++-------------------------
1 file changed, 250 insertions(+), 250 deletions(-)
diff --git a/generator/generator.ml b/generator/generator.ml
index 0aeb24e..40c1981 100755
--- a/generator/generator.ml
+++ b/generator/generator.ml
@@ -1069,10 +1069,10 @@ here. Often it's not documented at all.
pr "\n";
if List.mem AUnusedFlags (snd style) then
- pr "The flags parameter is unused. Always pass 0.\n\n";
+ pr "The flags parameter is unused. Always pass 0.\n\n";
if List.mem ASetValues (snd style) then
- pr "C<values> is an array of (key, value) pairs. There
+ pr "C<values> is an array of (key, value) pairs. There
should be C<nr_values> elements in this array.
Any existing values stored at the node are discarded, and their
@@ -1080,7 +1080,7 @@ C<hive_value_h> handles become invalid. Thus you can remove
all
values stored at C<node> by passing C<nr_values = 0>.\n\n";
if List.mem ASetValue (snd style) then
- pr "C<value> is a single (key, value) pair.
+ pr "C<value> is a single (key, value) pair.
Existing C<hive_value_h> handles become invalid.\n\n";
@@ -1791,8 +1791,8 @@ static void raise_closed (const char *) Noreturn;
| ASetValues ->
pr " int nrvalues = Wosize_val (valuesv);\n";
pr " hive_set_value *values = HiveSetValues_val (valuesv);\n"
- | ASetValue ->
- pr " hive_set_value *val = HiveSetValue_val (valv);\n"
+ | ASetValue ->
+ pr " hive_set_value *val = HiveSetValue_val (valv);\n"
) (snd style);
pr "\n";
@@ -1864,9 +1864,9 @@ static void raise_closed (const char *) Noreturn;
| ASetValues ->
pr " free (values);\n";
pr "\n";
- | ASetValue ->
- pr " free (val);\n";
- pr "\n";
+ | ASetValue ->
+ pr " free (val);\n";
+ pr "\n";
) (snd style);
(* Check for errors. *)
@@ -1903,7 +1903,7 @@ static void raise_closed (const char *) Noreturn;
pr " free (r);\n"
| RStringList ->
pr " rv = caml_copy_string_array ((const char **) r);\n";
- pr " int i;\n";
+ pr " int i;\n";
pr " for (i = 0; r[i] != NULL; ++i) free (r[i]);\n";
pr " free (r);\n"
| RLenType -> pr " rv = copy_type_len (len, t);\n"
@@ -2220,45 +2220,45 @@ sub open {
* Therefore we don't generate prototypes for these two calls:
*)
if fst style <> RErrDispose && List.hd (snd style) = AHive then (
- let longdesc = replace_str longdesc "C<hivex_" "C<" in
- pr "=item %s\n\n " name;
- generate_perl_prototype name style;
- pr "\n\n";
- pr "%s\n\n" longdesc;
-
- (match fst style with
- | RErr
- | RErrDispose
- | RHive
- | RString
- | RStringList
- | RLenType
- | RLenValue
- | RLenTypeVal
- | RInt32
- | RInt64 -> ()
- | RSize ->
+ let longdesc = replace_str longdesc "C<hivex_" "C<" in
+ pr "=item %s\n\n " name;
+ generate_perl_prototype name style;
+ pr "\n\n";
+ pr "%s\n\n" longdesc;
+
+ (match fst style with
+ | RErr
+ | RErrDispose
+ | RHive
+ | RString
+ | RStringList
+ | RLenType
+ | RLenValue
+ | RLenTypeVal
+ | RInt32
+ | RInt64 -> ()
+ | RSize ->
pr "\
This returns a size.\n\n"
- | RNode ->
- pr "\
+ | RNode ->
+ pr "\
This returns a node handle.\n\n"
- | RNodeNotFound ->
- pr "\
+ | RNodeNotFound ->
+ pr "\
This returns a node handle, or C<undef> if the node was not found.\n\n"
- | RNodeList ->
- pr "\
+ | RNodeList ->
+ pr "\
This returns a list of node handles.\n\n"
- | RValue ->
- pr "\
+ | RValue ->
+ pr "\
This returns a value handle.\n\n"
- | RValueList ->
- pr "\
+ | RValueList ->
+ pr "\
This returns a list of value handles.\n\n"
- );
+ );
- if List.mem ASetValues (snd style) then
- pr "C<@values> is an array of (keys, value) pairs.
+ if List.mem ASetValues (snd style) then
+ pr "C<@values> is an array of (keys, value) pairs.
Each element should be a hashref containing C<key>, C<t> (type)
and C<data>.
@@ -2524,172 +2524,172 @@ DESTROY (h)
fun (name, style, _, longdesc) ->
(* The close and open calls are handled specially above. *)
if fst style <> RErrDispose && List.hd (snd style) = AHive then (
- (match fst style with
- | RErr -> pr "void\n"
- | RErrDispose -> failwith "perl bindings cannot handle a call which disposes of
the handle"
- | RHive -> failwith "perl bindings cannot handle a call which returns a
handle"
- | RSize
- | RNode
- | RNodeNotFound
- | RValue
- | RString -> pr "SV *\n"
- | RNodeList
- | RValueList
- | RStringList
- | RLenType
- | RLenValue
- | RLenTypeVal -> pr "void\n"
- | RInt32 -> pr "SV *\n"
- | RInt64 -> pr "SV *\n"
- );
-
- (* Call and arguments. *)
- let perl_params =
- filter_map (function
- | AUnusedFlags -> None
- | arg -> Some (name_of_argt arg)) (snd style) in
-
- let c_params =
- List.map (function
- | AUnusedFlags -> "0"
- | ASetValues -> "values.nr_values, values.values"
- | arg -> name_of_argt arg) (snd style) in
-
- pr "%s (%s)\n" name (String.concat ", " perl_params);
- iteri (
+ (match fst style with
+ | RErr -> pr "void\n"
+ | RErrDispose -> failwith "perl bindings cannot handle a call which
disposes of the handle"
+ | RHive -> failwith "perl bindings cannot handle a call which returns a
handle"
+ | RSize
+ | RNode
+ | RNodeNotFound
+ | RValue
+ | RString -> pr "SV *\n"
+ | RNodeList
+ | RValueList
+ | RStringList
+ | RLenType
+ | RLenValue
+ | RLenTypeVal -> pr "void\n"
+ | RInt32 -> pr "SV *\n"
+ | RInt64 -> pr "SV *\n"
+ );
+
+ (* Call and arguments. *)
+ let perl_params =
+ filter_map (function
+ | AUnusedFlags -> None
+ | arg -> Some (name_of_argt arg)) (snd style) in
+
+ let c_params =
+ List.map (function
+ | AUnusedFlags -> "0"
+ | ASetValues -> "values.nr_values, values.values"
+ | arg -> name_of_argt arg) (snd style) in
+
+ pr "%s (%s)\n" name (String.concat ", " perl_params);
+ iteri (
fun i ->
function
| AHive ->
- pr " hive_h *h;\n"
- | ANode n
- | AValue n ->
- pr " int %s;\n" n
- | AString n ->
- pr " char *%s;\n" n
+ pr " hive_h *h;\n"
+ | ANode n
+ | AValue n ->
+ pr " int %s;\n" n
+ | AString n ->
+ pr " char *%s;\n" n
| AStringNullable n ->
- (*
http://www.perlmonks.org/?node_id=554277 *)
- pr " char *%s = SvOK(ST(%d)) ? SvPV_nolen(ST(%d)) : NULL;\n" n i i
- | AOpenFlags ->
- pr " int flags;\n"
- | AUnusedFlags -> ()
- | ASetValues ->
- pr " pl_set_values values = unpack_pl_set_values (ST(%d));\n" i
- | ASetValue ->
- pr " hive_set_value *val = unpack_set_value (ST(%d));\n" i
- ) (snd style);
-
- let free_args () =
- List.iter (
- function
- | ASetValues ->
- pr " free (values.values);\n"
- | ASetValue ->
- pr " free (val);\n"
- | AHive | ANode _ | AValue _ | AString _ | AStringNullable _
- | AOpenFlags | AUnusedFlags -> ()
- ) (snd style)
- in
-
- (* Code. *)
- (match fst style with
- | RErr ->
+ (*
http://www.perlmonks.org/?node_id=554277 *)
+ pr " char *%s = SvOK(ST(%d)) ? SvPV_nolen(ST(%d)) :
NULL;\n" n i i
+ | AOpenFlags ->
+ pr " int flags;\n"
+ | AUnusedFlags -> ()
+ | ASetValues ->
+ pr " pl_set_values values = unpack_pl_set_values
(ST(%d));\n" i
+ | ASetValue ->
+ pr " hive_set_value *val = unpack_set_value (ST(%d));\n"
i
+ ) (snd style);
+
+ let free_args () =
+ List.iter (
+ function
+ | ASetValues ->
+ pr " free (values.values);\n"
+ | ASetValue ->
+ pr " free (val);\n"
+ | AHive | ANode _ | AValue _ | AString _ | AStringNullable _
+ | AOpenFlags | AUnusedFlags -> ()
+ ) (snd style)
+ in
+
+ (* Code. *)
+ (match fst style with
+ | RErr ->
pr "PREINIT:\n";
pr " int r;\n";
pr " PPCODE:\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == -1)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
+ name;
- | RErrDispose -> assert false
- | RHive -> assert false
+ | RErrDispose -> assert false
+ | RHive -> assert false
- | RSize
- | RNode
- | RValue ->
+ | RSize
+ | RNode
+ | RValue ->
pr "PREINIT:\n";
- pr " /* hive_node_h = hive_value_h = size_t so we cheat\n";
- pr " here to simplify the generator */\n";
+ pr " /* hive_node_h = hive_value_h = size_t so we cheat\n";
+ pr " here to simplify the generator */\n";
pr " size_t r;\n";
pr " CODE:\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == 0)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
+ name;
pr " RETVAL = newSViv (r);\n";
pr " OUTPUT:\n";
pr " RETVAL\n"
- | RNodeNotFound ->
+ | RNodeNotFound ->
pr "PREINIT:\n";
pr " hive_node_h r;\n";
pr " CODE:\n";
- pr " errno = 0;\n";
+ pr " errno = 0;\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == 0 && errno != 0)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
- pr " if (r == 0)\n";
+ name;
+ pr " if (r == 0)\n";
pr " RETVAL = &PL_sv_undef;\n";
- pr " else\n";
+ pr " else\n";
pr " RETVAL = newSViv (r);\n";
pr " OUTPUT:\n";
pr " RETVAL\n"
- | RString ->
+ | RString ->
pr "PREINIT:\n";
pr " char *r;\n";
pr " CODE:\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == NULL)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
+ name;
if f_len_exists name then
pr " RETVAL = newSVpvn_utf8 (r, hivex_%s_len (%s), 1);\n"
name (String.concat ", " c_params)
else
pr " RETVAL = newSVpv (r, 0);\n";
- pr " free (r);\n";
+ pr " free (r);\n";
pr " OUTPUT:\n";
pr " RETVAL\n"
- | RNodeList
- | RValueList ->
+ | RNodeList
+ | RValueList ->
pr "PREINIT:\n";
pr " size_t *r;\n";
pr " int i, n;\n";
pr " PPCODE:\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == NULL)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
+ name;
pr " for (n = 0; r[n] != 0; ++n) /**/;\n";
pr " EXTEND (SP, n);\n";
pr " for (i = 0; i < n; ++i)\n";
pr " PUSHs (sv_2mortal (newSViv (r[i])));\n";
pr " free (r);\n";
- | RStringList ->
+ | RStringList ->
pr "PREINIT:\n";
pr " char **r;\n";
pr " int i, n;\n";
pr " PPCODE:\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == NULL)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
+ name;
pr " for (n = 0; r[n] != NULL; ++n) /**/;\n";
pr " EXTEND (SP, n);\n";
pr " for (i = 0; i < n; ++i) {\n";
@@ -2698,86 +2698,86 @@ DESTROY (h)
pr " }\n";
pr " free (r);\n";
- | RLenType ->
- pr "PREINIT:\n";
- pr " int r;\n";
- pr " size_t len;\n";
- pr " hive_type type;\n";
- pr " PPCODE:\n";
+ | RLenType ->
+ pr "PREINIT:\n";
+ pr " int r;\n";
+ pr " size_t len;\n";
+ pr " hive_type type;\n";
+ pr " PPCODE:\n";
pr " r = hivex_%s (%s, &type, &len);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == -1)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
- pr " EXTEND (SP, 2);\n";
- pr " PUSHs (sv_2mortal (newSViv (type)));\n";
- pr " PUSHs (sv_2mortal (newSViv (len)));\n";
-
- | RLenValue ->
- pr "PREINIT:\n";
- pr " hive_value_h r;\n";
- pr " size_t len;\n";
- pr " PPCODE:\n";
+ name;
+ pr " EXTEND (SP, 2);\n";
+ pr " PUSHs (sv_2mortal (newSViv (type)));\n";
+ pr " PUSHs (sv_2mortal (newSViv (len)));\n";
+
+ | RLenValue ->
+ pr "PREINIT:\n";
+ pr " hive_value_h r;\n";
+ pr " size_t len;\n";
+ pr " PPCODE:\n";
pr " errno = 0;\n";
pr " r = hivex_%s (%s, &len);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == 0 && errno)\n";
pr " croak (\"%%s: \", \"%s\", strerror
(errno));\n"
- name;
- pr " EXTEND (SP, 2);\n";
- pr " PUSHs (sv_2mortal (newSViv (len)));\n";
- pr " PUSHs (sv_2mortal (newSViv (r)));\n";
-
- | RLenTypeVal ->
- pr "PREINIT:\n";
- pr " char *r;\n";
- pr " size_t len;\n";
- pr " hive_type type;\n";
- pr " PPCODE:\n";
+ name;
+ pr " EXTEND (SP, 2);\n";
+ pr " PUSHs (sv_2mortal (newSViv (len)));\n";
+ pr " PUSHs (sv_2mortal (newSViv (r)));\n";
+
+ | RLenTypeVal ->
+ pr "PREINIT:\n";
+ pr " char *r;\n";
+ pr " size_t len;\n";
+ pr " hive_type type;\n";
+ pr " PPCODE:\n";
pr " r = hivex_%s (%s, &type, &len);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == NULL)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
- pr " EXTEND (SP, 2);\n";
- pr " PUSHs (sv_2mortal (newSViv (type)));\n";
- pr " PUSHs (sv_2mortal (newSVpvn (r, len)));\n";
- pr " free (r);\n";
+ name;
+ pr " EXTEND (SP, 2);\n";
+ pr " PUSHs (sv_2mortal (newSViv (type)));\n";
+ pr " PUSHs (sv_2mortal (newSVpvn (r, len)));\n";
+ pr " free (r);\n";
- | RInt32 ->
+ | RInt32 ->
pr "PREINIT:\n";
pr " int32_t r;\n";
pr " CODE:\n";
- pr " errno = 0;\n";
+ pr " errno = 0;\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == -1 && errno != 0)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
+ name;
pr " RETVAL = newSViv (r);\n";
pr " OUTPUT:\n";
pr " RETVAL\n"
- | RInt64 ->
+ | RInt64 ->
pr "PREINIT:\n";
pr " int64_t r;\n";
pr " CODE:\n";
- pr " errno = 0;\n";
+ pr " errno = 0;\n";
pr " r = hivex_%s (%s);\n"
- name (String.concat ", " c_params);
- free_args ();
+ name (String.concat ", " c_params);
+ free_args ();
pr " if (r == -1 && errno != 0)\n";
pr " croak (\"%%s: %%s\", \"%s\", strerror
(errno));\n"
- name;
+ name;
pr " RETVAL = my_newSVll (r);\n";
pr " OUTPUT:\n";
pr " RETVAL\n"
- );
- pr "\n"
+ );
+ pr "\n"
)
) functions
@@ -3055,10 +3055,10 @@ put_val_type (char *val, size_t len, hive_type t)
pr " PyObject *py_r;\n";
let error_code =
- match fst style with
+ match fst style with
| RErr -> pr " int r;\n"; "-1"
- | RErrDispose -> pr " int r;\n"; "-1"
- | RHive -> pr " hive_h *r;\n"; "NULL"
+ | RErrDispose -> pr " int r;\n"; "-1"
+ | RHive -> pr " hive_h *r;\n"; "NULL"
| RSize -> pr " size_t r;\n"; "0"
| RNode -> pr " hive_node_h r;\n"; "0"
| RNodeNotFound ->
@@ -3096,11 +3096,11 @@ put_val_type (char *val, size_t len, hive_type t)
(* Call and arguments. *)
let c_params =
- List.map (function
- | AUnusedFlags -> "0"
- | ASetValues -> "values.nr_values, values.values"
+ List.map (function
+ | AUnusedFlags -> "0"
+ | ASetValues -> "values.nr_values, values.values"
| ASetValue -> "&val"
- | arg -> name_of_argt arg) (snd style) in
+ | arg -> name_of_argt arg) (snd style) in
let c_params =
match fst style with
| RLenType | RLenTypeVal -> c_params @ ["&t";
"&len"]
@@ -3110,20 +3110,20 @@ put_val_type (char *val, size_t len, hive_type t)
List.iter (
function
| AHive ->
- pr " hive_h *h;\n";
+ pr " hive_h *h;\n";
pr " PyObject *py_h;\n"
- | ANode n
- | AValue n ->
- pr " long %s;\n" n
- | AString n
+ | ANode n
+ | AValue n ->
+ pr " long %s;\n" n
+ | AString n
| AStringNullable n ->
- pr " char *%s;\n" n
- | AOpenFlags ->
- pr " int flags;\n"
- | AUnusedFlags -> ()
- | ASetValues ->
- pr " py_set_values values;\n";
- pr " PyObject *py_values;\n"
+ pr " char *%s;\n" n
+ | AOpenFlags ->
+ pr " int flags;\n"
+ | AUnusedFlags -> ()
+ | ASetValues ->
+ pr " py_set_values values;\n";
+ pr " PyObject *py_values;\n"
| ASetValue ->
pr " hive_set_value val;\n";
pr " PyObject *py_val;\n";
@@ -3137,19 +3137,19 @@ put_val_type (char *val, size_t len, hive_type t)
List.iter (
function
| AHive ->
- pr "O"
- | ANode n
- | AValue n ->
- pr "l"
- | AString n ->
- pr "s"
+ pr "O"
+ | ANode n
+ | AValue n ->
+ pr "l"
+ | AString n ->
+ pr "s"
| AStringNullable n ->
- pr "z"
- | AOpenFlags ->
- pr "i"
- | AUnusedFlags -> ()
- | ASetValues
- | ASetValue ->
+ pr "z"
+ | AOpenFlags ->
+ pr "i"
+ | AUnusedFlags -> ()
+ | ASetValues
+ | ASetValue ->
pr "O"
) (snd style);
@@ -3158,19 +3158,19 @@ put_val_type (char *val, size_t len, hive_type t)
List.iter (
function
| AHive ->
- pr ", &py_h"
- | ANode n
- | AValue n ->
- pr ", &%s" n
- | AString n
+ pr ", &py_h"
+ | ANode n
+ | AValue n ->
+ pr ", &%s" n
+ | AString n
| AStringNullable n ->
- pr ", &%s" n
- | AOpenFlags ->
- pr ", &flags"
- | AUnusedFlags -> ()
- | ASetValues ->
+ pr ", &%s" n
+ | AOpenFlags ->
+ pr ", &flags"
+ | AUnusedFlags -> ()
+ | ASetValues ->
pr ", &py_values"
- | ASetValue ->
+ | ASetValue ->
pr ", &py_val"
) (snd style);
@@ -3182,13 +3182,13 @@ put_val_type (char *val, size_t len, hive_type t)
function
| AHive ->
pr " h = get_handle (py_h);\n"
- | ANode _
- | AValue _
- | AString _
+ | ANode _
+ | AValue _
+ | AString _
| AStringNullable _
- | AOpenFlags
- | AUnusedFlags -> ()
- | ASetValues ->
+ | AOpenFlags
+ | AUnusedFlags -> ()
+ | ASetValues ->
pr " if (get_values (py_values, &values) == -1)\n";
pr " return NULL;\n"
| ASetValue ->
@@ -3202,10 +3202,10 @@ put_val_type (char *val, size_t len, hive_type t)
(* Free up arguments. *)
List.iter (
function
- | AHive | ANode _ | AValue _
+ | AHive | ANode _ | AValue _
| AString _ | AStringNullable _
- | AOpenFlags | AUnusedFlags -> ()
- | ASetValues ->
+ | AOpenFlags | AUnusedFlags -> ()
+ | ASetValues ->
pr " free (values.values);\n";
pr " free (values.words);\n"
| ASetValue -> ()
@@ -3391,13 +3391,13 @@ class Hivex(object):
fun arg ->
pr ", ";
match arg with
- | AHive -> assert false
+ | AHive -> assert false
| ANode n | AValue n
| AString n | AStringNullable n -> pr "%s" n
- | AOpenFlags
+ | AOpenFlags
| AUnusedFlags -> assert false
- | ASetValues -> pr "values"
- | ASetValue -> pr "val"
+ | ASetValues -> pr "values"
+ | ASetValue -> pr "val"
) args;
pr ")\n";
pr "\n"
@@ -3434,9 +3434,9 @@ and generate_ruby_c () =
#define RSTRING_PTR(r) (RSTRING((r))->ptr)
#endif
-static VALUE m_hivex; /* hivex module */
-static VALUE c_hivex; /* hive_h handle */
-static VALUE e_Error; /* used for all errors */
+static VALUE m_hivex; /* hivex module */
+static VALUE c_hivex; /* hive_h handle */
+static VALUE e_Error; /* used for all errors */
static void
ruby_hivex_free (void *hvp)
@@ -3591,10 +3591,10 @@ get_values (VALUE valuesv, size_t *nr_values)
pr "\n";
let error_code =
- match ret with
+ match ret with
| RErr -> pr " int r;\n"; "-1"
- | RErrDispose -> pr " int r;\n"; "-1"
- | RHive -> pr " hive_h *r;\n"; "NULL"
+ | RErrDispose -> pr " int r;\n"; "-1"
+ | RHive -> pr " hive_h *r;\n"; "NULL"
| RSize -> pr " size_t r;\n"; "0"
| RNode -> pr " hive_node_h r;\n"; "0"
| RNodeNotFound ->
--
2.0.2