.TH LIBNORMALFORM_CLONE 3 LIBNORMALFORM .SH NAME libnormalform_clone \- Create a deep clone .SH SYNOPSIS .nf #include LIBNORMALFORM_SENTENCE *libnormalform_clone(LIBNORMALFORM_SENTENCE *\fIx\fP); .fi .PP Link with .IR -lnormalform . .SH DESCRIPTION The .BR libnormalform_clone () function creates a deep clone of .IR x , letting the application use the same sentence in concurrently from two threads. .PP Before calling the .BR libnormalform_clone () function, application provided objects in .I x must be configured for cloning: .I .copy_for_clone in each .IR "struct libnormalform_variable" , .IR "struct libnormalform_function" , .IR "struct libnormalform_map" , and .IR "struct libnormalform_transformer" , shall either be set to the copy of the object to use in the clone of .IR x , or to .I NULL if the object can safely be used by the clone of .IR x . .PP The returned pointer shall either be deallocated with the .BR libnormalform_free (3) function or be relinquished by being used as part of another sentence. .SH RETURN VALUE Upon successful completion, the .BR libnormalform_clone () function returns a deep clone of .IR x ; otherwise, the function returns .I NULL and sets .I errno to indicate the error. .SH ERRORS The .BR libnormalform_clone () function fails if: .TP .B ENOMEM Insufficient memory was available to create the sentence object. .PP The .BR libnormalform_clone () function also fails without setting .I errno if .I x is .IR NULL . .SH ATTRIBUTES For an explanation of the terms used in this section, see .BR attributes (7) and .IR "info \(dq(libc)POSIX Safety Concepts\(dq" . .TS allbox; lb lb lb l l l. Interface Attribute Value T{ .BR libnormalform_clone () T} Thread safety MT-Safe race:\fIx\fP T{ .BR libnormalform_clone () T} Async-signal safety AS-Unsafe heap T{ .BR libnormalform_clone () T} Async-cancel safety AC-Safe mem, AC-Unsafe heap .TE .SH SEE ALSO .BR libnormalform (7), .BR libnormalform_ref (3), .BR libnormalform_free (3)