libucl.3 (6cec9cad762b6476313fb1f8e931a1647822db6b) libucl.3 (3dcf5eb70598c88befd62f61f81e283e568ec519)
1.TH LIBUCL 5 "March 20, 2014" "Libucl manual"
1.TH "LIBUCL" "3" "July 26, 2014" "Libucl manual" ""
2.SH NAME
3.PP
4\f[B]ucl_parser_new\f[], \f[B]ucl_parser_register_macro\f[],
5\f[B]ucl_parser_register_variable\f[], \f[B]ucl_parser_add_chunk\f[],
6\f[B]ucl_parser_add_string\f[], \f[B]ucl_parser_add_file\f[],
7\f[B]ucl_parser_get_object\f[], \f[B]ucl_parser_get_error\f[],
8\f[B]ucl_parser_free\f[], \f[B]ucl_pubkey_add\f[],
9\f[B]ucl_parser_set_filevars\f[] \- universal configuration library

--- 17 unchanged lines hidden (view full) ---

27for instance, it is impossible to parse a part of document and therefore
28it is impossible to use \f[C]libucl\f[] as a streaming parser.
29In future, this limitation can be removed.
30.SS Emitting functions
31.PP
32Convert \f[C]ucl\f[] objects to some textual or binary representation.
33Currently, libucl supports the following exports:
34.IP \[bu] 2
2.SH NAME
3.PP
4\f[B]ucl_parser_new\f[], \f[B]ucl_parser_register_macro\f[],
5\f[B]ucl_parser_register_variable\f[], \f[B]ucl_parser_add_chunk\f[],
6\f[B]ucl_parser_add_string\f[], \f[B]ucl_parser_add_file\f[],
7\f[B]ucl_parser_get_object\f[], \f[B]ucl_parser_get_error\f[],
8\f[B]ucl_parser_free\f[], \f[B]ucl_pubkey_add\f[],
9\f[B]ucl_parser_set_filevars\f[] \- universal configuration library

--- 17 unchanged lines hidden (view full) ---

27for instance, it is impossible to parse a part of document and therefore
28it is impossible to use \f[C]libucl\f[] as a streaming parser.
29In future, this limitation can be removed.
30.SS Emitting functions
31.PP
32Convert \f[C]ucl\f[] objects to some textual or binary representation.
33Currently, libucl supports the following exports:
34.IP \[bu] 2
35\f[C]JSON\f[] \- valid json format (can possibly loose some original
35\f[C]JSON\f[] \- valid json format (can possibly lose some original
36data, such as implicit arrays)
37.IP \[bu] 2
36data, such as implicit arrays)
37.IP \[bu] 2
38\f[C]Config\f[] \- human\-readable configuration format (losseless)
38\f[C]Config\f[] \- human\-readable configuration format (lossless)
39.IP \[bu] 2
40\f[C]YAML\f[] \- embedded yaml format (has the same limitations as
41\f[C]json\f[] output)
42.SS Conversion functions
43.PP
44Help to convert \f[C]ucl\f[] objects to C types.
45These functions are used to convert \f[C]ucl_object_t\f[] to C primitive
46types, such as numbers, strings or boolean values.
47.SS Generation functions
48.PP
39.IP \[bu] 2
40\f[C]YAML\f[] \- embedded yaml format (has the same limitations as
41\f[C]json\f[] output)
42.SS Conversion functions
43.PP
44Help to convert \f[C]ucl\f[] objects to C types.
45These functions are used to convert \f[C]ucl_object_t\f[] to C primitive
46types, such as numbers, strings or boolean values.
47.SS Generation functions
48.PP
49Allow creating of \f[C]ucl\f[] objects from C types and creating of
49Allow creation of \f[C]ucl\f[] objects from C types and creating of
50complex \f[C]ucl\f[] objects, such as hashes or arrays from primitive
51\f[C]ucl\f[] objects, such as numbers or strings.
52.SS Iteration functions
53.PP
54Iterate over \f[C]ucl\f[] complex objects or over a chain of values, for
55example when a key in an object has multiple values (that can be treated
56as implicit array or implicit consolidation).
57.SS Validation functions

--- 112 unchanged lines hidden (view full) ---

