.TH LIBNORMALFORM_XNOR 3 LIBNORMALFORM .SH NAME libnormalform_xnor \- Logical equivalence .SH SYNOPSIS .nf #include LIBNORMALFORM_SENTENCE *libnormalform_xnor(LIBNORMALFORM_SENTENCE **\fIxs\fP); LIBNORMALFORM_SENTENCE *libnormalform_xnorl(LIBNORMALFORM_SENTENCE *\fIa\fP, ... /*, NULL */); LIBNORMALFORM_SENTENCE *libnormalform_vxnor(LIBNORMALFORM_SENTENCE *\fIa\fP, va_list \fPargs\fP); LIBNORMALFORM_SENTENCE *libnormalform_xnor_checked(size_t \fIn\fP, LIBNORMALFORM_SENTENCE **\fIxs\fP); LIBNORMALFORM_SENTENCE *libnormalform_xnorl_checked(size_t \fIn\fP, LIBNORMALFORM_SENTENCE *\fIa\fP, ... /*, NULL */); LIBNORMALFORM_SENTENCE *libnormalform_vxnor_checked(size_t \fIn\fP, LIBNORMALFORM_SENTENCE *\fIa\fP, va_list \fPargs\fP); LIBNORMALFORM_SENTENCE *libnormalform_xnor2(LIBNORMALFORM_SENTENCE *\fIp\fP, LIBNORMALFORM_SENTENCE *\fIq\fP); #define LIBNORMALFORM_XNOR(...) /* ... */ .fi .PP Link with .IR -lnormalform . .SH DESCRIPTION The .BR libnormalform_xnor () function creates a sentence that is logically equivalent to the logical equivalecne of the arguments, that is, a sentence that is true exactly when the parity of the subsentences equal to whether the number of subsentences is odd. .PP The value of the .I xs parameter shall be a null-pointer terminated list of subsentences. .PP The .BR libnormalform_xnorl () function is a variant of .BR libnormalform_xnor () which uses variadic arguments instead of an array. .PP The .BR libnormalform_vxnor () function is a variant of .BR libnormalform_xnorl () which takes an .I va_list in place of variadic arguments. .PP The .BR libnormalform_xnor_checked (), .BR libnormalform_xnorl_checked (), and .BR libnormalform_vxnor_checked () functions are variants of the .BR libnormalform_xnor (), .BR libnormalform_xnorl (), and .BR libnormalform_vxnor () functions respectively which assumes that it is given .I n subsentances, and checks that all are .RI non- NULL . However, these functions still require the list of subsentences to be terminated using a null-pointer. .PP .I "libnormalform_xnor2(p, q)" is equivalent to .IR "libnormalform_xnorl_checked(2, p, q, NULL)" . .PP The .BR LIBNORMALFORM_XNOR macro is a wrapper for the .BR libnormalform_xnor_checked () but is more similar to .BR libnormalform_xnorl (). Unlike .BR libnormalform_xnorl (), the argument list .I must not be terminated by a null-pointer, instead the macro automatically as the null-pointer. The macro will count the number of arguments it is given, therefore it will fail it the argument list is has an extra null-pointer. .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. .PP These functions adopt the ownership of any .I LIBNORMALFORM_SENTENCE * passed into it. Therefore, the user shall not attempt to deallocate input sentences. This holds even on failure: if the function fails, input sentences are deallocated. .SH RETURN VALUE Upon successful completion, the .BR libnormalform_xnor () function and its variants return an object representing the sentence; otherwise, the functions return .I NULL and set .I errno to indicate the error. .SH ERRORS These functions fails if: .TP .I ENOMEM Insufficient memory was available to create the sentence object. .PP The .BR libnormalform_xnor_checked (), .BR libnormalform_xnorl_checked (), and .BR libnormalform_vxnor_checked () functions will also fail without setting .I errno if any of the first .I n .IR "LIBNORMALFORM_SENTENCE *" 's are .IR NULL . Likewise, the .BR libnormalform_xnor2 () function will fail without setting .I errno if .I p or .I q 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_xnor (), .br .BR libnormalform_xnor_checked () T} Thread safety MT-Safe race:\fIxs\fP and elements in \fIxs\fP T{ .BR libnormalform_xnorl (), .br .BR libnormalform_xnorl_checked (), .br .BR libnormalform_xnor2 (), .br .BR LIBNORMALFORM_XNOR () T} Thread safety MT-Safe race:parameters T{ .BR libnormalform_vxnor (), .br .BR libnormalform_vxnor_checked () T} Thread safety MT-Safe race:parameters and arguments in \fIargs\fP T{ .BR libnormalform_xnor (), .br .BR libnormalform_xnorl (), .br .BR libnormalform_vxnor (), .br .BR libnormalform_xnor_checked (), .br .BR libnormalform_xnorl_checked (), .br .BR libnormalform_vxnor_checked (), .br .BR libnormalform_vxnor2 (), .br .BR LIBNORMALFORM_XNOR () T} Async-signal safety AS-Unsafe heap T{ .BR libnormalform_xnor (), .br .BR libnormalform_xnorl (), .br .BR libnormalform_vxnor (), .br .BR libnormalform_xnor_checked (), .br .BR libnormalform_xnorl_checked (), .br .BR libnormalform_vxnor_checked (), .br .BR libnormalform_vxnor2 (), .br .BR LIBNORMALFORM_XNOR () T} Async-cancel safety AC-Safe mem, AC-Unsafe heap .TE .SH NOTES If there are no subsentences, the resulting sentence is a tautology. .PP The connective is commutative and associative. It's truthtable is (1001). .PP The .BR LIBNORMALFORM_XNOR () macro requires ISO C23 support. .PP Using .BR libnormalform_xnor2 (), has greatest performance, however .BR libnormalform_xnor () is better at simplifying the sentence. The other functions are just wrappers for the .BR libnormalform_xnor () function. .PP These functions creates a clause where each term is connected with the XNOR connective. Unlike what the name Logical equivalence, this does .I not create a sentence that is true when all subsentences have the same value (this is only the case when there are 2 or 0 subsentences). Rather, when the number of terms is odd, it is equivalent to the parity (XOR) of the terms, but when the number of terms is odd, it is the inverse of the parity. .PP Side-effects in the arguments of the macro .BR LIBNORMALFORM_XNOR () are guaranteed to be applied exactly once. The side-effects in each macro are applied in no particular order. .SH SEE ALSO .BR libnormalform (7)