170bool\ ucl_parser_add_file\ (struct\ ucl_parser\ *parser,\
171\ \ \ \ const\ char\ *filename);
172\f[]
173.fi
174.PP
175Load file \f[C]filename\f[] and parse it with the specified
176\f[C]parser\f[].
177This function uses \f[C]mmap\f[] call to load file, therefore, it should
50complex \f[C]ucl\f[] objects, such as hashes or arrays from primitive
51\f[C]ucl\f[] objects, such as numbers or strings.
52.SS Iteration functions
53.PP
54Iterate over \f[C]ucl\f[] complex objects or over a chain of values, for
55example when a key in an object has multiple values (that can be treated
56as implicit array or implicit consolidation).
57.SS Validation functions

--- 112 unchanged lines hidden (view full) ---

170bool\ ucl_parser_add_file\ (struct\ ucl_parser\ *parser,\
171\ \ \ \ const\ char\ *filename);
172\f[]
173.fi
174.PP
175Load file \f[C]filename\f[] and parse it with the specified
176\f[C]parser\f[].
177This function uses \f[C]mmap\f[] call to load file, therefore, it should
178not be \f[C]shrinked\f[] during parsing.
178not be \f[C]shrunk\f[] during parsing.
179Otherwise, \f[C]libucl\f[] can cause memory corruption and terminate the
180calling application.
181This function is also used by the internal handler of \f[C]include\f[]
182macro, hence, this macro has the same limitation.
183.SS ucl_parser_get_object
184.IP
185.nf
186\f[C]

--- 98 unchanged lines hidden (view full) ---

285parser\ =\ ucl_parser_new\ (0);
286while\ (!feof\ (in)\ &&\ r\ <\ (int)sizeof\ (inbuf))\ {
287\ \ \ \ r\ +=\ fread\ (inbuf\ +\ r,\ 1,\ sizeof\ (inbuf)\ \-\ r,\ in);
288}
289ucl_parser_add_chunk\ (parser,\ inbuf,\ r);
290fclose\ (in);
291
292if\ (ucl_parser_get_error\ (parser))\ {
179Otherwise, \f[C]libucl\f[] can cause memory corruption and terminate the
180calling application.
181This function is also used by the internal handler of \f[C]include\f[]
182macro, hence, this macro has the same limitation.
183.SS ucl_parser_get_object
184.IP
185.nf
186\f[C]

--- 98 unchanged lines hidden (view full) ---

285parser\ =\ ucl_parser_new\ (0);
286while\ (!feof\ (in)\ &&\ r\ <\ (int)sizeof\ (inbuf))\ {
287\ \ \ \ r\ +=\ fread\ (inbuf\ +\ r,\ 1,\ sizeof\ (inbuf)\ \-\ r,\ in);
288}
289ucl_parser_add_chunk\ (parser,\ inbuf,\ r);
290fclose\ (in);
291
292if\ (ucl_parser_get_error\ (parser))\ {
293\ \ \ \ printf\ ("Error\ occured:\ %s\\n",\ ucl_parser_get_error\ (parser));
293\ \ \ \ printf\ ("Error\ occurred:\ %s\\n",\ ucl_parser_get_error\ (parser));
294\ \ \ \ ret\ =\ 1;
295}
296else\ {
297\ \ \ \ obj\ =\ ucl_parser_get_object\ (parser);
298}
299
300if\ (parser\ !=\ NULL)\ {
301\ \ \ \ ucl_parser_free\ (parser);

--- 16 unchanged lines hidden (view full) ---

318without spaces
319.IP \[bu] 2
320formatted json: \f[C]UCL_EMIT_JSON\f[] \- pretty formatted JSON with
321newlines and spaces
322.IP \[bu] 2
323compact yaml: \f[C]UCL_EMIT_YAML\f[] \- compact YAML output
324.PP
325Moreover, libucl API allows to select a custom set of emitting functions
294\ \ \ \ ret\ =\ 1;
295}
296else\ {
297\ \ \ \ obj\ =\ ucl_parser_get_object\ (parser);
298}
299
300if\ (parser\ !=\ NULL)\ {
301\ \ \ \ ucl_parser_free\ (parser);

--- 16 unchanged lines hidden (view full) ---

318without spaces
319.IP \[bu] 2
320formatted json: \f[C]UCL_EMIT_JSON\f[] \- pretty formatted JSON with
321newlines and spaces
322.IP \[bu] 2
323compact yaml: \f[C]UCL_EMIT_YAML\f[] \- compact YAML output
324.PP
325Moreover, libucl API allows to select a custom set of emitting functions
326allowing efficent and zero\-copy output of libucl objects.
326allowing efficient and zero\-copy output of libucl objects.
327Libucl uses the following structure to support this feature:
328.IP
329.nf
330\f[C]
331struct\ ucl_emitter_functions\ {
332\ \ \ \ /**\ Append\ a\ single\ character\ */
333\ \ \ \ int\ (*ucl_emitter_append_character)\ (unsigned\ char\ c,\ size_t\ nchars,\ void\ *ud);
334\ \ \ \ /**\ Append\ a\ string\ of\ a\ specified\ length\ */

--- 50 unchanged lines hidden (view full) ---

385This function is similar to the previous with the exception that it
386accepts the additional argument \f[C]emitter\f[] that defines the
387concrete set of output functions.
388This emit function could be useful for custom structures or streams
389emitters (including C++ ones, for example).
390.SH CONVERSION FUNCTIONS
391.PP
392Conversion functions are used to convert UCL objects to primitive types,
327Libucl uses the following structure to support this feature:
328.IP
329.nf
330\f[C]
331struct\ ucl_emitter_functions\ {
332\ \ \ \ /**\ Append\ a\ single\ character\ */
333\ \ \ \ int\ (*ucl_emitter_append_character)\ (unsigned\ char\ c,\ size_t\ nchars,\ void\ *ud);
334\ \ \ \ /**\ Append\ a\ string\ of\ a\ specified\ length\ */

--- 50 unchanged lines hidden (view full) ---

385This function is similar to the previous with the exception that it
386accepts the additional argument \f[C]emitter\f[] that defines the
387concrete set of output functions.
388This emit function could be useful for custom structures or streams
389emitters (including C++ ones, for example).
390.SH CONVERSION FUNCTIONS
391.PP
392Conversion functions are used to convert UCL objects to primitive types,
393such as strings, numbers or boolean values.
393such as strings, numbers, or boolean values.
394There are two types of conversion functions:
395.IP \[bu] 2
396safe: try to convert an ucl object to a primitive type and fail if such
397a conversion is not possible
398.IP \[bu] 2
399unsafe: return primitive type without additional checks, if the object
400cannot be converted then some reasonable default is returned (NULL for
401strings and 0 for numbers)
402.PP
403Also there is a single \f[C]ucl_object_tostring_forced\f[] function that
404converts any UCL object (including compound types \- arrays and objects)
405to a string representation.
394There are two types of conversion functions:
395.IP \[bu] 2
396safe: try to convert an ucl object to a primitive type and fail if such
397a conversion is not possible
398.IP \[bu] 2
399unsafe: return primitive type without additional checks, if the object
400cannot be converted then some reasonable default is returned (NULL for
401strings and 0 for numbers)
402.PP
403Also there is a single \f[C]ucl_object_tostring_forced\f[] function that
404converts any UCL object (including compound types \- arrays and objects)
405to a string representation.
406For compound and numeric types this function performs emitting to a
407compact json format actually.
406For objects, arrays, booleans and numeric types this function performs
407emitting to a compact json format actually.
408.PP
409Here is a list of all conversion functions:
410.IP \[bu] 2
411\f[C]ucl_object_toint\f[] \- returns \f[C]int64_t\f[] of UCL object
412.IP \[bu] 2
413\f[C]ucl_object_todouble\f[] \- returns \f[C]double\f[] of UCL object
414.IP \[bu] 2
415\f[C]ucl_object_toboolean\f[] \- returns \f[C]bool\f[] of UCL object
416.IP \[bu] 2
417\f[C]ucl_object_tostring\f[] \- returns \f[C]const\ char\ *\f[] of UCL
418object (this string is NULL terminated)
419.IP \[bu] 2
420\f[C]ucl_object_tolstring\f[] \- returns \f[C]const\ char\ *\f[] and
408.PP
409Here is a list of all conversion functions:
410.IP \[bu] 2
411\f[C]ucl_object_toint\f[] \- returns \f[C]int64_t\f[] of UCL object
412.IP \[bu] 2
413\f[C]ucl_object_todouble\f[] \- returns \f[C]double\f[] of UCL object
414.IP \[bu] 2
415\f[C]ucl_object_toboolean\f[] \- returns \f[C]bool\f[] of UCL object
416.IP \[bu] 2
417\f[C]ucl_object_tostring\f[] \- returns \f[C]const\ char\ *\f[] of UCL
418object (this string is NULL terminated)
419.IP \[bu] 2
420\f[C]ucl_object_tolstring\f[] \- returns \f[C]const\ char\ *\f[] and
421\f[C]size_t\f[] len of UCL object (string can be not NULL terminated)
421\f[C]size_t\f[] len of UCL object (string does not need to be NULL
422terminated)
422.IP \[bu] 2
423\f[C]ucl_object_tostring_forced\f[] \- returns string representation of
424any UCL object
425.PP
426Strings returned by these pointers are associated with the UCL object
427and exist over its lifetime.
428A caller should not free this memory.
429.SH GENERATION FUNCTIONS
430.PP
431It is possible to generate UCL objects from C primitive types.
423.IP \[bu] 2
424\f[C]ucl_object_tostring_forced\f[] \- returns string representation of
425any UCL object
426.PP
427Strings returned by these pointers are associated with the UCL object
428and exist over its lifetime.
429A caller should not free this memory.
430.SH GENERATION FUNCTIONS
431.PP
432It is possible to generate UCL objects from C primitive types.
432Moreover, libucl permits to create and modify complex UCL objects, such
433Moreover, libucl allows creation and modifying complex UCL objects, such
433as arrays or associative objects.
434.SS ucl_object_new
435.IP
436.nf
437\f[C]
438ucl_object_t\ *\ ucl_object_new\ (void)
439\f[]
440.fi

--- 21 unchanged lines hidden (view full) ---

462.SS Primitive objects generation
463.PP
464Libucl provides the functions similar to inverse conversion functions
465called with the specific C type: \- \f[C]ucl_object_fromint\f[] \-
466converts \f[C]int64_t\f[] to UCL object \-
467\f[C]ucl_object_fromdouble\f[] \- converts \f[C]double\f[] to UCL object
468\- \f[C]ucl_object_fromboolean\f[] \- converts \f[C]bool\f[] to UCL
469object \- \f[C]ucl_object_fromstring\f[] \- converts
434as arrays or associative objects.
435.SS ucl_object_new
436.IP
437.nf
438\f[C]
439ucl_object_t\ *\ ucl_object_new\ (void)
440\f[]
441.fi

--- 21 unchanged lines hidden (view full) ---

463.SS Primitive objects generation
464.PP
465Libucl provides the functions similar to inverse conversion functions
466called with the specific C type: \- \f[C]ucl_object_fromint\f[] \-
467converts \f[C]int64_t\f[] to UCL object \-
468\f[C]ucl_object_fromdouble\f[] \- converts \f[C]double\f[] to UCL object
469\- \f[C]ucl_object_fromboolean\f[] \- converts \f[C]bool\f[] to UCL
470object \- \f[C]ucl_object_fromstring\f[] \- converts
470\f[C]const\ char\ *\f[] to UCL object (this string is NULL terminated)
471\- \f[C]ucl_object_fromlstring\f[] \- converts \f[C]const\ char\ *\f[]
472and \f[C]size_t\f[] len to UCL object (string can be not NULL
473terminated)
471\f[C]const\ char\ *\f[] to UCL object (this string should be NULL
472terminated) \- \f[C]ucl_object_fromlstring\f[] \- converts
473\f[C]const\ char\ *\f[] and \f[C]size_t\f[] len to UCL object (string
474does not need to be NULL terminated)
474.PP
475Also there is a function to generate UCL object from a string performing
476various parsing or conversion operations called
477\f[C]ucl_object_fromstring_common\f[].
478.SS ucl_object_fromstring_common
479.IP
480.nf
481\f[C]
482ucl_object_t\ *\ ucl_object_fromstring_common\ (const\ char\ *str,\
483\ \ \ \ size_t\ len,\ enum\ ucl_string_flags\ flags)
484\f[]
485.fi
486.PP
487This function is used to convert a string \f[C]str\f[] of size
475.PP
476Also there is a function to generate UCL object from a string performing
477various parsing or conversion operations called
478\f[C]ucl_object_fromstring_common\f[].
479.SS ucl_object_fromstring_common
480.IP
481.nf
482\f[C]
483ucl_object_t\ *\ ucl_object_fromstring_common\ (const\ char\ *str,\
484\ \ \ \ size_t\ len,\ enum\ ucl_string_flags\ flags)
485\f[]
486.fi
487.PP
488This function is used to convert a string \f[C]str\f[] of size
488\f[C]len\f[] to an UCL objects applying \f[C]flags\f[] conversions.
489\f[C]len\f[] to a UCL object applying \f[C]flags\f[] conversions.
489If \f[C]len\f[] is equal to zero then a \f[C]str\f[] is assumed as
490NULL\-terminated.
491This function supports the following flags (a set of flags can be
492specified using logical \f[C]OR\f[] operation):
493.IP \[bu] 2
494\f[C]UCL_STRING_ESCAPE\f[] \- perform JSON escape
495.IP \[bu] 2
496\f[C]UCL_STRING_TRIM\f[] \- trim leading and trailing whitespaces

--- 36 unchanged lines hidden (view full) ---

533.IP
534.nf
535\f[C]
536const\ ucl_object_t*\ ucl_iterate_object\ (const\ ucl_object_t\ *obj,\
537\ \ \ \ ucl_object_iter_t\ *iter,\ bool\ expand_values);
538\f[]
539.fi
540.PP
490If \f[C]len\f[] is equal to zero then a \f[C]str\f[] is assumed as
491NULL\-terminated.
492This function supports the following flags (a set of flags can be
493specified using logical \f[C]OR\f[] operation):
494.IP \[bu] 2
495\f[C]UCL_STRING_ESCAPE\f[] \- perform JSON escape
496.IP \[bu] 2
497\f[C]UCL_STRING_TRIM\f[] \- trim leading and trailing whitespaces

--- 36 unchanged lines hidden (view full) ---

534.IP
535.nf
536\f[C]
537const\ ucl_object_t*\ ucl_iterate_object\ (const\ ucl_object_t\ *obj,\
538\ \ \ \ ucl_object_iter_t\ *iter,\ bool\ expand_values);
539\f[]
540.fi
541.PP
541This function accept opaque iterator pointer \f[C]iter\f[].
542This function accepts opaque iterator pointer \f[C]iter\f[].
542In the first call this iterator \f[I]must\f[] be initialized to
543\f[C]NULL\f[].
544Iterator is changed by this function call.
545\f[C]ucl_iterate_object\f[] returns the next UCL object in the compound
546object \f[C]obj\f[] or \f[C]NULL\f[] if all objects have been iterated.
547The reference count of the object returned is not increased, so a caller
548should not unref the object or modify its content (e.g.
549by inserting to another compound object).
550The object \f[C]obj\f[] should not be changed during the iteration
551process as well.
552\f[C]expand_values\f[] flag speicifies whether
553\f[C]ucl_iterate_object\f[] should expand keys with multiple values.
543In the first call this iterator \f[I]must\f[] be initialized to
544\f[C]NULL\f[].
545Iterator is changed by this function call.
546\f[C]ucl_iterate_object\f[] returns the next UCL object in the compound
547object \f[C]obj\f[] or \f[C]NULL\f[] if all objects have been iterated.
548The reference count of the object returned is not increased, so a caller
549should not unref the object or modify its content (e.g.
550by inserting to another compound object).
551The object \f[C]obj\f[] should not be changed during the iteration
552process as well.
553\f[C]expand_values\f[] flag speicifies whether
554\f[C]ucl_iterate_object\f[] should expand keys with multiple values.
554The general rule is that if you need to iterate throught the
555The general rule is that if you need to iterate through the
555\f[I]object\f[] or \f[I]explicit array\f[], then you always need to set
556this flag to \f[C]true\f[].
557However, if you get some key in the object and want to extract all its
558values then you should set \f[C]expand_values\f[] to \f[C]false\f[].
556\f[I]object\f[] or \f[I]explicit array\f[], then you always need to set
557this flag to \f[C]true\f[].
558However, if you get some key in the object and want to extract all its
559values then you should set \f[C]expand_values\f[] to \f[C]false\f[].
559Mixing of iteration types are not permitted since the iterator is set
560Mixing of iteration types is not permitted since the iterator is set
560according to the iteration type and cannot be reused.
561Here is an example of iteration over the objects using libucl API
562(assuming that \f[C]top\f[] is \f[C]UCL_OBJECT\f[] in this example):
563.IP
564.nf
565\f[C]
566ucl_object_iter_t\ it\ =\ NULL,\ it_obj\ =\ NULL;
567const\ ucl_object_t\ *cur,\ *tmp;

--- 26 unchanged lines hidden (view full) ---

594.PP
595This function uses ucl object \f[C]schema\f[], that must be valid in
596terms of \f[C]json\-schema\f[] draft v4, to validate input object
597\f[C]obj\f[].
598If this function returns \f[C]true\f[] then validation procedure has
599been succeed.
600Otherwise, \f[C]false\f[] is returned and \f[C]err\f[] is set to a
601specific value.
561according to the iteration type and cannot be reused.
562Here is an example of iteration over the objects using libucl API
563(assuming that \f[C]top\f[] is \f[C]UCL_OBJECT\f[] in this example):
564.IP
565.nf
566\f[C]
567ucl_object_iter_t\ it\ =\ NULL,\ it_obj\ =\ NULL;
568const\ ucl_object_t\ *cur,\ *tmp;

--- 26 unchanged lines hidden (view full) ---

595.PP
596This function uses ucl object \f[C]schema\f[], that must be valid in
597terms of \f[C]json\-schema\f[] draft v4, to validate input object
598\f[C]obj\f[].
599If this function returns \f[C]true\f[] then validation procedure has
600been succeed.
601Otherwise, \f[C]false\f[] is returned and \f[C]err\f[] is set to a
602specific value.
602If caller set \f[C]err\f[] to NULL then this function does not set any
603error just returning \f[C]false\f[].
603If a caller sets \f[C]err\f[] to NULL then this function does not set
604any error just returning \f[C]false\f[].
604Error is the structure defined as following:
605.IP
606.nf
607\f[C]
608struct\ ucl_schema_error\ {
609\ \ \ \ enum\ ucl_schema_error_code\ code;\ \ \ \ /*\ error\ code\ */
610\ \ \ \ char\ msg[128];\ \ \ \ \ \ \ \ \ \ \ \ \ \ /*\ error\ message\ */
605Error is the structure defined as following:
606.IP
607.nf
608\f[C]
609struct\ ucl_schema_error\ {
610\ \ \ \ enum\ ucl_schema_error_code\ code;\ \ \ \ /*\ error\ code\ */
611\ \ \ \ char\ msg[128];\ \ \ \ \ \ \ \ \ \ \ \ \ \ /*\ error\ message\ */
611\ \ \ \ ucl_object_t\ *obj;\ \ \ \ \ \ \ \ \ \ /*\ object\ where\ error\ occured\ */
612\ \ \ \ ucl_object_t\ *obj;\ \ \ \ \ \ \ \ \ \ /*\ object\ where\ error\ occurred\ */
612};
613\f[]
614.fi
615.PP
616Caller may use \f[C]code\f[] field to get a numeric error code:
617.IP
618.nf
619\f[C]

--- 4 unchanged lines hidden (view full) ---

624\ \ \ \ UCL_SCHEMA_MISSING_PROPERTY,/*\ missing\ properties\ */
625\ \ \ \ UCL_SCHEMA_CONSTRAINT,\ \ \ \ \ \ /*\ constraint\ found\ */
626\ \ \ \ UCL_SCHEMA_MISSING_DEPENDENCY,\ /*\ missing\ dependency\ */
627\ \ \ \ UCL_SCHEMA_UNKNOWN\ \ \ \ \ \ \ \ \ \ /*\ generic\ error\ */
628};
629\f[]
630.fi
631.PP
613};
614\f[]
615.fi
616.PP
617Caller may use \f[C]code\f[] field to get a numeric error code:
618.IP
619.nf
620\f[C]

--- 4 unchanged lines hidden (view full) ---

625\ \ \ \ UCL_SCHEMA_MISSING_PROPERTY,/*\ missing\ properties\ */
626\ \ \ \ UCL_SCHEMA_CONSTRAINT,\ \ \ \ \ \ /*\ constraint\ found\ */
627\ \ \ \ UCL_SCHEMA_MISSING_DEPENDENCY,\ /*\ missing\ dependency\ */
628\ \ \ \ UCL_SCHEMA_UNKNOWN\ \ \ \ \ \ \ \ \ \ /*\ generic\ error\ */
629};
630\f[]
631.fi
632.PP
632\f[C]msg\f[] is a stiring description of an error and \f[C]obj\f[] is an
633object where error has been occurred.
633\f[C]msg\f[] is a string description of an error and \f[C]obj\f[] is an
634object where error has occurred.
634Error object is not allocated by libucl, so there is no need to free it
635after validation (a static object should thus be used).
636.SH AUTHORS
637Vsevolod Stakhov <vsevolod@highsecure.ru>.
635Error object is not allocated by libucl, so there is no need to free it
636after validation (a static object should thus be used).
637.SH AUTHORS
638Vsevolod Stakhov <vsevolod@highsecure.ru>.