From bf4020471356938b9181a33984f511ffdd7ff25b Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Tue, 22 Oct 2019 18:59:27 +0200 Subject: Change license, change style, clean up, flat file hier, clean valgrind output in test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- .gitignore | 21 +- COPYING | 15 - DEPENDENCIES | 1 - LICENSE | 683 +----- Makefile | 66 + Makefile.in | 74 - README | 2 +- config.mk | 8 + configure | 48 - doc/man/libcoopgamma.7 | 46 - doc/man/libcoopgamma.h.0 | 479 ---- doc/man/libcoopgamma_async_context_destroy.3 | 33 - doc/man/libcoopgamma_async_context_initialise.3 | 44 - doc/man/libcoopgamma_async_context_marshal.3 | 49 - doc/man/libcoopgamma_async_context_unmarshal.3 | 83 - doc/man/libcoopgamma_connect.3 | 78 - doc/man/libcoopgamma_context_destroy.3 | 38 - doc/man/libcoopgamma_context_initialise.3 | 45 - doc/man/libcoopgamma_context_marshal.3 | 52 - doc/man/libcoopgamma_context_unmarshal.3 | 86 - doc/man/libcoopgamma_crtc_info_destroy.3 | 33 - doc/man/libcoopgamma_crtc_info_initialise.3 | 44 - doc/man/libcoopgamma_crtc_info_marshal.3 | 49 - doc/man/libcoopgamma_crtc_info_unmarshal.3 | 83 - doc/man/libcoopgamma_error_destroy.3 | 33 - doc/man/libcoopgamma_error_initialise.3 | 44 - doc/man/libcoopgamma_error_marshal.3 | 49 - doc/man/libcoopgamma_error_unmarshal.3 | 86 - doc/man/libcoopgamma_filter_destroy.3 | 33 - doc/man/libcoopgamma_filter_initialise.3 | 44 - doc/man/libcoopgamma_filter_marshal.3 | 49 - doc/man/libcoopgamma_filter_query_destroy.3 | 33 - doc/man/libcoopgamma_filter_query_initialise.3 | 44 - doc/man/libcoopgamma_filter_query_marshal.3 | 49 - doc/man/libcoopgamma_filter_query_unmarshal.3 | 86 - doc/man/libcoopgamma_filter_table_destroy.3 | 33 - doc/man/libcoopgamma_filter_table_initialise.3 | 44 - doc/man/libcoopgamma_filter_table_marshal.3 | 49 - doc/man/libcoopgamma_filter_table_unmarshal.3 | 86 - doc/man/libcoopgamma_filter_unmarshal.3 | 86 - doc/man/libcoopgamma_flush.3 | 58 - doc/man/libcoopgamma_get_crtcs_recv.3 | 63 - doc/man/libcoopgamma_get_crtcs_send.3 | 77 - doc/man/libcoopgamma_get_crtcs_sync.3 | 53 - doc/man/libcoopgamma_get_gamma_info_recv.3 | 150 -- doc/man/libcoopgamma_get_gamma_info_send.3 | 79 - doc/man/libcoopgamma_get_gamma_info_sync.3 | 142 -- doc/man/libcoopgamma_get_gamma_recv.3 | 98 - doc/man/libcoopgamma_get_gamma_send.3 | 93 - doc/man/libcoopgamma_get_gamma_sync.3 | 102 - doc/man/libcoopgamma_get_method_and_site.3 | 105 - doc/man/libcoopgamma_get_methods.3 | 65 - doc/man/libcoopgamma_get_pid_file.3 | 85 - doc/man/libcoopgamma_get_socket_file.3 | 86 - doc/man/libcoopgamma_queried_filter_destroy.3 | 33 - doc/man/libcoopgamma_queried_filter_initialise.3 | 44 - doc/man/libcoopgamma_queried_filter_marshal.3 | 55 - doc/man/libcoopgamma_queried_filter_unmarshal.3 | 91 - doc/man/libcoopgamma_ramps_destroy.3 | 43 - doc/man/libcoopgamma_ramps_initialise.3 | 62 - doc/man/libcoopgamma_ramps_marshal.3 | 66 - doc/man/libcoopgamma_ramps_unmarshal.3 | 100 - doc/man/libcoopgamma_set_gamma_recv.3 | 52 - doc/man/libcoopgamma_set_gamma_send.3 | 140 -- doc/man/libcoopgamma_set_gamma_sync.3 | 105 - doc/man/libcoopgamma_set_nonblocking.3 | 49 - doc/man/libcoopgamma_skip_message.3 | 30 - doc/man/libcoopgamma_synchronise.3 | 94 - libcoopgamma.7 | 46 + libcoopgamma.c | 2538 +++++++++++++++++++++ libcoopgamma.h | 1635 ++++++++++++++ libcoopgamma.h.0 | 479 ++++ libcoopgamma_async_context_destroy.3 | 33 + libcoopgamma_async_context_initialise.3 | 44 + libcoopgamma_async_context_marshal.3 | 49 + libcoopgamma_async_context_unmarshal.3 | 83 + libcoopgamma_connect.3 | 78 + libcoopgamma_context_destroy.3 | 38 + libcoopgamma_context_initialise.3 | 45 + libcoopgamma_context_marshal.3 | 52 + libcoopgamma_context_unmarshal.3 | 86 + libcoopgamma_crtc_info_destroy.3 | 33 + libcoopgamma_crtc_info_initialise.3 | 44 + libcoopgamma_crtc_info_marshal.3 | 49 + libcoopgamma_crtc_info_unmarshal.3 | 83 + libcoopgamma_error_destroy.3 | 33 + libcoopgamma_error_initialise.3 | 44 + libcoopgamma_error_marshal.3 | 49 + libcoopgamma_error_unmarshal.3 | 86 + libcoopgamma_filter_destroy.3 | 33 + libcoopgamma_filter_initialise.3 | 44 + libcoopgamma_filter_marshal.3 | 49 + libcoopgamma_filter_query_destroy.3 | 33 + libcoopgamma_filter_query_initialise.3 | 44 + libcoopgamma_filter_query_marshal.3 | 49 + libcoopgamma_filter_query_unmarshal.3 | 86 + libcoopgamma_filter_table_destroy.3 | 33 + libcoopgamma_filter_table_initialise.3 | 44 + libcoopgamma_filter_table_marshal.3 | 49 + libcoopgamma_filter_table_unmarshal.3 | 86 + libcoopgamma_filter_unmarshal.3 | 86 + libcoopgamma_flush.3 | 58 + libcoopgamma_get_crtcs_recv.3 | 63 + libcoopgamma_get_crtcs_send.3 | 77 + libcoopgamma_get_crtcs_sync.3 | 53 + libcoopgamma_get_gamma_info_recv.3 | 150 ++ libcoopgamma_get_gamma_info_send.3 | 79 + libcoopgamma_get_gamma_info_sync.3 | 142 ++ libcoopgamma_get_gamma_recv.3 | 98 + libcoopgamma_get_gamma_send.3 | 93 + libcoopgamma_get_gamma_sync.3 | 102 + libcoopgamma_get_method_and_site.3 | 105 + libcoopgamma_get_methods.3 | 65 + libcoopgamma_get_pid_file.3 | 85 + libcoopgamma_get_socket_file.3 | 86 + libcoopgamma_queried_filter_destroy.3 | 33 + libcoopgamma_queried_filter_initialise.3 | 44 + libcoopgamma_queried_filter_marshal.3 | 55 + libcoopgamma_queried_filter_unmarshal.3 | 91 + libcoopgamma_ramps_destroy.3 | 43 + libcoopgamma_ramps_initialise.3 | 62 + libcoopgamma_ramps_marshal.3 | 66 + libcoopgamma_ramps_unmarshal.3 | 100 + libcoopgamma_set_gamma_recv.3 | 52 + libcoopgamma_set_gamma_send.3 | 140 ++ libcoopgamma_set_gamma_sync.3 | 105 + libcoopgamma_set_nonblocking.3 | 49 + libcoopgamma_skip_message.3 | 30 + libcoopgamma_synchronise.3 | 94 + linux.mk | 5 + macos.mk | 5 + man.mk | 64 + mk/README | 71 - mk/all.mk | 32 - mk/clean.mk | 45 - mk/configure | 732 ------ mk/copy.mk | 78 - mk/dist.mk | 189 -- mk/empty.mk | 103 - mk/i18n.mk | 111 - mk/lang-c.mk | 307 --- mk/lowerpath.mk | 279 --- mk/man.mk | 111 - mk/path.mk | 176 -- mk/prologue.mk | 16 - mk/shell.mk | 233 -- mk/tags.mk | 25 - mk/texinfo.mk | 294 --- mk/tools.mk | 163 -- src/libcoopgamma.c | 2620 ---------------------- src/libcoopgamma.h | 1680 -------------- src/test.c | 273 --- test.c | 257 +++ 153 files changed, 8907 insertions(+), 12673 deletions(-) delete mode 100644 COPYING create mode 100644 Makefile delete mode 100644 Makefile.in create mode 100644 config.mk delete mode 100755 configure delete mode 100644 doc/man/libcoopgamma.7 delete mode 100644 doc/man/libcoopgamma.h.0 delete mode 100644 doc/man/libcoopgamma_async_context_destroy.3 delete mode 100644 doc/man/libcoopgamma_async_context_initialise.3 delete mode 100644 doc/man/libcoopgamma_async_context_marshal.3 delete mode 100644 doc/man/libcoopgamma_async_context_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_connect.3 delete mode 100644 doc/man/libcoopgamma_context_destroy.3 delete mode 100644 doc/man/libcoopgamma_context_initialise.3 delete mode 100644 doc/man/libcoopgamma_context_marshal.3 delete mode 100644 doc/man/libcoopgamma_context_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_crtc_info_destroy.3 delete mode 100644 doc/man/libcoopgamma_crtc_info_initialise.3 delete mode 100644 doc/man/libcoopgamma_crtc_info_marshal.3 delete mode 100644 doc/man/libcoopgamma_crtc_info_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_error_destroy.3 delete mode 100644 doc/man/libcoopgamma_error_initialise.3 delete mode 100644 doc/man/libcoopgamma_error_marshal.3 delete mode 100644 doc/man/libcoopgamma_error_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_filter_destroy.3 delete mode 100644 doc/man/libcoopgamma_filter_initialise.3 delete mode 100644 doc/man/libcoopgamma_filter_marshal.3 delete mode 100644 doc/man/libcoopgamma_filter_query_destroy.3 delete mode 100644 doc/man/libcoopgamma_filter_query_initialise.3 delete mode 100644 doc/man/libcoopgamma_filter_query_marshal.3 delete mode 100644 doc/man/libcoopgamma_filter_query_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_filter_table_destroy.3 delete mode 100644 doc/man/libcoopgamma_filter_table_initialise.3 delete mode 100644 doc/man/libcoopgamma_filter_table_marshal.3 delete mode 100644 doc/man/libcoopgamma_filter_table_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_filter_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_flush.3 delete mode 100644 doc/man/libcoopgamma_get_crtcs_recv.3 delete mode 100644 doc/man/libcoopgamma_get_crtcs_send.3 delete mode 100644 doc/man/libcoopgamma_get_crtcs_sync.3 delete mode 100644 doc/man/libcoopgamma_get_gamma_info_recv.3 delete mode 100644 doc/man/libcoopgamma_get_gamma_info_send.3 delete mode 100644 doc/man/libcoopgamma_get_gamma_info_sync.3 delete mode 100644 doc/man/libcoopgamma_get_gamma_recv.3 delete mode 100644 doc/man/libcoopgamma_get_gamma_send.3 delete mode 100644 doc/man/libcoopgamma_get_gamma_sync.3 delete mode 100644 doc/man/libcoopgamma_get_method_and_site.3 delete mode 100644 doc/man/libcoopgamma_get_methods.3 delete mode 100644 doc/man/libcoopgamma_get_pid_file.3 delete mode 100644 doc/man/libcoopgamma_get_socket_file.3 delete mode 100644 doc/man/libcoopgamma_queried_filter_destroy.3 delete mode 100644 doc/man/libcoopgamma_queried_filter_initialise.3 delete mode 100644 doc/man/libcoopgamma_queried_filter_marshal.3 delete mode 100644 doc/man/libcoopgamma_queried_filter_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_ramps_destroy.3 delete mode 100644 doc/man/libcoopgamma_ramps_initialise.3 delete mode 100644 doc/man/libcoopgamma_ramps_marshal.3 delete mode 100644 doc/man/libcoopgamma_ramps_unmarshal.3 delete mode 100644 doc/man/libcoopgamma_set_gamma_recv.3 delete mode 100644 doc/man/libcoopgamma_set_gamma_send.3 delete mode 100644 doc/man/libcoopgamma_set_gamma_sync.3 delete mode 100644 doc/man/libcoopgamma_set_nonblocking.3 delete mode 100644 doc/man/libcoopgamma_skip_message.3 delete mode 100644 doc/man/libcoopgamma_synchronise.3 create mode 100644 libcoopgamma.7 create mode 100644 libcoopgamma.c create mode 100644 libcoopgamma.h create mode 100644 libcoopgamma.h.0 create mode 100644 libcoopgamma_async_context_destroy.3 create mode 100644 libcoopgamma_async_context_initialise.3 create mode 100644 libcoopgamma_async_context_marshal.3 create mode 100644 libcoopgamma_async_context_unmarshal.3 create mode 100644 libcoopgamma_connect.3 create mode 100644 libcoopgamma_context_destroy.3 create mode 100644 libcoopgamma_context_initialise.3 create mode 100644 libcoopgamma_context_marshal.3 create mode 100644 libcoopgamma_context_unmarshal.3 create mode 100644 libcoopgamma_crtc_info_destroy.3 create mode 100644 libcoopgamma_crtc_info_initialise.3 create mode 100644 libcoopgamma_crtc_info_marshal.3 create mode 100644 libcoopgamma_crtc_info_unmarshal.3 create mode 100644 libcoopgamma_error_destroy.3 create mode 100644 libcoopgamma_error_initialise.3 create mode 100644 libcoopgamma_error_marshal.3 create mode 100644 libcoopgamma_error_unmarshal.3 create mode 100644 libcoopgamma_filter_destroy.3 create mode 100644 libcoopgamma_filter_initialise.3 create mode 100644 libcoopgamma_filter_marshal.3 create mode 100644 libcoopgamma_filter_query_destroy.3 create mode 100644 libcoopgamma_filter_query_initialise.3 create mode 100644 libcoopgamma_filter_query_marshal.3 create mode 100644 libcoopgamma_filter_query_unmarshal.3 create mode 100644 libcoopgamma_filter_table_destroy.3 create mode 100644 libcoopgamma_filter_table_initialise.3 create mode 100644 libcoopgamma_filter_table_marshal.3 create mode 100644 libcoopgamma_filter_table_unmarshal.3 create mode 100644 libcoopgamma_filter_unmarshal.3 create mode 100644 libcoopgamma_flush.3 create mode 100644 libcoopgamma_get_crtcs_recv.3 create mode 100644 libcoopgamma_get_crtcs_send.3 create mode 100644 libcoopgamma_get_crtcs_sync.3 create mode 100644 libcoopgamma_get_gamma_info_recv.3 create mode 100644 libcoopgamma_get_gamma_info_send.3 create mode 100644 libcoopgamma_get_gamma_info_sync.3 create mode 100644 libcoopgamma_get_gamma_recv.3 create mode 100644 libcoopgamma_get_gamma_send.3 create mode 100644 libcoopgamma_get_gamma_sync.3 create mode 100644 libcoopgamma_get_method_and_site.3 create mode 100644 libcoopgamma_get_methods.3 create mode 100644 libcoopgamma_get_pid_file.3 create mode 100644 libcoopgamma_get_socket_file.3 create mode 100644 libcoopgamma_queried_filter_destroy.3 create mode 100644 libcoopgamma_queried_filter_initialise.3 create mode 100644 libcoopgamma_queried_filter_marshal.3 create mode 100644 libcoopgamma_queried_filter_unmarshal.3 create mode 100644 libcoopgamma_ramps_destroy.3 create mode 100644 libcoopgamma_ramps_initialise.3 create mode 100644 libcoopgamma_ramps_marshal.3 create mode 100644 libcoopgamma_ramps_unmarshal.3 create mode 100644 libcoopgamma_set_gamma_recv.3 create mode 100644 libcoopgamma_set_gamma_send.3 create mode 100644 libcoopgamma_set_gamma_sync.3 create mode 100644 libcoopgamma_set_nonblocking.3 create mode 100644 libcoopgamma_skip_message.3 create mode 100644 libcoopgamma_synchronise.3 create mode 100644 linux.mk create mode 100644 macos.mk create mode 100644 man.mk delete mode 100644 mk/README delete mode 100644 mk/all.mk delete mode 100644 mk/clean.mk delete mode 100644 mk/configure delete mode 100644 mk/copy.mk delete mode 100644 mk/dist.mk delete mode 100644 mk/empty.mk delete mode 100644 mk/i18n.mk delete mode 100644 mk/lang-c.mk delete mode 100644 mk/lowerpath.mk delete mode 100644 mk/man.mk delete mode 100644 mk/path.mk delete mode 100644 mk/prologue.mk delete mode 100644 mk/shell.mk delete mode 100644 mk/tags.mk delete mode 100644 mk/texinfo.mk delete mode 100644 mk/tools.mk delete mode 100644 src/libcoopgamma.c delete mode 100644 src/libcoopgamma.h delete mode 100644 src/test.c create mode 100644 test.c diff --git a/.gitignore b/.gitignore index 87ad7ae..6a59d3e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1,10 @@ -bin/ -obj/ -aux/ -\#*\# -.\#* +*\#* *~ -*.bak -*.orig *.o +*.a +*.lo *.su *.so -*.out -*.pdf -*.dvi -*.ps -*.info -.config.mk -/config.status -/Makefile +*.so.* +*.dylib +/test diff --git a/COPYING b/COPYING deleted file mode 100644 index db4393a..0000000 --- a/COPYING +++ /dev/null @@ -1,15 +0,0 @@ -libcoopgamma -- Library for interfacing with cooperative gamma servers -Copyright (C) 2016 Mattias Andrée (maandree@kth.se) - -This library is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this library. If not, see . diff --git a/DEPENDENCIES b/DEPENDENCIES index 23d8713..420c60b 100644 --- a/DEPENDENCIES +++ b/DEPENDENCIES @@ -16,4 +16,3 @@ INSTALL DEPENDENCIES: make coreutils - diff --git a/LICENSE b/LICENSE index 94a9ed0..c2c5e80 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,15 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 +ISC License - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. +© 2016, 2019 Mattias Andrée - Preamble +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ab595c6 --- /dev/null +++ b/Makefile @@ -0,0 +1,66 @@ +.POSIX: + +LIB_MAJOR = 1 +LIB_MINOR = 2 +LIB_VERSION = $(LIB_MAJOR).$(LIB_MINOR) + +CONFIGFILE = config.mk +OSCONFIGFILE = linux.mk + +include $(CONFIGFILE) +include $(OSCONFIGFILE) +include man.mk + +all: libcoopgamma.a libcoopgamma.so test + +.c.o: + $(CC) -c -o $@ $< $(CPPFLAGS) $(CFLAGS) + +.c.lo: + $(CC) -fPIC -c -o $@ $< $(CPPFLAGS) $(CFLAGS) + +libcoopgamma.a: libcoopgamma.o + $(AR) rc $@ $? + $(AR) s $@ + +libcoopgamma.$(LIBEXT): libcoopgamma.lo + $(CC) $(LIBFLAGS) -o $@ libcoopgamma.lo $(LDFLAGS) + +test: test.o libcoopgamma.a + $(CC) -o $@ test.o libcoopgamma.a $(LDFLAGS) + +check: test + ./test + +install: libcoopgamma.a libcoopgamma.$(LIBEXT) + mkdir -p -- "$(DESTDIR)$(PREFIX)/include" + mkdir -p -- "$(DESTDIR)$(PREFIX)/lib" + mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man0" + mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man3" + mkdir -p -- "$(DESTDIR)$(MANPREFIX)/man7" + cp -- libcoopgamma.h "$(DESTDIR)$(PREFIX)/include" + cp -- libcoopgamma.a "$(DESTDIR)$(PREFIX)/lib" + cp -- libcoopgamma.$(LIBEXT) "$(DESTDIR)$(PREFIX)/lib/libcoopgamma.$(LIBMINOREXT)" + ln -sf -- libcoopgamma.$(LIBMINOREXT) "$(DESTDIR)$(PREFIX)/lib/libcoopgamma.$(LIBMAJOREXT)" + ln -sf -- libcoopgamma.$(LIBMINOREXT) "$(DESTDIR)$(PREFIX)/lib/libcoopgamma.$(LIBEXT)" + cp -- $(MAN0) "$(DESTDIR)$(MANPREFIX)/man0" + cp -- $(MAN3) "$(DESTDIR)$(MANPREFIX)/man3" + cp -- $(MAN7) "$(DESTDIR)$(MANPREFIX)/man7" + +uninstall: + -rm -f -- "$(DESTDIR)$(PREFIX)/include/libcoopgamma.h" + -rm -f -- "$(DESTDIR)$(PREFIX)/lib/libcoopgamma.a" + -rm -f -- "$(DESTDIR)$(PREFIX)/lib/libcoopgamma.$(LIBMINOREXT)" + -rm -f -- "$(DESTDIR)$(PREFIX)/lib/libcoopgamma.$(LIBMAJOREXT)" + -rm -f -- "$(DESTDIR)$(PREFIX)/lib/libcoopgamma.$(LIBEXT)" + -cd -- "$(DESTDIR)$(MANPREFIX)/man0/" && rm -f -- $(MAN0) + -cd -- "$(DESTDIR)$(MANPREFIX)/man3/" && rm -f -- $(MAN3) + -cd -- "$(DESTDIR)$(MANPREFIX)/man7/" && rm -f -- $(MAN7) + +clean: + -rm -f -- *.a *.lo *.o *.su *.$(LIBEXT) test + +.SUFFIXES: +.SUFFIXES: .lo .o .c + +.PHONY: all check install uninstall clean diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index b3a1e2e..0000000 --- a/Makefile.in +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright (C) 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -### This file will be stored to Makefile once you have run ./configure. ### -### See INSTALL for information on how to install this package. ### - - - -##### What is below this line is configurable, but is seldom useful. ##### - - -# The name of the package as it should be installed. -PKGNAME = libcoopgamma - - - -##### Nothing interesting below this. ##### - - -# In case you want add some configurations. Primarily -# intended for maintainers. Perhaps add GPG_KEY here. -# Of course, you can declare everthing with ./configure, -# but with this you are less likely to forget it. --include .make-configurations - - -# YOU, AS A USER, SHOULD NOT CHANGE THESE VARIABLES. {{ -# They specify how the reusable makefiles in mk/ shall behave. - -# Package information. -_PROJECT = libcoopgamma -_VERSION = 1.2 - -# Used by mk/lang-c.mk -_C_STD = c99 -_PEDANTIC = yes -_LIB = libcoopgamma -_OBJ_libcoopgamma = libcoopgamma -_SO_VERSION_libcoopgamma = $(_VERSION) -_SO_MAJOR_libcoopgamma = $(shell echo $(_SO_VERSION_libcoopgamma) | cut -d . -f 1) -_H = libcoopgamma -_HEADER_DIRLEVELS = 1 -_CPPFLAGS = -D'PACKAGE="$(PKGNAME)"' -D'PROGRAM_VERSION="$(_VERSION)"' - -# Used by mk/man.mk -_MAN_PAGE_SECTIONS = 0 3 7 -_MAN_0 = libcoopgamma.h -__TYPES = async_context context crtc_info error filter filter_query filter_table queried_filter ramps -__PROTOCOLS = get_crtcs get_gamma_info get_gamma set_gamma -_MAN_3 = $(foreach T,$(__TYPES),$(foreach F,destroy initialise marshal unmarshal,libcoopgamma_$(T)_$(F))) \ - $(foreach P,$(__PROTOCOLS),$(foreach F,recv send sync,libcoopgamma_$(P)_$(F))) \ - libcoopgamma_connect libcoopgamma_flush libcoopgamma_get_method_and_site \ - libcoopgamma_get_methods libcoopgamma_get_pid_file libcoopgamma_get_socket_file \ - libcoopgamma_set_nonblocking libcoopgamma_synchronise libcoopgamma_skip_message -_MAN_7 = libcoopgamma - -# Used by mk/copy.mk -_COPYING = COPYING LICENSE - -# Used by mk/dist.mk -_EVERYTHING = $(__EVERYTHING_ALL_COMMON) src/libcoopgamma.c src/libcoopgamma.h \ - DEPENDENCIES - -# }} - - -# All of the make rules and the configurations. -include $(v)mk/all.mk - diff --git a/README b/README index 53dd625..b0d6c4a 100644 --- a/README +++ b/README @@ -28,4 +28,4 @@ RATIONALE SEE ALSO libcoopgamma.h(0), coopgammad(1), gc-tools(7), - libclut(7) + libclut(7). diff --git a/config.mk b/config.mk new file mode 100644 index 0000000..ca1ffbb --- /dev/null +++ b/config.mk @@ -0,0 +1,8 @@ +PREFIX = /usr +MANPREFIX = $(PREFIX)/share/man + +CC = cc + +CPPFLAGS = -D_DEFAULT_SOURCE -D_GNU_SOURCE +CFLAGS = -std=c99 -Wall -Og -g +LDFLAGS = diff --git a/configure b/configure deleted file mode 100755 index 4d0e5d5..0000000 --- a/configure +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -# Run './configure --help' for usage information. - - -PKGNAME=libcoopgamma -MAN_SECTION_SUFFIX= - - -list_optional_features_help () -{ - true -} - -unrecognised_argument () -{ - option="${1}" - case "${option}" in - (--build | --target | --host) - incomplete="${option}" ;; - (--build=*) - ;; - (--target=*) - ;; - (--host=*) - ;; - (*) - ;; - esac -} - -. "$(dirname "${0}")"/mk/configure - - -cat < -.fi -.SH "DESCRIPTION" -The -.B -header includes the -.BR , -.BR , -and -.BR -headers. -.P -The -.B -header defines the macros which expands to integer -constant expressions with distinct values: -.TP -.BR LIBCOOPGAMMA_SUCCESS " = 0" -Unmarshal was successful. -.TP -.BR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " > 0" -Unmarshal failed. The marshalled data was created -with a older version of libcoopgamma that does not -marshall the data in a compatible way. -.TP -.BR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " > 0" -Unmarshal failed. The marshalled data was created with -a newer version libcoopgamma that does not marshall -the data in a compatible way. -.TP -.BR LIBCOOPGAMMA_ERRNO_SET " < 0 (-1)" -Unmarshal failed because of an error, -.I errno -has been set appropriately. -.P -The -.B -header defines -.I "enum libcoopgamma_support" -with the alias -.I libcoopgamma_support_t -and the following distinct values: -.TP -.BR LIBCOOPGAMMA_NO " = 0" -Gamma adjustments are not supported. -.TP -.BR LIBCOOPGAMMA_MAYBE " = 1" -Don't know whether gamma adjustments are supported. -.TP -.BR LIBCOOPGAMMA_YES " = 2" -Gamma adjustments are supported. -.P -The -.B -header defines -.I "enum libcoopgamma_depth" -with the alias -.I libcoopgamma_depth_t -and the following distinct values: -.TP -.BR LIBCOOPGAMMA_UINT8 " = 8" -Gamma ramps with -.I uint8_t -as the stop-type are used -.RI ( libcoopgamma_ramps8_t ). -.TP -.BR LIBCOOPGAMMA_UINT16 " = 16" -Gamma ramps with -.I uint16_t -as the stop-type are used -.RI ( libcoopgamma_ramps16_t ). -.TP -.BR LIBCOOPGAMMA_UINT32 " = 32" -Gamma ramps with -.I uint32_t -as the stop-type are used -.RI ( libcoopgamma_ramps32_t ). -.TP -.BR LIBCOOPGAMMA_UINT64 " = 64" -Gamma ramps with -.I uint64_t -as the stop-type are used -.RI ( libcoopgamma_ramps64_t ). -.TP -.BR LIBCOOPGAMMA_FLOAT " < 0" -Gamma ramps with -.I float -as the stop-type are used -.RI ( libcoopgamma_rampsf_t ). -.TP -.BR LIBCOOPGAMMA_DOUBLE " < 0" -Gamma ramps with -.I double -as the stop-type are used -.RI ( libcoopgamma_rampsd_t ). -.P -The -.B -header defines -.I "enum libcoopgamma_lifespan" -with the alias -.I libcoopgamma_lifespan_t -and the following distinct values: -.TP -.BR LIBCOOPGAMMA_REMOVE " = 0" -Remove the filter now. -.TP -.BR LIBCOOPGAMMA_UNTIL_DEATH " > 0" -Remove the filter when disconnecting from the coopgamma -server, or even explicitly removed, whichever comes first. -.TP -.BR LIBCOOPGAMMA_UNTIL_REMOVAL " > 0" -Only remove the filter when it is explicitly requested. -.P -The -.B -header defines -.I "enum libcoopgamma_colourspace" -with the alias -.I libcoopgamma_colourspace_t -and the following distinct values: -.TP -.BR LIBCOOPGAMMA_UNKNOWN " = 0" -The monitor's colourspace is unknown. -.TP -.BR LIBCOOPGAMMA_SRGB " > 0" -The monitor uses sRGB as its colourspace. -.TP -.BR LIBCOOPGAMMA_RGB " > 0" -The monitor uses an RGB colourspace other than sRGB. -.TP -.BR LIBCOOPGAMMA_NON_RGB " > 0" -The monitor uses a non-RGB multicolour colourspace. -.TP -.BR LIBCOOPGAMMA_GREY " > 0" -The monitor uses a singlecolour scale colourspace, -possibility greyscale, or is monochrome. -.P -The -.B -header defines -.I "struct libcoopgamma_ramps8" -.RI ( libcoopgamma_ramps8_t ), -.I "struct libcoopgamma_ramps16" -.RI ( libcoopgamma_ramps16_t ), -.I "struct libcoopgamma_ramps32" -.RI ( libcoopgamma_ramps32_t ), -.I "struct libcoopgamma_ramps64" -.RI ( libcoopgamma_ramps64_t ), -.I "struct libcoopgamma_rampsf" -.RI ( libcoopgamma_rampsf_t ), -.I "struct libcoopgamma_rampsd" -.RI ( libcoopgamma_rampsd_t ), -with the following members, -where -.I type -is -.IR uint8_t , -.IR uint16_t , -.IR uint32_t , -.IR uint64_t , -.IR float , -and -.I double -for the respective structures: -.TP -.B "size_t red_size" - The number of stops in the red ramp. -.TP -.B "size_t green_size" -The number of stops in the green ramp. -.TP -.B "size_t blue_size" -The number of stops in the blue ramp. -.TP -.IB type " *red" -The red ramp. -.TP -.IB type " *green" -The green ramp. -.TP -.IB type " *blue" -The blue ramp. -.P -The -.B -header defines -.I "union libcoopgamma_ramps" -with alias -.I libcoopgamma_ramps_t -and the follow members: -.TP -.B "libcoopgamma_ramps8_t u8" -.TP -.B "libcoopgamma_ramps16_t u16" -.TP -.B "libcoopgamma_ramps32_t u32" -.TP -.B "libcoopgamma_ramps64_t u64" -.TP -.B "libcoopgamma_rampsf_t f" -.TP -.B "libcoopgamma_rampsd_t d" -.P -The -.B -header defines -.I "struct libcoopgamma_filter" -with alias -.I libcoopgamma_filter_t -and the follow members: -.TP -.B "int64_t priority" -The priority of the filter, higher priority is applied first. -The gamma correction should have priority 0. -.TP -.B "char *crtc" -The CRTC for which this filter shall be applied. -.TP -.B "char *class" -Identifier for the filter. The syntax must be -\(aq\fI${PACKAGE_NAME}\fP\fB::\fP\fI${COMMAND_NAME}\fP\fB::\fP\fI${RULE}\fP\(aq. -.TP -.B "enum libcoopgamma_lifespan lifespan" -When shall the filter be removed? -If this member's value is -.IR LIBCOOPGAMMA_REMOVE , -only -.I .crtc -and -.I .class -need also be defined. -.TP -.B "enum libcoopgamma_depth depth" -The data type and bit-depth of the ramp stops. -.TP -.B "union libcoopgamma_ramps ramps" -The gamma ramp adjustments of the filter. -.P -The -.B -header defines -.I "struct libcoopgamma_crtc_info" -with alias -.I libcoopgamma_crtc_info_t -and the follow members: -.TP -.B "int cooperative" -Is cooperative gamma server running? -.TP -.B "enum libcoopgamma_depth depth" -The data type and bit-depth of the ramp stops. -.TP -.B "enum libcoopgamma_support supported" -Is gamma adjustments supported on the CRTC? -If not, -.IR .depth , -.IR .red_size , -.IR .green_size , -and -.I .blue_size -are undefined. -.TP -.B "size_t red_size" - The number of stops in the red ramp. -.TP -.B "size_t green_size" -The number of stops in the green ramp. -.TP -.B "size_t blue_size" -The number of stops in the blue ramp. -.TP -.B "enum libcoopgamma_colourspace colourspace" -The monitor's colurspace. -.TP -.B "int have_gamut" -Is the gamut of the monitor known? -If, and only if, so, -.IR .red_x , -.IR .red_y , -.IR .green_x , -.IR .green_y , -.IR .blue_x , -.IR .blue_y , -.IR .white_x , -and -.IR .white_y -are set. Unless the monitor uses an -RGB colourspace, this value should -be false, but there is no guarantee -of this, you have to check that the -colourspace is an RGB colourspace. -.TP -.B "unsigned red_x" -The x-value (CIE xyY) of the monitor's -red colour, multiplied by 1024. -.TP -.B "unsigned red_y" -The y-value (CIE xyY) of the monitor's -red colour, multiplied by 1024. -.TP -.B "unsigned green_x" -The x-value (CIE xyY) of the monitor's -green colour, multiplied by 1024. -.TP -.B "unsigned green_y" -The y-value (CIE xyY) of the monitor's -green colour, multiplied by 1024. -.TP -.B "unsigned blue_x" -The x-value (CIE xyY) of the monitor's -blue colour, multiplied by 1024. -.TP -.B "unsigned blue_y" -The y-value (CIE xyY) of the monitor's -blue colour, multiplied by 1024. -.TP -.B "unsigned white_x" -The x-value (CIE xyY) of the monitor's -default white point, multiplied by 1024. -.TP -.B "unsigned white_y" -The y-value (CIE xyY) of the monitor's -default white point, multiplied by 1024. -.P -The -.B -header defines -.I "struct libcoopgamma_filter_query" -with alias -.I libcoopgamma_filter_query_t -and the follow members: -.TP -.B "int64_t high_priority" -Do no return filters with higher priority than this value. -.TP -.B "int64_t low_priority" -Do no return filters with lower priority than this value. -.TP -.B "char *crtc" -The CRTC for which the the current filters shall returned -.TP -.B "int coalesce" -Shall all selected filters be coalesced into one gamma ramp triplet? -.P -The -.B -header defines -.I "struct libcoopgamma_queried_filter" -with alias -.I libcoopgamma_queried_filter_t -and the follow members: -.TP -.B "int64_t priority" -The filter's priority. -.TP -.B "char *class" -The filter's class. -.TP -.B "union libcoopgamma_ramps ramps" -The gamma ramp adjustments of the filter -.P -The -.B -header defines -.I "struct libcoopgamma_filter_table" -with alias -.I libcoopgamma_filter_table_t -and the follow members: -.TP -.B "size_t red_size" -The number of stops in the red ramp. -.TP -.B "size_t green_size" -The number of stops in the green ramp. -.TP -.B "size_t blue_size" -The number of stops in the blue ramp. -.TP -.B "size_t filter_count" -The number of filters. -.TP -.B "struct libcoopgamma_queried_filter_t *filters" -The filters, should be ordered by priority -in descending order (applied first goes first, -applied last goes last), lest there is something -wrong with the coopgamma server. - -If filter coalition was requested, there will -be exactly one filter -.I "(.filter_count == 1)" -and -.I ".filters->class == NULL" -and -.I ".filters->priority" -is undefined. -.TP -.B "enum libcoopgamma_depth depth" -The data type and bit-depth of the ramp stops. -.P -The -.B -header defines -.I "struct libcoopgamma_error" -with alias -.I libcoopgamma_error_t -and the follow members: -.TP -.B "uint64_t number" -Error code. - -If -.I ".custom" -is false, 0 indicates success, -otherwise, 0 indicates that no -error code has been assigned. -.TP -.B "int custom" -Is this a custom error? -.TP -.B "int server_side" -Did the error occur on the server-side? -.TP -.B "char *description" -Error message, can be, and usually is, -.I NULL -if -.I ".custom" -is false. -.P -The -.B -header defines -.I "struct libcoopgamma_context" -with alias -.I libcoopgamma_context_t -and the follow members and a lot -if internal unlisted members: -.TP -.B "struct libcoopgamma_error error" -The error of the last failed function call -to function that documents that this member -will be set on failure. - -This member is undefined after successful -function call. -.TP -.B "int fd" -File descriptor for the socket that connects -the client to the server. -.P -The -.B -header defines -.I "struct libcoopgamma_async_context" -with alias -.I libcoopgamma_async_context_t. -This structure has only internal members. -.SH "SEE ALSO" -.BR libcoopgamma (7), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3), -.BR libcoopgamma_get_methods (3), -.BR libcoopgamma_get_method_and_site (3), -.BR libcoopgamma_get_pid_file (3), -.BR libcoopgamma_get_socket_file (3), -.BR libcoopgamma_connect (3) diff --git a/doc/man/libcoopgamma_async_context_destroy.3 b/doc/man/libcoopgamma_async_context_destroy.3 deleted file mode 100644 index 154ad77..0000000 --- a/doc/man/libcoopgamma_async_context_destroy.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH LIBCOOPGAMMA_ASYNC_CONTEXT_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_async_context_destroy - Deinitialise a libcoopgamma_async_context_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_async_context_destroy(libcoopgamma_async_context_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_async_context_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.SH "SEE ALSO" -.BR libcoopgamma_async_context_initialise (3), -.BR libcoopgamma_async_context_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_context_destroy (3) diff --git a/doc/man/libcoopgamma_async_context_initialise.3 b/doc/man/libcoopgamma_async_context_initialise.3 deleted file mode 100644 index 24cf859..0000000 --- a/doc/man/libcoopgamma_async_context_initialise.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH LIBCOOPGAMMA_ASYNC_CONTEXT_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_async_context_initialise - Initialise a libcoopgamma_async_context_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_async_context_initialise(libcoopgamma_async_context_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_async_context_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_async_context_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_async_context_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_async_context_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_async_context_destroy (3), -.BR libcoopgamma_async_context_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3) diff --git a/doc/man/libcoopgamma_async_context_marshal.3 b/doc/man/libcoopgamma_async_context_marshal.3 deleted file mode 100644 index e7197b8..0000000 --- a/doc/man/libcoopgamma_async_context_marshal.3 +++ /dev/null @@ -1,49 +0,0 @@ -.TH LIBCOOPGAMMA_ASYNC_CONTEXT_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_async_context_marshal - Marshal a libcoopgamma_async_context_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_async_context_marshal(libcoopgamma_async_context_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_async_context_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.SH "RETURN VALUES" -The -.BR libcoopgamma_async_context_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_async_context_destroy (3), -.BR libcoopgamma_async_context_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_context_marshal (3) diff --git a/doc/man/libcoopgamma_async_context_unmarshal.3 b/doc/man/libcoopgamma_async_context_unmarshal.3 deleted file mode 100644 index 5930980..0000000 --- a/doc/man/libcoopgamma_async_context_unmarshal.3 +++ /dev/null @@ -1,83 +0,0 @@ -.TH LIBCOOPGAMMA_ASYNC_CONTEXT_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_async_context_unmarshal - Unmarshal a libcoopgamma_async_context_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_async_context_unmarshal(libcoopgamma_async_context_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_async_context_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_async_context_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_async_context_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_async_context_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -No error is specified for the -.BR libcoopgamma_async_context_marshal () -function. -.SH "SEE ALSO" -.BR libcoopgamma_async_context_destroy (3), -.BR libcoopgamma_async_context_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_connect.3 b/doc/man/libcoopgamma_connect.3 deleted file mode 100644 index 594d43f..0000000 --- a/doc/man/libcoopgamma_connect.3 +++ /dev/null @@ -1,78 +0,0 @@ -.TH LIBCOOPGAMMA_CONNECT 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_connect - Connect to a coopgamma server -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_connect(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP, - libcoopgamma_context_t *restrict \fIctx\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_connect () -function connects to the instance coopgamma server -for the selected adjustment -.I method -and -.IR site . -If the server is not already running, it will be started. If -.I method -or -.I site -is -.IR NULL , -the it will selected automatically. -The state of the connection is stored in -.IR ctx , -which must be initialised but not already connected. -.I ctx -can be initialised with -.BR libcoopgamma_context_initialise (3). -.P -For the duration of the function call, -.I SIGCHLD -most neither be ignored nor blocked. It is the -user of this library's responsibility to ensure -this. The -.BR libcoopgamma_connect () -function will not temporarily reset handling of -.I SIGCHLD -itself. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_connect () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_connect () -function may fail for any reason specified for -.BR libcoopgamma_get_socket_file (3), -.BR socket (3), -.BR waitpid (3), -and -.BR connect (3). -The function may also fail for any of the -following reasons: -.TP -.B ENAMETOOLONG -The pathname of the socket was too long. -.TP -.B 0 -The server failed to initialise. -.SH "SEE ALSO" -.BR libcoopgamma_get_methods (3), -.BR libcoopgamma_get_pid_file (3), -.BR libcoopgamma_get_socket_file (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_set_gamma_send (3) diff --git a/doc/man/libcoopgamma_context_destroy.3 b/doc/man/libcoopgamma_context_destroy.3 deleted file mode 100644 index 0d144a8..0000000 --- a/doc/man/libcoopgamma_context_destroy.3 +++ /dev/null @@ -1,38 +0,0 @@ -.TH LIBCOOPGAMMA_CONTEXT_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_context_destroy - Deinitialise a libcoopgamma_context_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_context_destroy(libcoopgamma_context_t *restrict \fIthis\fP, int \fIdisconnect\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_context_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.P -If and only if -.I disconnect -is a nonzero value, the function will -disconnect from the coopgamma server. -.SH "SEE ALSO" -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_context_initialise.3 b/doc/man/libcoopgamma_context_initialise.3 deleted file mode 100644 index 367c0a9..0000000 --- a/doc/man/libcoopgamma_context_initialise.3 +++ /dev/null @@ -1,45 +0,0 @@ -.TH LIBCOOPGAMMA_CONTEXT_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_context_initialise - Initialise a libcoopgamma_context_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_context_initialise(libcoopgamma_context_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_context_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_context_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_context_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_context_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_async_context_initialise (3), -.BR libcoopgamma_connect (3) diff --git a/doc/man/libcoopgamma_context_marshal.3 b/doc/man/libcoopgamma_context_marshal.3 deleted file mode 100644 index aa7feea..0000000 --- a/doc/man/libcoopgamma_context_marshal.3 +++ /dev/null @@ -1,52 +0,0 @@ -.TH LIBCOOPGAMMA_CONTEXT_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_context_marshal - Marshal a libcoopgamma_context_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_context_marshal(libcoopgamma_context_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_context_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -However, it is probably nonsensical to send the -marshalled data to any other process than the -process itself since it contains a file descriptor. -.SH "RETURN VALUES" -The -.BR libcoopgamma_context_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_context_unmarshal.3 b/doc/man/libcoopgamma_context_unmarshal.3 deleted file mode 100644 index f805163..0000000 --- a/doc/man/libcoopgamma_context_unmarshal.3 +++ /dev/null @@ -1,86 +0,0 @@ -.TH LIBCOOPGAMMA_CONTEXT_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_context_unmarshal - Unmarshal a libcoopgamma_context_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_context_unmarshal(libcoopgamma_context_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_context_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_context_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_context_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_context_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -The -.BR libcoopgamma_context_marshal () -function may fail, and returned -.I LIBCOOPGAMMA_ERRNO_SET -for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_crtc_info_destroy.3 b/doc/man/libcoopgamma_crtc_info_destroy.3 deleted file mode 100644 index c67e81c..0000000 --- a/doc/man/libcoopgamma_crtc_info_destroy.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH LIBCOOPGAMMA_CRTC_INFO_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_crtc_info_destroy - Deinitialise a libcoopgamma_crtc_info_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_crtc_info_destroy(libcoopgamma_crtc_info_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_crtc_info_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.SH "SEE ALSO" -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_crtc_info_initialise.3 b/doc/man/libcoopgamma_crtc_info_initialise.3 deleted file mode 100644 index 84f167d..0000000 --- a/doc/man/libcoopgamma_crtc_info_initialise.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH LIBCOOPGAMMA_CRTC_INFO_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_crtc_info_initialise - Initialise a libcoopgamma_crtc_info_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_crtc_info_initialise(libcoopgamma_crtc_info_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_crtc_info_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_crtc_info_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_crtc_info_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_crtc_info_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3) diff --git a/doc/man/libcoopgamma_crtc_info_marshal.3 b/doc/man/libcoopgamma_crtc_info_marshal.3 deleted file mode 100644 index 2a8b294..0000000 --- a/doc/man/libcoopgamma_crtc_info_marshal.3 +++ /dev/null @@ -1,49 +0,0 @@ -.TH LIBCOOPGAMMA_CRTC_INFO_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_crtc_info_marshal - Marshal a libcoopgamma_crtc_info_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_crtc_info_marshal(libcoopgamma_crtc_info_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_crtc_info_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.SH "RETURN VALUES" -The -.BR libcoopgamma_crtc_info_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_crtc_info_unmarshal.3 b/doc/man/libcoopgamma_crtc_info_unmarshal.3 deleted file mode 100644 index 964b3b0..0000000 --- a/doc/man/libcoopgamma_crtc_info_unmarshal.3 +++ /dev/null @@ -1,83 +0,0 @@ -.TH LIBCOOPGAMMA_CRTC_INFO_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_crtc_info_unmarshal - Unmarshal a libcoopgamma_crtc_info_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_crtc_info_unmarshal(libcoopgamma_crtc_info_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_crtc_info_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_crtc_info_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_crtc_info_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_crtc_info_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -No error is specified for the -.BR libcoopgamma_crtc_info_marshal () -function. -.SH "SEE ALSO" -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_error_destroy.3 b/doc/man/libcoopgamma_error_destroy.3 deleted file mode 100644 index 978d0ad..0000000 --- a/doc/man/libcoopgamma_error_destroy.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH LIBCOOPGAMMA_ERROR_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_error_destroy - Deinitialise a libcoopgamma_error_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_error_destroy(libcoopgamma_error_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_error_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.SH "SEE ALSO" -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_error_initialise.3 b/doc/man/libcoopgamma_error_initialise.3 deleted file mode 100644 index fba20cf..0000000 --- a/doc/man/libcoopgamma_error_initialise.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH LIBCOOPGAMMA_ERROR_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_error_initialise - Initialise a libcoopgamma_error_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_error_initialise(libcoopgamma_error_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_error_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_error_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_error_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_error_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3) diff --git a/doc/man/libcoopgamma_error_marshal.3 b/doc/man/libcoopgamma_error_marshal.3 deleted file mode 100644 index f168a1c..0000000 --- a/doc/man/libcoopgamma_error_marshal.3 +++ /dev/null @@ -1,49 +0,0 @@ -.TH LIBCOOPGAMMA_ERROR_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_error_marshal - Marshal a libcoopgamma_error_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_error_marshal(libcoopgamma_error_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_error_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.SH "RETURN VALUES" -The -.BR libcoopgamma_error_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_error_unmarshal.3 b/doc/man/libcoopgamma_error_unmarshal.3 deleted file mode 100644 index b780cb2..0000000 --- a/doc/man/libcoopgamma_error_unmarshal.3 +++ /dev/null @@ -1,86 +0,0 @@ -.TH LIBCOOPGAMMA_ERROR_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_error_unmarshal - Unmarshal a libcoopgamma_error_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_error_unmarshal(libcoopgamma_error_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_error_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_error_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_error_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_error_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -The -.BR libcoopgamma_error_marshal () -function may fail, and returned -.I LIBCOOPGAMMA_ERRNO_SET -for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_filter_destroy.3 b/doc/man/libcoopgamma_filter_destroy.3 deleted file mode 100644 index e246da3..0000000 --- a/doc/man/libcoopgamma_filter_destroy.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_destroy - Deinitialise a libcoopgamma_filter_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_filter_destroy(libcoopgamma_filter_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.SH "SEE ALSO" -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_filter_initialise.3 b/doc/man/libcoopgamma_filter_initialise.3 deleted file mode 100644 index d2889b4..0000000 --- a/doc/man/libcoopgamma_filter_initialise.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_initialise - Initialise a libcoopgamma_filter_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_filter_initialise(libcoopgamma_filter_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_filter_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_filter_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_filter_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3) diff --git a/doc/man/libcoopgamma_filter_marshal.3 b/doc/man/libcoopgamma_filter_marshal.3 deleted file mode 100644 index 982802d..0000000 --- a/doc/man/libcoopgamma_filter_marshal.3 +++ /dev/null @@ -1,49 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_marshal - Marshal a libcoopgamma_filter_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_filter_marshal(libcoopgamma_filter_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.SH "RETURN VALUES" -The -.BR libcoopgamma_filter_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_filter_query_destroy.3 b/doc/man/libcoopgamma_filter_query_destroy.3 deleted file mode 100644 index 83e5561..0000000 --- a/doc/man/libcoopgamma_filter_query_destroy.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_QUERY_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_query_destroy - Deinitialise a libcoopgamma_filter_query_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_filter_query_destroy(libcoopgamma_filter_query_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_query_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.SH "SEE ALSO" -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_filter_query_initialise.3 b/doc/man/libcoopgamma_filter_query_initialise.3 deleted file mode 100644 index e2a8903..0000000 --- a/doc/man/libcoopgamma_filter_query_initialise.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_QUERY_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_query_initialise - Initialise a libcoopgamma_filter_query_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_filter_query_initialise(libcoopgamma_filter_query_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_query_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_filter_query_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_filter_query_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_filter_query_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3) diff --git a/doc/man/libcoopgamma_filter_query_marshal.3 b/doc/man/libcoopgamma_filter_query_marshal.3 deleted file mode 100644 index 83d560d..0000000 --- a/doc/man/libcoopgamma_filter_query_marshal.3 +++ /dev/null @@ -1,49 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_QUERY_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_query_marshal - Marshal a libcoopgamma_filter_query_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_filter_query_marshal(libcoopgamma_filter_query_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_query_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.SH "RETURN VALUES" -The -.BR libcoopgamma_filter_query_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_filter_query_unmarshal.3 b/doc/man/libcoopgamma_filter_query_unmarshal.3 deleted file mode 100644 index 8adc09a..0000000 --- a/doc/man/libcoopgamma_filter_query_unmarshal.3 +++ /dev/null @@ -1,86 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_QUERY_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_query_unmarshal - Unmarshal a libcoopgamma_filter_query_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_filter_query_unmarshal(libcoopgamma_filter_query_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_query_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_filter_query_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_filter_query_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_filter_query_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -The -.BR libcoopgamma_filter_query_marshal () -function may fail, and returned -.I LIBCOOPGAMMA_ERRNO_SET -for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_filter_table_destroy.3 b/doc/man/libcoopgamma_filter_table_destroy.3 deleted file mode 100644 index 9fa4d61..0000000 --- a/doc/man/libcoopgamma_filter_table_destroy.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_TABLE_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_table_destroy - Deinitialise a libcoopgamma_filter_table_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_filter_table_destroy(libcoopgamma_filter_table_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_table_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.SH "SEE ALSO" -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_filter_table_initialise.3 b/doc/man/libcoopgamma_filter_table_initialise.3 deleted file mode 100644 index 79ee8cf..0000000 --- a/doc/man/libcoopgamma_filter_table_initialise.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_TABLE_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_table_initialise - Initialise a libcoopgamma_filter_table_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_filter_table_initialise(libcoopgamma_filter_table_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_table_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_filter_table_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_filter_table_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_filter_table_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3) diff --git a/doc/man/libcoopgamma_filter_table_marshal.3 b/doc/man/libcoopgamma_filter_table_marshal.3 deleted file mode 100644 index bc17c8a..0000000 --- a/doc/man/libcoopgamma_filter_table_marshal.3 +++ /dev/null @@ -1,49 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_TABLE_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_table_marshal - Marshal a libcoopgamma_filter_table_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_filter_table_marshal(libcoopgamma_filter_table_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_table_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.SH "RETURN VALUES" -The -.BR libcoopgamma_filter_table_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_filter_table_unmarshal.3 b/doc/man/libcoopgamma_filter_table_unmarshal.3 deleted file mode 100644 index 3dd5cd2..0000000 --- a/doc/man/libcoopgamma_filter_table_unmarshal.3 +++ /dev/null @@ -1,86 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_TABLE_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_table_unmarshal - Unmarshal a libcoopgamma_filter_table_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_filter_table_unmarshal(libcoopgamma_filter_table_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_table_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_filter_table_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_filter_table_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_filter_table_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -The -.BR libcoopgamma_filter_table_marshal () -function may fail, and returned -.I LIBCOOPGAMMA_ERRNO_SET -for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_filter_unmarshal.3 b/doc/man/libcoopgamma_filter_unmarshal.3 deleted file mode 100644 index d9f1ee8..0000000 --- a/doc/man/libcoopgamma_filter_unmarshal.3 +++ /dev/null @@ -1,86 +0,0 @@ -.TH LIBCOOPGAMMA_FILTER_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_filter_unmarshal - Unmarshal a libcoopgamma_filter_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_filter_unmarshal(libcoopgamma_filter_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_filter_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_filter_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_filter_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_filter_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -The -.BR libcoopgamma_filter_marshal () -function may fail, and returned -.I LIBCOOPGAMMA_ERRNO_SET -for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_flush.3 b/doc/man/libcoopgamma_flush.3 deleted file mode 100644 index 8ffaae2..0000000 --- a/doc/man/libcoopgamma_flush.3 +++ /dev/null @@ -1,58 +0,0 @@ -.TH LIBCOOPGAMMA_FLUSH 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_flush - Send all pending outbound data -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_flush(libcoopgamma_context_t *restrict \fIctx\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_flush () -function sends all data on -.I ctx -that have not yet been sent because of -interruption or similar. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_flush () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_flush () -function may fail for any reason specified for -.BR send (3). -Particularly interesting exceptional -conditions, that are not errors proper, include -those indicated by the following values on -.IR errno : -.TP -.B EINTR -The function was interrupted by a signal. When -this happens, just resume be calling the functon -again. -.TP -.BR EAGAIN " or " EWOULDBLOCK -The communication is nonblocking and the buffer -between the server and the client is full, -and no more data can be queued without blocking. -When this happens, wait a short period of time -and call the function again to resume. -.BR select (3) -or similar function can be used to wait until -.I ctx->fd -is writable. -.SH "SEE ALSO" -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_connect (3), -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_set_gamma_send (3) diff --git a/doc/man/libcoopgamma_get_crtcs_recv.3 b/doc/man/libcoopgamma_get_crtcs_recv.3 deleted file mode 100644 index 02f8daa..0000000 --- a/doc/man/libcoopgamma_get_crtcs_recv.3 +++ /dev/null @@ -1,63 +0,0 @@ -.TH LIBCOOPGAMMA_GET_CRTCS_RECV 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_crtcs_recv - Receive a list of all available CRTC:s -.SH "SYNOPSIS" -.nf -#include - -char **libcoopgamma_get_crtcs_recv(libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_crtcs_recv () -function parses the response for the requests -sent using the -.BR libcoopgamma_get_crtcs_send () -function with the same -.I ctx -and -.I async -arguments. The -.I async -must have been selected by the last call to the -.BR libcoopgamma_synchronise (3) -function. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_crtcs_recv () -function returns a -.I NULL -terminated -list of all available CRTC:s. If possible, -the CRTC:s are named by the connected -monitors' EDID:s. None of the elements can -contain a NUL or LF byte. The elements in -the list are subpointers of the returned -pointer. The user shall free the returned -pointer, which effectively frees all its -elements. On error, -.I NULL -is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_crtcs_recv () -function may fail for any reason specified for -.BR malloc (3). -The function may also fail for the following reasons: -.TP -.B EBADMSG -The received message was corrupt. -.SH "SEE ALSO" -.BR libcoopgamma_async_context_destroy (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_crtcs_sync (3), -.BR libcoopgamma_get_gamma_info_recv (3), -.BR libcoopgamma_get_gamma_recv (3), -.BR libcoopgamma_set_gamma_recv (3) diff --git a/doc/man/libcoopgamma_get_crtcs_send.3 b/doc/man/libcoopgamma_get_crtcs_send.3 deleted file mode 100644 index 6afeed0..0000000 --- a/doc/man/libcoopgamma_get_crtcs_send.3 +++ /dev/null @@ -1,77 +0,0 @@ -.TH LIBCOOPGAMMA_GET_CRTCS_SEND 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_crtcs_send - Send a request for an enumeration of all available CRTC:s -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_crtcs_send(libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_crtcs_send () -function sends a request over the connection of -.I ctx -to the server for an enumeration of all available -CRTC:s (roughly, display devices). Information -about the request is stored in -.IR *async , -this information is used by -.BR libcoopgamma_synchronise (3) -to identify the response, and by -.BR libcoopgamma_get_crtcs_recv (3) -to parse the response. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_crtcs_send () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_crtcs_send () -function may fail for any reason specified for -.BR malloc (3), -.BR realloc (3), -or -.BR libcoopgamma_flush (3). -Particularly interesting exceptional -conditions, that are not errors proper, include -those indicated by the following values on -.IR errno : -.TP -.B EINTR -The function was interrupted by a signal. When -this happens, call -.BR libcoopgamma_flush (3) -to resume. -.TP -.BR EAGAIN " or " EWOULDBLOCK -The communication is nonblocking and the buffer -between the server and the client is full, -and no more data can be queued without blocking. -When this happens, wait a short period of time -and call -.BR libcoopgamma_flush (3) -to resume. -.BR select (3) -or similar function can be used to wait until -.I ctx->fd -is readable. -.TP -.B ECONNREST -The connection to the server has closed. -.SH "SEE ALSO" -.BR libcoopgamma_async_context_initialise (3), -.BR libcoopgamma_flush (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_get_crtcs_recv (3), -.BR libcoopgamma_get_crtcs_sync (3), -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_set_gamma_send (3) diff --git a/doc/man/libcoopgamma_get_crtcs_sync.3 b/doc/man/libcoopgamma_get_crtcs_sync.3 deleted file mode 100644 index 3a3eebf..0000000 --- a/doc/man/libcoopgamma_get_crtcs_sync.3 +++ /dev/null @@ -1,53 +0,0 @@ -.TH LIBCOOPGAMMA_GET_CRTCS_SYNC 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_crtcs_sync - Synchronously retrieve a list of all available CRTC:s -.SH "SYNOPSIS" -.nf -#include - -char **libcoopgamma_get_crtcs_sync(libcoopgamma_context_t *restrict \fIctx\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_crtcs_sync () -function synchronously retrieves a -list of all available CRTC:s over the -connection of -.I ctx -to the server. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_crtcs_sync () -function returns a -.I NULL -terminated -list of all available CRTC:s. If possible, -the CRTC:s are named by the connected -monitors' EDID:s. None of the elements can -contain a NUL or LF byte. The elements in -the list are subpointers of the returned -pointer. The user shall free the returned -pointer, which effectively frees all its -elements. On error, -.I NULL -is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_crtcs_send () -function may fail for any reason specified for -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_crtcs_recv (3), -.BR libcoopgamma_flush (3), -or -.BR libcoopgamma_synchronise (3). -.SH "SEE ALSO" -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_crtcs_recv (3), -.BR libcoopgamma_get_gamma_info_sync (3), -.BR libcoopgamma_get_gamma_sync (3), -.BR libcoopgamma_set_gamma_sync (3) diff --git a/doc/man/libcoopgamma_get_gamma_info_recv.3 b/doc/man/libcoopgamma_get_gamma_info_recv.3 deleted file mode 100644 index 1307fe5..0000000 --- a/doc/man/libcoopgamma_get_gamma_info_recv.3 +++ /dev/null @@ -1,150 +0,0 @@ -.TH LIBCOOPGAMMA_GET_GAMMA_INFO_RECV 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_gamma_info_recv - Receive metainformation about a CRTC's gamma ramps -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_gamma_info_recv(libcoopgamma_crtc_info_t *restrict \fIinfo\fP, - libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_gamma_info_recv () -function parses the response for the requests -sent using the -.BR libcoopgamma_get_gamma_info_send () -function with the same -.I ctx -and -.I async -arguments. The -.I async -must have been selected by the last call to the -.BR libcoopgamma_synchronise (3) -function. -.P -The information about the CRTC's gamma ramps -will be stored in -.IR *info . -In particular, -.I info->cooperative -will be set to nonzero (actually 1) if there is -a coopgamma server running, -.I info->supported -will be set to -.IR LIBCOOPGAMMA_NO , -.IR LIBCOOPGAMMA_MAYBE , -or -.IR LIBCOOPGAMMA_YES , -which ever describes the state of gamma ramp -support on the CRTC. Unless -.I info->supported -is -.IR LIBCOOPGAMMA_NO , -the following will also be set: -.TP -.I info->red_size -The number of stops on the red gamma ramp. -.TP -.I info->green_size -The number of stops on the green gamma ramp. -.TP -.I info->blue_size -The number of stops on the blue gamma ramp. -.TP -.I info->depth -Describes the gamma ramp types used for the CRTC. -.P -The -.BR libcoopgamma_get_gamma_info_recv () -will also store monitor's colourspace information in -.IR *info . -In particular, -.I info->colourspace -will be set to -.IR LIBCOOPGAMMA_SRGB , -.IR LIBCOOPGAMMA_RGB , -.IR LIBCOOPGAMMA_NON_RGB , -.IR LIBCOOPGAMMA_GREY , -or -.IR LIBCOOPGAMMA_UNKNOWN , -and -.I info->have_gamut -will be set to 1 or 0. -.I info->have_gamut -should be set to 0 unless -.I info->colourspace -is set to -.I LIBCOOPGAMMA_SRGB -or -.IR LIBCOOPGAMMA_RGB , -and it should be set to 1 if -.I info->colourspace -is set to -.I LIBCOOPGAMMA_SRGB , -however there are no guarantees that -this is true. If -.I info->have_gamut -is non-zero, the following will also be set: -.TP -.I info->red_x -The x-value (CIE xyY) of the monitor's -red colour, multiplied by 1024. -.TP -.I info->red_y -The y-value (CIE xyY) of the monitor's -red colour, multiplied by 1024. -.TP -.I info->green_x -The x-value (CIE xyY) of the monitor's -green colour, multiplied by 1024. -.TP -.I info->green_y -The y-value (CIE xyY) of the monitor's -green colour, multiplied by 1024. -.TP -.I info->blue_x -The x-value (CIE xyY) of the monitor's -blue colour, multiplied by 1024. -.TP -.I info->blue_y -The y-value (CIE xyY) of the monitor's -blue colour, multiplied by 1024. -.TP -.I info->white_x -The x-value (CIE xyY) of the monitor's -default white point, multiplied by 1024. -.TP -.I info->white_y -The y-value (CIE xyY) of the monitor's -default white point, multiplied by 1024. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_gamma_info_recv () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_gamma_info_recv () -function may fail for any reason specified for -.BR malloc (3). -The function may also fail for the following reasons: -.TP -.B EBADMSG -The received message was corrupt. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_async_context_destroy (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_get_gamma_info_sync (3), -.BR libcoopgamma_get_crtcs_recv (3), -.BR libcoopgamma_get_gamma_recv (3), -.BR libcoopgamma_set_gamma_recv (3) diff --git a/doc/man/libcoopgamma_get_gamma_info_send.3 b/doc/man/libcoopgamma_get_gamma_info_send.3 deleted file mode 100644 index 16a312d..0000000 --- a/doc/man/libcoopgamma_get_gamma_info_send.3 +++ /dev/null @@ -1,79 +0,0 @@ -.TH LIBCOOPGAMMA_GET_GAMMA_INFO_SEND 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_gamma_info_send - Send a request for metainfomation for a CRTC's gamma ramps -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_gamma_info_send(const char *restrict \fIcrtc\fP, libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_gamma_info_send () -function sends a request over the connection of -.I ctx -to the server for metainformation about a the -CRTC, with the name given in the -.I crtc -parameter, gamma ramps. Information about the -request is stored in -.IR *async , -this information is used by -.BR libcoopgamma_synchronise (3) -to identify the response, and by -.BR libcoopgamma_get_gamma_info_recv (3) -to parse the response. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_gamma_info_send () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_gamma_info_send () -function may fail for any reason specified for -.BR malloc (3), -.BR realloc (3), -or -.BR libcoopgamma_flush (3). -Particularly interesting exceptional -conditions, that are not errors proper, include -those indicated by the following values on -.IR errno : -.TP -.B EINTR -The function was interrupted by a signal. When -this happens, call -.BR libcoopgamma_flush (3) -to resume. -.TP -.BR EAGAIN " or " EWOULDBLOCK -The communication is nonblocking and the buffer -between the server and the client is full, -and no more data can be queued without blocking. -When this happens, wait a short period of time -and call -.BR libcoopgamma_flush (3) -to resume. -.BR select (3) -or similar function can be used to wait until -.I ctx->fd -is readable. -.TP -.B ECONNREST -The connection to the server has closed. -.SH "SEE ALSO" -.BR libcoopgamma_async_context_initialise (3), -.BR libcoopgamma_flush (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_get_gamma_info_recv (3), -.BR libcoopgamma_get_gamma_info_sync (3), -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_set_gamma_send (3) diff --git a/doc/man/libcoopgamma_get_gamma_info_sync.3 b/doc/man/libcoopgamma_get_gamma_info_sync.3 deleted file mode 100644 index 3187231..0000000 --- a/doc/man/libcoopgamma_get_gamma_info_sync.3 +++ /dev/null @@ -1,142 +0,0 @@ -.TH LIBCOOPGAMMA_GET_GAMMA_INFO_SYNC 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_gamma_info_sync - Synchronously retrieve metainformation about a CRTC's gamma ramps -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_gamma_info_sync(const char* restrict \fIcrtc\fP, - libcoopgamma_crtc_info_t* restrict \fIinfo\fP, - libcoopgamma_context_t *restrict \fIctx\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_gamma_info_sync () -function synchronously retrieves metainformation -about the CRTC's, whose name is -.IR crtc , -gamma ramps over the connection of -.I ctx -to the server. -.P -The information about the CRTC's gamma ramps -will be stored in -.IR *info . -In particular, -.I info->cooperative -will be set to nonzero (actually 1) if there is -a coopgamma server running, -.I info->supported -will be set to -.IR LIBCOOPGAMMA_NO , -.IR LIBCOOPGAMMA_MAYBE , -or -.IR LIBCOOPGAMMA_YES , -which ever describes the state of gamma ramp -support on the CRTC. Unless -.I info->supported -is -.IR LIBCOOPGAMMA_NO , -the following will also be set: -.TP -.I info->red_size -The number of stops on the red gamma ramp. -.TP -.I info->green_size -The number of stops on the green gamma ramp. -.TP -.I info->blue_size -The number of stops on the blue gamma ramp. -.TP -.I info->depth -Describes the gamma ramp types used for the CRTC. -.P -The -.BR libcoopgamma_get_gamma_info_sync () -will also store monitor's colourspace information in -.IR *info . -In particular, -.I info->colourspace -will be set to -.IR LIBCOOPGAMMA_SRGB , -.IR LIBCOOPGAMMA_RGB , -.IR LIBCOOPGAMMA_NON_RGB , -.IR LIBCOOPGAMMA_GREY , -or -.IR LIBCOOPGAMMA_UNKNOWN , -and -.I info->have_gamut -will be set to 1 or 0. -.I info->have_gamut -should be set to 0 unless -.I info->colourspace -is set to -.I LIBCOOPGAMMA_SRGB -or -.IR LIBCOOPGAMMA_RGB , -and it should be set to 1 if -.I info->colourspace -is set to -.I LIBCOOPGAMMA_SRGB , -however there are no guarantees that -this is true. If -.I info->have_gamut -is non-zero, the following will also be set: -.TP -.I info->red_x -The x-value (CIE xyY) of the monitor's -red colour, multiplied by 1024. -.TP -.I info->red_y -The y-value (CIE xyY) of the monitor's -red colour, multiplied by 1024. -.TP -.I info->green_x -The x-value (CIE xyY) of the monitor's -green colour, multiplied by 1024. -.TP -.I info->green_y -The y-value (CIE xyY) of the monitor's -green colour, multiplied by 1024. -.TP -.I info->blue_x -The x-value (CIE xyY) of the monitor's -blue colour, multiplied by 1024. -.TP -.I info->blue_y -The y-value (CIE xyY) of the monitor's -blue colour, multiplied by 1024. -.TP -.I info->white_x -The x-value (CIE xyY) of the monitor's -default white point, multiplied by 1024. -.TP -.I info->white_y -The y-value (CIE xyY) of the monitor's -default white point, multiplied by 1024. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_gamma_info_recv () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_gamma_info_send () -function may fail for any reason specified for -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_get_gamma_info_recv (3), -.BR libcoopgamma_flush (3), -or -.BR libcoopgamma_synchronise (3). -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_get_gamma_info_recv (3), -.BR libcoopgamma_get_crtcs_sync (3), -.BR libcoopgamma_get_gamma_sync (3), -.BR libcoopgamma_set_gamma_sync (3) diff --git a/doc/man/libcoopgamma_get_gamma_recv.3 b/doc/man/libcoopgamma_get_gamma_recv.3 deleted file mode 100644 index 5697a86..0000000 --- a/doc/man/libcoopgamma_get_gamma_recv.3 +++ /dev/null @@ -1,98 +0,0 @@ -.TH LIBCOOPGAMMA_GET_GAMMA_RECV 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_gamma_recv - Receive the gamma filter table for a CRTC -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_gamma_recv(libcoopgamma_filter_table_t *restrict \fItable\fP, - libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_gamma_recv () -function parses the response for the requests -sent using the -.BR libcoopgamma_get_gamma_send () -function with the same -.I ctx -and -.I async -arguments. The -.I async -must have been selected by the last call to the -.BR libcoopgamma_synchronise (3) -function. -.P -The filters will be stored in -.IR *table . -In particular, the number of filter (1 if coalesced) -will be stored to -.IR table->filter_count , -the filters themselves will be stored in -.IR table->filters . -Some metainformation sent by the server will also -be stored in -.IR *table : -.TP -.I info->red_size -The number of stops on the red gamma ramp. -.TP -.I info->green_size -The number of stops on the green gamma ramp. -.TP -.I info->blue_size -The number of stops on the blue gamma ramp. -.TP -.I info->depth -Describes the gamma ramp types used for the CRTC. -.P -For all -.I i -from 0 up to but exclusing -.IR table->filter_count , -Information about the filter applied -.IR i :th -is stored in -.IR table->filters[i] . -.I table->filters[i].ramps -is the gamma ramps for -.I i :th -the filter. Unless coalesced, -.I table->filters[i].priority -and -.I table->filters[i].class -is also set. -.I table->filters[i].priority -is the prority of the filter, and -.I table->filters[i].class -is the class (identifier) of the filter. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_gamma_recv () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_gamma_recv () -function may fail for any reason specified for -.BR malloc (3). -The function may also fail for the following reasons: -.TP -.B EBADMSG -The received message was corrupt. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_async_context_destroy (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_get_gamma_sync (3), -.BR libcoopgamma_get_crtcs_recv (3), -.BR libcoopgamma_get_gamma_info_recv (3), -.BR libcoopgamma_set_gamma_recv (3) diff --git a/doc/man/libcoopgamma_get_gamma_send.3 b/doc/man/libcoopgamma_get_gamma_send.3 deleted file mode 100644 index ee202da..0000000 --- a/doc/man/libcoopgamma_get_gamma_send.3 +++ /dev/null @@ -1,93 +0,0 @@ -.TH LIBCOOPGAMMA_GET_GAMMA_SEND 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_gamma_send - Send a request to retrieve a CRTC's gamma ramp filters -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_gamma_send(const libcoopgamma_filter_query_t *restrict \fIquery\fP, - libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_gamma_send () -function sends a request over the connection of -.I ctx -to the server to retrieve the -CRTC's, with the name given in -.IR query->crtc , -applied filters. Information about the -request is stored in -.IR *async , -this information is used by -.BR libcoopgamma_synchronise (3) -to identify the response, and by -.BR libcoopgamma_get_gamma_recv (3) -to parse the response. -.P -The response will include all filter with a -priority between -.I query->low_priority -and -.IR query->high_priority, -inclusively. If and only if -.I query->coalesce -is nonzero, the, from the selected filters, -resulting gamma ramps are returned -rather than a list of all selected filters. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_gamma_send () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_gamma_send () -function may fail for any reason specified for -.BR malloc (3), -.BR realloc (3), -or -.BR libcoopgamma_flush (3). -Particularly interesting exceptional -conditions, that are not errors proper, include -those indicated by the following values on -.IR errno : -.TP -.B EINTR -The function was interrupted by a signal. When -this happens, call -.BR libcoopgamma_flush (3) -to resume. -.TP -.BR EAGAIN " or " EWOULDBLOCK -The communication is nonblocking and the buffer -between the server and the client is full, -and no more data can be queued without blocking. -When this happens, wait a short period of time -and call -.BR libcoopgamma_flush (3) -to resume. -.BR select (3) -or similar function can be used to wait until -.I ctx->fd -is readable. -.TP -.B ECONNREST -The connection to the server has closed. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_async_context_initialise (3), -.BR libcoopgamma_flush (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_get_gamma_recv (3), -.BR libcoopgamma_get_gamma_sync (3), -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_set_gamma_send (3) diff --git a/doc/man/libcoopgamma_get_gamma_sync.3 b/doc/man/libcoopgamma_get_gamma_sync.3 deleted file mode 100644 index e46cecf..0000000 --- a/doc/man/libcoopgamma_get_gamma_sync.3 +++ /dev/null @@ -1,102 +0,0 @@ -.TH LIBCOOPGAMMA_GET_GAMMA_SYNC 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_gamma_sync - Synchronously retrieve a CRTC's filter table -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_gamma_sync(const libcoopgamma_filter_query_t* restrict \fIquery\fP, - libcoopgamma_filter_table_t* restrict \fItable\fpP, - libcoopgamma_context_t *restrict \fIctx\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_get_gamma_sync () -function synchronously retrieves the gamma ramp filter -table for the CRTC, whose name is -.IR query->crtc , -over the connection of -.I ctx -to the server. -.P -The response will include all filter with a -priority between -.I query->low_priority -and -.IR query->high_priority, -inclusively. If and only if -.I query->coalesce -is nonzero, the, from the selected filters, -resulting gamma ramps are returned -rather than a list of all selected filters. -.P -The filters will be stored in -.IR *table . -In particular, the number of filter (1 if coalesced) -will be stored to -.IR table->filter_count , -the filters themselves will be stored in -.IR table->filters . -Some metainformation sent by the server will also -be stored in -.IR *table : -.TP -.I info->red_size -The number of stops on the red gamma ramp. -.TP -.I info->green_size -The number of stops on the green gamma ramp. -.TP -.I info->blue_size -The number of stops on the blue gamma ramp. -.TP -.I info->depth -Describes the gamma ramp types used for the CRTC. -.P -For all -.I i -from 0 up to but exclusing -.IR table->filter_count , -Information about the filter applied -.IR i :th -is stored in -.IR table->filters[i] . -.I table->filters[i].ramps -is the gamma ramps for -.I i :th -the filter. Unless coalesced, -.I table->filters[i].priority -and -.I table->filters[i].class -is also set. -.I table->filters[i].priority -is the prority of the filter, and -.I table->filters[i].class -is the class (identifier) of the filter. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_gamma_recv () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_gamma_send () -function may fail for any reason specified for -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_get_gamma_recv (3), -.BR libcoopgamma_flush (3), -or -.BR libcoopgamma_synchronise (3). -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_get_gamma_recv (3), -.BR libcoopgamma_get_crtcs_sync (3), -.BR libcoopgamma_get_gamma_info_sync (3), -.BR libcoopgamma_set_gamma_sync (3) diff --git a/doc/man/libcoopgamma_get_method_and_site.3 b/doc/man/libcoopgamma_get_method_and_site.3 deleted file mode 100644 index 654db03..0000000 --- a/doc/man/libcoopgamma_get_method_and_site.3 +++ /dev/null @@ -1,105 +0,0 @@ -.TH LIBCOOPGAMMA_GET_METHOD_AND_SITE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_method_and_site - Get the adjustment method and site -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_get_method_and_site(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP, - char **restrict \fImethodp\fP, char **restrict \fIsitep\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -Newcomers need not concern themselves with the -.BR libcoopgamma_get_method_and_site () -function. -.P -The -.BR libcoopgamma_get_method_and_site () -function consults -.BR coopgammad (1) -to get the names the selected adjustment -.I method -and -.IR site . -If -.I method -or -.I site -is -.IR NULL , -the it will selected automatically. -.P -The name of selected adjustment method is -stored in -.I *methodp -unless -.I methodp -is -.IR NULL . -If the selected selected adjustment method does -not exist, the function fail unless the given -.I method -.P -The name of selected site is stored in -.I *sitep -unless -.I sitep -is -.IR NULL . -is a positive number. -.P -The user should free -.I *methodp -and -.IR *sitep . -.P -For the duration of the function call, -.I SIGCHLD -most neither be ignored nor blocked. It is the -user of this library's responsibility to ensure -this. The -.BR libcoopgamma_get_method_and_site () -function will not temporarily reset handling of -.I SIGCHLD -itself. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_method_and_site () -function returns 0. On error, -1 -is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_method_and_site () -function may fail for any reason specified for -.BR pipe (3), -.BR fork (3), -.BR dup2 (3), -.BR execvp (3), -.BR malloc (3), -.BR realloc (3), -.BR read (3) -(other than -.IR EINTR ), -and -.BR waitpid (3). -The function may also fail for any of the -following reasons: -.TP -.B EINVAL -If -.I method -contain an invalid adjustment method name. -.TP -.B EBADMSG -.BR coopgammad (1) -output invalid data to stdout. -.SH "SEE ALSO" -.BR libcoopgamma_get_methods (3), -.BR libcoopgamma_get_pid_file (3), -.BR libcoopgamma_get_socket_file (3), -.BR libcoopgamma_context_initialise (3) diff --git a/doc/man/libcoopgamma_get_methods.3 b/doc/man/libcoopgamma_get_methods.3 deleted file mode 100644 index b2ce807..0000000 --- a/doc/man/libcoopgamma_get_methods.3 +++ /dev/null @@ -1,65 +0,0 @@ -.TH LIBCOOPGAMMA_GET_METHODS 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_methods - List all recognised adjustment method -.SH "SYNOPSIS" -.nf -#include - -char **libcoopgamma_get_methods(void); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -Newcomers are advices to postpone learning the -.BR libcoopgamma_get_methods () -function until they have a functional program. -.P -The -.BR libcoopgamma_get_methods () -function consults -.BR coopgammad (1) -to construct a list of all adjustment method name -recognised by -.BR coopgammad (1). -.P -For the duration of the function call, -.I SIGCHLD -most neither be ignored nor blocked. It is the -user of this library's responsibility to ensure -this. The -.BR libcoopgamma_get_methods () -function will not temporarily reset handling of -.I SIGCHLD -itself. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_methods () -function returns a list of recognised -adjustment method name. The list is terminated -by a -.I NULL -element and will contain no other -.I NULL -elements. Elements in the list are subpointers -of the returned pointer and most not be freed. -The user shall however free the returned pointer, -effectively freeing all elements stored in the list. -On error, -.I NULL -is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_methods () -function may fail for any reason specified for -.BR malloc (3), -.BR realloc (3), -and -.BR libcoopgamma_get_method_and_site (3). -.SH "SEE ALSO" -.BR libcoopgamma_get_method_and_site (3), -.BR libcoopgamma_get_pid_file (3), -.BR libcoopgamma_get_socket_file (3), -.BR libcoopgamma_context_initialise (3) diff --git a/doc/man/libcoopgamma_get_pid_file.3 b/doc/man/libcoopgamma_get_pid_file.3 deleted file mode 100644 index 3d312ef..0000000 --- a/doc/man/libcoopgamma_get_pid_file.3 +++ /dev/null @@ -1,85 +0,0 @@ -.TH LIBCOOPGAMMA_GET_PID_FILE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_pid_file - Get the PID file of the coopgamma server -.SH "SYNOPSIS" -.nf -#include - -char *libcoopgamma_get_pid_file(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -Newcomers need not concern themselves with the -.BR libcoopgamma_get_pid_file () -function. -.P -The -.BR libcoopgamma_get_pid_file () -function consults -.BR coopgammad (1) -to get the pathname of the PID file for the -.BR coopgammad (1) -instance for the selected adjustment -.I method -and -.IR site . -If -.I method -or -.I site -is -.IR NULL , -the it will selected automatically. -.P -For the duration of the function call, -.I SIGCHLD -most neither be ignored nor blocked. It is the -user of this library's responsibility to ensure -this. The -.BR libcoopgamma_get_pid_file () -function will not temporarily reset handling of -.I SIGCHLD -itself. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_pid_file () -function returns the pathname of the PID file. -Success does not mean that the server is necessarily -running at the moment. The user should free -the returned pointer. On error, -.I NULL -is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_pid_file () -function may fail for any reason specified for -.BR pipe (3), -.BR fork (3), -.BR dup2 (3), -.BR execvp (3), -.BR malloc (3), -.BR realloc (3), -.BR read (3) -(other than -.IR EINTR ), -and -.BR waitpid (3). -The function may also fail for any of the -following reasons: -.TP -.B EINVAL -If -.I method -contain an invalid adjustment method name. -.TP -.B EBADMSG -.BR coopgammad (1) -output invalid data to stdout. -.SH "SEE ALSO" -.BR libcoopgamma_get_methods (3), -.BR libcoopgamma_get_socket_file (3), -.BR libcoopgamma_context_initialise (3) diff --git a/doc/man/libcoopgamma_get_socket_file.3 b/doc/man/libcoopgamma_get_socket_file.3 deleted file mode 100644 index f73f0ca..0000000 --- a/doc/man/libcoopgamma_get_socket_file.3 +++ /dev/null @@ -1,86 +0,0 @@ -.TH LIBCOOPGAMMA_GET_SOCKET_FILE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_get_socket_file - Get the socket file of the coopgamma server -.SH "SYNOPSIS" -.nf -#include - -char *libcoopgamma_get_socket_file(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -Newcomers need not concern themselves with the -.BR libcoopgamma_get_socket_file () -function. -.P -The -.BR libcoopgamma_get_socket_file () -function consults -.BR coopgammad (1) -to get the pathname of the socket for -communicating with the -.BR coopgammad (1) -instance for the selected adjustment -.I method -and -.IR site . -If -.I method -or -.I site -is -.IR NULL , -the it will selected automatically. -.P -For the duration of the function call, -.I SIGCHLD -most neither be ignored nor blocked. It is the -user of this library's responsibility to ensure -this. The -.BR libcoopgamma_get_socket_file () -function will not temporarily reset handling of -.I SIGCHLD -itself. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_get_socket_file () -function returns the pathname of the socket. -Success does not mean that the server is necessarily -running at the moment. The user should free -the returned pointer. On error, -.I NULL -is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_get_socket_file () -function may fail for any reason specified for -.BR pipe (3), -.BR fork (3), -.BR dup2 (3), -.BR execvp (3), -.BR malloc (3), -.BR realloc (3), -.BR read (3) -(other than -.IR EINTR ), -and -.BR waitpid (3). -The function may also fail for any of the -following reasons: -.TP -.B EINVAL -If -.I method -contain an invalid adjustment method name. -.TP -.B EBADMSG -.BR coopgammad (1) -output invalid data to stdout. -.SH "SEE ALSO" -.BR libcoopgamma_get_methods (3), -.BR libcoopgamma_get_pid_file (3), -.BR libcoopgamma_context_initialise (3) diff --git a/doc/man/libcoopgamma_queried_filter_destroy.3 b/doc/man/libcoopgamma_queried_filter_destroy.3 deleted file mode 100644 index 6847ac4..0000000 --- a/doc/man/libcoopgamma_queried_filter_destroy.3 +++ /dev/null @@ -1,33 +0,0 @@ -.TH LIBCOOPGAMMA_QUERIED_FILTER_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_queried_filter_destroy - Deinitialise a libcoopgamma_queried_filter_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_queried_filter_destroy(libcoopgamma_queried_filter_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_queried_filter_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.SH "SEE ALSO" -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_queried_filter_initialise.3 b/doc/man/libcoopgamma_queried_filter_initialise.3 deleted file mode 100644 index 79f2c59..0000000 --- a/doc/man/libcoopgamma_queried_filter_initialise.3 +++ /dev/null @@ -1,44 +0,0 @@ -.TH LIBCOOPGAMMA_QUERIED_FILTER_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_queried_filter_initialise - Initialise a libcoopgamma_queried_filter_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_queried_filter_initialise(libcoopgamma_queried_filter_t *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_queried_filter_initialise () -function initialises -.IR this . -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_queried_filter_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_queried_filter_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -There are no errors specified for the -.BR libcoopgamma_queried_filter_initialise () -function. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3) diff --git a/doc/man/libcoopgamma_queried_filter_marshal.3 b/doc/man/libcoopgamma_queried_filter_marshal.3 deleted file mode 100644 index 10b7ff7..0000000 --- a/doc/man/libcoopgamma_queried_filter_marshal.3 +++ /dev/null @@ -1,55 +0,0 @@ -.TH LIBCOOPGAMMA_QUERIED_FILTER_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_queried_filter_marshal - Marshal a libcoopgamma_queried_filter_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_queried_filter_marshal(libcoopgamma_queried_filter_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, libcoopgamma_depth_t \fIdepth\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_queried_filter_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.I depth -must describe the ramps in -.IR this , -or be 0. If -.I depth -is 0, the ramps are not marshalled. -.SH "RETURN VALUES" -The -.BR libcoopgamma_queried_filter_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_queried_filter_unmarshal.3 b/doc/man/libcoopgamma_queried_filter_unmarshal.3 deleted file mode 100644 index 01f1867..0000000 --- a/doc/man/libcoopgamma_queried_filter_unmarshal.3 +++ /dev/null @@ -1,91 +0,0 @@ -.TH LIBCOOPGAMMA_QUERIED_FILTER_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_queried_filter_unmarshal - Unmarshal a libcoopgamma_queried_filter_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_queried_filter_unmarshal(libcoopgamma_queried_filter_t *restrict \fIthis\fP, - void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP, - libcoopgamma_depth_t \fIdepth\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_queried_filter_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.I depth -must be the same value the parameter with the same -name had in the corresponding call to -.BR libcoopgamma_queried_filter_marshal (3). -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_queried_filter_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_queried_filter_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_queried_filter_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -The -.BR libcoopgamma_queried_filter_marshal () -function may fail, and returned -.I LIBCOOPGAMMA_ERRNO_SET -for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_ramps_destroy.3 b/doc/man/libcoopgamma_ramps_destroy.3 deleted file mode 100644 index 3d78d5d..0000000 --- a/doc/man/libcoopgamma_ramps_destroy.3 +++ /dev/null @@ -1,43 +0,0 @@ -.TH LIBCOOPGAMMA_RAMPS_DESTROY 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_ramps_destroy - Deinitialise a libcoopgamma_ramps_t -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_ramps_destroy(void *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_ramps_destroy () -function releases all resources allocated -to -.IR this . -The function does however not free the -allocation of the pointer -.IR this -itself. -.I this -must be of any of the following types: -.IR libcoopgamma_ramps_t , -.IR libcoopgamma_ramps8_t , -.IR libcoopgamma_ramps16_t , -.IR libcoopgamma_ramps32_t , -.IR libcoopgamma_ramps64_t , -.IR libcoopgamma_rampsf_t , -or -.IR libcoopgamma_rampsd_t . -.SH "SEE ALSO" -.BR libcoopgamma_ramps_initialise (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_destroy (3), -.BR libcoopgamma_crtc_info_destroy (3), -.BR libcoopgamma_filter_query_destroy (3), -.BR libcoopgamma_queried_filter_destroy (3), -.BR libcoopgamma_filter_table_destroy (3), -.BR libcoopgamma_error_destroy (3), -.BR libcoopgamma_context_destroy (3), -.BR libcoopgamma_async_context_destroy (3) diff --git a/doc/man/libcoopgamma_ramps_initialise.3 b/doc/man/libcoopgamma_ramps_initialise.3 deleted file mode 100644 index f6ee3d2..0000000 --- a/doc/man/libcoopgamma_ramps_initialise.3 +++ /dev/null @@ -1,62 +0,0 @@ -.TH LIBCOOPGAMMA_RAMPS_INITIALISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_ramps_initialise - Initialise a member type of libcoopgamma_ramps_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_ramps_initialise(void *restrict \fIthis\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_ramps_initialise () -function initialises -.IR this . -.I this -must be of any of the following types, and not casted -to any other type such as -.I void* -or -.IR libcoopgamma_ramps_t: -.IR libcoopgamma_ramps8_t , -.IR libcoopgamma_ramps16_t , -.IR libcoopgamma_ramps32_t , -.IR libcoopgamma_ramps64_t , -.IR libcoopgamma_rampsf_t , -or -.IR libcoopgamma_rampsd_t . -.P -The -.BR libcoopgamma_ramps_initialise () -function is defined as a macro. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_ramps_destroy (3). -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_ramps_initialise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_ramps_initialise () -function may fail for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_crtc_info_initialise (3), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_queried_filter_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_error_initialise (3), -.BR libcoopgamma_context_initialise (3), -.BR libcoopgamma_async_context_initialise (3) diff --git a/doc/man/libcoopgamma_ramps_marshal.3 b/doc/man/libcoopgamma_ramps_marshal.3 deleted file mode 100644 index aed8509..0000000 --- a/doc/man/libcoopgamma_ramps_marshal.3 +++ /dev/null @@ -1,66 +0,0 @@ -.TH LIBCOOPGAMMA_RAMPS_MARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_ramps_marshal - Marshal a member type of libcoopgamma_ramps_t -.SH "SYNOPSIS" -.nf -#include - -size_t libcoopgamma_ramps_marshal(void *restrict \fIthis\fP, void *restrict \fIbuffer\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_ramps_marshal () -function marshals -.I this -into a -.I buffer -that can be sent to another process on any computer -with a compatible processor. A compatible processor -is any processor with the same endianness, encoding -and sizes of the intrinsic data types and -.IR size_t . -.P -.I this -must be of any of the following types, and not casted -to any other type such as -.I void* -or -.IR libcoopgamma_ramps_t: -.IR libcoopgamma_ramps8_t , -.IR libcoopgamma_ramps16_t , -.IR libcoopgamma_ramps32_t , -.IR libcoopgamma_ramps64_t , -.IR libcoopgamma_rampsf_t , -or -.IR libcoopgamma_rampsd_t . -.P -The -.BR libcoopgamma_ramps_marshal () -function is defined as a macro. -.SH "RETURN VALUES" -The -.BR libcoopgamma_ramps_marshal () -function returns the number of bytes stored in the -.IR buffer , -or if -.I buffer -is -.IR NULL , -the the number of bytes that would have -been written if it was not -.IR NULL . -The function is always successful. -.SH "SEE ALSO" -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_ramps_unmarshal (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_crtc_info_marshal (3), -.BR libcoopgamma_filter_query_marshal (3), -.BR libcoopgamma_queried_filter_marshal (3), -.BR libcoopgamma_filter_table_marshal (3), -.BR libcoopgamma_error_marshal (3), -.BR libcoopgamma_context_marshal (3), -.BR libcoopgamma_async_context_marshal (3) diff --git a/doc/man/libcoopgamma_ramps_unmarshal.3 b/doc/man/libcoopgamma_ramps_unmarshal.3 deleted file mode 100644 index 34393cf..0000000 --- a/doc/man/libcoopgamma_ramps_unmarshal.3 +++ /dev/null @@ -1,100 +0,0 @@ -.TH LIBCOOPGAMMA_RAMPS_UNMARSHAL 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_ramps_unmarshal - Unmarshal a member type of libcoopgamma_ramps_t -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_ramps_unmarshal(void *restrict \fIthis\fP, void *restrict \fIbuffer\fP, - size_t *restrict \fIn\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_ramps_unmarshal () -function unmarshals -.I this -from a -.I buffer . -The number of read bytes from -.I buffer -is stored in -.I *n -on success. -.P -.I this -must be of any of the following types, and not casted -to any other type such as -.I void* -or -.IR libcoopgamma_ramps_t: -.IR libcoopgamma_ramps8_t , -.IR libcoopgamma_ramps16_t , -.IR libcoopgamma_ramps32_t , -.IR libcoopgamma_ramps64_t , -.IR libcoopgamma_rampsf_t , -or -.IR libcoopgamma_rampsd_t . -.P -None if the parameters may be -.IR NULL . -.I this -does not have to be initialised. -.P -On failure, -.I this -should be deinitialised using -.BR libcoopgamma_ramps_destroy (3). -.P -Undefined behaviour is invoked if the -beginning of -.I buffer -does not contain data stored by -.BR libcoopgamma_ramps_marshal (3). -.SH "RETURN VALUES" -The -.BR libcoopgamma_ramps_unmarshal () -function returns one of the following -values: -.TP -.IR LIBCOOPGAMMA_SUCCESS " (= 0)" -The function was successful. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" -The data in -.I buffer -was stored by an earlier version of -.BR libcoopgamma (7) -that is no longer supported. -.TP -.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" -The data in -.I buffer -was stored by a newer version of -.BR libcoopgamma (7) -that stores the data in an incompatible format. -.TP -.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" -An other error was encountered. -.I errno -has been set appropriately. -.SH "ERROR" -The -.BR libcoopgamma_ramps_marshal () -function may fail, and returned -.I LIBCOOPGAMMA_ERRNO_SET -for any reason specified for -.BR malloc (3). -.SH "SEE ALSO" -.BR libcoopgamma_ramps_destroy (3), -.BR libcoopgamma_ramps_marshal (3), -.BR libcoopgamma_filter_unmarshal (3), -.BR libcoopgamma_crtc_info_unmarshal (3), -.BR libcoopgamma_filter_query_unmarshal (3), -.BR libcoopgamma_queried_filter_unmarshal (3), -.BR libcoopgamma_filter_table_unmarshal (3), -.BR libcoopgamma_error_unmarshal (3), -.BR libcoopgamma_context_unmarshal (3), -.BR libcoopgamma_async_context_unmarshal (3) diff --git a/doc/man/libcoopgamma_set_gamma_recv.3 b/doc/man/libcoopgamma_set_gamma_recv.3 deleted file mode 100644 index 073343b..0000000 --- a/doc/man/libcoopgamma_set_gamma_recv.3 +++ /dev/null @@ -1,52 +0,0 @@ -.TH LIBCOOPGAMMA_SET_GAMMA_RECV 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_set_gamma_recv - Check whether a request to modify the filter table for a CRTC succeeded -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_set_gamma_recv(libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_set_gamma_recv () -function parses the response for the requests -sent using the -.BR libcoopgamma_set_gamma_send () -function with the same -.I ctx -and -.I async -arguments. The -.I async -must have been selected by the last call to the -.BR libcoopgamma_synchronise (3) -function. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_set_gamma_recv () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_set_gamma_recv () -function may fail for any reason specified for -.BR malloc (3). -The function may also fail for the following reasons: -.TP -.B EBADMSG -The received message was corrupt. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_async_context_destroy (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_set_gamma_send (3), -.BR libcoopgamma_set_gamma_sync (3), -.BR libcoopgamma_get_crtcs_recv (3), -.BR libcoopgamma_get_gamma_info_recv (3), -.BR libcoopgamma_get_gamma_recv (3) diff --git a/doc/man/libcoopgamma_set_gamma_send.3 b/doc/man/libcoopgamma_set_gamma_send.3 deleted file mode 100644 index 18c13f0..0000000 --- a/doc/man/libcoopgamma_set_gamma_send.3 +++ /dev/null @@ -1,140 +0,0 @@ -.TH LIBCOOPGAMMA_SET_GAMMA_SEND 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_set_gamma_send - Send a request to add, update, or remove a gamma ramp filter for CRTC -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_set_gamma_send(const libcoopgamma_filter_t *restrict \fIfilter\fP, - libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIasync\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_set_gamma_send () -function sends a request over the connection of -.I ctx -to add, update, or remove a gamma ramp filter for -the CRTC with the name given in -.IR filter->crtc . -Information about the request is stored in -.IR *async , -this information is used by -.BR libcoopgamma_synchronise (3) -to identify the response, and by -.BR libcoopgamma_get_gamma_recv (3) -to parse the response. -.P -A filter with the class (identifier) -.I filter->class -is removed if -.I filter->lifespan -is -.IR LIBCOOPGAMMA_REMOVE . -If -.I filter->lifespan -is not -.IR LIBCOOPGAMMA_REMOVE , -a filter with matching class is updated -if such filter exists, otherwise the filter is -added. The fitler, unless it is removed, is -inserted or moved to the priority specified by -.IR filter->priority . -.I filter->priority -is isregarded when -.I filter->lifespan -is -.IR LIBCOOPGAMMA_REMOVE . -A filter with high priority is applied before -a fitler with low priority. The filter is removed -when it is explicit removed used -.IR LIBCOOPGAMMA_REMOVE , -or if -.I filter->lifespan -is -.IR LIBCOOPGAMMA_UNTIL_DEATH , -when the client that last added or updated -the filter disconnects from the server, which -ever comes first. Note that, when updating a -filter, the lifespan is updated to -.IR filter->lifespan . -.P -The class -.RI ( filter->class ) -must be of the format -\fI${PACKAGE_NAME}\fP\fB::\fP\fI${COMMAND_NAME}\fP\fB::\fP\fI${RULE}\fP, -where -.I ${PACKAGE_NAME} -is the name of the package as installed on the system, -the program should make it easy to adjust this; -.I ${COMMAND_NAME} -is the name of the program, this too should not -easily adjustable, and -.I ${RULE} -is a string that identifies filter uniquely within -the program, or can be hardcoded or runtime -configurable. -.P -Unless -.I filter->lifespan -is -.IR LIBCOOPGAMMA_REMOVE , -.I filter->depth -and -.I filter->ramps -must be configured to specified the desired ramp values. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_set_gamma_send () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_set_gamma_send () -function may fail for any reason specified for -.BR malloc (3), -.BR realloc (3), -or -.BR libcoopgamma_flush (3). -Particularly interesting exceptional -conditions, that are not errors proper, include -those indicated by the following values on -.IR errno : -.TP -.B EINTR -The function was interrupted by a signal. When -this happens, call -.BR libcoopgamma_flush (3) -to resume. -.TP -.BR EAGAIN " or " EWOULDBLOCK -The communication is nonblocking and the buffer -between the server and the client is full, -and no more data can be queued without blocking. -When this happens, wait a short period of time -and call -.BR libcoopgamma_flush (3) -to resume. -.BR select (3) -or similar function can be used to wait until -.I ctx->fd -is readable. -.TP -.B ECONNREST -The connection to the server has closed. -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_initialise (3), -.BR libcoopgamma_async_context_initialise (3), -.BR libcoopgamma_flush (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_set_gamma_recv (3), -.BR libcoopgamma_set_gamma_sync (3), -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_set_gamma_send (3) diff --git a/doc/man/libcoopgamma_set_gamma_sync.3 b/doc/man/libcoopgamma_set_gamma_sync.3 deleted file mode 100644 index e65e345..0000000 --- a/doc/man/libcoopgamma_set_gamma_sync.3 +++ /dev/null @@ -1,105 +0,0 @@ -.TH LIBCOOPGAMMA_SET_GAMMA_SYNC 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_set_gamma_sync - Synchronously modify a CRTC's filter table -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_set_gamma_sync(const libcoopgamma_filter_t* restrict \fIfilter\fP, - libcoopgamma_context_t *restrict \fIctx\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_set_gamma_sync () -function synchronously adds, updates, or removes -a filter to, in, or from the CTRC's, whose name is -.IR filter->crtc , -filter table, over the connection of -.I ctx -to the server. -.P -A filter with the class (identifier) -.I filter->class -is removed if -.I filter->lifespan -is -.IR LIBCOOPGAMMA_REMOVE . -If -.I filter->lifespan -is not -.IR LIBCOOPGAMMA_REMOVE , -a filter with matching class is updated -if such filter exists, otherwise the filter is -added. The fitler, unless it is removed, is -inserted or moved to the priority specified by -.IR filter->priority . -.I filter->priority -is isregarded when -.I filter->lifespan -is -.IR LIBCOOPGAMMA_REMOVE . -A filter with high priority is applied before -a fitler with low priority. The filter is removed -when it is explicit removed used -.IR LIBCOOPGAMMA_REMOVE , -or if -.I filter->lifespan -is -.IR LIBCOOPGAMMA_UNTIL_DEATH , -when the client that last added or updated -the filter disconnects from the server, which -ever comes first. Note that, when updating a -filter, the lifespan is updated to -.IR filter->lifespan . -.P -The class -.RI ( filter->class ) -must be of the format -\fI${PACKAGE_NAME}\fP\fB::\fP\fI${COMMAND_NAME}\fP\fB::\fP\fI${RULE}\fP, -where -.I ${PACKAGE_NAME} -is the name of the package as installed on the system, -the program should make it easy to adjust this; -.I ${COMMAND_NAME} -is the name of the program, this too should not -easily adjustable, and -.I ${RULE} -is a string that identifies filter uniquely within -the program, or can be hardcoded or runtime -configurable. -.P -Unless -.I filter->lifespan -is -.IR LIBCOOPGAMMA_REMOVE , -.I filter->depth -and -.I filter->ramps -must be configured to specified the desired ramp values. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_set_gamma_recv () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_set_gamma_send () -function may fail for any reason specified for -.BR libcoopgamma_set_gamma_send (3), -.BR libcoopgamma_set_gamma_recv (3), -.BR libcoopgamma_flush (3), -or -.BR libcoopgamma_synchronise (3). -.SH "SEE ALSO" -.BR libcoopgamma.h (0), -.BR libcoopgamma_filter_query_initialise (3), -.BR libcoopgamma_filter_table_initialise (3), -.BR libcoopgamma_set_gamma_send (3), -.BR libcoopgamma_set_gamma_recv (3), -.BR libcoopgamma_get_crtcs_sync (3), -.BR libcoopgamma_get_gamma_info_sync (3), -.BR libcoopgamma_get_gamma_sync (3) diff --git a/doc/man/libcoopgamma_set_nonblocking.3 b/doc/man/libcoopgamma_set_nonblocking.3 deleted file mode 100644 index 7e6ceb6..0000000 --- a/doc/man/libcoopgamma_set_nonblocking.3 +++ /dev/null @@ -1,49 +0,0 @@ -.TH LIBCOOPGAMMA_SET_NONBLOCKING 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_set_nonblocking - Switch to or from nonblocking communication -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_set_nonblocking(libcoopgamma_context_t *restrict \fIctx\fP, int \fInonblocking\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_set_nonblocking () -function sets the communication with the server for -the connection of -.I ctx -to be nonblocking if -.I nonblocking -is nonzero, -and to be block otherwise. -.I ctx -must already be connected to the server, -which is achieved by calling the -.BR libcoopgamma_connect (3) -functon. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_set_nonblocking () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_connect () -function may fail for any reason specified for -.BR fcntl (3) -with -.I F_GETFL -or -.I F_SETFL -as the second argument. -.SH "SEE ALSO" -.BR libcoopgamma_connect (3), -.BR libcoopgamma_get_crtcs_send (3), -.BR libcoopgamma_get_gamma_info_send (3), -.BR libcoopgamma_get_gamma_send (3), -.BR libcoopgamma_set_gamma_send (3) diff --git a/doc/man/libcoopgamma_skip_message.3 b/doc/man/libcoopgamma_skip_message.3 deleted file mode 100644 index 13eb6cc..0000000 --- a/doc/man/libcoopgamma_skip_message.3 +++ /dev/null @@ -1,30 +0,0 @@ -.TH LIBCOOPGAMMA_SKIP_MESSAGE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_skip_message - Skip a received message -.SH "SYNOPSIS" -.nf -#include - -void libcoopgamma_skip_message(libcoopgamma_context_t *restrict \fIctx\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_skip_message () -function is used to tell the library that you -are not interested in a message recieved for -.IR ctx . -This can be the case if -.BR libcoopgamma_synchronise (3) -selected an asynchronous call context that -is inactive. -.SH "SEE ALSO" -.BR libcoopgamma_flush (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_synchronise (3), -.BR libcoopgamma_get_crtcs_sync (3), -.BR libcoopgamma_get_gamma_info_sync (3), -.BR libcoopgamma_get_gamma_sync (3), -.BR libcoopgamma_set_gamma_sync (3) diff --git a/doc/man/libcoopgamma_synchronise.3 b/doc/man/libcoopgamma_synchronise.3 deleted file mode 100644 index 70d2f63..0000000 --- a/doc/man/libcoopgamma_synchronise.3 +++ /dev/null @@ -1,94 +0,0 @@ -.TH LIBCOOPGAMMA_SYNCHRONISE 3 LIBCOOPGAMMA -.SH "NAME" -libcoopgamma_synchronise - Wait for the next message to be received -.SH "SYNOPSIS" -.nf -#include - -int libcoopgamma_synchronise(libcoopgamma_context_t *restrict \fIctx\fP, - libcoopgamma_async_context_t *restrict \fIpending\fP, - size_t \fIn\fP, size_t *restrict \fIselected\fP); -.fi -.P -Link with -.IR -lcoopgamma . -.SH "DESCRIPTION" -The -.BR libcoopgamma_synchronise () -function waits until the next message for -.I ctx -to be received and selects the context for the -asynchronous call for which the received message -is a response. -.I pending -shall list thes contexts for all pending asynchronous -call. The number of pending asynchronous call shall be -passed to the function via the -.I n -parameter. Once a full message as been received -.I *selected -is set to the index of the context in -.I pending -representing the context for the asynchronous call -to which the received message is a response. -.SH "RETURN VALUES" -Upon successful completion, the -.BR libcoopgamma_synchronise () -function returns 0. On error, -1 is returned and -.I errno -is set appropriately. -.SH "ERRORS" -The -.BR libcoopgamma_synchronise () -function may fail for any reason specified for -.BR realloc (3), -or -.BR recv (3). -Particularly interesting exceptional -conditions, that are not errors proper, include -those indicated by the following values on -.IR errno : -.TP -.B EINTR -The function was interrupted by a signal. When -this happens, just resume be calling the functon -again. -.TP -.BR EAGAIN " or " EWOULDBLOCK -The communication is nonblocking and no more -data is ready to be read, the buffer between -the server and the client has been depleted, -When this happens, wait a short period of time -and call the function again to resume. -.BR select (3) -or similar function can be used to wait until -.I ctx->fd -is readable. -.TP -.B ECONNREST -The connection to the server has closed. -.P -The function may also fail for the following reasons: -.TP -.B EBADMSG -A corrupt message has been received. Call the -function again to ge the next message. -.TP -.B ENOTRECOVERABLE -A corrupt message has been received. The corruption -is too severe for recovery. You may either exit -or disconnection and connection again. -.TP -0 -The receive message does not match any of the -.I n -first contexts in -.IR pending . -.SH "SEE ALSO" -.BR libcoopgamma_flush (3), -.BR libcoopgamma_set_nonblocking (3), -.BR libcoopgamma_skip_message (3), -.BR libcoopgamma_get_crtcs_recv (3), -.BR libcoopgamma_get_gamma_info_recv (3), -.BR libcoopgamma_get_gamma_recv (3), -.BR libcoopgamma_set_gamma_recv (3) diff --git a/libcoopgamma.7 b/libcoopgamma.7 new file mode 100644 index 0000000..2e11d27 --- /dev/null +++ b/libcoopgamma.7 @@ -0,0 +1,46 @@ +.TH LIBCOOPGAMMA 7 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma - Cooperative gamma library +.SH "DESCRIPTION" +.B libcoopgamma +is a C library that enables programs to communicate with +.BR coopgammad (1), +and eventually +.BR mds-coopgamma (1). +The advantage of using +.B libcoopgamma +over directly communicating with the display server is +you get support for multiple display servers transparently +(just like with +.BR libgamma (7)), +more importantly, all programs that use libcoopgamma can +change the gamma ramps without overriding each others +changes, they add their own filters. Filters are ordered +by their selected priority and chained together by the +cooperative gamma server +.RB ( coopgammad (1) +or +.BR mds-coopgamma (1)) +and the result is applied. A third advantage is that you +can choose when the filter shall be removed, this can +either be not until it is explicitly requested, or until +the client that add (or lasted modified) the filter +disconnects from the server or when explicitly requested, +whichever comes first. +.P +.B libcoopgamma +prints warnings and errors, that cannot be returned, +to stderr. It is preferred that you have a non-static +.I "char *" +with the name +.I argv0 +where the name of the process +.RI ( argv[0] ) +is stored. +.SH "RATIONALE" +One program cannot do everything and still be user friendly. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR coopgammad (1), +.BR gc-tools (7), +.BR libclut (7) diff --git a/libcoopgamma.c b/libcoopgamma.c new file mode 100644 index 0000000..30a68fe --- /dev/null +++ b/libcoopgamma.c @@ -0,0 +1,2538 @@ +/* See LICENSE file for copyright and license details. */ +#include "libcoopgamma.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#if !defined(COOPGAMMAD) +# define COOPGAMMAD "coopgammad" +#endif + + +#if defined(__clang__) +# pragma GCC diagnostic ignored "-Wdocumentation" +# pragma GCC diagnostic ignored "-Wcovered-switch-default" +# pragma GCC diagnostic ignored "-Wcast-align" +#endif + + +#if defined(__GNUC__) +# define NAME_OF_THE_PROCESS (argv0) +extern const char *argv0; +const char *argv0 __attribute__((weak)) = "libcoopgamma"; +#else +# define NAME_OF_THE_PROCESS ("libcoopgamma") +#endif + + + +#define SUBBUF\ + (buf ? &buf[off] : NULL) + +#define NNSUBBUF\ + (buf + off) + +#define MARSHAL_PROLOGUE\ + char *restrict buf = vbuf;\ + size_t off = 0; + +#define UNMARSHAL_PROLOGUE\ + const char *restrict buf = vbuf;\ + size_t off = 0; + +#define MARSHAL_EPILOGUE\ + return off + +#define UNMARSHAL_EPILOGUE\ + return *np = off, LIBCOOPGAMMA_SUCCESS + +#define marshal_prim(datum, type)\ + ((buf != NULL ? *(type *)&buf[off] = (datum) : 0), off += sizeof(type)) + +#define unmarshal_prim(datum, type)\ + ((datum) = *(const type *)&buf[off], off += sizeof(type)) + +#define marshal_version(version)\ + marshal_prim(version, int) + +#define unmarshal_version(version)\ + do {\ + int version__;\ + unmarshal_prim(version__, int);\ + if (version__ < (version))\ + return LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE;\ + if (version__ > (version))\ + return LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE;\ + } while (0) + +#define marshal_buffer(data, n)\ + ((buf ? (memcpy(buf + off, (data), (n)), 0) : 0), off += (n)) + +#define unmarshal_buffer(data, n)\ + do {\ + (data) = malloc(n);\ + if (!(data))\ + return LIBCOOPGAMMA_ERRNO_SET;\ + memcpy((data), &buf[off], (n));\ + off += (n);\ + } while (0) + +#define marshal_string(datum)\ + (!(datum) ? marshal_prim(0, char) :\ + (marshal_prim(1, char), marshal_buffer((datum), strlen(datum) + 1))) + +#define unmarshal_string(datum)\ + do {\ + char nonnull__;\ + unmarshal_prim(nonnull__, char);\ + if (nonnull__)\ + unmarshal_buffer((datum), strlen(buf + off) + 1);\ + else\ + (datum) = NULL;\ + } while (0) + + + +#define copy_errno(ctx)\ + (!errno ? NULL :\ + ((ctx)->error.number = (uint64_t)errno,\ + (ctx)->error.custom = 0,\ + (ctx)->error.server_side = 0,\ + free((ctx)->error.description),\ + (ctx)->error.description = NULL)) + + +#define SYNC_CALL(send_call, recv_call, fail_return)\ + libcoopgamma_async_context_t async;\ + if (send_call < 0) {\ + reflush:\ + if (errno != EINTR)\ + return fail_return;\ + if (libcoopgamma_flush(ctx) < 0)\ + goto reflush;\ + }\ + resync:\ + if (libcoopgamma_synchronise(ctx, &async, (size_t)1, &(size_t){0}) < 0) {\ + if (errno != EINTR && errno)\ + return fail_return;\ + goto resync;\ + }\ + return recv_call + + +#define INTEGRAL_DEPTHS\ + case LIBCOOPGAMMA_UINT8:\ + case LIBCOOPGAMMA_UINT16:\ + case LIBCOOPGAMMA_UINT32:\ + case LIBCOOPGAMMA_UINT64: + + + +/** + * Initialise a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` + * + * `this->red_size`, `this->green_size`, and `this->blue_size` must already be set + * + * @param this The record to initialise + * @param width The `sizeof(*(this->red))` + * @return Zero on success, -1 on error + */ +int +libcoopgamma_ramps_initialise_(void *restrict this, size_t width) +{ + libcoopgamma_ramps8_t *restrict this8 = (libcoopgamma_ramps8_t *restrict)this; + this8->red = this8->green = this8->blue = NULL; + this8->red = malloc((this8->red_size + this8->green_size + this8->blue_size) * width); + if (!this8->red) + return -1; + this8->green = this8->red + this8->red_size * width; + this8->blue = this8->green + this8->green_size * width; + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, + * `libcoopgamma_ramps32_t`, `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, + * `libcoopgamma_rampsd_t`, or `libcoopgamma_ramps_t`, the allocation of the record + * itself is not freed + * + * Always call this function after failed call to `libcoopgamma_ramps_initialise` + * or failed call to `libcoopgamma_ramps_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_ramps_destroy(void *restrict this) +{ + libcoopgamma_ramps8_t *restrict this8 = (libcoopgamma_ramps8_t *restrict)this; + free(this8->red); + this8->red = this8->green = this8->blue = NULL; +} + + +/** + * Marshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @param width The `sizeof(*(this->red))` + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_ramps_marshal_(const void *restrict this, void *restrict vbuf, size_t width) +{ + const libcoopgamma_ramps8_t *restrict this8 = (const libcoopgamma_ramps8_t *restrict)this; + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_RAMPS_VERSION); + marshal_prim(this8->red_size, size_t); + marshal_prim(this8->green_size, size_t); + marshal_prim(this8->blue_size, size_t); + marshal_buffer(this8->red, (this8->red_size + this8->green_size + this8->blue_size) * width); + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @param width The `sizeof(*(this->red))` + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_ramps_unmarshal_(void *restrict this, const void *restrict vbuf, + size_t *restrict np, size_t width) +{ + libcoopgamma_ramps8_t *restrict this8 = (libcoopgamma_ramps8_t *restrict)this; + UNMARSHAL_PROLOGUE; + unmarshal_version(LIBCOOPGAMMA_RAMPS_VERSION); + unmarshal_prim(this8->red_size, size_t); + unmarshal_prim(this8->green_size, size_t); + unmarshal_prim(this8->blue_size, size_t); + unmarshal_buffer(this8->red, (this8->red_size + this8->green_size + this8->blue_size) * width); + this8->green = this8->red + this8->red_size * width; + this8->blue = this8->green + this8->green_size * width; + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_filter_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_filter_initialise(libcoopgamma_filter_t *restrict this) +{ + memset(this, 0, sizeof(*this)); + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_filter_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_filter_initialise` + * or failed call to `libcoopgamma_filter_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_filter_destroy(libcoopgamma_filter_t *restrict this) +{ + free(this->crtc); + free(this->class); + free(this->ramps.u8.red); + memset(this, 0, sizeof(*this)); +} + + +/** + * Marshal a `libcoopgamma_filter_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_filter_marshal(const libcoopgamma_filter_t *restrict this, void *restrict vbuf) +{ + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_FILTER_VERSION); + marshal_version(LIBCOOPGAMMA_DEPTH_VERSION); + marshal_version(LIBCOOPGAMMA_LIFESPAN_VERSION); + marshal_prim(this->depth, libcoopgamma_depth_t); + marshal_prim(this->priority, int64_t); + marshal_string(this->crtc); + marshal_string(this->class); + marshal_prim(this->lifespan, libcoopgamma_lifespan_t); + switch (this->depth) { + case LIBCOOPGAMMA_UINT8: off += libcoopgamma_ramps_marshal(&this->ramps.u8, SUBBUF); break; + case LIBCOOPGAMMA_UINT16: off += libcoopgamma_ramps_marshal(&this->ramps.u16, SUBBUF); break; + case LIBCOOPGAMMA_UINT32: off += libcoopgamma_ramps_marshal(&this->ramps.u32, SUBBUF); break; + case LIBCOOPGAMMA_UINT64: off += libcoopgamma_ramps_marshal(&this->ramps.u64, SUBBUF); break; + case LIBCOOPGAMMA_FLOAT: off += libcoopgamma_ramps_marshal(&this->ramps.f, SUBBUF); break; + case LIBCOOPGAMMA_DOUBLE: off += libcoopgamma_ramps_marshal(&this->ramps.d, SUBBUF); break; + default: + break; + } + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_filter_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_filter_unmarshal(libcoopgamma_filter_t *restrict this, const void *restrict vbuf, size_t *restrict np) +{ + int r = LIBCOOPGAMMA_SUCCESS; + size_t n = 0; + UNMARSHAL_PROLOGUE; + memset(this, 0, sizeof(*this)); + unmarshal_version(LIBCOOPGAMMA_FILTER_VERSION); + unmarshal_version(LIBCOOPGAMMA_DEPTH_VERSION); + unmarshal_version(LIBCOOPGAMMA_LIFESPAN_VERSION); + unmarshal_prim(this->depth, libcoopgamma_depth_t); + unmarshal_prim(this->priority, int64_t); + unmarshal_string(this->crtc); + unmarshal_string(this->class); + unmarshal_prim(this->lifespan, libcoopgamma_lifespan_t); + switch (this->depth) { + case LIBCOOPGAMMA_UINT8: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u8), NNSUBBUF, &n); break; + case LIBCOOPGAMMA_UINT16: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u16), NNSUBBUF, &n); break; + case LIBCOOPGAMMA_UINT32: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u32), NNSUBBUF, &n); break; + case LIBCOOPGAMMA_UINT64: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u64), NNSUBBUF, &n); break; + case LIBCOOPGAMMA_FLOAT: r = libcoopgamma_ramps_unmarshal(&(this->ramps.f), NNSUBBUF, &n); break; + case LIBCOOPGAMMA_DOUBLE: r = libcoopgamma_ramps_unmarshal(&(this->ramps.d), NNSUBBUF, &n); break; + default: + break; + } + if (r != LIBCOOPGAMMA_SUCCESS) + return r; + off += n; + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_crtc_info_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_crtc_info_initialise(libcoopgamma_crtc_info_t *restrict this) +{ + memset(this, 0, sizeof(*this)); + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_crtc_info_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_crtc_info_initialise` + * or failed call to `libcoopgamma_crtc_info_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_crtc_info_destroy(libcoopgamma_crtc_info_t *restrict this) +{ + (void) this; +} + + +/** + * Marshal a `libcoopgamma_crtc_info_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_crtc_info_marshal(const libcoopgamma_crtc_info_t *restrict this, void *restrict vbuf) +{ + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_CRTC_INFO_VERSION); + marshal_version(LIBCOOPGAMMA_DEPTH_VERSION); + marshal_version(LIBCOOPGAMMA_SUPPORT_VERSION); + marshal_version(LIBCOOPGAMMA_COLOURSPACE_VERSION); + marshal_prim(this->cooperative, int); + marshal_prim(this->depth, libcoopgamma_depth_t); + marshal_prim(this->red_size, size_t); + marshal_prim(this->green_size, size_t); + marshal_prim(this->blue_size, size_t); + marshal_prim(this->supported, libcoopgamma_support_t); + marshal_prim(this->colourspace, libcoopgamma_colourspace_t); + marshal_prim(this->have_gamut, int); + marshal_prim(this->red_x, unsigned); + marshal_prim(this->red_y, unsigned); + marshal_prim(this->green_x, unsigned); + marshal_prim(this->green_y, unsigned); + marshal_prim(this->blue_x, unsigned); + marshal_prim(this->blue_y, unsigned); + marshal_prim(this->white_x, unsigned); + marshal_prim(this->white_y, unsigned); + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_crtc_info_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_crtc_info_unmarshal(libcoopgamma_crtc_info_t *restrict this, const void *restrict vbuf, size_t *restrict np) +{ + UNMARSHAL_PROLOGUE; + unmarshal_version(LIBCOOPGAMMA_CRTC_INFO_VERSION); + unmarshal_version(LIBCOOPGAMMA_DEPTH_VERSION); + unmarshal_version(LIBCOOPGAMMA_SUPPORT_VERSION); + unmarshal_version(LIBCOOPGAMMA_COLOURSPACE_VERSION); + unmarshal_prim(this->cooperative, int); + unmarshal_prim(this->depth, libcoopgamma_depth_t); + unmarshal_prim(this->red_size, size_t); + unmarshal_prim(this->green_size, size_t); + unmarshal_prim(this->blue_size, size_t); + unmarshal_prim(this->supported, libcoopgamma_support_t); + unmarshal_prim(this->colourspace, libcoopgamma_colourspace_t); + unmarshal_prim(this->have_gamut, int); + unmarshal_prim(this->red_x, unsigned); + unmarshal_prim(this->red_y, unsigned); + unmarshal_prim(this->green_x, unsigned); + unmarshal_prim(this->green_y, unsigned); + unmarshal_prim(this->blue_x, unsigned); + unmarshal_prim(this->blue_y, unsigned); + unmarshal_prim(this->white_x, unsigned); + unmarshal_prim(this->white_y, unsigned); + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_filter_query_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_filter_query_initialise(libcoopgamma_filter_query_t *restrict this) +{ + this->crtc = NULL; + this->coalesce = 0; + this->high_priority = INT64_MAX; + this->low_priority = INT64_MIN; + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_filter_query_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_filter_query_initialise` + * or failed call to `libcoopgamma_filter_query_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_filter_query_destroy(libcoopgamma_filter_query_t *restrict this) +{ + free(this->crtc); + this->crtc = NULL; +} + + +/** + * Marshal a `libcoopgamma_filter_query_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_filter_query_marshal(const libcoopgamma_filter_query_t *restrict this, void* restrict vbuf) +{ + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_FILTER_QUERY_VERSION); + marshal_string(this->crtc); + marshal_prim(this->coalesce, int); + marshal_prim(this->high_priority, int64_t); + marshal_prim(this->low_priority, int64_t); + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_filter_query_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_filter_query_unmarshal(libcoopgamma_filter_query_t *restrict this, const void *restrict vbuf, size_t *restrict np) +{ + UNMARSHAL_PROLOGUE; + this->crtc = NULL; + unmarshal_version(LIBCOOPGAMMA_FILTER_QUERY_VERSION); + unmarshal_string(this->crtc); + unmarshal_prim(this->coalesce, int); + unmarshal_prim(this->high_priority, int64_t); + unmarshal_prim(this->low_priority, int64_t); + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_queried_filter_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_queried_filter_initialise(libcoopgamma_queried_filter_t *restrict this) +{ + memset(this, 0, sizeof(*this)); + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_queried_filter_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_queried_filter_initialise` + * or failed call to `libcoopgamma_queried_filter_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_queried_filter_destroy(libcoopgamma_queried_filter_t *restrict this) +{ + free(this->class); + this->class = NULL; + libcoopgamma_ramps_destroy(&this->ramps.u8); +} + + +/** + * Marshal a `libcoopgamma_queried_filter_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @param depth The type used of ramp stops + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_queried_filter_marshal(const libcoopgamma_queried_filter_t *restrict this, + void *restrict vbuf, libcoopgamma_depth_t depth) +{ + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_QUERIED_FILTER_VERSION); + marshal_prim(this->priority, int64_t); + marshal_string(this->class); + switch (depth) { + case LIBCOOPGAMMA_UINT8: off += libcoopgamma_ramps_marshal(&this->ramps.u8, SUBBUF); break; + case LIBCOOPGAMMA_UINT16: off += libcoopgamma_ramps_marshal(&this->ramps.u16, SUBBUF); break; + case LIBCOOPGAMMA_UINT32: off += libcoopgamma_ramps_marshal(&this->ramps.u32, SUBBUF); break; + case LIBCOOPGAMMA_UINT64: off += libcoopgamma_ramps_marshal(&this->ramps.u64, SUBBUF); break; + case LIBCOOPGAMMA_FLOAT: off += libcoopgamma_ramps_marshal(&this->ramps.f, SUBBUF); break; + case LIBCOOPGAMMA_DOUBLE: off += libcoopgamma_ramps_marshal(&this->ramps.d, SUBBUF); break; + default: + break; + } + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_queried_filter_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @param depth The type used of ramp stops + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int libcoopgamma_queried_filter_unmarshal(libcoopgamma_queried_filter_t *restrict this, const void *restrict vbuf, + size_t *restrict np, libcoopgamma_depth_t depth) +{ + int r = LIBCOOPGAMMA_SUCCESS; + size_t n = 0; + UNMARSHAL_PROLOGUE; + memset(this, 0, sizeof(*this)); + unmarshal_version(LIBCOOPGAMMA_QUERIED_FILTER_VERSION); + unmarshal_prim(this->priority, int64_t); + unmarshal_string(this->class); + switch (depth) { + case LIBCOOPGAMMA_UINT8: r = libcoopgamma_ramps_unmarshal(&this->ramps.u8, NNSUBBUF, &n); break; + case LIBCOOPGAMMA_UINT16: r = libcoopgamma_ramps_unmarshal(&this->ramps.u16, NNSUBBUF, &n); break; + case LIBCOOPGAMMA_UINT32: r = libcoopgamma_ramps_unmarshal(&this->ramps.u32, NNSUBBUF, &n); break; + case LIBCOOPGAMMA_UINT64: r = libcoopgamma_ramps_unmarshal(&this->ramps.u64, NNSUBBUF, &n); break; + case LIBCOOPGAMMA_FLOAT: r = libcoopgamma_ramps_unmarshal(&this->ramps.f, NNSUBBUF, &n); break; + case LIBCOOPGAMMA_DOUBLE: r = libcoopgamma_ramps_unmarshal(&this->ramps.d, NNSUBBUF, &n); break; + default: + break; + } + if (r != LIBCOOPGAMMA_SUCCESS) + return r; + off += n; + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_filter_table_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_filter_table_initialise(libcoopgamma_filter_table_t *restrict this) +{ + memset(this, 0, sizeof(*this)); + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_filter_table_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_filter_table_initialise` + * or failed call to `libcoopgamma_filter_table_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_filter_table_destroy(libcoopgamma_filter_table_t *restrict this) +{ + while (this->filter_count) + libcoopgamma_queried_filter_destroy(this->filters + --this->filter_count); + free(this->filters); + this->filters = NULL; +} + + +/** + * Marshal a `libcoopgamma_filter_table_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_filter_table_marshal(const libcoopgamma_filter_table_t *restrict this, void *restrict vbuf) +{ + size_t i; + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_FILTER_TABLE_VERSION); + marshal_version(LIBCOOPGAMMA_DEPTH_VERSION); + marshal_prim(this->depth, libcoopgamma_depth_t); + marshal_prim(this->red_size, size_t); + marshal_prim(this->green_size, size_t); + marshal_prim(this->blue_size, size_t); + marshal_prim(this->filter_count, size_t); + for (i = 0; i < this->filter_count; i++) + off += libcoopgamma_queried_filter_marshal(&this->filters[i], SUBBUF, this->depth); + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_filter_table_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_filter_table_unmarshal(libcoopgamma_filter_table_t *restrict this, const void *restrict vbuf, size_t *restrict np) +{ + size_t i, n, fn; + int r; + UNMARSHAL_PROLOGUE; + this->filter_count = 0; + this->filters = NULL; + unmarshal_version(LIBCOOPGAMMA_FILTER_TABLE_VERSION); + unmarshal_version(LIBCOOPGAMMA_DEPTH_VERSION); + unmarshal_prim(this->depth, libcoopgamma_depth_t); + unmarshal_prim(this->red_size, size_t); + unmarshal_prim(this->green_size, size_t); + unmarshal_prim(this->blue_size, size_t); + unmarshal_prim(fn, size_t); + this->filters = malloc(fn * sizeof(*this->filters)); + if (!this->filters) + return LIBCOOPGAMMA_ERRNO_SET; + for (i = 0; i < fn; i++) { + r = libcoopgamma_queried_filter_unmarshal(&this->filters[i], NNSUBBUF, &n, this->depth); + if (r != LIBCOOPGAMMA_SUCCESS) + return r; + off += n; + this->filter_count += 1; + } + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_error_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_error_initialise(libcoopgamma_error_t *restrict this) +{ + this->number = 0; + this->custom = 0; + this->description = NULL; + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_error_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_error_initialise` + * or failed call to `libcoopgamma_error_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_error_destroy(libcoopgamma_error_t *restrict this) +{ + free(this->description); + this->description = NULL; +} + + +/** + * Marshal a `libcoopgamma_error_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_error_marshal(const libcoopgamma_error_t *restrict this, void *restrict vbuf) +{ + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_ERROR_VERSION); + marshal_prim(this->number, uint64_t); + marshal_prim(this->custom, int); + marshal_prim(this->server_side, int); + marshal_string(this->description); + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_error_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_error_unmarshal(libcoopgamma_error_t *restrict this, const void *restrict vbuf, size_t *restrict np) +{ + UNMARSHAL_PROLOGUE; + this->description = NULL; + unmarshal_version(LIBCOOPGAMMA_ERROR_VERSION); + unmarshal_prim(this->number, uint64_t); + unmarshal_prim(this->custom, int); + unmarshal_prim(this->server_side, int); + unmarshal_string(this->description); + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_context_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_context_initialise(libcoopgamma_context_t *restrict this) +{ + memset(this, 0, sizeof(*this)); + this->fd = -1; + this->blocking = 1; + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_context_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_context_initialise` + * or failed call to `libcoopgamma_context_unmarshal` + * + * @param this The record to destroy + * @param disconnect Disconnect from the server? + */ +void +libcoopgamma_context_destroy(libcoopgamma_context_t *restrict this, int disconnect) +{ + if (disconnect && this->fd >= 0) { + shutdown(this->fd, SHUT_RDWR); + close(this->fd); + } + this->fd = -1; + libcoopgamma_error_destroy(&this->error); + free(this->outbound); + free(this->inbound); + this->outbound = NULL; + this->inbound = NULL; +} + + +/** + * Marshal a `libcoopgamma_context_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_context_marshal(const libcoopgamma_context_t *restrict this, void *restrict vbuf) +{ + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_CONTEXT_VERSION); + marshal_prim(this->fd, int); + off += libcoopgamma_error_marshal(&this->error, SUBBUF); + marshal_prim(this->message_id, uint32_t); + marshal_prim(this->outbound_head - this->outbound_tail, size_t); + marshal_buffer(this->outbound + this->outbound_tail, this->outbound_head - this->outbound_tail); + marshal_prim(this->inbound_head - this->inbound_tail, size_t); + marshal_buffer(this->inbound + this->inbound_tail, this->inbound_head - this->inbound_tail); + marshal_prim(this->length, size_t); + marshal_prim(this->curline, size_t); + marshal_prim(this->in_response_to, uint32_t); + marshal_prim(this->have_all_headers, int); + marshal_prim(this->bad_message, int); + marshal_prim(this->blocking, int); + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_context_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_context_unmarshal(libcoopgamma_context_t *restrict this, const void *restrict vbuf, size_t *restrict np) +{ + size_t n; + int r; + UNMARSHAL_PROLOGUE; + memset(this, 0, sizeof(*this)); + unmarshal_version(LIBCOOPGAMMA_CONTEXT_VERSION); + unmarshal_prim(this->fd, int); + r = libcoopgamma_error_unmarshal(&this->error, NNSUBBUF, &n); + if (r != LIBCOOPGAMMA_SUCCESS) + return r; + off += n; + unmarshal_prim(this->message_id, uint32_t); + unmarshal_prim(this->outbound_head, size_t); + this->outbound_size = this->outbound_head; + unmarshal_buffer(this->outbound, this->outbound_head); + unmarshal_prim(this->inbound_head, size_t); + this->inbound_size = this->inbound_head; + unmarshal_buffer(this->inbound, this->inbound_head); + unmarshal_prim(this->length, size_t); + unmarshal_prim(this->curline, size_t); + unmarshal_prim(this->in_response_to, uint32_t); + unmarshal_prim(this->have_all_headers, int); + unmarshal_prim(this->bad_message, int); + unmarshal_prim(this->blocking, int); + UNMARSHAL_EPILOGUE; +} + + + +/** + * Initialise a `libcoopgamma_async_context_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +int +libcoopgamma_async_context_initialise(libcoopgamma_async_context_t *restrict this) +{ + this->message_id = 0; + this->coalesce = 0; + return 0; +} + + +/** + * Release all resources allocated to a `libcoopgamma_async_context_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_async_context_initialise` + * or failed call to `libcoopgamma_async_context_unmarshal` + * + * @param this The record to destroy + */ +void +libcoopgamma_async_context_destroy(libcoopgamma_async_context_t *restrict this) +{ + (void) this; +} + + +/** + * Marshal a `libcoopgamma_async_context_t` into a buffer + * + * @param this The record to marshal + * @param vbuf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +size_t +libcoopgamma_async_context_marshal(const libcoopgamma_async_context_t *restrict this, void *restrict vbuf) +{ + MARSHAL_PROLOGUE; + marshal_version(LIBCOOPGAMMA_ASYNC_CONTEXT_VERSION); + marshal_prim(this->message_id, uint32_t); + marshal_prim(this->coalesce, int); + MARSHAL_EPILOGUE; +} + + +/** + * Unmarshal a `libcoopgamma_async_context_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param vbuf The buffer with the marshalled record + * @param np Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +int +libcoopgamma_async_context_unmarshal(libcoopgamma_async_context_t *restrict this, const void *restrict vbuf, size_t *restrict np) +{ + UNMARSHAL_PROLOGUE; + unmarshal_version(LIBCOOPGAMMA_ASYNC_CONTEXT_VERSION); + unmarshal_prim(this->message_id, uint32_t); + unmarshal_prim(this->coalesce, int); + UNMARSHAL_EPILOGUE; +} + + + +/** + * List all recognised adjustment method + * + * SIGCHLD must not be ignored or blocked + * + * @return A `NULL`-terminated list of names. You should only free + * the outer pointer, inner pointers are subpointers of the + * outer pointer and cannot be freed. `NULL` on error. + */ +char ** +libcoopgamma_get_methods(void) +{ + char num[5]; /* The size is base on the fact that we have limited `n` in the loop below */ + char **methods = NULL; + char *method; + char **rc; + char *buffer; + int n = 0; + size_t size = 0; + void *new; + + methods = malloc(4 * sizeof(*methods)); + if (!methods) + goto fail; + + for (n = 0; n < 10000 /* just to be safe */; n++) { + if (n >= 4 && (n & -n) == n) { + new = realloc(methods, (size_t)(n << 1) * sizeof(*methods)); + if (!new) + goto fail; + methods = new; + } + sprintf(num, "%i", n); + if (libcoopgamma_get_method_and_site(num, NULL, &method, NULL)) + goto fail; + if (!strcmp(method, num)) { + free(method); + break; + } + methods[n] = method; + size += strlen(method) + 1; + } + + rc = malloc((size_t)(n + 1) * sizeof(char *) + size); + if (!rc) + goto fail; + buffer = ((char *)rc) + (size_t)(n + 1) * sizeof(char *); + rc[n] = NULL; + while (n--) { + rc[n] = buffer; + buffer = stpcpy(buffer, methods[n]) + 1; + free(methods[n]); + } + free(methods); + + return rc; + +fail: + while (n--) + free(methods[n]); + free(methods); + return NULL; +} + + +/** + * Run coopgammad with -q or -qq and return the response + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @param arg "-q" or "-qq", which shall be passed to coopgammad? + * @return The output of coopgammad, `NULL` on error. This + * will be NUL-terminated and will not contain any + * other `NUL` bytes. + */ +static char * +libcoopgamma_query(const char *restrict method, const char *restrict site, const char *restrict arg) +{ + const char *(args[7]) = {COOPGAMMAD, arg}; + size_t i = 2, n = 0, size = 0; + int pipe_rw[2] = { -1, -1 }; + pid_t pid; + int saved_errno, status; + char *msg = NULL; + ssize_t got; + void *new; + + if (method) args[i++] = "-m", args[i++] = method; + if (site) args[i++] = "-s", args[i++] = site; + args[i] = NULL; + + if (pipe(pipe_rw) < 0) + goto fail; + + switch ((pid = fork())) { + case -1: + goto fail; + + case 0: + /* Child */ + close(pipe_rw[0]); + if (pipe_rw[1] != STDOUT_FILENO) { + close(STDOUT_FILENO); + if (dup2(pipe_rw[1], STDOUT_FILENO) < 0) + goto fail_child; + close(pipe_rw[1]); + } +#if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wcast-qual" +#endif + execvp(COOPGAMMAD, (char* const*)(args)); +#if defined(__GNUC__) +# pragma GCC diagnostic pop +#endif + fail_child: + saved_errno = errno; + perror(NAME_OF_THE_PROCESS); + if (write(STDOUT_FILENO, &saved_errno, sizeof(int)) != sizeof(int)) + perror(NAME_OF_THE_PROCESS); + exit(1); + + default: + /* Parent */ + close(pipe_rw[1]), pipe_rw[1] = -1; + for (;;) { + if (n == size) { + new = realloc(msg, size = (n ? (n << 1) : 256)); + if (!new) + goto fail; + msg = new; + } + got = read(pipe_rw[0], msg + n, size - n); + if (got < 0) { + if (errno == EINTR) + continue; + goto fail; + } else if (got == 0) { + break; + } + n += (size_t)got; + } + close(pipe_rw[0]), pipe_rw[0] = -1; + if (waitpid(pid, &status, 0) < 0) + goto fail; + if (status) { + errno = EINVAL; + if (n == sizeof(int) && *(int *)msg) + errno = *(int*)msg; + } + break; + } + + if (n == size) { + new = realloc(msg, n + 1); + if (!new) + goto fail; + msg = new; + } + msg[n] = '\0'; + + if (strchr(msg, '\0') != msg + n) { + errno = EBADMSG; + goto fail; + } + + return msg; + +fail: + saved_errno = errno; + if (pipe_rw[0] >= 0) + close(pipe_rw[0]); + if (pipe_rw[1] >= 0) + close(pipe_rw[1]); + free(msg); + errno = saved_errno; + return NULL; +} + + +/** + * Get the adjustment method and site + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @param methodp Output pointer for the selected adjustment method, + * which cannot be `NULL`. It is safe to call + * this function with this parameter set to `NULL`. + * @param sitep Output pointer for the selected site, which will + * be `NULL` the method only supports one site or if + * `site == NULL` and no site can be selected + * automatically. It is safe to call this function + * with this parameter set to `NULL`. + * @return Zero on success, -1 on error + */ +int +libcoopgamma_get_method_and_site(const char *restrict method, const char *restrict site, + char **restrict methodp, char **restrict sitep) +{ + int saved_errno; + char *raw; + char *p; + char *q; + + raw = libcoopgamma_query(method, site, "-q"); + if (!raw) + return -1; + + if (methodp) *methodp = NULL; + if (sitep) *sitep = NULL; + + p = strchr(raw, '\n'); + if (!p) { + errno = EBADMSG; + goto fail; + } + *p++ = '\0'; + + if (methodp) { + *methodp = malloc(strlen(raw) + 1); + if (!*methodp) + goto fail; + strcpy(*methodp, raw); + } + + if (site && *(q = strchr(p, '\0') - 1)) { + if (*q != '\n') { + errno = EBADMSG; + goto fail; + } + *q = '\0'; + *sitep = malloc(strlen(p) + 1); + if (!*sitep) + goto fail; + strcpy(*sitep, p); + } + + free(raw); + return 0; + +fail: + saved_errno = errno; + if (methodp) { + free(*methodp); + *methodp = NULL; + } + free(raw); + errno = saved_errno; + return -1; +} + + +/** + * Get the PID file of the coopgamma server + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @return The pathname of the server's PID file, `NULL` on error + * or if there server does not use PID files. The later + * case is detected by checking that `errno` is set to 0. + */ +char * +libcoopgamma_get_pid_file(const char *restrict method, const char *restrict site) +{ + char *path; + size_t n; + + path = libcoopgamma_get_socket_file(method, site); + if (!path) + return NULL; + + n = strlen(path); + if (n < 7 || strcmp(path + n - 7, ".socket")) { + free(path); + errno = EBADMSG; + return NULL; + } + + strcpy(path + n - 7, ".pid"); + return path; +} + + +/** + * Get the socket file of the coopgamma server + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @return The pathname of the server's socket, `NULL` on error + * or if there server does have its own socket. The later + * case is detected by checking that `errno` is set to 0, + * and is the case when communicating with a server in a + * multi-server display server like mds. + */ +char * +libcoopgamma_get_socket_file(const char *restrict method, const char *restrict site) +{ + char *raw; + char *p; + + raw = libcoopgamma_query(method, site, "-qq"); + if (!raw) + return NULL; + + p = strchr(raw, '\0') - 1; + if (p < raw || *p != '\n') { + errno = EBADMSG; + goto fail; + } + *p = '\0'; + if (!*raw) { + errno = EBADMSG; + goto fail; + } + + return raw; +fail: + free(raw); + return NULL; +} + + + +/** + * Connect to a coopgamma server, and start it if necessary + * + * Use `libcoopgamma_context_destroy` to disconnect + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @param ctx The state of the library, must be initialised + * @return Zero on success, -1 on error. On error, `errno` is set + * to 0 if the server could not be initialised. + */ +int +libcoopgamma_connect(const char *restrict method, const char *restrict site, libcoopgamma_context_t *restrict ctx) +{ + const char *(args[6]) = {COOPGAMMAD}; + struct sockaddr_un address; + char* path; + int saved_errno; + int tries = 0, status; + pid_t pid; + size_t i = 1; + + ctx->blocking = 1; + + if (method) args[i++] = "-m", args[i++] = method; + if (site) args[i++] = "-s", args[i++] = site; + args[i] = NULL; + + path = libcoopgamma_get_socket_file(method, site); + if (!path) + return -1; + if (strlen(path) >= sizeof(address.sun_path)) { + free(path); + errno = ENAMETOOLONG; + return -1; + } + + address.sun_family = AF_UNIX; + strcpy(address.sun_path, path); + free(path); + if ((ctx->fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) + return -1; + +retry: + if (connect(ctx->fd, (struct sockaddr *)&address, (socklen_t)sizeof(address)) < 0) { + if ((errno == ECONNREFUSED || errno == ENOENT || errno == ENOTDIR) && !tries++) { + switch ((pid = fork())) { + case -1: + goto fail; + + case 0: + /* Child */ + close(ctx->fd); +#if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wcast-qual" +#endif + execvp(COOPGAMMAD, (char *const *)(args)); +#if defined(__GNUC__) +# pragma GCC diagnostic pop +#endif + perror(NAME_OF_THE_PROCESS); + exit(1); + + default: + /* Parent */ + if (waitpid(pid, &status, 0) < 0) + goto fail; + if (status) { + errno = 0; + goto fail; + } + break; + } + goto retry; + } + goto fail; + } + + return 0; + +fail: + saved_errno = errno; + close(ctx->fd); + ctx->fd = -1; + errno = saved_errno; + return -1; +} + + +/** + * By default communication is blocking, this function + * can be used to switch between blocking and nonblocking + * + * After setting the communication to nonblocking, + * `libcoopgamma_flush`, `libcoopgamma_synchronise` and + * and request-sending functions can fail with EAGAIN and + * EWOULDBLOCK. It is safe to continue with `libcoopgamma_flush` + * (for `libcoopgamma_flush` it selfand equest-sending functions) + * or `libcoopgamma_synchronise` just like EINTR failure. + * + * @param ctx The state of the library, must be connected + * @param nonblocking Nonblocking mode? + * @return Zero on success, -1 on error + */ +int +libcoopgamma_set_nonblocking(libcoopgamma_context_t *restrict ctx, int nonblocking) +{ + int flags = fcntl(ctx->fd, F_GETFL); + if (flags == -1) + return -1; + if (nonblocking) + flags |= O_NONBLOCK; + else + flags &= ~O_NONBLOCK; + if (fcntl(ctx->fd, F_SETFL, flags) == -1) + return -1; + ctx->blocking = !nonblocking; + return 0; +} + + +/** + * Send all pending outbound data + * + * If this function or another function that sends a request + * to the server fails with EINTR, call this function to + * complete the transfer. The `async` parameter will always + * be in a properly configured state if a function fails + * with EINTR. + * + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error + */ +int +libcoopgamma_flush(libcoopgamma_context_t *restrict ctx) +{ + ssize_t sent; + size_t chunksize = ctx->outbound_head - ctx->outbound_tail; + size_t sendsize; + + while (ctx->outbound_tail < ctx->outbound_head) { + sendsize = ctx->outbound_head - ctx->outbound_tail; + sendsize = sendsize < chunksize ? sendsize : chunksize; + sent = send(ctx->fd, ctx->outbound + ctx->outbound_tail, sendsize, MSG_NOSIGNAL); + if (sent < 0) { + if (errno == EPIPE) + errno = ECONNRESET; + if (errno != EMSGSIZE) + return -1; + if (!(chunksize >>= 1)) + return -1; + continue; + } + +#ifdef DEBUG_MODE + fprintf(stderr, "\033[31m"); + fwrite(ctx->outbound + ctx->outbound_tail, (size_t)sent, 1, stderr); + fprintf(stderr, "\033[m"); + fflush(stderr); +#endif + + ctx->outbound_tail += (size_t)sent; + } + + return 0; +} + + +/** + * Wait for the next message to be received + * + * @param ctx The state of the library, must be connected + * @param pending Information for each pending request + * @param n The number of elements in `pending` + * @param selected The index of the element in `pending` which corresponds + * to the first inbound message, note that this only means + * that the message is not for any of the other request, + * if the message is corrupt any of the listed requests can + * be selected even if it is not for any of the requests. + * Functions that parse the message will detect such corruption. + * @return Zero on success, -1 on error. If the the message is ignored, + * which happens if corresponding `libcoopgamma_async_context_t` + * is not listed, -1 is returned and `errno` is set to 0. If -1 + * is returned, `errno` is set to `ENOTRECOVERABLE` you have + * received a corrupt message and the context has been tainted + * beyond recover. + */ +int +libcoopgamma_synchronise(libcoopgamma_context_t *restrict ctx, libcoopgamma_async_context_t *restrict pending, + size_t n, size_t *restrict selected) +{ + char temp[3 * sizeof(size_t) + 1]; + ssize_t got; + size_t i; + char *p; + char *line; + char *value; + struct pollfd pollfd; + size_t new_size; + void *new; + + if (ctx->inbound_head == ctx->inbound_tail) { + ctx->inbound_head = ctx->inbound_tail = ctx->curline = 0; + } else if (ctx->inbound_tail > 0) { + memmove(ctx->inbound, ctx->inbound + ctx->inbound_tail, ctx->inbound_head -= ctx->inbound_tail); + ctx->curline -= ctx->inbound_tail; + ctx->inbound_tail = 0; + } + + pollfd.fd = ctx->fd; + pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; + + if (ctx->inbound_head) + goto skip_recv; + for (;;) { + if (ctx->inbound_head == ctx->inbound_size) { + new_size = ctx->inbound_size ? (ctx->inbound_size << 1) : 1024; + new = realloc(ctx->inbound, new_size); + if (!new) + return -1; + ctx->inbound = new; + ctx->inbound_size = new_size; + } + + if (ctx->blocking) { + pollfd.revents = 0; + if (poll(&pollfd, (nfds_t)1, -1) < 0) + return -1; + } + got = recv(ctx->fd, ctx->inbound + ctx->inbound_head, ctx->inbound_size - ctx->inbound_head, 0); + if (got <= 0) { + if (got == 0) + errno = ECONNRESET; + return -1; + } + +#ifdef DEBUG_MODE + fprintf(stderr, "\033[32m"); + fwrite(ctx->inbound + ctx->inbound_head, (size_t)got, 1, stderr); + fprintf(stderr, "\033[m"); + fflush(stderr); +#endif + + ctx->inbound_head += (size_t)got; + + skip_recv: + while (!ctx->have_all_headers) { + line = ctx->inbound + ctx->curline; + p = memchr(line, '\n', ctx->inbound_head - ctx->curline); + if (!p) + break; + if (memchr(line, '\0', (size_t)(p - line)) != NULL) + ctx->bad_message = 1; + *p++ = '\0'; + ctx->curline = (size_t)(p - ctx->inbound); + if (!*line) { + ctx->have_all_headers = 1; + } else if (strstr(line, "In response to: ") == line) { + value = line + (sizeof("In response to: ") - 1); + ctx->in_response_to = (uint32_t)atol(value); + } else if (strstr(line, "Length: ") == line) { + value = line + (sizeof("Length: ") - 1); + ctx->length = (size_t)atol(value); + sprintf(temp, "%zu", ctx->length); + if (strcmp(value, temp)) + goto fatal; + } + } + + if (ctx->have_all_headers && ctx->inbound_head >= ctx->curline + ctx->length) { + ctx->curline += ctx->length; + if (ctx->bad_message) { + ctx->bad_message = 0; + ctx->have_all_headers = 0; + ctx->length = 0; + ctx->inbound_tail = ctx->curline; + errno = EBADMSG; + return -1; + } + for (i = 0; i < n; i++) { + if (pending[i].message_id == ctx->in_response_to) { + *selected = i; + return 0; + } + } + *selected = 0; + ctx->bad_message = 0; + ctx->have_all_headers = 0; + ctx->length = 0; + ctx->inbound_tail = ctx->curline; + errno = 0; + return -1; + } + } + +fatal: + errno = ENOTRECOVERABLE; + return -1; +} + + +/** + * Send a message to the server and wait for response + * + * @param resp:char** Output parameter for the response, + * will be NUL-terminated + * @param ctx:libcoopgamma_context_t* The state of the library + * @param payload:void* Data to append to the end of the message + * @param payload_size:size_t Byte-size of `payload` + * @param format:string-literal Message formatting string + * @param ... Message formatting arguments + * + * On error, the macro goes to `fail`. + */ +#define SEND_MESSAGE(ctx, payload, payload_size, format, ...)\ + do {\ + ssize_t n__;\ + char *msg__;\ + snprintf(NULL, (size_t)0, format "%zn", __VA_ARGS__, &n__);\ + msg__ = malloc((size_t)n__ + (payload_size) + (size_t)1);\ + if (!msg__)\ + goto fail;\ + sprintf(msg__, format, __VA_ARGS__);\ + if (payload)\ + memcpy(msg__ + n__, (payload), (payload_size));\ + if (send_message((ctx), msg__, (size_t)n__ + (payload_size)) < 0)\ + goto fail;\ + } while (0) + + +/** + * Send a message to the server and wait for response + * + * @param ctx The state of the library + * @param msg The message to send + * @param n The length of `msg` + * @return Zero on success, -1 on error + */ +static int +send_message(libcoopgamma_context_t *restrict ctx, char *msg, size_t n) +{ + void *new; + if (ctx->outbound_head == ctx->outbound_tail) { + free(ctx->outbound); + ctx->outbound = msg; + ctx->outbound_tail = 0; + ctx->outbound_head = n; + ctx->outbound_size = n; + } else { + if (ctx->outbound_head + n > ctx->outbound_size) { + memmove(ctx->outbound, ctx->outbound + ctx->outbound_tail, ctx->outbound_head -= ctx->outbound_tail); + ctx->outbound_tail = 0; + } + if (ctx->outbound_head + n > ctx->outbound_size) { + new = realloc(ctx->outbound, ctx->outbound_head + n); + if (!new) { + free(msg); + return -1; + } + ctx->outbound = new; + ctx->outbound_size = ctx->outbound_head + n; + } + memcpy(ctx->outbound + ctx->outbound_head, msg, n); + ctx->outbound_head += n; + free(msg); + } + ctx->message_id += 1; + return libcoopgamma_flush(ctx); +} + + +/** + * Get the next header of the inbound message + * + * All headers must be read before the payload is read + * + * @param ctx The state of the library, must be connected + * @return The next header line, can never be `NULL`, + * the empty string marks the end of the headers. + * This memory segment must not be freed. + */ +static char * +next_header(libcoopgamma_context_t *restrict ctx) +{ + char *rc = ctx->inbound + ctx->inbound_tail; + ctx->inbound_tail += strlen(rc) + 1; + return rc; +} + + +/** + * Get the payload of the inbound message + * + * Calling this function marks that the inbound message + * has been fully ready. You must call this function + * even if you do not expect a payload + * + * @param ctx The state of the library, must be connected + * @param n Output parameter for the size of the payload + * @return The payload (not NUL-terminated), `NULL` if + * there is no payload. Failure is impossible. + * This memory segment must not be freed. + */ +static char * +next_payload(libcoopgamma_context_t *restrict ctx, size_t *n) +{ + char *rc; + ctx->have_all_headers = 0; + if ((*n = ctx->length)) { + rc = ctx->inbound + ctx->inbound_tail; + ctx->inbound_tail += *n; + ctx->length = 0; + return rc; + } + return NULL; +} + + +/** + * Tell the library that you will not be parsing a receive message + * + * @param ctx The state of the library, must be connected + */ +void +libcoopgamma_skip_message(libcoopgamma_context_t *restrict ctx) +{ + size_t _n; + while (*next_header(ctx)); + (void) next_payload(ctx, &_n); +} + + +/** + * Check whether the server sent an error, if so copy it to `ctx` + * + * This function will also reports EBADMSG if the message ID + * that the message is a response to does not match the request + * information, or if it is missing + * + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return 1 if the server sent an error (even indicating success), + * 0 on success, -1 on failure. Information about failure + * is copied `ctx`. + */ +static int +check_error(libcoopgamma_context_t *restrict ctx, libcoopgamma_async_context_t *restrict async) +{ + char temp[3 * sizeof(uint64_t) + 1]; + size_t old_tail = ctx->inbound_tail; + char *line; + char *value; + int command_ok = 0; + int have_in_response_to = 0; + int have_error = 0; + int bad = 0; + char *payload; + size_t n; + + for (;;) { + line = next_header(ctx); + value = strchr(line, ':') + 2; + if (!*line) { + break; + } else if (!strcmp(line, "Command: error")) { + command_ok = 1; + } else if (strstr(line, "In response to: ") == line) { + uint32_t id = (uint32_t)atol(value); + have_in_response_to = 1 + !!have_in_response_to; + if (id != async->message_id) { + bad = 1; + } else { + sprintf(temp, "%" PRIu32, id); + if (strcmp(value, temp)) + bad = 1; + } + } else if (strstr(line, "Error: ") == line) { + have_error = 1 + !!have_error; + ctx->error.server_side = 1; + ctx->error.custom = (strstr(value, "custom") == value); + if (ctx->error.custom) { + if (value[6] == '\0') { + ctx->error.number = 0; + continue; + } else if (value[6] != ' ') { + bad = 1; + continue; + } + value += 7; + } + ctx->error.number = (uint64_t)atoll(value); + sprintf(temp, "%" PRIu64, ctx->error.number); + if (strcmp(value, temp)) + bad = 1; + } + } + + if (!command_ok) { + ctx->inbound_tail = old_tail; + return 0; + } + + payload = next_payload(ctx, &n); + if (payload) { + if (memchr(payload, '\0', n) || payload[n - 1] != '\n') + goto badmsg; + ctx->error.description = malloc(n); + if (ctx->error.description == NULL) + goto fail; + memcpy(ctx->error.description, payload, n - 1); + ctx->error.description[n - 1] = '\0'; + } + + if (bad || have_in_response_to != 1 || have_error != 1) + goto badmsg; + + return 1; + +badmsg: + errno = EBADMSG; +fail: + copy_errno(ctx); + return -1; +} + + + +#if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnonnull" +#endif + + + +/** + * List all available CRTC:s, send request part + * + * Cannot be used before connecting to the server + * + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +int +libcoopgamma_get_crtcs_send(libcoopgamma_context_t *restrict ctx, libcoopgamma_async_context_t *restrict async) +{ + async->message_id = ctx->message_id; + SEND_MESSAGE(ctx, NULL, (size_t)0, + "Command: enumerate-crtcs\n" + "Message ID: %" PRIu32 "\n" + "\n", + ctx->message_id); + + return 0; +fail: + copy_errno(ctx); + return -1; +} + + +/** + * List all available CRTC:s, receive response part + * + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return A `NULL`-terminated list of names. You should only free + * the outer pointer, inner pointers are subpointers of the + * outer pointer and cannot be freed. `NULL` on error, in + * which case `ctx->error` (rather than `errno`) is read + * for information about the error. + */ +char ** +libcoopgamma_get_crtcs_recv(libcoopgamma_context_t *restrict ctx, libcoopgamma_async_context_t *restrict async) +{ + char *line; + char *payload; + char *end; + int command_ok = 0; + size_t i, n, lines, len, length; + char **rc; + + if (check_error(ctx, async)) + return NULL; + + for (;;) { + line = next_header(ctx); + if (!*line) + break; + else if (!strcmp(line, "Command: crtc-enumeration")) + command_ok = 1; + } + + payload = next_payload(ctx, &n); + + if (!command_ok || (n > 0 && payload[n - 1] != '\n')) { + errno = EBADMSG; + copy_errno(ctx); + return NULL; + } + + line = payload; + end = payload + n; + lines = length = 0; + while (line != end) { + lines += 1; + length += len = (size_t)(strchr(line, '\n') + 1 - line); + line += len; + line[-1] = '\0'; + } + + rc = malloc((lines + 1) * sizeof(char *) + length); + if (!rc) { + copy_errno(ctx); + return NULL; + } + + line = ((char *)rc) + (lines + 1) * sizeof(char *); + memcpy(line, payload, length); + rc[lines] = NULL; + for (i = 0; i < lines; i++) { + rc[i] = line; + line = strchr(line, '\0') + 1; + } + + return rc; +} + + +/** + * List all available CRTC:s, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param ctx The state of the library, must be connected + * @return A `NULL`-terminated list of names. You should only free + * the outer pointer, inner pointers are subpointers of the + * outer pointer and cannot be freed. `NULL` on error, in + * which case `ctx->error` (rather than `errno`) is read + * for information about the error. + */ +char ** +libcoopgamma_get_crtcs_sync(libcoopgamma_context_t *restrict ctx) +{ + SYNC_CALL(libcoopgamma_get_crtcs_send(ctx, &async), + libcoopgamma_get_crtcs_recv(ctx, &async), (copy_errno(ctx), NULL)); +} + + + +/** + * Retrieve information about a CRTC:s gamma ramps, send request part + * + * Cannot be used before connecting to the server + * + * @param crtc The name of the CRTC + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +int +libcoopgamma_get_gamma_info_send(const char *restrict crtc, libcoopgamma_context_t *restrict ctx, + libcoopgamma_async_context_t *restrict async) +{ +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnonnull-compare" +#endif + if (crtc == NULL || strchr(crtc, '\n')) { + errno = EINVAL; + goto fail; + } +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic pop +#endif + + async->message_id = ctx->message_id; + SEND_MESSAGE(ctx, NULL, (size_t)0, + "Command: get-gamma-info\n" + "Message ID: %" PRIu32 "\n" + "CRTC: %s\n" + "\n", + ctx->message_id, crtc); + + return 0; +fail: + copy_errno(ctx); + return 0; +} + + +/** + * Retrieve information about a CRTC:s gamma ramps, receive response part + * + * @param info Output parameter for the information, must be initialised + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +int +libcoopgamma_get_gamma_info_recv(libcoopgamma_crtc_info_t *restrict info, libcoopgamma_context_t *restrict ctx, + libcoopgamma_async_context_t *restrict async) +{ + char temp[3 * sizeof(size_t) + 1]; + char *line; + char *value; + size_t _n; + int have_cooperative = 0, have_gamma_support = 0, have_colourspace = 0; + int have_depth = 0, have_white_x = 0, have_white_y = 0; + int have_red_size = 0, have_red_x = 0, have_red_y = 0; + int have_green_size = 0, have_green_x = 0, have_green_y = 0; + int have_blue_size = 0, have_blue_x = 0, have_blue_y = 0; + int bad = 0, r = 0, g = 0, b = 0, x = 0; + size_t *outz; + unsigned *outu; + int *have; + + if (check_error(ctx, async)) + return -1; + + info->cooperative = 0; /* Should be in the response, but ... */ + info->colourspace = LIBCOOPGAMMA_UNKNOWN; + + for (;;) { + line = next_header(ctx); + value = strchr(line, ':') + 2; + if (!*line) { + break; + } else if (strstr(line, "Cooperative: ") == line) { + have_cooperative = 1 + !!have_cooperative; + if (!strcmp(value, "yes")) info->cooperative = 1; + else if (!strcmp(value, "no")) info->cooperative = 0; + else + bad = 1; + } else if (strstr(line, "Depth: ") == line) { + have_depth = 1 + !!have_depth; + if (!strcmp(value, "8")) info->depth = LIBCOOPGAMMA_UINT8; + else if (!strcmp(value, "16")) info->depth = LIBCOOPGAMMA_UINT16; + else if (!strcmp(value, "32")) info->depth = LIBCOOPGAMMA_UINT32; + else if (!strcmp(value, "64")) info->depth = LIBCOOPGAMMA_UINT64; + else if (!strcmp(value, "f")) info->depth = LIBCOOPGAMMA_FLOAT; + else if (!strcmp(value, "d")) info->depth = LIBCOOPGAMMA_DOUBLE; + else + bad = 1; + } else if (strstr(line, "Gamma support: ") == line) { + have_gamma_support = 1 + !!have_gamma_support; + if (!strcmp(value, "yes")) info->supported = LIBCOOPGAMMA_YES; + else if (!strcmp(value, "no")) info->supported = LIBCOOPGAMMA_NO; + else if (!strcmp(value, "maybe")) info->supported = LIBCOOPGAMMA_MAYBE; + else + bad = 1; + } else if ((r = (strstr(line, "Red size: ") == line)) || + (g = (strstr(line, "Green size: ") == line)) || + strstr(line, "Blue size: ") == line) { + if (r) have_red_size = 1 + !!have_red_size, outz = &info->red_size; + else if (g) have_green_size = 1 + !!have_green_size, outz = &info->green_size; + else have_blue_size = 1 + !!have_blue_size, outz = &info->blue_size; + *outz = (size_t)atol(value); + sprintf(temp, "%zu", *outz); + if (strcmp(value, temp)) + bad = 1; + } else if ((x = r = (strstr(line, "Red x: ") == line)) || + (r = (strstr(line, "Red y: ") == line)) || + (x = g = (strstr(line, "Green x: ") == line)) || + (g = (strstr(line, "Green y: ") == line)) || + (x = b = (strstr(line, "Blue x: ") == line)) || + (b = (strstr(line, "Blue y: ") == line)) || + (x = (strstr(line, "White x: ") == line)) || + strstr(line, "White y: ") == line) { + if (r && x) have = &have_red_x, outu = &info->red_x; + else if (r) have = &have_red_y, outu = &info->red_y; + else if (g && x) have = &have_green_x, outu = &info->green_x; + else if (g) have = &have_green_y, outu = &info->green_y; + else if (b && x) have = &have_blue_x, outu = &info->blue_x; + else if (b) have = &have_blue_y, outu = &info->blue_y; + else if (x) have = &have_white_x, outu = &info->white_x; + else have = &have_white_y, outu = &info->white_y; + *have = 1 + !!*have; + *outu = (unsigned)atoi(value); + sprintf(temp, "%u", *outu); + if (strcmp(value, temp)) + bad = 1; + } else if (strstr(line, "Colour space: ") == line) { + have_colourspace = 1 + !!have_colourspace; + if (!strcmp(value, "sRGB")) info->colourspace = LIBCOOPGAMMA_SRGB; + else if (!strcmp(value, "RGB")) info->colourspace = LIBCOOPGAMMA_RGB; + else if (!strcmp(value, "non-RGB")) info->colourspace = LIBCOOPGAMMA_NON_RGB; + else if (!strcmp(value, "grey")) info->colourspace = LIBCOOPGAMMA_GREY; + else + info->colourspace = LIBCOOPGAMMA_UNKNOWN; + } + } + + (void) next_payload(ctx, &_n); + + info->have_gamut = (have_red_x && have_green_x && have_blue_x && have_white_x && + have_red_y && have_green_y && have_blue_y && have_white_y); + + if (bad || have_gamma_support != 1 || have_red_x > 1 || have_red_y > 1 || + have_green_x > 1 || have_green_y > 1 || have_blue_x > 1 || have_blue_y > 1 || + have_white_x > 1 || have_white_y > 1 || have_colourspace > 1) { + errno = EBADMSG; + copy_errno(ctx); + return -1; + } + if (info->supported != LIBCOOPGAMMA_NO) { + if (have_cooperative > 1 || have_depth != 1 || have_gamma_support != 1 || + have_red_size != 1 || have_green_size != 1 || have_blue_size != 1) { + errno = EBADMSG; + copy_errno(ctx); + return -1; + } + } + + return 0; +} + + +/** + * Retrieve information about a CRTC:s gamma ramps, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param crtc The name of the CRTC + * @param info Output parameter for the information, must be initialised + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +int +libcoopgamma_get_gamma_info_sync(const char *restrict ctrc, libcoopgamma_crtc_info_t *restrict info, + libcoopgamma_context_t *restrict ctx) +{ + SYNC_CALL(libcoopgamma_get_gamma_info_send(ctrc, ctx, &async), + libcoopgamma_get_gamma_info_recv(info, ctx, &async), (copy_errno(ctx), -1)); +} + + + +/** + * Retrieve the current gamma ramp adjustments, send request part + * + * Cannot be used before connecting to the server + * + * @param query The query to send + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +int +libcoopgamma_get_gamma_send(const libcoopgamma_filter_query_t *restrict query, libcoopgamma_context_t *restrict ctx, + libcoopgamma_async_context_t *restrict async) +{ +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnonnull-compare" +#endif + if (!query || !query->crtc || strchr(query->crtc, '\n')) { + errno = EINVAL; + goto fail; + } +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic pop +#endif + + async->message_id = ctx->message_id; + async->coalesce = query->coalesce; + SEND_MESSAGE(ctx, NULL, (size_t)0, + "Command: get-gamma\n" + "Message ID: %" PRIu32 "\n" + "CRTC: %s\n" + "Coalesce: %s\n" + "High priority: %" PRIi64 "\n" + "Low priority: %" PRIi64 "\n" + "\n", + ctx->message_id, query->crtc, query->coalesce ? "yes" : "no", + query->high_priority, query->low_priority); + + return 0; +fail: + copy_errno(ctx); + return -1; +} + + +/** + * Retrieve the current gamma ramp adjustments, receive response part + * + * @param table Output for the response, must be initialised + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +int +libcoopgamma_get_gamma_recv(libcoopgamma_filter_table_t *restrict table, libcoopgamma_context_t *restrict ctx, + libcoopgamma_async_context_t *restrict async) +{ + char temp[3 * sizeof(size_t) + 1]; + char *line; + char *value; + char *payload; + size_t i, n, width, clutsize; + int have_depth = 0; + int have_red_size = 0; + int have_green_size = 0; + int have_blue_size = 0; + int have_tables = 0; + int bad = 0, r = 0, g = 0; + size_t *out; + size_t off, len; + + if (check_error(ctx, async)) + return -1; + + libcoopgamma_filter_table_destroy(table); + + for (;;) { + line = next_header(ctx); + value = strchr(line, ':') + 2; + if (!*line) { + break; + } else if (strstr(line, "Depth: ") == line) { + have_depth = 1 + !!have_depth; + if (!strcmp(value, "8")) table->depth = LIBCOOPGAMMA_UINT8; + else if (!strcmp(value, "16")) table->depth = LIBCOOPGAMMA_UINT16; + else if (!strcmp(value, "32")) table->depth = LIBCOOPGAMMA_UINT32; + else if (!strcmp(value, "64")) table->depth = LIBCOOPGAMMA_UINT64; + else if (!strcmp(value, "f")) table->depth = LIBCOOPGAMMA_FLOAT; + else if (!strcmp(value, "d")) table->depth = LIBCOOPGAMMA_DOUBLE; + else + bad = 1; + } else if ((r = (strstr(line, "Red size: ") == line)) || + (g = (strstr(line, "Green size: ") == line)) || + strstr(line, "Blue size: ") == line) { + if (r) have_red_size = 1 + !!have_red_size, out = &table->red_size; + else if (g) have_green_size = 1 + !!have_green_size, out = &table->green_size; + else have_blue_size = 1 + !!have_blue_size, out = &table->blue_size; + *out = (size_t)atol(value); + sprintf(temp, "%zu", *out); + if (strcmp(value, temp)) + bad = 1; + } else if (strstr(line, "Tables: ") == line) { + have_tables = 1 + have_tables; + table->filter_count = (size_t)atol(value); + sprintf(temp, "%zu", table->filter_count); + if (strcmp(value, temp)) + bad = 1; + } + } + + payload = next_payload(ctx, &n); + + if (bad || have_depth != 1 || have_red_size != 1 || have_green_size != 1 || + have_blue_size != 1 || (async->coalesce ? have_tables > 1 : !have_tables) || + ((!payload || !n) && (async->coalesce || table->filter_count > 0)) || + (n > 0 && have_tables && !table->filter_count) || + (async->coalesce && have_tables && table->filter_count != 1)) + goto bad; + + switch (table->depth) { + case LIBCOOPGAMMA_FLOAT: width = sizeof(float); break; + case LIBCOOPGAMMA_DOUBLE: width = sizeof(double); break; + default: INTEGRAL_DEPTHS + if (table->depth <= 0 || (table->depth & 7)) + goto bad; + width = (size_t)(table->depth / 8); + break; + } + + clutsize = table->red_size + table->green_size + table->blue_size; + clutsize *= width; + + if (async->coalesce) { + if (n != clutsize) + goto bad; + table->filters = malloc(sizeof(*(table->filters))); + if (!table->filters) + goto fail; + table->filters->priority = 0; + table->filters->class = NULL; + table->filters->ramps.u8.red_size = table->red_size; + table->filters->ramps.u8.green_size = table->green_size; + table->filters->ramps.u8.blue_size = table->blue_size; + if (libcoopgamma_ramps_initialise_(&table->filters->ramps, width) < 0) + goto fail; + memcpy(table->filters->ramps.u8.red, payload, clutsize); + table->filter_count = 1; + } else if (!table->filter_count) { + table->filters = NULL; + } else { + off = 0; + table->filters = calloc(table->filter_count, sizeof(*table->filters)); + if (!table->filters) + goto fail; + for (i = 0; i < table->filter_count; i++) { + if (off + sizeof(int64_t) > n) + goto bad; + table->filters[i].priority = *(int64_t *)(payload + off); + off += sizeof(int64_t); + if (!memchr(payload + off, '\0', n - off)) + goto bad; + len = strlen(payload + off) + 1; + table->filters[i].class = malloc(len); + if (!table->filters[i].class) + goto fail; + memcpy(table->filters[i].class, payload + off, len); + off += len; + if (off + clutsize > n) + goto bad; + table->filters[i].ramps.u8.red_size = table->red_size; + table->filters[i].ramps.u8.green_size = table->green_size; + table->filters[i].ramps.u8.blue_size = table->blue_size; + if (libcoopgamma_ramps_initialise_(&(table->filters[i].ramps), width) < 0) + goto fail; + memcpy(table->filters->ramps.u8.red, payload + off, clutsize); + off += clutsize; + } + if (off != n) + goto bad; + } + + return 0; +bad: + errno = EBADMSG; +fail: + copy_errno(ctx); + return -1; +} + + +/** + * Retrieve the current gamma ramp adjustments, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param query The query to send + * @param table Output for the response, must be initialised + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +int +libcoopgamma_get_gamma_sync(const libcoopgamma_filter_query_t *restrict query, libcoopgamma_filter_table_t *restrict table, + libcoopgamma_context_t *restrict ctx) +{ + SYNC_CALL(libcoopgamma_get_gamma_send(query, ctx, &async), + libcoopgamma_get_gamma_recv(table, ctx, &async), (copy_errno(ctx), -1)); +} + + + +/** + * Apply, update, or remove a gamma ramp adjustment, send request part + * + * Cannot be used before connecting to the server + * + * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +int +libcoopgamma_set_gamma_send(const libcoopgamma_filter_t *restrict filter, libcoopgamma_context_t *restrict ctx, + libcoopgamma_async_context_t *restrict async) +{ + const void *payload = NULL; + const char *lifespan; + char priority[sizeof("Priority: \n") + 3 * sizeof(int64_t)] = {'\0'}; + char length [sizeof("Length: \n") + 3 * sizeof(size_t) ] = {'\0'}; + size_t payload_size = 0, stopwidth = 0; + +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnonnull-compare" +#endif + if (!filter || !filter->crtc || strchr(filter->crtc, '\n') || !filter->class || strchr(filter->class, '\n')) { + errno = EINVAL; + goto fail; + } +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic pop +#endif + + switch (filter->lifespan) { + case LIBCOOPGAMMA_REMOVE: lifespan = "remove"; break; + case LIBCOOPGAMMA_UNTIL_DEATH: lifespan = "until-death"; break; + case LIBCOOPGAMMA_UNTIL_REMOVAL: lifespan = "until-removal"; break; + default: + errno = EINVAL; + goto fail; + } + + if (filter->lifespan != LIBCOOPGAMMA_REMOVE) { + switch (filter->depth) { + case LIBCOOPGAMMA_FLOAT: stopwidth = sizeof(float); break; + case LIBCOOPGAMMA_DOUBLE: stopwidth = sizeof(double); break; + default: INTEGRAL_DEPTHS + if (filter->depth <= 0 || (filter->depth & 7)) { + errno = EINVAL; + goto fail; + } + stopwidth = (size_t)(filter->depth / 8); + break; + } + + payload_size = filter->ramps.u8.red_size; + payload_size += filter->ramps.u8.green_size; + payload_size += filter->ramps.u8.blue_size; + payload_size *= stopwidth; + payload = filter->ramps.u8.red; + sprintf(priority, "Priority: %" PRIi64 "\n", filter->priority); + sprintf(length, "Length: %zu\n", payload_size); + } + + async->message_id = ctx->message_id; + SEND_MESSAGE(ctx, payload, payload_size, + "Command: set-gamma\n" + "Message ID: %" PRIu32 "\n" + "CRTC: %s\n" + "Class: %s\n" + "Lifespan: %s\n" + "%s" + "%s" + "\n", + ctx->message_id, filter->crtc, filter->class, lifespan, priority, length); + + return 0; +fail: + copy_errno(ctx); + return -1; +} + + +/** + * Apply, update, or remove a gamma ramp adjustment, receive response part + * + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +int +libcoopgamma_set_gamma_recv(libcoopgamma_context_t *restrict ctx, libcoopgamma_async_context_t *restrict async) +{ + size_t _n = 0; + + if (check_error(ctx, async)) + return -(ctx->error.custom || ctx->error.number); + + while (*next_header(ctx)); + (void) next_payload(ctx, &_n); + + errno = EBADMSG; + copy_errno(ctx); + return -1; +} + + +/** + * Apply, update, or remove a gamma ramp adjustment, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's + * @param depth The datatype for the stops in the gamma ramps, must match the CRTC's + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +int +libcoopgamma_set_gamma_sync(const libcoopgamma_filter_t *restrict filter, libcoopgamma_context_t *restrict ctx) +{ + SYNC_CALL(libcoopgamma_set_gamma_send(filter, ctx, &async), + libcoopgamma_set_gamma_recv(ctx, &async), (copy_errno(ctx), -1)); +} + + + +#if defined(__GNUC__) +# pragma GCC diagnostic pop +#endif diff --git a/libcoopgamma.h b/libcoopgamma.h new file mode 100644 index 0000000..5f5e800 --- /dev/null +++ b/libcoopgamma.h @@ -0,0 +1,1635 @@ +/* See LICENSE file for copyright and license details. */ +#ifndef LIBCOOPGAMMA_H +#define LIBCOOPGAMMA_H + +#include +#include +#include + + +#if defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdocumentation" +#endif + +#if defined(__GNUC__) && !defined(__clang__) +# define LIBCOOPGAMMA_GCC_ONLY(...) __VA_ARGS__ +#else +# define LIBCOOPGAMMA_GCC_ONLY(...) /* ignore */ +#endif + + + +/** + * Unmarshal was successful + * + * This value will always be zero + */ +#define LIBCOOPGAMMA_SUCCESS 0 + +/** + * Unmarshal failed: the marshalled data was created + * with a older version of libcoopgamma that does not + * marshall the data in a compatible way + * + * This value will always be positive + */ +#define LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE 1 + +/** + * Unmarshal failed: the marshalled data was created with + * a newer version libcoopgamma that does not marshall + * the data in a compatible way + * + * This value will always be positive + */ +#define LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE 2 + +/** + * Unmarshal failed because of an error, `errno` has been set + * + * This value will always be -1 and will be the + * only negative value in this category of constants + */ +#define LIBCOOPGAMMA_ERRNO_SET -1 + + + +/** + * Number used to identify implementation + * version of `libcoopgamma_support_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_SUPPORT_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_depth_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_DEPTH_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_lifespan_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_LIFESPAN_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_colourspace_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_COLOURSPACE_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_ramps*_t`, if they + * are ever modified, this number is increased + */ +#define LIBCOOPGAMMA_RAMPS_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_filter_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_FILTER_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_ctrc_info_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_CRTC_INFO_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_filter_query_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_FILTER_QUERY_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_queried_filter_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_QUERIED_FILTER_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_filter_table_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_FILTER_TABLE_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_error_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_ERROR_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_context_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_CONTEXT_VERSION 0 + +/** + * Number used to identify implementation + * version of `libcoopgamma_async_context_t`, if it + * is ever modified, this number is increased + */ +#define LIBCOOPGAMMA_ASYNC_CONTEXT_VERSION 0 + + + +/** + * Values used to indicate the support + * for gamma adjustments + */ +typedef enum libcoopgamma_support { + /** + * Gamma adjustments are not supported + * + * This value will always be 0 + */ + LIBCOOPGAMMA_NO = 0, + + /** + * Don't know whether gamma + * adjustments are supported + * + * This value will always be 1 + */ + LIBCOOPGAMMA_MAYBE = 1, + + /** + * Gamma adjustments are supported + * + * This value will always be 2 + */ + LIBCOOPGAMMA_YES = 2 + +} libcoopgamma_support_t; + + +/** + * Values used to tell which datatype + * is used for the gamma ramp stops + * + * The values will always be the number + * of bits for integral types, and + * negative for floating-point types + */ +typedef enum libcoopgamma_depth { + /** + * `uint8_t` + */ + LIBCOOPGAMMA_UINT8 = 8, + + /** + * `uint16_t` + */ + LIBCOOPGAMMA_UINT16 = 16, + + /** + * `uint32_t` + */ + LIBCOOPGAMMA_UINT32 = 32, + + /** + * `uint64_t` + */ + LIBCOOPGAMMA_UINT64 = 64, + + /** + * `float` + */ + LIBCOOPGAMMA_FLOAT = -1, + + /** + * `double` + */ + LIBCOOPGAMMA_DOUBLE = -2 + +} libcoopgamma_depth_t; + + +/** + * Values used to tell when a filter + * should be removed + */ +typedef enum libcoopgamma_lifespan { + /** + * Remove the filter now + * + * This value will always be 0 + */ + LIBCOOPGAMMA_REMOVE = 0, + + /** + * Remove the filter when disconnecting + * from the coopgamma server + */ + LIBCOOPGAMMA_UNTIL_DEATH = 1, + + /** + * Only remove the filter when it + * is explicitly requested + */ + LIBCOOPGAMMA_UNTIL_REMOVAL = 2 + +} libcoopgamma_lifespan_t; + + +/** + * Colourspaces + */ +typedef enum libcoopgamma_colourspace { + /** + * The colourspace is unknown + * + * This value will always be 0 + */ + LIBCOOPGAMMA_UNKNOWN = 0, + + /** + * sRGB (Standard RGB) + */ + LIBCOOPGAMMA_SRGB = 1, + + /** + * RGB other than sRGB + */ + LIBCOOPGAMMA_RGB = 2, + + /** + * Non-RGB multicolour + */ + LIBCOOPGAMMA_NON_RGB = 3, + + /** + * Monochrome, greyscale, or some + * other singlecolour scale + */ + LIBCOOPGAMMA_GREY = 4 + +} libcoopgamma_colourspace_t; + + +/** + * Define a gamma ramp structure + * + * @param suffix:identifier The end of the name of the `struct` + * @param type:scalar-type The datatype of the stops + */ +#define LIBCOOPGAMMA_RAMPS__(suffix, type)\ +typedef struct libcoopgamma_ramps##suffix {\ + /** + * The number of stops in the red ramp + */\ + size_t red_size;\ + \ + /** + * The number of stops in the green ramp + */\ + size_t green_size;\ + \ + /** + * The number of stops in the blue ramp + */\ + size_t blue_size;\ + \ + /** + * The red ramp + */\ + type *red;\ + \ + /** + * The green ramp + */\ + type *green;\ + \ + /** + * The blue ramp + */\ + type *blue;\ + \ +} libcoopgamma_ramps##suffix##_t + +/** + * `typedef struct libcoopgamma_ramps8 libcoopgamma_ramps8_t` + * + * Gamma ramp structure with `uint8_t` stops + */ +LIBCOOPGAMMA_RAMPS__(8, uint8_t); + +/** + * `typedef struct libcoopgamma_ramps16 libcoopgamma_ramps16_t` + * + * Gamma ramp structure with `uint16_t` stops + */ +LIBCOOPGAMMA_RAMPS__(16, uint16_t); + +/** + * `typedef struct libcoopgamma_ramps32 libcoopgamma_ramps32_t` + * + * Gamma ramp structure with `uint32_t` stops + */ +LIBCOOPGAMMA_RAMPS__(32, uint32_t); + +/** + * `typedef struct libcoopgamma_ramps64 libcoopgamma_ramps64_t` + * + * Gamma ramp structure with `uint64_t` stops + */ +LIBCOOPGAMMA_RAMPS__(64, uint64_t); + +/** + * `typedef struct libcoopgamma_rampsf libcoopgamma_rampsf_t` + * + * Gamma ramp structure with `float` stops + */ +LIBCOOPGAMMA_RAMPS__(f, float); + +/** + * `typedef struct libcoopgamma_rampsd libcoopgamma_rampsd_t` + * + * Gamma ramp structure with `double` stops + */ +LIBCOOPGAMMA_RAMPS__(d, double); + + +/** + * Union with all ramp types. + */ +typedef union libcoopgamma_ramps { + /** + * 8-bit version + */ + libcoopgamma_ramps8_t u8; + + /** + * 16-bit version + */ + libcoopgamma_ramps16_t u16; + + /** + * 32-bit version + */ + libcoopgamma_ramps32_t u32; + + /** + * 64-bit version + */ + libcoopgamma_ramps64_t u64; + + /** + * Single precision floating-point version + */ + libcoopgamma_rampsf_t f; + + /** + * Double precision floating-point version + */ + libcoopgamma_rampsd_t d; + +} libcoopgamma_ramps_t; + + +/** + * Data set to the coopgamma server to apply, + * update, or remove a filter. + */ +typedef struct libcoopgamma_filter { + /** + * The priority of the filter, higher priority + * is applied first. The gamma correction should + * have priority 0. + */ + int64_t priority; + + /** + * The CRTC for which this filter shall be applied + */ + char *crtc; + + /** + * Identifier for the filter + * + * The syntax must be "${PACKAGE_NAME}::${COMMAND_NAME}::${RULE}" + */ + char *class; + + /** + * When shall the filter be removed? + * + * If this member's value is `LIBCOOPGAMMA_REMOVE`, + * only `.crtc` and `.class` need also be defined + */ + libcoopgamma_lifespan_t lifespan; + + /** + * The data type and bit-depth of the ramp stops + */ + libcoopgamma_depth_t depth; + + /** + * The gamma ramp adjustments of the filter + */ + libcoopgamma_ramps_t ramps; + +} libcoopgamma_filter_t; + + +/** + * Gamma ramp meta information for a CRTC + */ +typedef struct libcoopgamma_crtc_info { + /** + * Is cooperative gamma server running? + */ + int cooperative; + + /** + * The data type and bit-depth of the ramp stops + */ + libcoopgamma_depth_t depth; + + /** + * Is gamma adjustments supported on the CRTC? + * If not, `.depth`, `.red_size`, `.green_size`, + * and `.blue_size` are undefined + */ + libcoopgamma_support_t supported; + +#if INT_MAX != LONG_MAX + int padding__; +#endif + + /** + * The number of stops in the red ramp + */ + size_t red_size; + + /** + * The number of stops in the green ramp + */ + size_t green_size; + + /** + * The number of stops in the blue ramp + */ + size_t blue_size; + + /** + * The monitor's colourspace + */ + libcoopgamma_colourspace_t colourspace; + + /** + * Whether `.red_x`, `.red_y`, `.green_x`, + * `.green_y`, `.blue_x`, `.blue_y`, + * `.white_x`, and `.white_y` are set. + * + * If this is true, but the colourspace + * is not RGB (or sRGB), there is something + * wrong. Please also check the colourspace. + */ + int have_gamut; + + /** + * The x-value (CIE xyY) of the monitor's + * red colour, multiplied by 1024 + */ + unsigned red_x; + + /** + * The y-value (CIE xyY) of the monitor's + * red colour, multiplied by 1024 + */ + unsigned red_y; + + /** + * The x-value (CIE xyY) of the monitor's + * green colour, multiplied by 1024 + */ + unsigned green_x; + + /** + * The y-value (CIE xyY) of the monitor's + * green colour, multiplied by 1024 + */ + unsigned green_y; + + /** + * The x-value (CIE xyY) of the monitor's + * blue colour, multiplied by 1024 + */ + unsigned blue_x; + + /** + * The y-value (CIE xyY) of the monitor's + * blue colour, multiplied by 1024 + */ + unsigned blue_y; + + /** + * The x-value (CIE xyY) of the monitor's + * default white point, multiplied by 1024 + */ + unsigned white_x; + + /** + * The y-value (CIE xyY) of the monitor's + * default white point, multiplied by 1024 + */ + unsigned white_y; + +} libcoopgamma_crtc_info_t; + + +/** + * Data sent to the coopgamma server + * when requestng the current filter + * table + */ +typedef struct libcoopgamma_filter_query { + /** + * Do no return filters with higher + * priority than this value + */ + int64_t high_priority; + + /** + * Do no return filters with lower + * priority than this value + */ + int64_t low_priority; + + /** + * The CRTC for which the the current + * filters shall returned + */ + char *crtc; + + /** + * Whether to coalesce all filters + * into one gamma ramp triplet + */ + int coalesce; + +#if INT_MAX != LONG_MAX + int padding__; +#endif + +} libcoopgamma_filter_query_t; + + +/** + * Stripped down version of `libcoopgamma_filter` + * which only contains the information returned + * in response to "Command: get-gamma" + */ +typedef struct libcoopgamma_queried_filter { + /** + * The filter's priority + */ + int64_t priority; + + /** + * The filter's class + */ + char *class; + + /** + * The gamma ramp adjustments of the filter + */ + libcoopgamma_ramps_t ramps; + +} libcoopgamma_queried_filter_t; + + +/** + * Response type for "Command: get-gamma": a + * list of applied filters and meta-information + * that was necessary for decoding the response + */ +typedef struct libcoopgamma_filter_table { + /** + * The number of stops in the red ramp + */ + size_t red_size; + + /** + * The number of stops in the green ramp + */ + size_t green_size; + + /** + * The number of stops in the blue ramp + */ + size_t blue_size; + + /** + * The number of filters + */ + size_t filter_count; + + /** + * The filters, should be ordered by priority + * in descending order, lest there is something + * wrong with the coopgamma server + * + * If filter coalition was requested, there will + * be exactly one filter (`.filter_count == 1`) + * and `.filters->class == NULL` and + * `.filters->priority` is undefined. + */ + libcoopgamma_queried_filter_t *filters; + + /** + * The data type and bit-depth of the ramp stops + */ + libcoopgamma_depth_t depth; + +#if INT_MAX != LONG_MAX + int padding__; +#endif + +} libcoopgamma_filter_table_t; + + +/** + * Error message from coopgamma server + */ +typedef struct libcoopgamma_error { + /** + * Error code + * + * If `.custom` is false, 0 indicates + * success, otherwise, 0 indicates that + * no error code has been assigned + */ + uint64_t number; + + /** + * Is this a custom error? + */ + int custom; + + /** + * Did the error occur on the server-side? + */ + int server_side; + + /** + * Error message, can be `NULL` if + * `.custom` is false + */ + char *description; + +} libcoopgamma_error_t; + + +/** + * Library state + * + * Use of this structure is not thread-safe, + * create one instance per thread that uses + * this structure + */ +typedef struct libcoopgamma_context { + /** + * The error of the last failed function call + * + * This member is undefined after successful function call + */ + libcoopgamma_error_t error; + + /** + * File descriptor for the socket + */ + int fd; + + /* The members below are internal. */ + + /** + * Whether `libcoopgamma_synchronise` have + * read the empty end-of-headers line + */ + int have_all_headers; + + /** + * Whether `libcoopgamma_synchronise` is reading + * a corrupt but recoverable message + */ + int bad_message; + + /** + * Is communication blocking? + */ + int blocking; + + /** + * Message ID of the next message + */ + uint32_t message_id; + + /** + * The ID of outbound message to which the inbound + * message being read by `libcoopgamma_synchronise` + * is a response + */ + uint32_t in_response_to; + + /** + * Buffer with the outbound message + */ + char *outbound; + + /** + * The write head for `outbound` + */ + size_t outbound_head; + + /** + * The read head for `outbound` + */ + size_t outbound_tail; + + /** + * The allocation size of `outbound` + */ + size_t outbound_size; + + /** + * Buffer with the inbound message + */ + char *inbound; + + /** + * The write head for `inbound` + */ + size_t inbound_head; + + /** + * The read head for `inbound` + */ + size_t inbound_tail; + + /** + * The allocation size of `inbound` + */ + size_t inbound_size; + + /** + * The value of 'Length' header in + * the inbound message + */ + size_t length; + + /** + * The beginning of the current line that + * is being read by `libcoopgamma_synchronise` + */ + size_t curline; + +} libcoopgamma_context_t; + + +/** + * Information necessary to identify and + * parse a response from the server + */ +typedef struct libcoopgamma_async_context { + /* All members are internal. */ + + /** + * The value of the 'In response to' header + * in the waited message + */ + uint32_t message_id; + + /** + * Whether to coalesce all filters + * into one gamma ramp triplet + */ + int coalesce; + +} libcoopgamma_async_context_t; + + + +/** + * Initialise a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` + * + * `this->red_size`, `this->green_size`, and `this->blue_size` must already be set + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +#define libcoopgamma_ramps_initialise(this)\ + (libcoopgamma_ramps_initialise_((this), sizeof(*((this)->red)))) + +/** + * Marshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +#define libcoopgamma_ramps_marshal(this, buf)\ + (libcoopgamma_ramps_marshal_((this), (buf), sizeof(*((this)->red)))) + +/** + * Unmarshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +#define libcoopgamma_ramps_unmarshal(this, buf, n)\ + (libcoopgamma_ramps_unmarshal_((this), (buf), (n), sizeof(*((this)->red)))) + + +/** + * Initialise a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` + * + * `this->red_size`, `this->green_size`, and `this->blue_size` must already be set + * + * @param this The record to initialise + * @param width The `sizeof(*(this->red))` + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_ramps_initialise_(void *restrict, size_t); + +/** + * Release all resources allocated to a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, + * `libcoopgamma_ramps32_t`, `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, + * `libcoopgamma_rampsd_t`, or `libcoopgamma_ramps_t`, the allocation of the record + * itself is not freed + * + * Always call this function after failed call to `libcoopgamma_ramps_initialise` + * or failed call to `libcoopgamma_ramps_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +void libcoopgamma_ramps_destroy(void *restrict); + +/** + * Marshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @param width The `sizeof(*(this->red))` + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) +size_t libcoopgamma_ramps_marshal_(const void *restrict, void *restrict, size_t); + +/** + * Unmarshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, + * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @param width The `sizeof(*(this->red))` + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_ramps_unmarshal_(void *restrict, const void *restrict, size_t *restrict, size_t); + + +/** + * Initialise a `libcoopgamma_filter_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_filter_initialise(libcoopgamma_filter_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_filter_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_filter_initialise` + * or failed call to `libcoopgamma_filter_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +void libcoopgamma_filter_destroy(libcoopgamma_filter_t *restrict); + +/** + * Marshal a `libcoopgamma_filter_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) +size_t libcoopgamma_filter_marshal(const libcoopgamma_filter_t *restrict, void *restrict); + +/** + * Unmarshal a `libcoopgamma_filter_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_filter_unmarshal(libcoopgamma_filter_t *restrict, const void *restrict, size_t *restrict); + + +/** + * Initialise a `libcoopgamma_crtc_info_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_crtc_info_initialise(libcoopgamma_crtc_info_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_crtc_info_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_crtc_info_initialise` + * or failed call to `libcoopgamma_crtc_info_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +void libcoopgamma_crtc_info_destroy(libcoopgamma_crtc_info_t *restrict); + +/** + * Marshal a `libcoopgamma_crtc_info_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) +size_t libcoopgamma_crtc_info_marshal(const libcoopgamma_crtc_info_t *restrict, void *restrict); + +/** + * Unmarshal a `libcoopgamma_crtc_info_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_crtc_info_unmarshal(libcoopgamma_crtc_info_t *restrict, const void *restrict, size_t *restrict); + + +/** + * Initialise a `libcoopgamma_filter_query_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_filter_query_initialise(libcoopgamma_filter_query_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_filter_query_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_filter_query_initialise` + * or failed call to `libcoopgamma_filter_query_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +void libcoopgamma_filter_query_destroy(libcoopgamma_filter_query_t *restrict); + +/** + * Marshal a `libcoopgamma_filter_query_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) +size_t libcoopgamma_filter_query_marshal(const libcoopgamma_filter_query_t *restrict, void *restrict); + +/** + * Unmarshal a `libcoopgamma_filter_query_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_filter_query_unmarshal(libcoopgamma_filter_query_t *restrict, const void *restrict, size_t *restrict); + + +/** + * Initialise a `libcoopgamma_queried_filter_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_queried_filter_initialise(libcoopgamma_queried_filter_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_queried_filter_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_queried_filter_initialise` + * or failed call to `libcoopgamma_queried_filter_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +void libcoopgamma_queried_filter_destroy(libcoopgamma_queried_filter_t *restrict); + +/** + * Marshal a `libcoopgamma_queried_filter_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @param depth The type used of ramp stops + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) +size_t libcoopgamma_queried_filter_marshal(const libcoopgamma_queried_filter_t *restrict, void *restrict, libcoopgamma_depth_t); + +/** + * Unmarshal a `libcoopgamma_queried_filter_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @param depth The type used of ramp stops + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_queried_filter_unmarshal(libcoopgamma_queried_filter_t *restrict, const void *restrict, + size_t *restrict, libcoopgamma_depth_t); + + +/** + * Initialise a `libcoopgamma_filter_table_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_filter_table_initialise(libcoopgamma_filter_table_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_filter_table_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_filter_table_initialise` + * or failed call to `libcoopgamma_filter_table_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +void libcoopgamma_filter_table_destroy(libcoopgamma_filter_table_t *restrict); + +/** + * Marshal a `libcoopgamma_filter_table_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) +size_t libcoopgamma_filter_table_marshal(const libcoopgamma_filter_table_t *restrict, void *restrict); + +/** + * Unmarshal a `libcoopgamma_filter_table_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_filter_table_unmarshal(libcoopgamma_filter_table_t *restrict, const void *restrict, size_t *restrict); + + +/** + * Initialise a `libcoopgamma_error_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_error_initialise(libcoopgamma_error_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_error_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_error_initialise` + * or failed call to `libcoopgamma_error_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +void libcoopgamma_error_destroy(libcoopgamma_error_t *restrict); + +/** + * Marshal a `libcoopgamma_error_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) +size_t libcoopgamma_error_marshal(const libcoopgamma_error_t *restrict, void *restrict); + +/** + * Unmarshal a `libcoopgamma_error_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_error_unmarshal(libcoopgamma_error_t *restrict, const void *restrict, size_t *restrict); + + +/** + * Initialise a `libcoopgamma_context_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_context_initialise(libcoopgamma_context_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_context_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_context_initialise` + * or failed call to `libcoopgamma_context_unmarshal` + * + * @param this The record to destroy + * @param disconnect Disconnect from the server? + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +void libcoopgamma_context_destroy(libcoopgamma_context_t *restrict, int); + +/** + * Marshal a `libcoopgamma_context_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) +size_t libcoopgamma_context_marshal(const libcoopgamma_context_t *restrict, void *restrict); + +/** + * Unmarshal a `libcoopgamma_context_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_context_unmarshal(libcoopgamma_context_t *restrict, const void *restrict, size_t *restrict); + + +/** + * Initialise a `libcoopgamma_async_context_t` + * + * @param this The record to initialise + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_async_context_initialise(libcoopgamma_async_context_t *restrict); + +/** + * Release all resources allocated to a `libcoopgamma_async_context_t`, + * the allocation of the record itself is not freed + * + * Always call this function after failed call to `libcoopgamma_async_context_initialise` + * or failed call to `libcoopgamma_async_context_unmarshal` + * + * @param this The record to destroy + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +void libcoopgamma_async_context_destroy(libcoopgamma_async_context_t *restrict); + +/** + * Marshal a `libcoopgamma_async_context_t` into a buffer + * + * @param this The record to marshal + * @param buf The output buffer, `NULL` to only measure + * how large this buffer has to be + * @return The number of marshalled bytes, or if `buf == NULL`, + * how many bytes would be marshalled if `buf != NULL` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) +size_t libcoopgamma_async_context_marshal(const libcoopgamma_async_context_t *restrict, void *restrict); + +/** + * Unmarshal a `libcoopgamma_async_context_t` from a buffer + * + * @param this The output parameter for unmarshalled record + * @param buf The buffer with the marshalled record + * @param n Output parameter for the number of unmarshalled bytes, undefined on failure + * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, + * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_async_context_unmarshal(libcoopgamma_async_context_t *restrict, const void *restrict, size_t *restrict); + + +/** + * List all recognised adjustment method + * + * SIGCHLD must not be ignored or blocked + * + * @return A `NULL`-terminated list of names. You should only free + * the outer pointer, inner pointers are subpointers of the + * outer pointer and cannot be freed. `NULL` on error. + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__))) +char **libcoopgamma_get_methods(void); + +/** + * Get the adjustment method and site + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @param methodp Output pointer for the selected adjustment method, + * which cannot be `NULL`. It is safe to call + * this function with this parameter set to `NULL`. + * @param sitep Output pointer for the selected site, which will + * be `NULL` the method only supports one site or if + * `site == NULL` and no site can be selected + * automatically. It is safe to call this function + * with this parameter set to `NULL`. + * @return Zero on success, -1 on error + */ +int libcoopgamma_get_method_and_site(const char *restrict, const char *restrict, char **restrict, char **restrict); + +/** + * Get the PID file of the coopgamma server + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @return The pathname of the server's PID file, `NULL` on error + * or if there server does not use PID files. The later + * case is detected by checking that `errno` is set to 0. + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__))) +char *libcoopgamma_get_pid_file(const char *restrict, const char *restrict); + +/** + * Get the socket file of the coopgamma server + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @return The pathname of the server's socket, `NULL` on error + * or if there server does have its own socket. The later + * case is detected by checking that `errno` is set to 0, + * and is the case when communicating with a server in a + * multi-server display server like mds. + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__))) +char *libcoopgamma_get_socket_file(const char *restrict, const char *restrict); + + +/** + * Connect to a coopgamma server, and start it if necessary + * + * Use `libcoopgamma_context_destroy` to disconnect + * + * SIGCHLD must not be ignored or blocked + * + * @param method The adjustment method, `NULL` for automatic + * @param site The site, `NULL` for automatic + * @param ctx The state of the library, must be initialised + * @return Zero on success, -1 on error. On error, `errno` is set + * to 0 if the server could not be initialised. + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(3)))) +int libcoopgamma_connect(const char *restrict, const char *restrict, libcoopgamma_context_t *restrict); + +/** + * By default communication is blocking, this function + * can be used to switch between blocking and nonblocking + * + * After setting the communication to nonblocking, + * `libcoopgamma_flush`, `libcoopgamma_synchronise` and + * and request-sending functions can fail with EAGAIN and + * EWOULDBLOCK. It is safe to continue with `libcoopgamma_flush` + * (for `libcoopgamma_flush` it selfand equest-sending functions) + * or `libcoopgamma_synchronise` just like EINTR failure. + * + * @param ctx The state of the library, must be connected + * @param nonblocking Nonblocking mode? + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_set_nonblocking(libcoopgamma_context_t *restrict, int); + +/** + * Send all pending outbound data + * + * If this function or another function that sends a request + * to the server fails with EINTR, call this function to + * complete the transfer. The `async` parameter will always + * be in a properly configured state if a function fails + * with EINTR. + * + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) +int libcoopgamma_flush(libcoopgamma_context_t *restrict); + +/** + * Wait for the next message to be received + * + * @param ctx The state of the library, must be connected + * @param pending Information for each pending request + * @param n The number of elements in `pending` + * @param selected The index of the element in `pending` which corresponds + * to the first inbound message, note that this only means + * that the message is not for any of the other request, + * if the message is corrupt any of the listed requests can + * be selected even if it is not for any of the requests. + * Functions that parse the message will detect such corruption. + * @return Zero on success, -1 on error. If the the message is ignored, + * which happens if corresponding `libcoopgamma_async_context_t` + * is not listed, -1 is returned and `errno` is set to 0. If -1 + * is returned, `errno` is set to `ENOTRECOVERABLE` you have + * received a corrupt message and the context has been tainted + * beyond recover. + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1, 4), __leaf__))) +int libcoopgamma_synchronise(libcoopgamma_context_t *restrict, libcoopgamma_async_context_t *restrict, size_t, size_t *restrict); + +/** + * Tell the library that you will not be parsing a receive message + * + * @param ctx The state of the library, must be connected + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +void libcoopgamma_skip_message(libcoopgamma_context_t *restrict); + + +/** + * List all available CRTC:s, send request part + * + * Cannot be used before connecting to the server + * + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_get_crtcs_send(libcoopgamma_context_t *restrict, libcoopgamma_async_context_t *restrict); + +/** + * List all available CRTC:s, receive response part + * + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return A `NULL`-terminated list of names. You should only free + * the outer pointer, inner pointers are subpointers of the + * outer pointer and cannot be freed. `NULL` on error, in + * which case `ctx->error` (rather than `errno`) is read + * for information about the error. + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__, __nonnull__))) +char **libcoopgamma_get_crtcs_recv(libcoopgamma_context_t *restrict, libcoopgamma_async_context_t *restrict); + +/** + * List all available CRTC:s, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param ctx The state of the library, must be connected + * @return A `NULL`-terminated list of names. You should only free + * the outer pointer, inner pointers are subpointers of the + * outer pointer and cannot be freed. `NULL` on error, in + * which case `ctx->error` (rather than `errno`) is read + * for information about the error. + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__, __nonnull__))) +char **libcoopgamma_get_crtcs_sync(libcoopgamma_context_t *restrict); + + +/** + * Retrieve information about a CRTC:s gamma ramps, send request part + * + * Cannot be used before connecting to the server + * + * @param crtc The name of the CRTC + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_get_gamma_info_send(const char *restrict, libcoopgamma_context_t *restrict, libcoopgamma_async_context_t *restrict); + +/** + * Retrieve information about a CRTC:s gamma ramps, receive response part + * + * @param info Output parameter for the information, must be initialised + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_get_gamma_info_recv(libcoopgamma_crtc_info_t *restrict, libcoopgamma_context_t *restrict, + libcoopgamma_async_context_t *restrict); + +/** + * Retrieve information about a CRTC:s gamma ramps, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param crtc The name of the CRTC + * @param info Output parameter for the information, must be initialised + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_get_gamma_info_sync(const char *restrict, libcoopgamma_crtc_info_t *restrict, libcoopgamma_context_t *restrict); + + +/** + * Retrieve the current gamma ramp adjustments, send request part + * + * Cannot be used before connecting to the server + * + * @param query The query to send + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_get_gamma_send(const libcoopgamma_filter_query_t *restrict, libcoopgamma_context_t *restrict, + libcoopgamma_async_context_t *restrict); + +/** + * Retrieve the current gamma ramp adjustments, receive response part + * + * @param table Output for the response, must be initialised + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_get_gamma_recv(libcoopgamma_filter_table_t *restrict, libcoopgamma_context_t *restrict, + libcoopgamma_async_context_t *restrict); + +/** + * Retrieve the current gamma ramp adjustments, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param query The query to send + * @param table Output for the response, must be initialised + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_get_gamma_sync(const libcoopgamma_filter_query_t *restrict, + libcoopgamma_filter_table_t *restrict, + libcoopgamma_context_t *restrict); + + +/** + * Apply, update, or remove a gamma ramp adjustment, send request part + * + * Cannot be used before connecting to the server + * + * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's + * @param ctx The state of the library, must be connected + * @param async Information about the request, that is needed to + * identify and parse the response, is stored here + * @return Zero on success, -1 on error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_set_gamma_send(const libcoopgamma_filter_t *restrict, libcoopgamma_context_t *restrict, + libcoopgamma_async_context_t *restrict); + +/** + * Apply, update, or remove a gamma ramp adjustment, receive response part + * + * @param ctx The state of the library, must be connected + * @param async Information about the request + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_set_gamma_recv(libcoopgamma_context_t *restrict, libcoopgamma_async_context_t *restrict); + +/** + * Apply, update, or remove a gamma ramp adjustment, synchronous version + * + * This is a synchronous request function, as such, + * you have to ensure that communication is blocking + * (default), and that there are not asynchronous + * requests waiting, it also means that EINTR:s are + * silently ignored and there no wait to cancel the + * operation without disconnection from the server + * + * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's + * @param ctx The state of the library, must be connected + * @return Zero on success, -1 on error, in which case `ctx->error` + * (rather than `errno`) is read for information about the error + */ +LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) +int libcoopgamma_set_gamma_sync(const libcoopgamma_filter_t *restrict, libcoopgamma_context_t *restrict); + + + +#if defined(__clang__) +# pragma GCC diagnostic pop +#endif + +#undef LIBCOOPGAMMA_GCC_ONLY + +#endif diff --git a/libcoopgamma.h.0 b/libcoopgamma.h.0 new file mode 100644 index 0000000..73a0b8a --- /dev/null +++ b/libcoopgamma.h.0 @@ -0,0 +1,479 @@ +.TH LIBCOOPGAMMA.H 0 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma.h - Cooperative gamma library header +.SH "SYNOPSIS" +.nf +#include +.fi +.SH "DESCRIPTION" +The +.B +header includes the +.BR , +.BR , +and +.BR +headers. +.P +The +.B +header defines the macros which expands to integer +constant expressions with distinct values: +.TP +.BR LIBCOOPGAMMA_SUCCESS " = 0" +Unmarshal was successful. +.TP +.BR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " > 0" +Unmarshal failed. The marshalled data was created +with a older version of libcoopgamma that does not +marshall the data in a compatible way. +.TP +.BR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " > 0" +Unmarshal failed. The marshalled data was created with +a newer version libcoopgamma that does not marshall +the data in a compatible way. +.TP +.BR LIBCOOPGAMMA_ERRNO_SET " < 0 (-1)" +Unmarshal failed because of an error, +.I errno +has been set appropriately. +.P +The +.B +header defines +.I "enum libcoopgamma_support" +with the alias +.I libcoopgamma_support_t +and the following distinct values: +.TP +.BR LIBCOOPGAMMA_NO " = 0" +Gamma adjustments are not supported. +.TP +.BR LIBCOOPGAMMA_MAYBE " = 1" +Don't know whether gamma adjustments are supported. +.TP +.BR LIBCOOPGAMMA_YES " = 2" +Gamma adjustments are supported. +.P +The +.B +header defines +.I "enum libcoopgamma_depth" +with the alias +.I libcoopgamma_depth_t +and the following distinct values: +.TP +.BR LIBCOOPGAMMA_UINT8 " = 8" +Gamma ramps with +.I uint8_t +as the stop-type are used +.RI ( libcoopgamma_ramps8_t ). +.TP +.BR LIBCOOPGAMMA_UINT16 " = 16" +Gamma ramps with +.I uint16_t +as the stop-type are used +.RI ( libcoopgamma_ramps16_t ). +.TP +.BR LIBCOOPGAMMA_UINT32 " = 32" +Gamma ramps with +.I uint32_t +as the stop-type are used +.RI ( libcoopgamma_ramps32_t ). +.TP +.BR LIBCOOPGAMMA_UINT64 " = 64" +Gamma ramps with +.I uint64_t +as the stop-type are used +.RI ( libcoopgamma_ramps64_t ). +.TP +.BR LIBCOOPGAMMA_FLOAT " < 0" +Gamma ramps with +.I float +as the stop-type are used +.RI ( libcoopgamma_rampsf_t ). +.TP +.BR LIBCOOPGAMMA_DOUBLE " < 0" +Gamma ramps with +.I double +as the stop-type are used +.RI ( libcoopgamma_rampsd_t ). +.P +The +.B +header defines +.I "enum libcoopgamma_lifespan" +with the alias +.I libcoopgamma_lifespan_t +and the following distinct values: +.TP +.BR LIBCOOPGAMMA_REMOVE " = 0" +Remove the filter now. +.TP +.BR LIBCOOPGAMMA_UNTIL_DEATH " > 0" +Remove the filter when disconnecting from the coopgamma +server, or even explicitly removed, whichever comes first. +.TP +.BR LIBCOOPGAMMA_UNTIL_REMOVAL " > 0" +Only remove the filter when it is explicitly requested. +.P +The +.B +header defines +.I "enum libcoopgamma_colourspace" +with the alias +.I libcoopgamma_colourspace_t +and the following distinct values: +.TP +.BR LIBCOOPGAMMA_UNKNOWN " = 0" +The monitor's colourspace is unknown. +.TP +.BR LIBCOOPGAMMA_SRGB " > 0" +The monitor uses sRGB as its colourspace. +.TP +.BR LIBCOOPGAMMA_RGB " > 0" +The monitor uses an RGB colourspace other than sRGB. +.TP +.BR LIBCOOPGAMMA_NON_RGB " > 0" +The monitor uses a non-RGB multicolour colourspace. +.TP +.BR LIBCOOPGAMMA_GREY " > 0" +The monitor uses a singlecolour scale colourspace, +possibility greyscale, or is monochrome. +.P +The +.B +header defines +.I "struct libcoopgamma_ramps8" +.RI ( libcoopgamma_ramps8_t ), +.I "struct libcoopgamma_ramps16" +.RI ( libcoopgamma_ramps16_t ), +.I "struct libcoopgamma_ramps32" +.RI ( libcoopgamma_ramps32_t ), +.I "struct libcoopgamma_ramps64" +.RI ( libcoopgamma_ramps64_t ), +.I "struct libcoopgamma_rampsf" +.RI ( libcoopgamma_rampsf_t ), +.I "struct libcoopgamma_rampsd" +.RI ( libcoopgamma_rampsd_t ), +with the following members, +where +.I type +is +.IR uint8_t , +.IR uint16_t , +.IR uint32_t , +.IR uint64_t , +.IR float , +and +.I double +for the respective structures: +.TP +.B "size_t red_size" + The number of stops in the red ramp. +.TP +.B "size_t green_size" +The number of stops in the green ramp. +.TP +.B "size_t blue_size" +The number of stops in the blue ramp. +.TP +.IB type " *red" +The red ramp. +.TP +.IB type " *green" +The green ramp. +.TP +.IB type " *blue" +The blue ramp. +.P +The +.B +header defines +.I "union libcoopgamma_ramps" +with alias +.I libcoopgamma_ramps_t +and the follow members: +.TP +.B "libcoopgamma_ramps8_t u8" +.TP +.B "libcoopgamma_ramps16_t u16" +.TP +.B "libcoopgamma_ramps32_t u32" +.TP +.B "libcoopgamma_ramps64_t u64" +.TP +.B "libcoopgamma_rampsf_t f" +.TP +.B "libcoopgamma_rampsd_t d" +.P +The +.B +header defines +.I "struct libcoopgamma_filter" +with alias +.I libcoopgamma_filter_t +and the follow members: +.TP +.B "int64_t priority" +The priority of the filter, higher priority is applied first. +The gamma correction should have priority 0. +.TP +.B "char *crtc" +The CRTC for which this filter shall be applied. +.TP +.B "char *class" +Identifier for the filter. The syntax must be +\(aq\fI${PACKAGE_NAME}\fP\fB::\fP\fI${COMMAND_NAME}\fP\fB::\fP\fI${RULE}\fP\(aq. +.TP +.B "enum libcoopgamma_lifespan lifespan" +When shall the filter be removed? +If this member's value is +.IR LIBCOOPGAMMA_REMOVE , +only +.I .crtc +and +.I .class +need also be defined. +.TP +.B "enum libcoopgamma_depth depth" +The data type and bit-depth of the ramp stops. +.TP +.B "union libcoopgamma_ramps ramps" +The gamma ramp adjustments of the filter. +.P +The +.B +header defines +.I "struct libcoopgamma_crtc_info" +with alias +.I libcoopgamma_crtc_info_t +and the follow members: +.TP +.B "int cooperative" +Is cooperative gamma server running? +.TP +.B "enum libcoopgamma_depth depth" +The data type and bit-depth of the ramp stops. +.TP +.B "enum libcoopgamma_support supported" +Is gamma adjustments supported on the CRTC? +If not, +.IR .depth , +.IR .red_size , +.IR .green_size , +and +.I .blue_size +are undefined. +.TP +.B "size_t red_size" + The number of stops in the red ramp. +.TP +.B "size_t green_size" +The number of stops in the green ramp. +.TP +.B "size_t blue_size" +The number of stops in the blue ramp. +.TP +.B "enum libcoopgamma_colourspace colourspace" +The monitor's colurspace. +.TP +.B "int have_gamut" +Is the gamut of the monitor known? +If, and only if, so, +.IR .red_x , +.IR .red_y , +.IR .green_x , +.IR .green_y , +.IR .blue_x , +.IR .blue_y , +.IR .white_x , +and +.IR .white_y +are set. Unless the monitor uses an +RGB colourspace, this value should +be false, but there is no guarantee +of this, you have to check that the +colourspace is an RGB colourspace. +.TP +.B "unsigned red_x" +The x-value (CIE xyY) of the monitor's +red colour, multiplied by 1024. +.TP +.B "unsigned red_y" +The y-value (CIE xyY) of the monitor's +red colour, multiplied by 1024. +.TP +.B "unsigned green_x" +The x-value (CIE xyY) of the monitor's +green colour, multiplied by 1024. +.TP +.B "unsigned green_y" +The y-value (CIE xyY) of the monitor's +green colour, multiplied by 1024. +.TP +.B "unsigned blue_x" +The x-value (CIE xyY) of the monitor's +blue colour, multiplied by 1024. +.TP +.B "unsigned blue_y" +The y-value (CIE xyY) of the monitor's +blue colour, multiplied by 1024. +.TP +.B "unsigned white_x" +The x-value (CIE xyY) of the monitor's +default white point, multiplied by 1024. +.TP +.B "unsigned white_y" +The y-value (CIE xyY) of the monitor's +default white point, multiplied by 1024. +.P +The +.B +header defines +.I "struct libcoopgamma_filter_query" +with alias +.I libcoopgamma_filter_query_t +and the follow members: +.TP +.B "int64_t high_priority" +Do no return filters with higher priority than this value. +.TP +.B "int64_t low_priority" +Do no return filters with lower priority than this value. +.TP +.B "char *crtc" +The CRTC for which the the current filters shall returned +.TP +.B "int coalesce" +Shall all selected filters be coalesced into one gamma ramp triplet? +.P +The +.B +header defines +.I "struct libcoopgamma_queried_filter" +with alias +.I libcoopgamma_queried_filter_t +and the follow members: +.TP +.B "int64_t priority" +The filter's priority. +.TP +.B "char *class" +The filter's class. +.TP +.B "union libcoopgamma_ramps ramps" +The gamma ramp adjustments of the filter +.P +The +.B +header defines +.I "struct libcoopgamma_filter_table" +with alias +.I libcoopgamma_filter_table_t +and the follow members: +.TP +.B "size_t red_size" +The number of stops in the red ramp. +.TP +.B "size_t green_size" +The number of stops in the green ramp. +.TP +.B "size_t blue_size" +The number of stops in the blue ramp. +.TP +.B "size_t filter_count" +The number of filters. +.TP +.B "struct libcoopgamma_queried_filter_t *filters" +The filters, should be ordered by priority +in descending order (applied first goes first, +applied last goes last), lest there is something +wrong with the coopgamma server. + +If filter coalition was requested, there will +be exactly one filter +.I "(.filter_count == 1)" +and +.I ".filters->class == NULL" +and +.I ".filters->priority" +is undefined. +.TP +.B "enum libcoopgamma_depth depth" +The data type and bit-depth of the ramp stops. +.P +The +.B +header defines +.I "struct libcoopgamma_error" +with alias +.I libcoopgamma_error_t +and the follow members: +.TP +.B "uint64_t number" +Error code. + +If +.I ".custom" +is false, 0 indicates success, +otherwise, 0 indicates that no +error code has been assigned. +.TP +.B "int custom" +Is this a custom error? +.TP +.B "int server_side" +Did the error occur on the server-side? +.TP +.B "char *description" +Error message, can be, and usually is, +.I NULL +if +.I ".custom" +is false. +.P +The +.B +header defines +.I "struct libcoopgamma_context" +with alias +.I libcoopgamma_context_t +and the follow members and a lot +if internal unlisted members: +.TP +.B "struct libcoopgamma_error error" +The error of the last failed function call +to function that documents that this member +will be set on failure. + +This member is undefined after successful +function call. +.TP +.B "int fd" +File descriptor for the socket that connects +the client to the server. +.P +The +.B +header defines +.I "struct libcoopgamma_async_context" +with alias +.I libcoopgamma_async_context_t. +This structure has only internal members. +.SH "SEE ALSO" +.BR libcoopgamma (7), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3), +.BR libcoopgamma_get_methods (3), +.BR libcoopgamma_get_method_and_site (3), +.BR libcoopgamma_get_pid_file (3), +.BR libcoopgamma_get_socket_file (3), +.BR libcoopgamma_connect (3) diff --git a/libcoopgamma_async_context_destroy.3 b/libcoopgamma_async_context_destroy.3 new file mode 100644 index 0000000..154ad77 --- /dev/null +++ b/libcoopgamma_async_context_destroy.3 @@ -0,0 +1,33 @@ +.TH LIBCOOPGAMMA_ASYNC_CONTEXT_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_async_context_destroy - Deinitialise a libcoopgamma_async_context_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_async_context_destroy(libcoopgamma_async_context_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_async_context_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.SH "SEE ALSO" +.BR libcoopgamma_async_context_initialise (3), +.BR libcoopgamma_async_context_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_context_destroy (3) diff --git a/libcoopgamma_async_context_initialise.3 b/libcoopgamma_async_context_initialise.3 new file mode 100644 index 0000000..24cf859 --- /dev/null +++ b/libcoopgamma_async_context_initialise.3 @@ -0,0 +1,44 @@ +.TH LIBCOOPGAMMA_ASYNC_CONTEXT_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_async_context_initialise - Initialise a libcoopgamma_async_context_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_async_context_initialise(libcoopgamma_async_context_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_async_context_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_async_context_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_async_context_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_async_context_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_async_context_destroy (3), +.BR libcoopgamma_async_context_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3) diff --git a/libcoopgamma_async_context_marshal.3 b/libcoopgamma_async_context_marshal.3 new file mode 100644 index 0000000..e7197b8 --- /dev/null +++ b/libcoopgamma_async_context_marshal.3 @@ -0,0 +1,49 @@ +.TH LIBCOOPGAMMA_ASYNC_CONTEXT_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_async_context_marshal - Marshal a libcoopgamma_async_context_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_async_context_marshal(libcoopgamma_async_context_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_async_context_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.SH "RETURN VALUES" +The +.BR libcoopgamma_async_context_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_async_context_destroy (3), +.BR libcoopgamma_async_context_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_context_marshal (3) diff --git a/libcoopgamma_async_context_unmarshal.3 b/libcoopgamma_async_context_unmarshal.3 new file mode 100644 index 0000000..5930980 --- /dev/null +++ b/libcoopgamma_async_context_unmarshal.3 @@ -0,0 +1,83 @@ +.TH LIBCOOPGAMMA_ASYNC_CONTEXT_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_async_context_unmarshal - Unmarshal a libcoopgamma_async_context_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_async_context_unmarshal(libcoopgamma_async_context_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_async_context_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_async_context_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_async_context_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_async_context_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +No error is specified for the +.BR libcoopgamma_async_context_marshal () +function. +.SH "SEE ALSO" +.BR libcoopgamma_async_context_destroy (3), +.BR libcoopgamma_async_context_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3) diff --git a/libcoopgamma_connect.3 b/libcoopgamma_connect.3 new file mode 100644 index 0000000..594d43f --- /dev/null +++ b/libcoopgamma_connect.3 @@ -0,0 +1,78 @@ +.TH LIBCOOPGAMMA_CONNECT 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_connect - Connect to a coopgamma server +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_connect(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP, + libcoopgamma_context_t *restrict \fIctx\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_connect () +function connects to the instance coopgamma server +for the selected adjustment +.I method +and +.IR site . +If the server is not already running, it will be started. If +.I method +or +.I site +is +.IR NULL , +the it will selected automatically. +The state of the connection is stored in +.IR ctx , +which must be initialised but not already connected. +.I ctx +can be initialised with +.BR libcoopgamma_context_initialise (3). +.P +For the duration of the function call, +.I SIGCHLD +most neither be ignored nor blocked. It is the +user of this library's responsibility to ensure +this. The +.BR libcoopgamma_connect () +function will not temporarily reset handling of +.I SIGCHLD +itself. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_connect () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_connect () +function may fail for any reason specified for +.BR libcoopgamma_get_socket_file (3), +.BR socket (3), +.BR waitpid (3), +and +.BR connect (3). +The function may also fail for any of the +following reasons: +.TP +.B ENAMETOOLONG +The pathname of the socket was too long. +.TP +.B 0 +The server failed to initialise. +.SH "SEE ALSO" +.BR libcoopgamma_get_methods (3), +.BR libcoopgamma_get_pid_file (3), +.BR libcoopgamma_get_socket_file (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_set_gamma_send (3) diff --git a/libcoopgamma_context_destroy.3 b/libcoopgamma_context_destroy.3 new file mode 100644 index 0000000..0d144a8 --- /dev/null +++ b/libcoopgamma_context_destroy.3 @@ -0,0 +1,38 @@ +.TH LIBCOOPGAMMA_CONTEXT_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_context_destroy - Deinitialise a libcoopgamma_context_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_context_destroy(libcoopgamma_context_t *restrict \fIthis\fP, int \fIdisconnect\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_context_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.P +If and only if +.I disconnect +is a nonzero value, the function will +disconnect from the coopgamma server. +.SH "SEE ALSO" +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_context_initialise.3 b/libcoopgamma_context_initialise.3 new file mode 100644 index 0000000..367c0a9 --- /dev/null +++ b/libcoopgamma_context_initialise.3 @@ -0,0 +1,45 @@ +.TH LIBCOOPGAMMA_CONTEXT_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_context_initialise - Initialise a libcoopgamma_context_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_context_initialise(libcoopgamma_context_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_context_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_context_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_context_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_context_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_async_context_initialise (3), +.BR libcoopgamma_connect (3) diff --git a/libcoopgamma_context_marshal.3 b/libcoopgamma_context_marshal.3 new file mode 100644 index 0000000..aa7feea --- /dev/null +++ b/libcoopgamma_context_marshal.3 @@ -0,0 +1,52 @@ +.TH LIBCOOPGAMMA_CONTEXT_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_context_marshal - Marshal a libcoopgamma_context_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_context_marshal(libcoopgamma_context_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_context_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +However, it is probably nonsensical to send the +marshalled data to any other process than the +process itself since it contains a file descriptor. +.SH "RETURN VALUES" +The +.BR libcoopgamma_context_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_context_unmarshal.3 b/libcoopgamma_context_unmarshal.3 new file mode 100644 index 0000000..f805163 --- /dev/null +++ b/libcoopgamma_context_unmarshal.3 @@ -0,0 +1,86 @@ +.TH LIBCOOPGAMMA_CONTEXT_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_context_unmarshal - Unmarshal a libcoopgamma_context_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_context_unmarshal(libcoopgamma_context_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_context_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_context_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_context_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_context_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +The +.BR libcoopgamma_context_marshal () +function may fail, and returned +.I LIBCOOPGAMMA_ERRNO_SET +for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_crtc_info_destroy.3 b/libcoopgamma_crtc_info_destroy.3 new file mode 100644 index 0000000..c67e81c --- /dev/null +++ b/libcoopgamma_crtc_info_destroy.3 @@ -0,0 +1,33 @@ +.TH LIBCOOPGAMMA_CRTC_INFO_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_crtc_info_destroy - Deinitialise a libcoopgamma_crtc_info_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_crtc_info_destroy(libcoopgamma_crtc_info_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_crtc_info_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.SH "SEE ALSO" +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_crtc_info_initialise.3 b/libcoopgamma_crtc_info_initialise.3 new file mode 100644 index 0000000..84f167d --- /dev/null +++ b/libcoopgamma_crtc_info_initialise.3 @@ -0,0 +1,44 @@ +.TH LIBCOOPGAMMA_CRTC_INFO_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_crtc_info_initialise - Initialise a libcoopgamma_crtc_info_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_crtc_info_initialise(libcoopgamma_crtc_info_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_crtc_info_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_crtc_info_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_crtc_info_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_crtc_info_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3) diff --git a/libcoopgamma_crtc_info_marshal.3 b/libcoopgamma_crtc_info_marshal.3 new file mode 100644 index 0000000..2a8b294 --- /dev/null +++ b/libcoopgamma_crtc_info_marshal.3 @@ -0,0 +1,49 @@ +.TH LIBCOOPGAMMA_CRTC_INFO_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_crtc_info_marshal - Marshal a libcoopgamma_crtc_info_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_crtc_info_marshal(libcoopgamma_crtc_info_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_crtc_info_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.SH "RETURN VALUES" +The +.BR libcoopgamma_crtc_info_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_crtc_info_unmarshal.3 b/libcoopgamma_crtc_info_unmarshal.3 new file mode 100644 index 0000000..964b3b0 --- /dev/null +++ b/libcoopgamma_crtc_info_unmarshal.3 @@ -0,0 +1,83 @@ +.TH LIBCOOPGAMMA_CRTC_INFO_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_crtc_info_unmarshal - Unmarshal a libcoopgamma_crtc_info_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_crtc_info_unmarshal(libcoopgamma_crtc_info_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_crtc_info_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_crtc_info_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_crtc_info_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_crtc_info_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +No error is specified for the +.BR libcoopgamma_crtc_info_marshal () +function. +.SH "SEE ALSO" +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_error_destroy.3 b/libcoopgamma_error_destroy.3 new file mode 100644 index 0000000..978d0ad --- /dev/null +++ b/libcoopgamma_error_destroy.3 @@ -0,0 +1,33 @@ +.TH LIBCOOPGAMMA_ERROR_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_error_destroy - Deinitialise a libcoopgamma_error_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_error_destroy(libcoopgamma_error_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_error_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.SH "SEE ALSO" +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_error_initialise.3 b/libcoopgamma_error_initialise.3 new file mode 100644 index 0000000..fba20cf --- /dev/null +++ b/libcoopgamma_error_initialise.3 @@ -0,0 +1,44 @@ +.TH LIBCOOPGAMMA_ERROR_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_error_initialise - Initialise a libcoopgamma_error_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_error_initialise(libcoopgamma_error_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_error_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_error_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_error_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_error_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3) diff --git a/libcoopgamma_error_marshal.3 b/libcoopgamma_error_marshal.3 new file mode 100644 index 0000000..f168a1c --- /dev/null +++ b/libcoopgamma_error_marshal.3 @@ -0,0 +1,49 @@ +.TH LIBCOOPGAMMA_ERROR_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_error_marshal - Marshal a libcoopgamma_error_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_error_marshal(libcoopgamma_error_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_error_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.SH "RETURN VALUES" +The +.BR libcoopgamma_error_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_error_unmarshal.3 b/libcoopgamma_error_unmarshal.3 new file mode 100644 index 0000000..b780cb2 --- /dev/null +++ b/libcoopgamma_error_unmarshal.3 @@ -0,0 +1,86 @@ +.TH LIBCOOPGAMMA_ERROR_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_error_unmarshal - Unmarshal a libcoopgamma_error_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_error_unmarshal(libcoopgamma_error_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_error_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_error_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_error_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_error_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +The +.BR libcoopgamma_error_marshal () +function may fail, and returned +.I LIBCOOPGAMMA_ERRNO_SET +for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_filter_destroy.3 b/libcoopgamma_filter_destroy.3 new file mode 100644 index 0000000..e246da3 --- /dev/null +++ b/libcoopgamma_filter_destroy.3 @@ -0,0 +1,33 @@ +.TH LIBCOOPGAMMA_FILTER_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_destroy - Deinitialise a libcoopgamma_filter_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_filter_destroy(libcoopgamma_filter_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.SH "SEE ALSO" +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_filter_initialise.3 b/libcoopgamma_filter_initialise.3 new file mode 100644 index 0000000..d2889b4 --- /dev/null +++ b/libcoopgamma_filter_initialise.3 @@ -0,0 +1,44 @@ +.TH LIBCOOPGAMMA_FILTER_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_initialise - Initialise a libcoopgamma_filter_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_filter_initialise(libcoopgamma_filter_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_filter_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_filter_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_filter_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3) diff --git a/libcoopgamma_filter_marshal.3 b/libcoopgamma_filter_marshal.3 new file mode 100644 index 0000000..982802d --- /dev/null +++ b/libcoopgamma_filter_marshal.3 @@ -0,0 +1,49 @@ +.TH LIBCOOPGAMMA_FILTER_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_marshal - Marshal a libcoopgamma_filter_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_filter_marshal(libcoopgamma_filter_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.SH "RETURN VALUES" +The +.BR libcoopgamma_filter_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_filter_query_destroy.3 b/libcoopgamma_filter_query_destroy.3 new file mode 100644 index 0000000..83e5561 --- /dev/null +++ b/libcoopgamma_filter_query_destroy.3 @@ -0,0 +1,33 @@ +.TH LIBCOOPGAMMA_FILTER_QUERY_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_query_destroy - Deinitialise a libcoopgamma_filter_query_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_filter_query_destroy(libcoopgamma_filter_query_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_query_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.SH "SEE ALSO" +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_filter_query_initialise.3 b/libcoopgamma_filter_query_initialise.3 new file mode 100644 index 0000000..e2a8903 --- /dev/null +++ b/libcoopgamma_filter_query_initialise.3 @@ -0,0 +1,44 @@ +.TH LIBCOOPGAMMA_FILTER_QUERY_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_query_initialise - Initialise a libcoopgamma_filter_query_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_filter_query_initialise(libcoopgamma_filter_query_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_query_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_filter_query_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_filter_query_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_filter_query_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3) diff --git a/libcoopgamma_filter_query_marshal.3 b/libcoopgamma_filter_query_marshal.3 new file mode 100644 index 0000000..83d560d --- /dev/null +++ b/libcoopgamma_filter_query_marshal.3 @@ -0,0 +1,49 @@ +.TH LIBCOOPGAMMA_FILTER_QUERY_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_query_marshal - Marshal a libcoopgamma_filter_query_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_filter_query_marshal(libcoopgamma_filter_query_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_query_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.SH "RETURN VALUES" +The +.BR libcoopgamma_filter_query_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_filter_query_unmarshal.3 b/libcoopgamma_filter_query_unmarshal.3 new file mode 100644 index 0000000..8adc09a --- /dev/null +++ b/libcoopgamma_filter_query_unmarshal.3 @@ -0,0 +1,86 @@ +.TH LIBCOOPGAMMA_FILTER_QUERY_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_query_unmarshal - Unmarshal a libcoopgamma_filter_query_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_filter_query_unmarshal(libcoopgamma_filter_query_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_query_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_filter_query_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_filter_query_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_filter_query_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +The +.BR libcoopgamma_filter_query_marshal () +function may fail, and returned +.I LIBCOOPGAMMA_ERRNO_SET +for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_filter_table_destroy.3 b/libcoopgamma_filter_table_destroy.3 new file mode 100644 index 0000000..9fa4d61 --- /dev/null +++ b/libcoopgamma_filter_table_destroy.3 @@ -0,0 +1,33 @@ +.TH LIBCOOPGAMMA_FILTER_TABLE_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_table_destroy - Deinitialise a libcoopgamma_filter_table_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_filter_table_destroy(libcoopgamma_filter_table_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_table_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.SH "SEE ALSO" +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_filter_table_initialise.3 b/libcoopgamma_filter_table_initialise.3 new file mode 100644 index 0000000..79ee8cf --- /dev/null +++ b/libcoopgamma_filter_table_initialise.3 @@ -0,0 +1,44 @@ +.TH LIBCOOPGAMMA_FILTER_TABLE_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_table_initialise - Initialise a libcoopgamma_filter_table_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_filter_table_initialise(libcoopgamma_filter_table_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_table_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_filter_table_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_filter_table_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_filter_table_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3) diff --git a/libcoopgamma_filter_table_marshal.3 b/libcoopgamma_filter_table_marshal.3 new file mode 100644 index 0000000..bc17c8a --- /dev/null +++ b/libcoopgamma_filter_table_marshal.3 @@ -0,0 +1,49 @@ +.TH LIBCOOPGAMMA_FILTER_TABLE_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_table_marshal - Marshal a libcoopgamma_filter_table_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_filter_table_marshal(libcoopgamma_filter_table_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_table_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.SH "RETURN VALUES" +The +.BR libcoopgamma_filter_table_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_filter_table_unmarshal.3 b/libcoopgamma_filter_table_unmarshal.3 new file mode 100644 index 0000000..3dd5cd2 --- /dev/null +++ b/libcoopgamma_filter_table_unmarshal.3 @@ -0,0 +1,86 @@ +.TH LIBCOOPGAMMA_FILTER_TABLE_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_table_unmarshal - Unmarshal a libcoopgamma_filter_table_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_filter_table_unmarshal(libcoopgamma_filter_table_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_table_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_filter_table_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_filter_table_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_filter_table_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +The +.BR libcoopgamma_filter_table_marshal () +function may fail, and returned +.I LIBCOOPGAMMA_ERRNO_SET +for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_filter_unmarshal.3 b/libcoopgamma_filter_unmarshal.3 new file mode 100644 index 0000000..d9f1ee8 --- /dev/null +++ b/libcoopgamma_filter_unmarshal.3 @@ -0,0 +1,86 @@ +.TH LIBCOOPGAMMA_FILTER_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_filter_unmarshal - Unmarshal a libcoopgamma_filter_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_filter_unmarshal(libcoopgamma_filter_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_filter_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_filter_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_filter_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_filter_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +The +.BR libcoopgamma_filter_marshal () +function may fail, and returned +.I LIBCOOPGAMMA_ERRNO_SET +for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_flush.3 b/libcoopgamma_flush.3 new file mode 100644 index 0000000..8ffaae2 --- /dev/null +++ b/libcoopgamma_flush.3 @@ -0,0 +1,58 @@ +.TH LIBCOOPGAMMA_FLUSH 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_flush - Send all pending outbound data +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_flush(libcoopgamma_context_t *restrict \fIctx\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_flush () +function sends all data on +.I ctx +that have not yet been sent because of +interruption or similar. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_flush () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_flush () +function may fail for any reason specified for +.BR send (3). +Particularly interesting exceptional +conditions, that are not errors proper, include +those indicated by the following values on +.IR errno : +.TP +.B EINTR +The function was interrupted by a signal. When +this happens, just resume be calling the functon +again. +.TP +.BR EAGAIN " or " EWOULDBLOCK +The communication is nonblocking and the buffer +between the server and the client is full, +and no more data can be queued without blocking. +When this happens, wait a short period of time +and call the function again to resume. +.BR select (3) +or similar function can be used to wait until +.I ctx->fd +is writable. +.SH "SEE ALSO" +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_connect (3), +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_set_gamma_send (3) diff --git a/libcoopgamma_get_crtcs_recv.3 b/libcoopgamma_get_crtcs_recv.3 new file mode 100644 index 0000000..02f8daa --- /dev/null +++ b/libcoopgamma_get_crtcs_recv.3 @@ -0,0 +1,63 @@ +.TH LIBCOOPGAMMA_GET_CRTCS_RECV 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_crtcs_recv - Receive a list of all available CRTC:s +.SH "SYNOPSIS" +.nf +#include + +char **libcoopgamma_get_crtcs_recv(libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_crtcs_recv () +function parses the response for the requests +sent using the +.BR libcoopgamma_get_crtcs_send () +function with the same +.I ctx +and +.I async +arguments. The +.I async +must have been selected by the last call to the +.BR libcoopgamma_synchronise (3) +function. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_crtcs_recv () +function returns a +.I NULL +terminated +list of all available CRTC:s. If possible, +the CRTC:s are named by the connected +monitors' EDID:s. None of the elements can +contain a NUL or LF byte. The elements in +the list are subpointers of the returned +pointer. The user shall free the returned +pointer, which effectively frees all its +elements. On error, +.I NULL +is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_crtcs_recv () +function may fail for any reason specified for +.BR malloc (3). +The function may also fail for the following reasons: +.TP +.B EBADMSG +The received message was corrupt. +.SH "SEE ALSO" +.BR libcoopgamma_async_context_destroy (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_crtcs_sync (3), +.BR libcoopgamma_get_gamma_info_recv (3), +.BR libcoopgamma_get_gamma_recv (3), +.BR libcoopgamma_set_gamma_recv (3) diff --git a/libcoopgamma_get_crtcs_send.3 b/libcoopgamma_get_crtcs_send.3 new file mode 100644 index 0000000..6afeed0 --- /dev/null +++ b/libcoopgamma_get_crtcs_send.3 @@ -0,0 +1,77 @@ +.TH LIBCOOPGAMMA_GET_CRTCS_SEND 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_crtcs_send - Send a request for an enumeration of all available CRTC:s +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_crtcs_send(libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_crtcs_send () +function sends a request over the connection of +.I ctx +to the server for an enumeration of all available +CRTC:s (roughly, display devices). Information +about the request is stored in +.IR *async , +this information is used by +.BR libcoopgamma_synchronise (3) +to identify the response, and by +.BR libcoopgamma_get_crtcs_recv (3) +to parse the response. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_crtcs_send () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_crtcs_send () +function may fail for any reason specified for +.BR malloc (3), +.BR realloc (3), +or +.BR libcoopgamma_flush (3). +Particularly interesting exceptional +conditions, that are not errors proper, include +those indicated by the following values on +.IR errno : +.TP +.B EINTR +The function was interrupted by a signal. When +this happens, call +.BR libcoopgamma_flush (3) +to resume. +.TP +.BR EAGAIN " or " EWOULDBLOCK +The communication is nonblocking and the buffer +between the server and the client is full, +and no more data can be queued without blocking. +When this happens, wait a short period of time +and call +.BR libcoopgamma_flush (3) +to resume. +.BR select (3) +or similar function can be used to wait until +.I ctx->fd +is readable. +.TP +.B ECONNREST +The connection to the server has closed. +.SH "SEE ALSO" +.BR libcoopgamma_async_context_initialise (3), +.BR libcoopgamma_flush (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_get_crtcs_recv (3), +.BR libcoopgamma_get_crtcs_sync (3), +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_set_gamma_send (3) diff --git a/libcoopgamma_get_crtcs_sync.3 b/libcoopgamma_get_crtcs_sync.3 new file mode 100644 index 0000000..3a3eebf --- /dev/null +++ b/libcoopgamma_get_crtcs_sync.3 @@ -0,0 +1,53 @@ +.TH LIBCOOPGAMMA_GET_CRTCS_SYNC 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_crtcs_sync - Synchronously retrieve a list of all available CRTC:s +.SH "SYNOPSIS" +.nf +#include + +char **libcoopgamma_get_crtcs_sync(libcoopgamma_context_t *restrict \fIctx\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_crtcs_sync () +function synchronously retrieves a +list of all available CRTC:s over the +connection of +.I ctx +to the server. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_crtcs_sync () +function returns a +.I NULL +terminated +list of all available CRTC:s. If possible, +the CRTC:s are named by the connected +monitors' EDID:s. None of the elements can +contain a NUL or LF byte. The elements in +the list are subpointers of the returned +pointer. The user shall free the returned +pointer, which effectively frees all its +elements. On error, +.I NULL +is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_crtcs_send () +function may fail for any reason specified for +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_crtcs_recv (3), +.BR libcoopgamma_flush (3), +or +.BR libcoopgamma_synchronise (3). +.SH "SEE ALSO" +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_crtcs_recv (3), +.BR libcoopgamma_get_gamma_info_sync (3), +.BR libcoopgamma_get_gamma_sync (3), +.BR libcoopgamma_set_gamma_sync (3) diff --git a/libcoopgamma_get_gamma_info_recv.3 b/libcoopgamma_get_gamma_info_recv.3 new file mode 100644 index 0000000..1307fe5 --- /dev/null +++ b/libcoopgamma_get_gamma_info_recv.3 @@ -0,0 +1,150 @@ +.TH LIBCOOPGAMMA_GET_GAMMA_INFO_RECV 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_gamma_info_recv - Receive metainformation about a CRTC's gamma ramps +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_gamma_info_recv(libcoopgamma_crtc_info_t *restrict \fIinfo\fP, + libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_gamma_info_recv () +function parses the response for the requests +sent using the +.BR libcoopgamma_get_gamma_info_send () +function with the same +.I ctx +and +.I async +arguments. The +.I async +must have been selected by the last call to the +.BR libcoopgamma_synchronise (3) +function. +.P +The information about the CRTC's gamma ramps +will be stored in +.IR *info . +In particular, +.I info->cooperative +will be set to nonzero (actually 1) if there is +a coopgamma server running, +.I info->supported +will be set to +.IR LIBCOOPGAMMA_NO , +.IR LIBCOOPGAMMA_MAYBE , +or +.IR LIBCOOPGAMMA_YES , +which ever describes the state of gamma ramp +support on the CRTC. Unless +.I info->supported +is +.IR LIBCOOPGAMMA_NO , +the following will also be set: +.TP +.I info->red_size +The number of stops on the red gamma ramp. +.TP +.I info->green_size +The number of stops on the green gamma ramp. +.TP +.I info->blue_size +The number of stops on the blue gamma ramp. +.TP +.I info->depth +Describes the gamma ramp types used for the CRTC. +.P +The +.BR libcoopgamma_get_gamma_info_recv () +will also store monitor's colourspace information in +.IR *info . +In particular, +.I info->colourspace +will be set to +.IR LIBCOOPGAMMA_SRGB , +.IR LIBCOOPGAMMA_RGB , +.IR LIBCOOPGAMMA_NON_RGB , +.IR LIBCOOPGAMMA_GREY , +or +.IR LIBCOOPGAMMA_UNKNOWN , +and +.I info->have_gamut +will be set to 1 or 0. +.I info->have_gamut +should be set to 0 unless +.I info->colourspace +is set to +.I LIBCOOPGAMMA_SRGB +or +.IR LIBCOOPGAMMA_RGB , +and it should be set to 1 if +.I info->colourspace +is set to +.I LIBCOOPGAMMA_SRGB , +however there are no guarantees that +this is true. If +.I info->have_gamut +is non-zero, the following will also be set: +.TP +.I info->red_x +The x-value (CIE xyY) of the monitor's +red colour, multiplied by 1024. +.TP +.I info->red_y +The y-value (CIE xyY) of the monitor's +red colour, multiplied by 1024. +.TP +.I info->green_x +The x-value (CIE xyY) of the monitor's +green colour, multiplied by 1024. +.TP +.I info->green_y +The y-value (CIE xyY) of the monitor's +green colour, multiplied by 1024. +.TP +.I info->blue_x +The x-value (CIE xyY) of the monitor's +blue colour, multiplied by 1024. +.TP +.I info->blue_y +The y-value (CIE xyY) of the monitor's +blue colour, multiplied by 1024. +.TP +.I info->white_x +The x-value (CIE xyY) of the monitor's +default white point, multiplied by 1024. +.TP +.I info->white_y +The y-value (CIE xyY) of the monitor's +default white point, multiplied by 1024. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_gamma_info_recv () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_gamma_info_recv () +function may fail for any reason specified for +.BR malloc (3). +The function may also fail for the following reasons: +.TP +.B EBADMSG +The received message was corrupt. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_async_context_destroy (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_get_gamma_info_sync (3), +.BR libcoopgamma_get_crtcs_recv (3), +.BR libcoopgamma_get_gamma_recv (3), +.BR libcoopgamma_set_gamma_recv (3) diff --git a/libcoopgamma_get_gamma_info_send.3 b/libcoopgamma_get_gamma_info_send.3 new file mode 100644 index 0000000..16a312d --- /dev/null +++ b/libcoopgamma_get_gamma_info_send.3 @@ -0,0 +1,79 @@ +.TH LIBCOOPGAMMA_GET_GAMMA_INFO_SEND 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_gamma_info_send - Send a request for metainfomation for a CRTC's gamma ramps +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_gamma_info_send(const char *restrict \fIcrtc\fP, libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_gamma_info_send () +function sends a request over the connection of +.I ctx +to the server for metainformation about a the +CRTC, with the name given in the +.I crtc +parameter, gamma ramps. Information about the +request is stored in +.IR *async , +this information is used by +.BR libcoopgamma_synchronise (3) +to identify the response, and by +.BR libcoopgamma_get_gamma_info_recv (3) +to parse the response. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_gamma_info_send () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_gamma_info_send () +function may fail for any reason specified for +.BR malloc (3), +.BR realloc (3), +or +.BR libcoopgamma_flush (3). +Particularly interesting exceptional +conditions, that are not errors proper, include +those indicated by the following values on +.IR errno : +.TP +.B EINTR +The function was interrupted by a signal. When +this happens, call +.BR libcoopgamma_flush (3) +to resume. +.TP +.BR EAGAIN " or " EWOULDBLOCK +The communication is nonblocking and the buffer +between the server and the client is full, +and no more data can be queued without blocking. +When this happens, wait a short period of time +and call +.BR libcoopgamma_flush (3) +to resume. +.BR select (3) +or similar function can be used to wait until +.I ctx->fd +is readable. +.TP +.B ECONNREST +The connection to the server has closed. +.SH "SEE ALSO" +.BR libcoopgamma_async_context_initialise (3), +.BR libcoopgamma_flush (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_get_gamma_info_recv (3), +.BR libcoopgamma_get_gamma_info_sync (3), +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_set_gamma_send (3) diff --git a/libcoopgamma_get_gamma_info_sync.3 b/libcoopgamma_get_gamma_info_sync.3 new file mode 100644 index 0000000..3187231 --- /dev/null +++ b/libcoopgamma_get_gamma_info_sync.3 @@ -0,0 +1,142 @@ +.TH LIBCOOPGAMMA_GET_GAMMA_INFO_SYNC 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_gamma_info_sync - Synchronously retrieve metainformation about a CRTC's gamma ramps +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_gamma_info_sync(const char* restrict \fIcrtc\fP, + libcoopgamma_crtc_info_t* restrict \fIinfo\fP, + libcoopgamma_context_t *restrict \fIctx\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_gamma_info_sync () +function synchronously retrieves metainformation +about the CRTC's, whose name is +.IR crtc , +gamma ramps over the connection of +.I ctx +to the server. +.P +The information about the CRTC's gamma ramps +will be stored in +.IR *info . +In particular, +.I info->cooperative +will be set to nonzero (actually 1) if there is +a coopgamma server running, +.I info->supported +will be set to +.IR LIBCOOPGAMMA_NO , +.IR LIBCOOPGAMMA_MAYBE , +or +.IR LIBCOOPGAMMA_YES , +which ever describes the state of gamma ramp +support on the CRTC. Unless +.I info->supported +is +.IR LIBCOOPGAMMA_NO , +the following will also be set: +.TP +.I info->red_size +The number of stops on the red gamma ramp. +.TP +.I info->green_size +The number of stops on the green gamma ramp. +.TP +.I info->blue_size +The number of stops on the blue gamma ramp. +.TP +.I info->depth +Describes the gamma ramp types used for the CRTC. +.P +The +.BR libcoopgamma_get_gamma_info_sync () +will also store monitor's colourspace information in +.IR *info . +In particular, +.I info->colourspace +will be set to +.IR LIBCOOPGAMMA_SRGB , +.IR LIBCOOPGAMMA_RGB , +.IR LIBCOOPGAMMA_NON_RGB , +.IR LIBCOOPGAMMA_GREY , +or +.IR LIBCOOPGAMMA_UNKNOWN , +and +.I info->have_gamut +will be set to 1 or 0. +.I info->have_gamut +should be set to 0 unless +.I info->colourspace +is set to +.I LIBCOOPGAMMA_SRGB +or +.IR LIBCOOPGAMMA_RGB , +and it should be set to 1 if +.I info->colourspace +is set to +.I LIBCOOPGAMMA_SRGB , +however there are no guarantees that +this is true. If +.I info->have_gamut +is non-zero, the following will also be set: +.TP +.I info->red_x +The x-value (CIE xyY) of the monitor's +red colour, multiplied by 1024. +.TP +.I info->red_y +The y-value (CIE xyY) of the monitor's +red colour, multiplied by 1024. +.TP +.I info->green_x +The x-value (CIE xyY) of the monitor's +green colour, multiplied by 1024. +.TP +.I info->green_y +The y-value (CIE xyY) of the monitor's +green colour, multiplied by 1024. +.TP +.I info->blue_x +The x-value (CIE xyY) of the monitor's +blue colour, multiplied by 1024. +.TP +.I info->blue_y +The y-value (CIE xyY) of the monitor's +blue colour, multiplied by 1024. +.TP +.I info->white_x +The x-value (CIE xyY) of the monitor's +default white point, multiplied by 1024. +.TP +.I info->white_y +The y-value (CIE xyY) of the monitor's +default white point, multiplied by 1024. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_gamma_info_recv () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_gamma_info_send () +function may fail for any reason specified for +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_get_gamma_info_recv (3), +.BR libcoopgamma_flush (3), +or +.BR libcoopgamma_synchronise (3). +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_get_gamma_info_recv (3), +.BR libcoopgamma_get_crtcs_sync (3), +.BR libcoopgamma_get_gamma_sync (3), +.BR libcoopgamma_set_gamma_sync (3) diff --git a/libcoopgamma_get_gamma_recv.3 b/libcoopgamma_get_gamma_recv.3 new file mode 100644 index 0000000..5697a86 --- /dev/null +++ b/libcoopgamma_get_gamma_recv.3 @@ -0,0 +1,98 @@ +.TH LIBCOOPGAMMA_GET_GAMMA_RECV 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_gamma_recv - Receive the gamma filter table for a CRTC +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_gamma_recv(libcoopgamma_filter_table_t *restrict \fItable\fP, + libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_gamma_recv () +function parses the response for the requests +sent using the +.BR libcoopgamma_get_gamma_send () +function with the same +.I ctx +and +.I async +arguments. The +.I async +must have been selected by the last call to the +.BR libcoopgamma_synchronise (3) +function. +.P +The filters will be stored in +.IR *table . +In particular, the number of filter (1 if coalesced) +will be stored to +.IR table->filter_count , +the filters themselves will be stored in +.IR table->filters . +Some metainformation sent by the server will also +be stored in +.IR *table : +.TP +.I info->red_size +The number of stops on the red gamma ramp. +.TP +.I info->green_size +The number of stops on the green gamma ramp. +.TP +.I info->blue_size +The number of stops on the blue gamma ramp. +.TP +.I info->depth +Describes the gamma ramp types used for the CRTC. +.P +For all +.I i +from 0 up to but exclusing +.IR table->filter_count , +Information about the filter applied +.IR i :th +is stored in +.IR table->filters[i] . +.I table->filters[i].ramps +is the gamma ramps for +.I i :th +the filter. Unless coalesced, +.I table->filters[i].priority +and +.I table->filters[i].class +is also set. +.I table->filters[i].priority +is the prority of the filter, and +.I table->filters[i].class +is the class (identifier) of the filter. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_gamma_recv () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_gamma_recv () +function may fail for any reason specified for +.BR malloc (3). +The function may also fail for the following reasons: +.TP +.B EBADMSG +The received message was corrupt. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_async_context_destroy (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_get_gamma_sync (3), +.BR libcoopgamma_get_crtcs_recv (3), +.BR libcoopgamma_get_gamma_info_recv (3), +.BR libcoopgamma_set_gamma_recv (3) diff --git a/libcoopgamma_get_gamma_send.3 b/libcoopgamma_get_gamma_send.3 new file mode 100644 index 0000000..ee202da --- /dev/null +++ b/libcoopgamma_get_gamma_send.3 @@ -0,0 +1,93 @@ +.TH LIBCOOPGAMMA_GET_GAMMA_SEND 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_gamma_send - Send a request to retrieve a CRTC's gamma ramp filters +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_gamma_send(const libcoopgamma_filter_query_t *restrict \fIquery\fP, + libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_gamma_send () +function sends a request over the connection of +.I ctx +to the server to retrieve the +CRTC's, with the name given in +.IR query->crtc , +applied filters. Information about the +request is stored in +.IR *async , +this information is used by +.BR libcoopgamma_synchronise (3) +to identify the response, and by +.BR libcoopgamma_get_gamma_recv (3) +to parse the response. +.P +The response will include all filter with a +priority between +.I query->low_priority +and +.IR query->high_priority, +inclusively. If and only if +.I query->coalesce +is nonzero, the, from the selected filters, +resulting gamma ramps are returned +rather than a list of all selected filters. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_gamma_send () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_gamma_send () +function may fail for any reason specified for +.BR malloc (3), +.BR realloc (3), +or +.BR libcoopgamma_flush (3). +Particularly interesting exceptional +conditions, that are not errors proper, include +those indicated by the following values on +.IR errno : +.TP +.B EINTR +The function was interrupted by a signal. When +this happens, call +.BR libcoopgamma_flush (3) +to resume. +.TP +.BR EAGAIN " or " EWOULDBLOCK +The communication is nonblocking and the buffer +between the server and the client is full, +and no more data can be queued without blocking. +When this happens, wait a short period of time +and call +.BR libcoopgamma_flush (3) +to resume. +.BR select (3) +or similar function can be used to wait until +.I ctx->fd +is readable. +.TP +.B ECONNREST +The connection to the server has closed. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_async_context_initialise (3), +.BR libcoopgamma_flush (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_get_gamma_recv (3), +.BR libcoopgamma_get_gamma_sync (3), +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_set_gamma_send (3) diff --git a/libcoopgamma_get_gamma_sync.3 b/libcoopgamma_get_gamma_sync.3 new file mode 100644 index 0000000..e46cecf --- /dev/null +++ b/libcoopgamma_get_gamma_sync.3 @@ -0,0 +1,102 @@ +.TH LIBCOOPGAMMA_GET_GAMMA_SYNC 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_gamma_sync - Synchronously retrieve a CRTC's filter table +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_gamma_sync(const libcoopgamma_filter_query_t* restrict \fIquery\fP, + libcoopgamma_filter_table_t* restrict \fItable\fpP, + libcoopgamma_context_t *restrict \fIctx\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_get_gamma_sync () +function synchronously retrieves the gamma ramp filter +table for the CRTC, whose name is +.IR query->crtc , +over the connection of +.I ctx +to the server. +.P +The response will include all filter with a +priority between +.I query->low_priority +and +.IR query->high_priority, +inclusively. If and only if +.I query->coalesce +is nonzero, the, from the selected filters, +resulting gamma ramps are returned +rather than a list of all selected filters. +.P +The filters will be stored in +.IR *table . +In particular, the number of filter (1 if coalesced) +will be stored to +.IR table->filter_count , +the filters themselves will be stored in +.IR table->filters . +Some metainformation sent by the server will also +be stored in +.IR *table : +.TP +.I info->red_size +The number of stops on the red gamma ramp. +.TP +.I info->green_size +The number of stops on the green gamma ramp. +.TP +.I info->blue_size +The number of stops on the blue gamma ramp. +.TP +.I info->depth +Describes the gamma ramp types used for the CRTC. +.P +For all +.I i +from 0 up to but exclusing +.IR table->filter_count , +Information about the filter applied +.IR i :th +is stored in +.IR table->filters[i] . +.I table->filters[i].ramps +is the gamma ramps for +.I i :th +the filter. Unless coalesced, +.I table->filters[i].priority +and +.I table->filters[i].class +is also set. +.I table->filters[i].priority +is the prority of the filter, and +.I table->filters[i].class +is the class (identifier) of the filter. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_gamma_recv () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_gamma_send () +function may fail for any reason specified for +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_get_gamma_recv (3), +.BR libcoopgamma_flush (3), +or +.BR libcoopgamma_synchronise (3). +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_get_gamma_recv (3), +.BR libcoopgamma_get_crtcs_sync (3), +.BR libcoopgamma_get_gamma_info_sync (3), +.BR libcoopgamma_set_gamma_sync (3) diff --git a/libcoopgamma_get_method_and_site.3 b/libcoopgamma_get_method_and_site.3 new file mode 100644 index 0000000..654db03 --- /dev/null +++ b/libcoopgamma_get_method_and_site.3 @@ -0,0 +1,105 @@ +.TH LIBCOOPGAMMA_GET_METHOD_AND_SITE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_method_and_site - Get the adjustment method and site +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_get_method_and_site(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP, + char **restrict \fImethodp\fP, char **restrict \fIsitep\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +Newcomers need not concern themselves with the +.BR libcoopgamma_get_method_and_site () +function. +.P +The +.BR libcoopgamma_get_method_and_site () +function consults +.BR coopgammad (1) +to get the names the selected adjustment +.I method +and +.IR site . +If +.I method +or +.I site +is +.IR NULL , +the it will selected automatically. +.P +The name of selected adjustment method is +stored in +.I *methodp +unless +.I methodp +is +.IR NULL . +If the selected selected adjustment method does +not exist, the function fail unless the given +.I method +.P +The name of selected site is stored in +.I *sitep +unless +.I sitep +is +.IR NULL . +is a positive number. +.P +The user should free +.I *methodp +and +.IR *sitep . +.P +For the duration of the function call, +.I SIGCHLD +most neither be ignored nor blocked. It is the +user of this library's responsibility to ensure +this. The +.BR libcoopgamma_get_method_and_site () +function will not temporarily reset handling of +.I SIGCHLD +itself. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_method_and_site () +function returns 0. On error, -1 +is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_method_and_site () +function may fail for any reason specified for +.BR pipe (3), +.BR fork (3), +.BR dup2 (3), +.BR execvp (3), +.BR malloc (3), +.BR realloc (3), +.BR read (3) +(other than +.IR EINTR ), +and +.BR waitpid (3). +The function may also fail for any of the +following reasons: +.TP +.B EINVAL +If +.I method +contain an invalid adjustment method name. +.TP +.B EBADMSG +.BR coopgammad (1) +output invalid data to stdout. +.SH "SEE ALSO" +.BR libcoopgamma_get_methods (3), +.BR libcoopgamma_get_pid_file (3), +.BR libcoopgamma_get_socket_file (3), +.BR libcoopgamma_context_initialise (3) diff --git a/libcoopgamma_get_methods.3 b/libcoopgamma_get_methods.3 new file mode 100644 index 0000000..b2ce807 --- /dev/null +++ b/libcoopgamma_get_methods.3 @@ -0,0 +1,65 @@ +.TH LIBCOOPGAMMA_GET_METHODS 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_methods - List all recognised adjustment method +.SH "SYNOPSIS" +.nf +#include + +char **libcoopgamma_get_methods(void); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +Newcomers are advices to postpone learning the +.BR libcoopgamma_get_methods () +function until they have a functional program. +.P +The +.BR libcoopgamma_get_methods () +function consults +.BR coopgammad (1) +to construct a list of all adjustment method name +recognised by +.BR coopgammad (1). +.P +For the duration of the function call, +.I SIGCHLD +most neither be ignored nor blocked. It is the +user of this library's responsibility to ensure +this. The +.BR libcoopgamma_get_methods () +function will not temporarily reset handling of +.I SIGCHLD +itself. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_methods () +function returns a list of recognised +adjustment method name. The list is terminated +by a +.I NULL +element and will contain no other +.I NULL +elements. Elements in the list are subpointers +of the returned pointer and most not be freed. +The user shall however free the returned pointer, +effectively freeing all elements stored in the list. +On error, +.I NULL +is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_methods () +function may fail for any reason specified for +.BR malloc (3), +.BR realloc (3), +and +.BR libcoopgamma_get_method_and_site (3). +.SH "SEE ALSO" +.BR libcoopgamma_get_method_and_site (3), +.BR libcoopgamma_get_pid_file (3), +.BR libcoopgamma_get_socket_file (3), +.BR libcoopgamma_context_initialise (3) diff --git a/libcoopgamma_get_pid_file.3 b/libcoopgamma_get_pid_file.3 new file mode 100644 index 0000000..3d312ef --- /dev/null +++ b/libcoopgamma_get_pid_file.3 @@ -0,0 +1,85 @@ +.TH LIBCOOPGAMMA_GET_PID_FILE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_pid_file - Get the PID file of the coopgamma server +.SH "SYNOPSIS" +.nf +#include + +char *libcoopgamma_get_pid_file(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +Newcomers need not concern themselves with the +.BR libcoopgamma_get_pid_file () +function. +.P +The +.BR libcoopgamma_get_pid_file () +function consults +.BR coopgammad (1) +to get the pathname of the PID file for the +.BR coopgammad (1) +instance for the selected adjustment +.I method +and +.IR site . +If +.I method +or +.I site +is +.IR NULL , +the it will selected automatically. +.P +For the duration of the function call, +.I SIGCHLD +most neither be ignored nor blocked. It is the +user of this library's responsibility to ensure +this. The +.BR libcoopgamma_get_pid_file () +function will not temporarily reset handling of +.I SIGCHLD +itself. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_pid_file () +function returns the pathname of the PID file. +Success does not mean that the server is necessarily +running at the moment. The user should free +the returned pointer. On error, +.I NULL +is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_pid_file () +function may fail for any reason specified for +.BR pipe (3), +.BR fork (3), +.BR dup2 (3), +.BR execvp (3), +.BR malloc (3), +.BR realloc (3), +.BR read (3) +(other than +.IR EINTR ), +and +.BR waitpid (3). +The function may also fail for any of the +following reasons: +.TP +.B EINVAL +If +.I method +contain an invalid adjustment method name. +.TP +.B EBADMSG +.BR coopgammad (1) +output invalid data to stdout. +.SH "SEE ALSO" +.BR libcoopgamma_get_methods (3), +.BR libcoopgamma_get_socket_file (3), +.BR libcoopgamma_context_initialise (3) diff --git a/libcoopgamma_get_socket_file.3 b/libcoopgamma_get_socket_file.3 new file mode 100644 index 0000000..f73f0ca --- /dev/null +++ b/libcoopgamma_get_socket_file.3 @@ -0,0 +1,86 @@ +.TH LIBCOOPGAMMA_GET_SOCKET_FILE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_get_socket_file - Get the socket file of the coopgamma server +.SH "SYNOPSIS" +.nf +#include + +char *libcoopgamma_get_socket_file(const char *restrict \fImethod\fP, const char *restrict \fIsite\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +Newcomers need not concern themselves with the +.BR libcoopgamma_get_socket_file () +function. +.P +The +.BR libcoopgamma_get_socket_file () +function consults +.BR coopgammad (1) +to get the pathname of the socket for +communicating with the +.BR coopgammad (1) +instance for the selected adjustment +.I method +and +.IR site . +If +.I method +or +.I site +is +.IR NULL , +the it will selected automatically. +.P +For the duration of the function call, +.I SIGCHLD +most neither be ignored nor blocked. It is the +user of this library's responsibility to ensure +this. The +.BR libcoopgamma_get_socket_file () +function will not temporarily reset handling of +.I SIGCHLD +itself. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_get_socket_file () +function returns the pathname of the socket. +Success does not mean that the server is necessarily +running at the moment. The user should free +the returned pointer. On error, +.I NULL +is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_get_socket_file () +function may fail for any reason specified for +.BR pipe (3), +.BR fork (3), +.BR dup2 (3), +.BR execvp (3), +.BR malloc (3), +.BR realloc (3), +.BR read (3) +(other than +.IR EINTR ), +and +.BR waitpid (3). +The function may also fail for any of the +following reasons: +.TP +.B EINVAL +If +.I method +contain an invalid adjustment method name. +.TP +.B EBADMSG +.BR coopgammad (1) +output invalid data to stdout. +.SH "SEE ALSO" +.BR libcoopgamma_get_methods (3), +.BR libcoopgamma_get_pid_file (3), +.BR libcoopgamma_context_initialise (3) diff --git a/libcoopgamma_queried_filter_destroy.3 b/libcoopgamma_queried_filter_destroy.3 new file mode 100644 index 0000000..6847ac4 --- /dev/null +++ b/libcoopgamma_queried_filter_destroy.3 @@ -0,0 +1,33 @@ +.TH LIBCOOPGAMMA_QUERIED_FILTER_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_queried_filter_destroy - Deinitialise a libcoopgamma_queried_filter_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_queried_filter_destroy(libcoopgamma_queried_filter_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_queried_filter_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.SH "SEE ALSO" +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_queried_filter_initialise.3 b/libcoopgamma_queried_filter_initialise.3 new file mode 100644 index 0000000..79f2c59 --- /dev/null +++ b/libcoopgamma_queried_filter_initialise.3 @@ -0,0 +1,44 @@ +.TH LIBCOOPGAMMA_QUERIED_FILTER_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_queried_filter_initialise - Initialise a libcoopgamma_queried_filter_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_queried_filter_initialise(libcoopgamma_queried_filter_t *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_queried_filter_initialise () +function initialises +.IR this . +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_queried_filter_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_queried_filter_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +There are no errors specified for the +.BR libcoopgamma_queried_filter_initialise () +function. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3) diff --git a/libcoopgamma_queried_filter_marshal.3 b/libcoopgamma_queried_filter_marshal.3 new file mode 100644 index 0000000..10b7ff7 --- /dev/null +++ b/libcoopgamma_queried_filter_marshal.3 @@ -0,0 +1,55 @@ +.TH LIBCOOPGAMMA_QUERIED_FILTER_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_queried_filter_marshal - Marshal a libcoopgamma_queried_filter_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_queried_filter_marshal(libcoopgamma_queried_filter_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, libcoopgamma_depth_t \fIdepth\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_queried_filter_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.I depth +must describe the ramps in +.IR this , +or be 0. If +.I depth +is 0, the ramps are not marshalled. +.SH "RETURN VALUES" +The +.BR libcoopgamma_queried_filter_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_queried_filter_unmarshal.3 b/libcoopgamma_queried_filter_unmarshal.3 new file mode 100644 index 0000000..01f1867 --- /dev/null +++ b/libcoopgamma_queried_filter_unmarshal.3 @@ -0,0 +1,91 @@ +.TH LIBCOOPGAMMA_QUERIED_FILTER_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_queried_filter_unmarshal - Unmarshal a libcoopgamma_queried_filter_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_queried_filter_unmarshal(libcoopgamma_queried_filter_t *restrict \fIthis\fP, + void *restrict \fIbuffer\fP, size_t *restrict \fIn\fP, + libcoopgamma_depth_t \fIdepth\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_queried_filter_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.I depth +must be the same value the parameter with the same +name had in the corresponding call to +.BR libcoopgamma_queried_filter_marshal (3). +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_queried_filter_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_queried_filter_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_queried_filter_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +The +.BR libcoopgamma_queried_filter_marshal () +function may fail, and returned +.I LIBCOOPGAMMA_ERRNO_SET +for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_ramps_destroy.3 b/libcoopgamma_ramps_destroy.3 new file mode 100644 index 0000000..3d78d5d --- /dev/null +++ b/libcoopgamma_ramps_destroy.3 @@ -0,0 +1,43 @@ +.TH LIBCOOPGAMMA_RAMPS_DESTROY 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_ramps_destroy - Deinitialise a libcoopgamma_ramps_t +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_ramps_destroy(void *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_ramps_destroy () +function releases all resources allocated +to +.IR this . +The function does however not free the +allocation of the pointer +.IR this +itself. +.I this +must be of any of the following types: +.IR libcoopgamma_ramps_t , +.IR libcoopgamma_ramps8_t , +.IR libcoopgamma_ramps16_t , +.IR libcoopgamma_ramps32_t , +.IR libcoopgamma_ramps64_t , +.IR libcoopgamma_rampsf_t , +or +.IR libcoopgamma_rampsd_t . +.SH "SEE ALSO" +.BR libcoopgamma_ramps_initialise (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_destroy (3), +.BR libcoopgamma_crtc_info_destroy (3), +.BR libcoopgamma_filter_query_destroy (3), +.BR libcoopgamma_queried_filter_destroy (3), +.BR libcoopgamma_filter_table_destroy (3), +.BR libcoopgamma_error_destroy (3), +.BR libcoopgamma_context_destroy (3), +.BR libcoopgamma_async_context_destroy (3) diff --git a/libcoopgamma_ramps_initialise.3 b/libcoopgamma_ramps_initialise.3 new file mode 100644 index 0000000..f6ee3d2 --- /dev/null +++ b/libcoopgamma_ramps_initialise.3 @@ -0,0 +1,62 @@ +.TH LIBCOOPGAMMA_RAMPS_INITIALISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_ramps_initialise - Initialise a member type of libcoopgamma_ramps_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_ramps_initialise(void *restrict \fIthis\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_ramps_initialise () +function initialises +.IR this . +.I this +must be of any of the following types, and not casted +to any other type such as +.I void* +or +.IR libcoopgamma_ramps_t: +.IR libcoopgamma_ramps8_t , +.IR libcoopgamma_ramps16_t , +.IR libcoopgamma_ramps32_t , +.IR libcoopgamma_ramps64_t , +.IR libcoopgamma_rampsf_t , +or +.IR libcoopgamma_rampsd_t . +.P +The +.BR libcoopgamma_ramps_initialise () +function is defined as a macro. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_ramps_destroy (3). +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_ramps_initialise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_ramps_initialise () +function may fail for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_crtc_info_initialise (3), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_queried_filter_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_error_initialise (3), +.BR libcoopgamma_context_initialise (3), +.BR libcoopgamma_async_context_initialise (3) diff --git a/libcoopgamma_ramps_marshal.3 b/libcoopgamma_ramps_marshal.3 new file mode 100644 index 0000000..aed8509 --- /dev/null +++ b/libcoopgamma_ramps_marshal.3 @@ -0,0 +1,66 @@ +.TH LIBCOOPGAMMA_RAMPS_MARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_ramps_marshal - Marshal a member type of libcoopgamma_ramps_t +.SH "SYNOPSIS" +.nf +#include + +size_t libcoopgamma_ramps_marshal(void *restrict \fIthis\fP, void *restrict \fIbuffer\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_ramps_marshal () +function marshals +.I this +into a +.I buffer +that can be sent to another process on any computer +with a compatible processor. A compatible processor +is any processor with the same endianness, encoding +and sizes of the intrinsic data types and +.IR size_t . +.P +.I this +must be of any of the following types, and not casted +to any other type such as +.I void* +or +.IR libcoopgamma_ramps_t: +.IR libcoopgamma_ramps8_t , +.IR libcoopgamma_ramps16_t , +.IR libcoopgamma_ramps32_t , +.IR libcoopgamma_ramps64_t , +.IR libcoopgamma_rampsf_t , +or +.IR libcoopgamma_rampsd_t . +.P +The +.BR libcoopgamma_ramps_marshal () +function is defined as a macro. +.SH "RETURN VALUES" +The +.BR libcoopgamma_ramps_marshal () +function returns the number of bytes stored in the +.IR buffer , +or if +.I buffer +is +.IR NULL , +the the number of bytes that would have +been written if it was not +.IR NULL . +The function is always successful. +.SH "SEE ALSO" +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_ramps_unmarshal (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_crtc_info_marshal (3), +.BR libcoopgamma_filter_query_marshal (3), +.BR libcoopgamma_queried_filter_marshal (3), +.BR libcoopgamma_filter_table_marshal (3), +.BR libcoopgamma_error_marshal (3), +.BR libcoopgamma_context_marshal (3), +.BR libcoopgamma_async_context_marshal (3) diff --git a/libcoopgamma_ramps_unmarshal.3 b/libcoopgamma_ramps_unmarshal.3 new file mode 100644 index 0000000..34393cf --- /dev/null +++ b/libcoopgamma_ramps_unmarshal.3 @@ -0,0 +1,100 @@ +.TH LIBCOOPGAMMA_RAMPS_UNMARSHAL 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_ramps_unmarshal - Unmarshal a member type of libcoopgamma_ramps_t +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_ramps_unmarshal(void *restrict \fIthis\fP, void *restrict \fIbuffer\fP, + size_t *restrict \fIn\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_ramps_unmarshal () +function unmarshals +.I this +from a +.I buffer . +The number of read bytes from +.I buffer +is stored in +.I *n +on success. +.P +.I this +must be of any of the following types, and not casted +to any other type such as +.I void* +or +.IR libcoopgamma_ramps_t: +.IR libcoopgamma_ramps8_t , +.IR libcoopgamma_ramps16_t , +.IR libcoopgamma_ramps32_t , +.IR libcoopgamma_ramps64_t , +.IR libcoopgamma_rampsf_t , +or +.IR libcoopgamma_rampsd_t . +.P +None if the parameters may be +.IR NULL . +.I this +does not have to be initialised. +.P +On failure, +.I this +should be deinitialised using +.BR libcoopgamma_ramps_destroy (3). +.P +Undefined behaviour is invoked if the +beginning of +.I buffer +does not contain data stored by +.BR libcoopgamma_ramps_marshal (3). +.SH "RETURN VALUES" +The +.BR libcoopgamma_ramps_unmarshal () +function returns one of the following +values: +.TP +.IR LIBCOOPGAMMA_SUCCESS " (= 0)" +The function was successful. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE " (> 0)" +The data in +.I buffer +was stored by an earlier version of +.BR libcoopgamma (7) +that is no longer supported. +.TP +.IR LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE " (> 0)" +The data in +.I buffer +was stored by a newer version of +.BR libcoopgamma (7) +that stores the data in an incompatible format. +.TP +.IR LIBCOOPGAMMA_ERRNO_SET "(= -1)" +An other error was encountered. +.I errno +has been set appropriately. +.SH "ERROR" +The +.BR libcoopgamma_ramps_marshal () +function may fail, and returned +.I LIBCOOPGAMMA_ERRNO_SET +for any reason specified for +.BR malloc (3). +.SH "SEE ALSO" +.BR libcoopgamma_ramps_destroy (3), +.BR libcoopgamma_ramps_marshal (3), +.BR libcoopgamma_filter_unmarshal (3), +.BR libcoopgamma_crtc_info_unmarshal (3), +.BR libcoopgamma_filter_query_unmarshal (3), +.BR libcoopgamma_queried_filter_unmarshal (3), +.BR libcoopgamma_filter_table_unmarshal (3), +.BR libcoopgamma_error_unmarshal (3), +.BR libcoopgamma_context_unmarshal (3), +.BR libcoopgamma_async_context_unmarshal (3) diff --git a/libcoopgamma_set_gamma_recv.3 b/libcoopgamma_set_gamma_recv.3 new file mode 100644 index 0000000..073343b --- /dev/null +++ b/libcoopgamma_set_gamma_recv.3 @@ -0,0 +1,52 @@ +.TH LIBCOOPGAMMA_SET_GAMMA_RECV 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_set_gamma_recv - Check whether a request to modify the filter table for a CRTC succeeded +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_set_gamma_recv(libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_set_gamma_recv () +function parses the response for the requests +sent using the +.BR libcoopgamma_set_gamma_send () +function with the same +.I ctx +and +.I async +arguments. The +.I async +must have been selected by the last call to the +.BR libcoopgamma_synchronise (3) +function. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_set_gamma_recv () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_set_gamma_recv () +function may fail for any reason specified for +.BR malloc (3). +The function may also fail for the following reasons: +.TP +.B EBADMSG +The received message was corrupt. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_async_context_destroy (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_set_gamma_send (3), +.BR libcoopgamma_set_gamma_sync (3), +.BR libcoopgamma_get_crtcs_recv (3), +.BR libcoopgamma_get_gamma_info_recv (3), +.BR libcoopgamma_get_gamma_recv (3) diff --git a/libcoopgamma_set_gamma_send.3 b/libcoopgamma_set_gamma_send.3 new file mode 100644 index 0000000..18c13f0 --- /dev/null +++ b/libcoopgamma_set_gamma_send.3 @@ -0,0 +1,140 @@ +.TH LIBCOOPGAMMA_SET_GAMMA_SEND 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_set_gamma_send - Send a request to add, update, or remove a gamma ramp filter for CRTC +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_set_gamma_send(const libcoopgamma_filter_t *restrict \fIfilter\fP, + libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIasync\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_set_gamma_send () +function sends a request over the connection of +.I ctx +to add, update, or remove a gamma ramp filter for +the CRTC with the name given in +.IR filter->crtc . +Information about the request is stored in +.IR *async , +this information is used by +.BR libcoopgamma_synchronise (3) +to identify the response, and by +.BR libcoopgamma_get_gamma_recv (3) +to parse the response. +.P +A filter with the class (identifier) +.I filter->class +is removed if +.I filter->lifespan +is +.IR LIBCOOPGAMMA_REMOVE . +If +.I filter->lifespan +is not +.IR LIBCOOPGAMMA_REMOVE , +a filter with matching class is updated +if such filter exists, otherwise the filter is +added. The fitler, unless it is removed, is +inserted or moved to the priority specified by +.IR filter->priority . +.I filter->priority +is isregarded when +.I filter->lifespan +is +.IR LIBCOOPGAMMA_REMOVE . +A filter with high priority is applied before +a fitler with low priority. The filter is removed +when it is explicit removed used +.IR LIBCOOPGAMMA_REMOVE , +or if +.I filter->lifespan +is +.IR LIBCOOPGAMMA_UNTIL_DEATH , +when the client that last added or updated +the filter disconnects from the server, which +ever comes first. Note that, when updating a +filter, the lifespan is updated to +.IR filter->lifespan . +.P +The class +.RI ( filter->class ) +must be of the format +\fI${PACKAGE_NAME}\fP\fB::\fP\fI${COMMAND_NAME}\fP\fB::\fP\fI${RULE}\fP, +where +.I ${PACKAGE_NAME} +is the name of the package as installed on the system, +the program should make it easy to adjust this; +.I ${COMMAND_NAME} +is the name of the program, this too should not +easily adjustable, and +.I ${RULE} +is a string that identifies filter uniquely within +the program, or can be hardcoded or runtime +configurable. +.P +Unless +.I filter->lifespan +is +.IR LIBCOOPGAMMA_REMOVE , +.I filter->depth +and +.I filter->ramps +must be configured to specified the desired ramp values. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_set_gamma_send () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_set_gamma_send () +function may fail for any reason specified for +.BR malloc (3), +.BR realloc (3), +or +.BR libcoopgamma_flush (3). +Particularly interesting exceptional +conditions, that are not errors proper, include +those indicated by the following values on +.IR errno : +.TP +.B EINTR +The function was interrupted by a signal. When +this happens, call +.BR libcoopgamma_flush (3) +to resume. +.TP +.BR EAGAIN " or " EWOULDBLOCK +The communication is nonblocking and the buffer +between the server and the client is full, +and no more data can be queued without blocking. +When this happens, wait a short period of time +and call +.BR libcoopgamma_flush (3) +to resume. +.BR select (3) +or similar function can be used to wait until +.I ctx->fd +is readable. +.TP +.B ECONNREST +The connection to the server has closed. +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_initialise (3), +.BR libcoopgamma_async_context_initialise (3), +.BR libcoopgamma_flush (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_set_gamma_recv (3), +.BR libcoopgamma_set_gamma_sync (3), +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_set_gamma_send (3) diff --git a/libcoopgamma_set_gamma_sync.3 b/libcoopgamma_set_gamma_sync.3 new file mode 100644 index 0000000..e65e345 --- /dev/null +++ b/libcoopgamma_set_gamma_sync.3 @@ -0,0 +1,105 @@ +.TH LIBCOOPGAMMA_SET_GAMMA_SYNC 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_set_gamma_sync - Synchronously modify a CRTC's filter table +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_set_gamma_sync(const libcoopgamma_filter_t* restrict \fIfilter\fP, + libcoopgamma_context_t *restrict \fIctx\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_set_gamma_sync () +function synchronously adds, updates, or removes +a filter to, in, or from the CTRC's, whose name is +.IR filter->crtc , +filter table, over the connection of +.I ctx +to the server. +.P +A filter with the class (identifier) +.I filter->class +is removed if +.I filter->lifespan +is +.IR LIBCOOPGAMMA_REMOVE . +If +.I filter->lifespan +is not +.IR LIBCOOPGAMMA_REMOVE , +a filter with matching class is updated +if such filter exists, otherwise the filter is +added. The fitler, unless it is removed, is +inserted or moved to the priority specified by +.IR filter->priority . +.I filter->priority +is isregarded when +.I filter->lifespan +is +.IR LIBCOOPGAMMA_REMOVE . +A filter with high priority is applied before +a fitler with low priority. The filter is removed +when it is explicit removed used +.IR LIBCOOPGAMMA_REMOVE , +or if +.I filter->lifespan +is +.IR LIBCOOPGAMMA_UNTIL_DEATH , +when the client that last added or updated +the filter disconnects from the server, which +ever comes first. Note that, when updating a +filter, the lifespan is updated to +.IR filter->lifespan . +.P +The class +.RI ( filter->class ) +must be of the format +\fI${PACKAGE_NAME}\fP\fB::\fP\fI${COMMAND_NAME}\fP\fB::\fP\fI${RULE}\fP, +where +.I ${PACKAGE_NAME} +is the name of the package as installed on the system, +the program should make it easy to adjust this; +.I ${COMMAND_NAME} +is the name of the program, this too should not +easily adjustable, and +.I ${RULE} +is a string that identifies filter uniquely within +the program, or can be hardcoded or runtime +configurable. +.P +Unless +.I filter->lifespan +is +.IR LIBCOOPGAMMA_REMOVE , +.I filter->depth +and +.I filter->ramps +must be configured to specified the desired ramp values. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_set_gamma_recv () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_set_gamma_send () +function may fail for any reason specified for +.BR libcoopgamma_set_gamma_send (3), +.BR libcoopgamma_set_gamma_recv (3), +.BR libcoopgamma_flush (3), +or +.BR libcoopgamma_synchronise (3). +.SH "SEE ALSO" +.BR libcoopgamma.h (0), +.BR libcoopgamma_filter_query_initialise (3), +.BR libcoopgamma_filter_table_initialise (3), +.BR libcoopgamma_set_gamma_send (3), +.BR libcoopgamma_set_gamma_recv (3), +.BR libcoopgamma_get_crtcs_sync (3), +.BR libcoopgamma_get_gamma_info_sync (3), +.BR libcoopgamma_get_gamma_sync (3) diff --git a/libcoopgamma_set_nonblocking.3 b/libcoopgamma_set_nonblocking.3 new file mode 100644 index 0000000..7e6ceb6 --- /dev/null +++ b/libcoopgamma_set_nonblocking.3 @@ -0,0 +1,49 @@ +.TH LIBCOOPGAMMA_SET_NONBLOCKING 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_set_nonblocking - Switch to or from nonblocking communication +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_set_nonblocking(libcoopgamma_context_t *restrict \fIctx\fP, int \fInonblocking\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_set_nonblocking () +function sets the communication with the server for +the connection of +.I ctx +to be nonblocking if +.I nonblocking +is nonzero, +and to be block otherwise. +.I ctx +must already be connected to the server, +which is achieved by calling the +.BR libcoopgamma_connect (3) +functon. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_set_nonblocking () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_connect () +function may fail for any reason specified for +.BR fcntl (3) +with +.I F_GETFL +or +.I F_SETFL +as the second argument. +.SH "SEE ALSO" +.BR libcoopgamma_connect (3), +.BR libcoopgamma_get_crtcs_send (3), +.BR libcoopgamma_get_gamma_info_send (3), +.BR libcoopgamma_get_gamma_send (3), +.BR libcoopgamma_set_gamma_send (3) diff --git a/libcoopgamma_skip_message.3 b/libcoopgamma_skip_message.3 new file mode 100644 index 0000000..13eb6cc --- /dev/null +++ b/libcoopgamma_skip_message.3 @@ -0,0 +1,30 @@ +.TH LIBCOOPGAMMA_SKIP_MESSAGE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_skip_message - Skip a received message +.SH "SYNOPSIS" +.nf +#include + +void libcoopgamma_skip_message(libcoopgamma_context_t *restrict \fIctx\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_skip_message () +function is used to tell the library that you +are not interested in a message recieved for +.IR ctx . +This can be the case if +.BR libcoopgamma_synchronise (3) +selected an asynchronous call context that +is inactive. +.SH "SEE ALSO" +.BR libcoopgamma_flush (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_synchronise (3), +.BR libcoopgamma_get_crtcs_sync (3), +.BR libcoopgamma_get_gamma_info_sync (3), +.BR libcoopgamma_get_gamma_sync (3), +.BR libcoopgamma_set_gamma_sync (3) diff --git a/libcoopgamma_synchronise.3 b/libcoopgamma_synchronise.3 new file mode 100644 index 0000000..70d2f63 --- /dev/null +++ b/libcoopgamma_synchronise.3 @@ -0,0 +1,94 @@ +.TH LIBCOOPGAMMA_SYNCHRONISE 3 LIBCOOPGAMMA +.SH "NAME" +libcoopgamma_synchronise - Wait for the next message to be received +.SH "SYNOPSIS" +.nf +#include + +int libcoopgamma_synchronise(libcoopgamma_context_t *restrict \fIctx\fP, + libcoopgamma_async_context_t *restrict \fIpending\fP, + size_t \fIn\fP, size_t *restrict \fIselected\fP); +.fi +.P +Link with +.IR -lcoopgamma . +.SH "DESCRIPTION" +The +.BR libcoopgamma_synchronise () +function waits until the next message for +.I ctx +to be received and selects the context for the +asynchronous call for which the received message +is a response. +.I pending +shall list thes contexts for all pending asynchronous +call. The number of pending asynchronous call shall be +passed to the function via the +.I n +parameter. Once a full message as been received +.I *selected +is set to the index of the context in +.I pending +representing the context for the asynchronous call +to which the received message is a response. +.SH "RETURN VALUES" +Upon successful completion, the +.BR libcoopgamma_synchronise () +function returns 0. On error, -1 is returned and +.I errno +is set appropriately. +.SH "ERRORS" +The +.BR libcoopgamma_synchronise () +function may fail for any reason specified for +.BR realloc (3), +or +.BR recv (3). +Particularly interesting exceptional +conditions, that are not errors proper, include +those indicated by the following values on +.IR errno : +.TP +.B EINTR +The function was interrupted by a signal. When +this happens, just resume be calling the functon +again. +.TP +.BR EAGAIN " or " EWOULDBLOCK +The communication is nonblocking and no more +data is ready to be read, the buffer between +the server and the client has been depleted, +When this happens, wait a short period of time +and call the function again to resume. +.BR select (3) +or similar function can be used to wait until +.I ctx->fd +is readable. +.TP +.B ECONNREST +The connection to the server has closed. +.P +The function may also fail for the following reasons: +.TP +.B EBADMSG +A corrupt message has been received. Call the +function again to ge the next message. +.TP +.B ENOTRECOVERABLE +A corrupt message has been received. The corruption +is too severe for recovery. You may either exit +or disconnection and connection again. +.TP +0 +The receive message does not match any of the +.I n +first contexts in +.IR pending . +.SH "SEE ALSO" +.BR libcoopgamma_flush (3), +.BR libcoopgamma_set_nonblocking (3), +.BR libcoopgamma_skip_message (3), +.BR libcoopgamma_get_crtcs_recv (3), +.BR libcoopgamma_get_gamma_info_recv (3), +.BR libcoopgamma_get_gamma_recv (3), +.BR libcoopgamma_set_gamma_recv (3) diff --git a/linux.mk b/linux.mk new file mode 100644 index 0000000..5b97157 --- /dev/null +++ b/linux.mk @@ -0,0 +1,5 @@ +LIBEXT = so +LIBFLAGS = -shared -Wl,-soname,libcoopgamma.$(LIBEXT).$(LIB_MAJOR) + +LIBMAJOREXT = $(LIBEXT).$(LIB_MAJOR) +LIBMINOREXT = $(LIBEXT).$(LIB_VERSION) diff --git a/macos.mk b/macos.mk new file mode 100644 index 0000000..b475197 --- /dev/null +++ b/macos.mk @@ -0,0 +1,5 @@ +LIBEXT = dylib +LIBFLAGS = -dynamiclib + +LIBMAJOREXT = $(LIB_MAJOR).$(LIBEXT) +LIBMINOREXT = $(LIB_VERSION).$(LIBEXT) diff --git a/man.mk b/man.mk new file mode 100644 index 0000000..413c917 --- /dev/null +++ b/man.mk @@ -0,0 +1,64 @@ +MAN0 =\ + libcoopgamma.h.0 + +MAN3=\ + libcoopgamma_async_context_destroy.3\ + libcoopgamma_async_context_initialise.3\ + libcoopgamma_async_context_marshal.3\ + libcoopgamma_async_context_unmarshal.3\ + libcoopgamma_connect.3\ + libcoopgamma_context_destroy.3\ + libcoopgamma_context_initialise.3\ + libcoopgamma_context_marshal.3\ + libcoopgamma_context_unmarshal.3\ + libcoopgamma_crtc_info_destroy.3\ + libcoopgamma_crtc_info_initialise.3\ + libcoopgamma_crtc_info_marshal.3\ + libcoopgamma_crtc_info_unmarshal.3\ + libcoopgamma_error_destroy.3\ + libcoopgamma_error_initialise.3\ + libcoopgamma_error_marshal.3\ + libcoopgamma_error_unmarshal.3\ + libcoopgamma_filter_destroy.3\ + libcoopgamma_filter_initialise.3\ + libcoopgamma_filter_marshal.3\ + libcoopgamma_filter_query_destroy.3\ + libcoopgamma_filter_query_initialise.3\ + libcoopgamma_filter_query_marshal.3\ + libcoopgamma_filter_query_unmarshal.3\ + libcoopgamma_filter_table_destroy.3\ + libcoopgamma_filter_table_initialise.3\ + libcoopgamma_filter_table_marshal.3\ + libcoopgamma_filter_table_unmarshal.3\ + libcoopgamma_filter_unmarshal.3\ + libcoopgamma_flush.3\ + libcoopgamma_get_crtcs_recv.3\ + libcoopgamma_get_crtcs_send.3\ + libcoopgamma_get_crtcs_sync.3\ + libcoopgamma_get_gamma_info_recv.3\ + libcoopgamma_get_gamma_info_send.3\ + libcoopgamma_get_gamma_info_sync.3\ + libcoopgamma_get_gamma_recv.3\ + libcoopgamma_get_gamma_send.3\ + libcoopgamma_get_gamma_sync.3\ + libcoopgamma_get_method_and_site.3\ + libcoopgamma_get_methods.3\ + libcoopgamma_get_pid_file.3\ + libcoopgamma_get_socket_file.3\ + libcoopgamma_queried_filter_destroy.3\ + libcoopgamma_queried_filter_initialise.3\ + libcoopgamma_queried_filter_marshal.3\ + libcoopgamma_queried_filter_unmarshal.3\ + libcoopgamma_ramps_destroy.3\ + libcoopgamma_ramps_initialise.3\ + libcoopgamma_ramps_marshal.3\ + libcoopgamma_ramps_unmarshal.3\ + libcoopgamma_set_gamma_recv.3\ + libcoopgamma_set_gamma_send.3\ + libcoopgamma_set_gamma_sync.3\ + libcoopgamma_set_nonblocking.3\ + libcoopgamma_skip_message.3\ + libcoopgamma_synchronise.3 + +MAN7 =\ + libcoopgamma.7 diff --git a/mk/README b/mk/README deleted file mode 100644 index e79926d..0000000 --- a/mk/README +++ /dev/null @@ -1,71 +0,0 @@ -This is a collection of generic enough makefiles. -Please feel free to use them in your project. - -Usage: - Include all.mk from your makefile. - - Read the top of each file for details. - - Define the variables: - - _VERSION - This version of the package. - - _PROJECT - The name of the project. Must only include [a-z0-9_-]. - - _PROJECT_FULL - The name of the project. May include any character. - - _SRC - All source code files. This list is used when - generating the translation template file. - - _COPYRIGHT_HOLDER - The copyright holder's full name and e-mail address. - - COMMAND - The name of the command. Must not be declared if - the package does not include exactly one runnable - command. - - PKGNAME - The name of the package. - - Variables beginning with __ are used internally by - the files where they appear, or in rare cases, - internally between these files. - - Variables beginning with _ but not __ are set in the - makefile to specify for these files how they should - behave. They should not be changed by a user of the - package. - - Variables that do not begin with _ are configurable - by the user of the package. - - Do no use single character variables in your Makefile. - - To suppress pre-install, post-install, pre-uninstall, - and post-uninstall instructions, set N=true. - PRE_INSTALL, POST_INSTALL, PRE_UNINSTALL, and - POST_UNINSTALL are supportered as specified by the - GNU coding standardars. - - To figure out what pre-install commands to run in your package, run: - make -n a=% install | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' - - To figure out what post-install commands to run in your package, run: - make -n z=% uninstall | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' - - To figure out what pre-uninstall commands to run in your package, run: - make -n a=% uninstall | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' - - To figure out what post-uninstall commands to run in your package, run: - make -n z=% uninstall | sed -e 's/\\$//' -e 's/^ *//' | sed -n '/^% /s/^..//p' - - To suppress verbatim which commands Make runs, - set Q=@. (Excluding the period.) - -Developers should use DEBUG=1 when running make, when possible. - diff --git a/mk/all.mk b/mk/all.mk deleted file mode 100644 index 032718d..0000000 --- a/mk/all.mk +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== This file includes all the other files in appropriate order. ===# - - -ifndef Q -A = \e[35m -Z =  -endif - -include $(v)mk/path.mk -include .config.mk -include $(v)mk/path.mk -include $(v)mk/lowerpath.mk -include $(v)mk/empty.mk -include $(v)mk/tools.mk -include $(v)mk/copy.mk -include $(v)mk/lang-c.mk -include $(v)mk/texinfo.mk -include $(v)mk/man.mk -include $(v)mk/i18n.mk -include $(v)mk/clean.mk -include $(v)mk/dist.mk -include $(v)mk/tags.mk -include $(v)mk/prologue.mk - diff --git a/mk/clean.mk b/mk/clean.mk deleted file mode 100644 index 1ae4fdc..0000000 --- a/mk/clean.mk +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== These rules are used for cleaning the repository of generated files. ===# - - -# Delete all files are normally created during a build. -.PHONY: clean -clean: clean-dist - @$(PRINTF_INFO) '\e[00;01;31mCLEANING BUILT FILES\e[34m\e[00m\n' - -$(Q)$(RM) -r -- bin aux *.su src/*.su src/*/*.su src/*/*/*.su src/*/*/*/*.su - @$(ECHO) - -# Delete all files that are created during configuration or building. -.PHONY: distclean -distclean: clean - @$(PRINTF_INFO) '\e[00;01;31mCLEANING CONFIGURATIONS\e[34m\e[00m\n' - -$(Q)$(RM) -- .config.mk config.status Makefile - @$(ECHO) - -# Like `make clean` but do not remove massive binaries -# that are seldom recompiled. -.PHONY: mostlyclean -mostlyclean: clean - -# Delete everything except ./configure -.PHONY: maintainer-clean -maintainer-clean: clean distclean - @$(ECHO) - @$(ECHO) 'This command is intended for maintainers to use; it' - @$(ECHO) 'deletes files that may need special tools to rebuild.' - @$(ECHO) - -# Delete all files generated by `make dist` -.PHONY: clean-dist -clean-dist: - @$(PRINTF_INFO) '\e[00;01;31mCLEANING RELEASES\e[34m\e[00m\n' - -$(Q)$(RM) -r -- $(_PROJECT)-*.tar* $(_PROJECT)-*.checksums* $(_PROJECT)-* - @$(ECHO) - diff --git a/mk/configure b/mk/configure deleted file mode 100644 index 4b6e61a..0000000 --- a/mk/configure +++ /dev/null @@ -1,732 +0,0 @@ -# -*- shell-script -*- - -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -# Run './configure --help' for usage information. - - -# FOR DEVELOPERS USING THIS SCRIPT: -# This file is used by include this file, via the . builtin, -# in your ./configure. Before doing so, you must declare -# PKGNAME=the_name_of_your_package -# MAN_SECTION_SUFFIX=default_suffix_to_append_to_man_page_section # (usually empty) -# MAN_SECTION=the_section_your_man_page_is_in # (do no declare if you do not use exacly one section) -# Define the function list_optional_features_help, see the help output. -# Define the function unrecognised_argument to deal with any unrecognised argument. - - - -# Store command for rebuilding Makefile to config.status. -exec 10>config.status - -# Store configurations to .config.mk. -exec 20>.config.mk - - -# Print a quoted (if necessary) version of a string -quote () -{ - value="$1" - if ! test "${value%%\'*}" = "${value}"; then - value="'$(echo "${value}" | sed "s/'/'\\\\''/g")'" - elif ! test "$(printf '%s' ${value})" = "${value}"; then - value="'${value}'" - elif ! test "$(echo ${value}) | tr -d a-zA-Z0-9+_@%/=-" = ""; then - value="'${value}'" - fi - echo "${value}" -} - - -# Parse command line. -incomplete= -dashed= -f_help= -f_gnulinux= -f_bin_merger= -for option; do - if test -n "${incomplete}"; then - option="${incomplete}=${option}" - incomplete= - fi - - # For --{with{,out},{en,dis}able}-*. - feature="${option#--*}" - feature="${feature#*-}" - feature="$(echo "${feature}" | tr a-z- A-Z_)" - - # For directories and filename tweaks. - nodash=_novar - - case "${dashed}${option}" in -# general - (--) - dashed=yes ;; - (--help) - f_help=yes ;; - (--destdir | --destdir=* | --pkgdir | --pkgdir=*) - nodash=destdir ;; - (--srcdir | --srcdir) - nodash=srcdir ;; - -# directory automation - (--gnu-linux) - f_gnulinux=yes ;; - (--bin-merger) - f_bin_merger=yes ;; - -# directories and filenames - (--prefix | --prefix=*) - nodash=prefix ;; - (--exec-prefix | --exec-prefix=* | --exec_prefix | --exec_prefix=*) - nodash=exec_prefix ;; - (--bindir | --bindir=*) - nodash=bindir ;; - (--sbindir | --sbindir=*) - nodash=sbindir ;; - (--libexecdir | --libexecdir=*) - nodash=libexecdir ;; - (--libdir | --libdir=*) - nodash=libdir ;; - (--includedir | --includedir=*) - nodash=includedir ;; - (--oldincludedir | --oldincludedir=*) - nodash=oldincludedir ;; - (--datarootdir | --datarootdir=*) - nodash=datarootdir ;; - (--datadir | --datadir=*) - nodash=datadir ;; - (--libdatarootdir | --libdatarootdir=*) - nodash=libdatarootdir ;; - (--libdatadir | --libdatadir=*) - nodash=libdatadir ;; - (--sysconfdir | --sysconfdir=*) - nodash=sysconfdir ;; - (--sharedstatedir | --=sharedstatedir*) - nodash=sharedstatedir ;; - (--localstatedir | --localstatedir=*) - nodash=localstatedir ;; - (--runstatedir | --runstatedir=*) - nodash=runstatedir ;; - (--lispdir | --lispdir=*) - nodash=lispdir ;; - (--localedir | --localedir=*) - nodash=localedir ;; - (--licensedir | --licensedir=*) - nodash=licensedir ;; - (--emptydir | --emptydir=*) - nodash=emptydir ;; - (--cachedir | --cachedir=*) - nodash=cachedir ;; - (--spooldir | --spooldir=*) - nodash=spooldir ;; - (--logdir | --logdir=*) - nodash=logdir ;; - (--statedir | --statedir=*) - nodash=statedir ;; - (--gamedir | --gamedir=*) - nodash=gamedir ;; - (--sharedcachedir | --sharedcachedir=*) - nodash=sharedcachedir ;; - (--sharedspooldir | --sharedspooldir=*) - nodash=sharedspooldir ;; - (--sharedlogdir | --sharedlogdir=*) - nodash=sharedlogdir ;; - (--sharedstatedir | --sharedstatedir=*) - nodash=sharedstatedir ;; - (--sharedgamedir | --sharedgamedir=*) - nodash=sharedgamedir ;; - (--tmpdir | --tmpdir=*) - nodash=tmpdir ;; - (--localtmpdir | --localtmpdir=*) - nodash=localtmpdir ;; - (--sharedtmpdir | --sharedtmpdir=*) - nodash=sharedtmpdir ;; - (--lockdir | --lockdir=*) - nodash=lockdir ;; - (--skeldir | --skeldir=*) - nodash=skeldir ;; - (--devdir | --devdir=*) - nodash=devdir ;; - (--sysdir | --sysdir=*) - nodash=sysdir ;; - (--procdir | --procdir=*) - nodash=procdir ;; - (--selfprocdir | --selfprocdir=*) - nodash=selfprocdir ;; - (--docdir | --docdir=*) - nodash=docdir ;; - (--infodir | --infodir=*) - nodash=infodir ;; - (--dvidir | --dvidir=*) - nodash=dvidir ;; - (--pdfdir | --pdfdir=*) - nodash=pdfdir ;; - (--psdir | --psdir=*) - nodash=psdir ;; - (--htmldir | --htmldir=*) - nodash=htmldir ;; - (--mandir | --mandir=*) - nodash=mandir ;; - (--man0 | --man0=*) - nodash=man0 ;; - (--man1 | --man1=*) - nodash=man1 ;; - (--man2 | --man2=*) - nodash=man2 ;; - (--man3 | --man3=*) - nodash=man3 ;; - (--man4 | --man4=*) - nodash=man4 ;; - (--man5 | --man5=*) - nodash=man5 ;; - (--man6 | --man6=*) - nodash=man6 ;; - (--man7 | --man7=*) - nodash=man7 ;; - (--man8 | --man8=*) - nodash=man8 ;; - (--man9 | --man9=*) - nodash=man9 ;; - (--man0ext | --man0ext=*) - nodash=man0ext ;; - (--man1ext | --man1ext=*) - nodash=man1ext ;; - (--man2ext | --man2ext=*) - nodash=man2ext ;; - (--man3ext | --man3ext=*) - nodash=man3ext ;; - (--man4ext | --man4ext=*) - nodash=man4ext ;; - (--man5ext | --man5ext=*) - nodash=man5ext ;; - (--man6ext | --man6ext=*) - nodash=man6ext ;; - (--man7ext | --man7ext=*) - nodash=man7ext ;; - (--man8ext | --man8ext=*) - nodash=man8ext ;; - (--man9ext | --man9ext=*) - nodash=man9ext ;; - (--manext | --manext=*) - if test -n "${MAN_SECTION}"; then - nodash=manext - else - printf "\e[01;31m%s: warning: ignoring: %s\e[00m\n" "${0}" "${option}" >&2 - sleep 1 - fi - ;; - -# ignored - # Unrecognised directories, and settings that cannot be used with internationalisation. - (--*dir=* | --*dir | --man?dir | --man?dir=*) - printf "\e[01;31m%s: warning: ignoring: %s\e[00m\n" "${0}" "${option}" >&2 - sleep 1 - ;; - -# feature tweaking - (--with-*) - feature="WITH_${feature}" - echo "${feature}" = yes >&20 - export "${feature}"=yes - option="${option}=x" - ;; - - (--without-*) - feature="WITHOUT_${feature}" - echo "${feature}" = yes >&20 - export "${feature}"=yes - option="${option}=x" - ;; - - (--enable-*=*) - param="${feature#*=}" - feature="${feature%%=*}" - if ! test "${param}" = "no"; then - feature="ENABLE_${feature}" - else - feature="DISABLE_${feature}" - param=yes - fi - echo "${feature}" = "${param}" >&20 - export "${feature}"="${param}" - ;; - - (--enable-*) - feature="DISABLE_${feature}" - echo "${feature}" = yes >&20 - export "${feature}"=yes - option="${option}=x" - ;; - - (--disable-*) - feature="DISABLE_${feature}" - echo "${feature}" = yes >&20 - export "${feature}"=yes - option="${option}=x" - ;; - -# unrecognised - (${dashed}--*) - unrecognised_argument "${option}" - ;; - -# variables - (${dashed}*=*) - var="${option%%=*}" - val="${option#*=}" - if test -n "$(echo "${var}" | tr -d '[_a-zA-Z0-9-]')"; then - # Variable is not used and is potentially not - # formatted in a compatible way. - printf "\e[01;31m%s: warning: ignoring because of bad format: %s\e[00m\n" "${0}" "${option}" >&2 - sleep 1 - fi - echo "${var}" = "${val}" >&20 - ;; - -# unrecognised - (*) - unrecognised_argument "${option}" - ;; - esac - - if test "${option%%=*}" = "${option}"; then - incomplete="${option}" - else - eval "${nodash}=$(quote "${option#*=}")" - eval "have_${nodash}=yes" - fi -done - - -# Print usage information. This is parsed by -# the auto-completion script for ./configure. -if test -n "${f_help}"; then - cat <&10 -echo >&10 -echo '# This file was generated by ./configure, its purpose is two-fold:' >&10 -echo '# 1) It lets you rebuild Makefile with the same configurations you' >&10 -echo '# used last time you run ./configure.' >&10 -echo '# 2) It lets Makefile rebuild itself transparently when out of date.' >&10 -echo >&10 - -# config.status should adjust CWD. -echo 'cd "$(dirname "${0}")"' >&10 - -# config.status calls ./configure with all arguments you called ./configure. -printf "exec %s" "${0}" >&10 -for option; do - printf " %s" "$(quote "${option}")" >&10 -done -echo >&10 - -# Close config.status. -exec 10>&- - - -# Store environment (with restrictions). -env | while read line; do - var="${line%%=*}" - val="${line#*=}" - if test "${var}" = "${line}"; then - # Malformated variables. (Can happen!, sigh...) - continue - elif test -n "$(echo "${var}" | tr -d '[_a-zA-Z0-9-]')"; then - # Variable is not used and is potentially not - # formatted in a compatible way. - continue - fi - case "${var}" in - (_ | PWD | SHELL | SHLVL | TERM | COLORTERM | MAKEFLAGS) - # We do not want to propagate these. - ;; - (*) - echo "${var}" = "${val}" >&20 - ;; - esac -done - -# Store directories and filenames. -if test -n "${destdir}"; then - echo DESTDIR = "${destdir}" >&20 -fi -echo PREFIX = "${prefix}" >&20 -echo SYSCONFDIR = "${sysconfdir}" >&20 -echo COMDIR = "${sharedstatedir}" >&20 -echo VARDIR = "${localstatedir}" >&20 -echo RUNDIR = "${runstatedir}" >&20 -echo TMPDIR = "${tmpdir}" >&20 -echo DEVDIR = "${devdir}" >&20 -echo SYSDIR = "${sysdir}" >&20 -echo PROCDIR = "${procdir}" >&20 -echo EXEC_PREFIX = "${exec_prefix}" >&20 -echo BINDIR = "${bindir}" >&20 -echo SBINDIR = "${sbindir}" >&20 -echo LIBEXECDIR = "${libexecdir}" >&20 -echo LIBDIR = "${libdir}" >&20 -echo INCLUDEDIR = "${includedir}" >&20 -echo OLDINCLUDEDIR = "${oldincludedir}" >&20 -echo DATADIR = "${datarootdir}" >&20 -echo RESDIR = "${datadir}" >&20 -echo SYSDEPDATADIR = "${libdatarootdir}" >&20 -echo SYSDEPRESDIR = "${libdatadir}" >&20 -echo LISPDIR = "${lispdir}" >&20 -echo LOCALEDIR = "${localedir}" >&20 -echo LICENSEDIR = "${licensedir}" >&20 -echo CACHEDIR = "${cachedir}" >&20 -echo SPOOLDIR = "${spooldir}" >&20 -echo EMPTYDIR = "${emptydir}" >&20 -echo LOGDIR = "${logdir}" >&20 -echo STATEDIR = "${statedir}" >&20 -echo GAMEDIR = "${gamedir}" >&20 -echo COMCACHEDIR = "${sharedcachedir}" >&20 -echo COMPOOLDIR = "${sharedpooldir}" >&20 -echo COMLOGDIR = "${sharedlogdir}" >&20 -echo COMSTATEDIR = "${sharedstatedir}" >&20 -echo COMGAMEDIR = "${sharedgamedir}" >&20 -echo LOCALTMPDIR = "${localtmpdir}" >&20 -echo SHAREDTMPDIR = "${sharedtmpdir}" >&20 -echo LOCKDIR = "${lockdir}" >&20 -echo SKELDIR = "${skeldir}" >&20 -echo SELFPROCDIR = "${selfprocdir}" >&20 -echo DOCDIR = "${docdir}" >&20 -echo INFODIR = "${infodir}" >&20 -echo DVIDIR = "${dvidir}" >&20 -echo PDFDIR = "${pdfdir}" >&20 -echo PSDIR = "${psdir}" >&20 -echo HTMLDIR = "${htmldir}" >&20 -echo MANDIR = "${mandir}" >&20 -echo MAN0 = "${man0}" >&20 -echo MAN1 = "${man1}" >&20 -echo MAN2 = "${man2}" >&20 -echo MAN3 = "${man3}" >&20 -echo MAN4 = "${man4}" >&20 -echo MAN5 = "${man5}" >&20 -echo MAN6 = "${man6}" >&20 -echo MAN7 = "${man7}" >&20 -echo MAN8 = "${man8}" >&20 -echo MAN9 = "${man9}" >&20 -echo MAN0EXT = "${man0ext}" >&20 -echo MAN1EXT = "${man1ext}" >&20 -echo MAN2EXT = "${man2ext}" >&20 -echo MAN3EXT = "${man3ext}" >&20 -echo MAN4EXT = "${man4ext}" >&20 -echo MAN5EXT = "${man5ext}" >&20 -echo MAN6EXT = "${man6ext}" >&20 -echo MAN7EXT = "${man7ext}" >&20 -echo MAN8EXT = "${man8ext}" >&20 -echo MAN9EXT = "${man9ext}" >&20 - -# Close .config.mk. -exec 20>&- - -# Now, make Makefile available. -if test -f Makefile; then - chmod u+w Makefile # This scripts makes it read-only. -fi -exec 30>Makefile -echo "# ----------------------------------------------------- #" >&30 -echo "# This file was created by ./configure from Makefile.in #" >&30 -echo "# ----------------------------------------------------- #" >&30 -echo >&30 -if test -n "${srcdir}"; then - echo v = "${srcdir}" >&30 -fi -cat "${srcdir_proper}"Makefile.in >&30 -exec 30>&- - - -# config.status should be executable. -chmod a+x config.status - -# Makefile should be read-only to ones does not edit it by mistake. -chmod a-w Makefile - - -# Help functions for the parent script. -test_with () -{ - with="$(eval echo '${WITH_'"${1}"'}')" - without="$(eval echo '${WITHOUT_'"${1}"'}')" - if ! test -n "${with}" && ! test -n "${without}"; then - echo "${2}" - elif ! test -n "${with}" && test -n "${without}"; then - echo "no" - elif test -n "${with}" && ! test -n "${without}"; then - echo "yes" - elif test "${2}" = yes; then - echo "no" - else - echo "yes" - fi -} -test_enable () -{ - enable="$(eval echo '${ENABLE_'"${1}"'}')" - disable="$(eval echo '${DISABLE_'"${1}"'}')" - if ! test -n "${enable}" && ! test -n "${disable}"; then - echo "${2}" - elif ! test -n "${enable}" && test -n "${disable}"; then - echo "no" - elif test -n "${enable}" && ! test -n "${disable}"; then - echo "${enable}" - elif test "${2}" = yes ; then - echo "no" - else - echo "${enable}" - fi -} - - -# After including this file, you may want -# to do something like: -# -# cat < -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== These rules are used for legal files. ===# - - -# Enables the rules: -# install-copyright Install all files in _COPYING and _LICENSE -# install-copying Install all files in _COPYING -# install-license Install all files in _LICENSE - - -# WHEN TO BUILD, INSTALL, AND UNINSTALL: - -install-base: install-copyright -uninstall: uninstall-copyright - - -# INSTALL RULES: - -.PHONY: install-copyright -install-copyright: - -ifdef _COPYING -.PHONY: install-copyright -install-copyright: install-copying - -.PHONY: install-copying -install-copying: $(foreach F,$(_COPYING),$(v)$(F)) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" - @$(ECHO_EMPTY) -endif - -ifdef _LICENSE -.PHONY: install-copyright -install-copyright: install-license - -.PHONY: install-license -install-license: $(foreach F,$(_LICENSE),$(v)$(F)) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" - @$(ECHO_EMPTY) -endif - - -# UNINSTALL RULES: - -.PHONY: uninstall-copyright -uninstall-copyright: - -ifdef _COPYING -.PHONY: uninstall-copyright -uninstall-copyright: uninstall-copying - -.PHONY: uninstall-copying -uninstall-copying: - -$(Q)$(RM) -- $(foreach F,$(_COPYING),"$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)/$(F)") - -$(Q)$(RMDIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" -endif - -ifdef _LICENSE -.PHONY: uninstall-copyright -uninstall-copyright: uninstall-license - -.PHONY: uninstall-license -uninstall-license: - -$(Q)$(RM) -- $(foreach F,$(_LICENSE),"$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)/$(F)") - -$(Q)$(RMDIR) -- "$(DESTDIR)$(LICENSEDIR)/$(PKGNAME)" -endif - diff --git a/mk/dist.mk b/mk/dist.mk deleted file mode 100644 index 9f8c48b..0000000 --- a/mk/dist.mk +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== These rules are used for making releases. ===# - - -# CONFIGURATIONS: - -# Formats for packages to generate. -DIST_FORMATS = tar tar.xz tar.bz2 tar.gz - -# Define DO_NOT_SIGN if you do not want sign the release. - -# You can select checksums to generate: -# Declaring NO_BSD_SUM will omit `sum -r`. -# Declaring NO_SYSV_SUM will omit `sum -s`. -# List all checksum programs, that do not require any flags, in DIST_CHECKSUMS. - -# Any missing flags for GnuPG? -GPG_FLAGS = - -# What key should be used for signing? -GPG_KEY ?= - -# You should define _EVERYTHING to enumerate all files that belong in -# the release tarball, lest 'git archive' will be used as a fallback. - - - -# HELP VARIALES: - -# You may use these to help list all files in _EVERYTHING -__EVERYTHING_COMMON = $(_COPYING) $(_LICENSE) README -__EVERYTHING_SRC = $(foreach F,$(_SRC),src/$(F)) -__EVERYTHING_LOCALE = $(foreach L,$(LOCALES),po/$(L).po) -__EVERYTHING_SHELL = $(foreach F,$(_AUTO_COMPLETE),src/$(F).auto-completion) \ - $(foreach F,$(_AUTO_COMPLETE),$(foreac F,$(_SHELL_LOCALES),src/$(F).$(L),auto-completion)) -__EVERYTHING_MK_ = all clean copy dist empty i18n lang-c lowerpath man path prologue shell tags texinfo tools -__EVERYTHING_MK = $(foreach F,$(__EVERYTHING_MK_),mk/$(F).mk) mk/configure mk/README configure Makefile.in -__EVERYTHING_MAN = $(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),doc/man/$(P).$(S))) \ - $(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach L,$(MAN_LOCALES),$(foreach P,$(_MAN_$(L)_$(S)),doc/man/$(P).$(L).$(S)))) -__EVERYTHING_ALL_COMMON = $(__EVERYTHING_COMMON) $(__EVERYTHING_MK) $(__EVERYTHING_MAN) \ - $(__EVERYTHING_LOCALE) $(__EVERYTHING_SRC) $(__EVERYTHING_SHELL) -# This one (__todo) if you have a todo file, but do not want it to be greped. -__TO__ = TO -__DO__ = DO -__todo = $(__TO__)$(__DO__) - - -# The packages and there detached signatures (if any.) -ifndef DO_NOT_SIGN -__DIST_FILES = $(foreach F,$(DIST_FORMATS),$(_PROJECT)-$(_VERSION).$(F) $(_PROJECT)-$(_VERSION).$(F).sig) -endif -ifdef DO_NOT_SIGN -__DIST_FILES = $(foreach F,$(DIST_FORMATS),$(_PROJECT)-$(_VERSION).$(F)) -endif - -# All known checksum programs that are unambiguous. -__DIST_CHECKSUMS_ALL = cksum md2sum md4sum md5sum md6sum sha0sum sha1sum sha224sum \ - sha256sum sha384sum sha512sum sha512-224sum sha512-256sum \ - sha3-224sum sha3-256sum sha3-384sum sha3-512sum shake256sum \ - shake512sum rawshake256sum rawshake512sum keccak-224sum \ - keccak-256sum keccak-384sum keccak-512sum keccaksum - -# All installed checksum programs that are unambiguous. -DIST_CHECKSUMS = $(foreach C,$(__DIST_CHECKSUMS_ALL),$(shell if command -v $(C) >/dev/null; then $(ECHO) $(C); fi)) - - - -# MAKE RULES: - -# Generate release files. (Tarballs, compressed and uncompressed; signatures; checksums.) -.PHONY: dist -dist: dist-balls dist-checksums - - - -# HELP MAKE RULES: - -# Generate tarballs, compressed and uncompressed, -.PHONY: dist-balls -dist-balls: $(__DIST_FILES) - -ifndef DO_NOT_SIGN -# Generate checksums and signature of checksums. -.PHONY: dist-checksums -dist-checksums: $(_PROJECT)-$(_VERSION).checksums $(_PROJECT)-$(_VERSION).checksums.sig - -# Generate uncompressed tarball and signature of it. -.PHONY: dist-tar -dist-tar: $(_PROJECT)-$(_VERSION).tar $(_PROJECT)-$(_VERSION).tar.sig - -# Generate xz-copressed tarball and signature of it. -.PHONY: dist-xz -dist-xz: $(_PROJECT)-$(_VERSION).tar.xz $(_PROJECT)-$(_VERSION).tar.xz.sig - -# Generate bz2-copressed tarball and signature of it. -.PHONY: dist-bzip2 -dist-bz2: $(_PROJECT)-$(_VERSION).tar.bz2 $(_PROJECT)-$(_VERSION).tar.bz2.sig - -# Generate gzip-copressed tarball and signature of it. -.PHONY: dist-gz -dist-gz: $(_PROJECT)-$(_VERSION).tar.gz $(_PROJECT)-$(_VERSION).tar.sig -endif -ifdef DO_NOT_SIGN -# Generate checksums, but no signature. -.PHONY: dist-checksums -dist-checksums: $(_PROJECT)-$(_VERSION).checksums - -# Generate uncompressed tarball, but no signature. -.PHONY: dist-tar -dist-tar: $(_PROJECT)-$(_VERSION).tar - -# Generate xz-compressed tarball, but no signature. -.PHONY: dist-xz -dist-xz: $(_PROJECT)-$(_VERSION).tar.xz - -# Generate bzip2-compressed tarball, but no signature. -.PHONY: dist-bz2 -dist-bz2: $(_PROJECT)-$(_VERSION).tar.bz2 - -# Generate gzip-compressed tarball, but no signature. -.PHONY: dist-gz -dist-gz: $(_PROJECT)-$(_VERSION).tar.gz -endif - -# Generate the tarball for the release. -ifdef v -__GIT_DIR = --git-dir=$(v) -endif -$(_PROJECT)-$(_VERSION).tar: $(foreach F,$(_EVERYTHING),$(v)$(F)) - @$(PRINTF_INFO) '\e[00;01;31mTAR\e[34m %s\e[00m$A\n' "$@" - @if $(TEST) -f $@; then $(RM) $@; fi -ifndef _EVERYTHING - $(Q)git archive --prefix=$(_PROJECT)-$(_VERSION)/ --format=tar $(__GIT_DIR) $(_VERSION) -o $@ #$Z -endif -ifdef _EVERYTHING - $(Q)$(LN) -s . $(_PROJECT)-$(_VERSION) - $(Q)$(TAR) c -- $(foreach F,$(_EVERYTHING),$(v)$(_PROJECT)-$(_VERSION)/$(F)) > $@ - $(Q)$(RM) $(_PROJECT)-$(_VERSION) -endif - @$(ECHO_EMPTY) - -# Compression rule for xz-compression. Used on the tarball. -%.xz: % - @$(PRINTF_INFO) '\e[00;01;31mXZ\e[34m %s\e[00m$A\n' "$@" - @if $(TEST) -f $@; then $(RM) $@; fi - $(Q)$(XZ_COMPRESS) $< #$Z - @$(ECHO_EMPTY) - -# Compression rule for bzip2-compression. Used on the tarball. -%.bz2: % - @$(PRINTF_INFO) '\e[00;01;31mBZIP2\e[34m %s\e[00m$A\n' "$@" - @if $(TEST) -f $@; then $(RM) $@; fi - $(Q)$(BZIP2_COMPRESS) $< #$Z - @$(ECHO_EMPTY) - -# Compression rule for gzip-compression. Used on the tarball. -%.gz: % - @$(PRINTF_INFO) '\e[00;01;31mGZIP\e[34m %s\e[00m$A\n' "$@" - @if $(TEST) -f $@; then $(RM) $@; fi - $(Q)$(GZIP_COMPRESS) $< #$Z - @$(ECHO_EMPTY) - -# Generate checksums of tarballs, compressed and uncompressed, and of their detached signatures. -$(_PROJECT)-$(_VERSION).checksums: $(__DIST_FILES) - @$(PRINTF_INFO) '\e[00;01;31mCHECKSUM\e[34m %s\e[00m\n' "$@" - @$(PRINTF) '' > $@ -ifndef NO_BSD_SUM - @if ! ($(ECHO) ':: sum -r ::' && sum -r $^ && $(ECHO)) >> $@ ; then $(PRINTF) '' > $@; fi -endif -ifndef NO_SYSV_SUM - @if ! ($(ECHO) ':: sum -s ::' && sum -s $^ && $(ECHO)) >> $@ ; then $(PRINTF) '' > $@; fi -endif - @$(foreach C,$(DIST_CHECKSUMS),$(ECHO) ':: $(C) ::' >> $@ && $(C) $^ | $(GREP) -v '^--' >> $@ && $(ECHO) >> $@ &&) $(TRUE) - @$(ECHO_EMPTY) - -# Signing rule. Used on the tarballs, compressed and uncompressed, and on the checksum file. -%.sig: % - @$(PRINTF_INFO) '\e[00;01;31mSIG\e[34m %s\e[00m$A\n' "$@" - @if $(TEST) -f $@; then $(RM) $@; fi - $(Q)$(GPG) $(GPG_FLAGS) --local-user $(GPG_KEY) --detach-sign --armor --output $@ < $< #$Z - @$(ECHO_EMPTY) - diff --git a/mk/empty.mk b/mk/empty.mk deleted file mode 100644 index fd684f6..0000000 --- a/mk/empty.mk +++ /dev/null @@ -1,103 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== This file includes empty rules that are filled by other files. ===# - - -.PHONY: all -all: - -.PHONY: everything -everything: - -.PHONY: base -base: - -.PHONY: cmd -cmd: - -.PHONY: lib -lib: - -.PHONY: doc -doc: - - -.PHONY: check -check: - - -.PHONY: install -install: - -.PHONY: install-everything -install-everything: - -.PHONY: install-base -install-base: - -.PHONY: install-cmd -install-cmd: - -.PHONY: install-lib -install-lib: - -.PHONY: install-doc -install-doc: - - -.PHONY: installcheck -installcheck: - - -.PHONY: uninstall -uninstall: - - - -.PHONY: all -all: base - -.PHONY: everything -everything: base - -.PHONY: base -base: cmd lib - - -.PHONY: install -install: install-base - -.PHONY: install-everything -install-everything: install-base - -.PHONY: install-base -install-base: install-cmd install-lib - - - -.PHONY: install-strip -install-strip: __STRIP = -s -install-strip: install - -.PHONY: install-everything-strip -install-everything-strip: __STRIP = -s -install-everything-strip: install-everything - -.PHONY: install-base-strip -install-base-strip: __STRIP = -s -install-base-strip: install-base - -.PHONY: install-cmd-strip -install-cmd-strip: __STRIP = -s -install-cmd-strip: install-cmd - -.PHONY: install-lib-strip -install-lib-strip: __STRIP = -s -install-lib-strip: install-lib - diff --git a/mk/i18n.mk b/mk/i18n.mk deleted file mode 100644 index ed6ec79..0000000 --- a/mk/i18n.mk +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== These rules are used for internationalisation. ===# - - -# Enables the rules: -# locale Build all translations. -# update-po Update all .po files for further translation. -# install-locale Install all locales. -# -# "All locales" are those listed in LOCALES. -# If LOCALES is not defined, this file is ignored. -# -# If WITHOUT_GETTEXT is defined, `locale` and -# `install-locale` will not do anything. -# -# _SRC should list all sources files, excluding the src/ -# at the beginning of the pathnames. - - -ifdef LOCALES - - -# WHEN TO BUILD, INSTALL, AND UNINSTALL: - -all: locale -everything: locale -install: install-locale -install-everything: install-locale -uninstall: uninstall-locale - - -# BUILD RULES: - -# Build all translations. -ifdef WITHOUT_GETTEXT -.PHONY: locale -locale: -endif -ifndef WITHOUT_GETTEXT -.PHONY: locale -locale: $(foreach L,$(LOCALES),bin/mo/$(L)/messages.mo) -endif - -# Update all translation files for further translation. -.PHONY: update-po -update-po: $(foreach L,$(LOCALES),po/$(L).po) - -# Generate template for translations. -aux/$(_PROJECT).pot: $(foreach S,$(_SRC),$(v)src/$(S)) - @$(PRINTF_INFO) '\e[00;01;31mPOT\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p aux - $(Q)$(CPP) -DUSE_GETTEXT=1 $^ | \ - $(XGETTEXT) -o "$@" -Lc --from-code utf-8 --package-name "$(_PROJECT_FULL)" \ - --package-version $(_VERSION) --no-wrap --force-po \ - --copyright-holder '$(_COPYRIGHT_HOLDER)' - #$Z - @$(ECHO_EMPTY) - -# Create or update a translation file. -po/%.po: aux/$(_PROJECT).pot - @$(PRINTF_INFO) '\e[00;01;31mPO\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p po - $(Q)if ! $(TEST) -e $@; then \ - $(MSGINIT) --no-translator --no-wrap -i aux/$(_PROJECT).pot -o $@ -l $*; \ - else \ - $(MSGMERGE) --no-wrap -U $@ aux/$(_PROJECT).pot; \ - fi #$Z - @$(TOUCH) $@ - @$(ECHO_EMPTY) - -# Compile a translation file. -bin/mo/%/messages.mo: $(v)po/%.po - @$(PRINTF_INFO) '\e[00;01;31mMO\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p bin/mo/$* - $(Q)cd bin/mo/$* && $(MSGFMT) $(__back3unless_v)$< #$Z - @$(ECHO_EMPTY) - - -# INSTALL RULES: - -# Install all locales. -ifdef WITHOUT_GETTEXT -.PHONY: install-locale -install-locale: -endif -ifndef WITHOUT_GETTEXT -.PHONY: install-locale -install-locale: $(foreach L,$(LOCALES),bin/mo/$(L)/messages.mo) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL) -dm755 -- $(foreach L,$(LOCALES),"$(DESTDIR)$(LOCALEDIR)/$(L)/LC_MESSAGES") - $(Q)$(foreach L,$(LOCALES),$(INSTALL_DATA) bin/mo/$(L)/messages.mo -- "$(DESTDIR)$(LOCALEDIR)/$(L)/LC_MESSAGES/$(PKGNAME).mo" &&) $(TRUE) - @$(ECHO_EMPTY) -endif - - -# UNINSTALL RULES: - -# Uninstall all locales. -.PHONY: uninstall-locale -uninstall-locale: - -$(Q)$(RM) -- $(foreach L,$(LOCALES),"$(DESTDIR)$(LOCALEDIR)/$(L)/LC_MESSAGES/$(PKGNAME).mo") - - -endif - diff --git a/mk/lang-c.mk b/mk/lang-c.mk deleted file mode 100644 index 63015fb..0000000 --- a/mk/lang-c.mk +++ /dev/null @@ -1,307 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== This file includes rules for C programs. ===# - - -# This file is ignored unless _C_STD is defined. -# _C_STD should be set the the version of C that -# is used. -# -# If you want to compile with -pedantic, define -# the variable _PEDANTIC. -# -# Define _CPPFLAGS with any additional CPP -# flags to use, _CFLAGS with any additional CC -# flags to use, and _LDFLAGS with any additional -# LD flags to use. -# -# Defined in path.mk, you can change _ALL_DIRS -# if you do not want CPP definitions for all -# directories. -# -# Define _HEADER_DIRLEVELS to specify the directory -# nesting level in src. It is assumed that all -# directories contain header files. Set to '0' if -# there are no header files. -# -# _BIN shall list all commands to build. These -# should be the basenames. For each command -# you should be the variable _OBJ_$(COMMAND) -# that lists all objects files (without the -# suffix and without the aux/ prefix) that -# are required to build the command. -# -# Binary you want installed to /sbin rather than -# /bin shall be listed in _SBIN rather than in -# _BIN. _SBIN and _BIN may not list binaries -# with identical names. Analogically, you may -# add _LIBEXEC for binary to be installed to -# /libexec. -# -# If you only have one binary, you may select -# to define _BINDIR to name the variable with -# the pathname for the directory the binary -# shall be installed. For example, if you want -# the binary to be installed to /usr/sbin, -# define _BINDIR = SBINDIR. -# -# List libraries to compile in in _LIB. For each -# library, you should also define -# _SO_VERSION_$(LIBRARY) and _SO_MAJOR_$(LIBRARY) -# with the full version number and the major -# version number, respectively. Additionally, -# list all header files that shall be installed -# in _H, these should not contain the 'src/' prefix -# or the '.h' suffix. - - -ifdef _C_STD - - - -# HELP VARIABLES: - -# Figure out whether the GCC is being used. -ifeq ($(shell $(PRINTF) '%s\n' ${CC} | $(HEAD) -n 1),gcc) -__USING_GCC = 1 -endif - -# Are there any commands? -ifdef _BIN -__HAVE_CMD_C = 1 -endif -ifdef _SBIN -__HAVE_CMD_C = 1 -endif -ifdef _LIBEXEC -__HAVE_CMD_C = 1 -endif - - -# WHEN TO BUILD, INSTALL, AND UNINSTALL: - -ifdef __HAVE_CMD_C -cmd: cmd-c -install-cmd: install-cmd-c -uninstall: uninstall-cmd-c -endif -ifdef _LIB -lib: lib-c -install-lib: install-lib-c -uninstall: uninstall-lib-c -endif - - -# BUILD VARIABLES: - -# Optimisation settings for C code compilation. -ifndef OPTIMISE -ifndef DEBUG -OPTIMISE = -O2 -g -endif -ifdef DEBUG -ifdef __USING_GCC -OPTIMISE = -Og -g -endif -ifndef __USING_GCC -OPTIMISE = -g -endif -endif -endif - -# Warning settings for C code compilation. -ifdef _PEDANTIC -_PEDANTIC = -pedantic -endif -ifndef WARN -ifndef DEBUG -WARN = -Wall -endif -ifdef DEBUG -ifdef __USING_GCC -WARN = -Wall -Wextra $(_PEDANTIC) -Wdouble-promotion -Wformat=2 -Winit-self -Wmissing-include-dirs \ - -Wtrampolines -Wmissing-prototypes -Wmissing-declarations -Wnested-externs \ - -Wno-variadic-macros -Wsync-nand -Wunsafe-loop-optimizations -Wcast-align \ - -Wdeclaration-after-statement -Wundef -Wbad-function-cast -Wwrite-strings -Wlogical-op \ - -Wstrict-prototypes -Wold-style-definition -Wpacked -Wvector-operation-performance \ - -Wunsuffixed-float-constants -Wsuggest-attribute=const -Wsuggest-attribute=noreturn \ - -Wsuggest-attribute=format -Wnormalized=nfkc -fstrict-aliasing -fipa-pure-const -ftree-vrp \ - -fstack-usage -funsafe-loop-optimizations -Wshadow -Wredundant-decls -Winline -Wcast-qual \ - -Wsign-conversion -Wstrict-overflow=5 -Wconversion -Wsuggest-attribute=pure -Wswitch-default \ - -Wstrict-aliasing=1 -fstrict-overflow -Wfloat-equal -Wpadded -Waggregate-return \ - -Wtraditional-conversion -endif -ifndef __USING_GCC -WARN = -Wall -Wextra $(_PEDANTIC) -endif -endif -endif - -# Support for internationalisation? -ifndef WITHOUT_GETTEXT -_CPPFLAGS += -D'USE_GETTEXT=1' -endif - -# Add CPP definitions for all directories. -_CPPFLAGS += $(foreach D,$(_ALL_DIRS),-D'$(D)="$($(D))"') - -# Compilation and linking flags, and command. -ifndef CPPFLAGS -CPPFLAGS = -endif -ifndef CFLAGS -CFLAGS = $(OPTIMISE) $(WARN) -endif -ifndef LDFLAGS -LDFLAGS = $(OPTIMISE) $(WARN) -endif -__CC = $(CC) -std=$(_C_STD) -c $(_CPPFLAGS) $(_CFLAGS) -__LD = $(CC) -std=$(_C_STD) $(_LDFLAGS) -__CC_POST = $(CPPFLAGS) $(CFLAGS) $(EXTRA_CPPFLAGS) $(EXTRA_CFLAGS) -__LD_POST = $(LDFLAGS) $(EXTRA_LDFLAGS) - -# Header files. -__H = -ifdef _HEADER_DIRLEVELS -ifeq ($(_HEADER_DIRLEVELS),1) -__H += src/*.h -endif -ifneq ($(_HEADER_DIRLEVELS),1) -ifeq ($(_HEADER_DIRLEVELS),2) -__H += src/*.h -__H += src/*/*.h -endif -ifneq ($(_HEADER_DIRLEVELS),2) -ifneq ($(_HEADER_DIRLEVELS),0) -__H += $(foreach W,$(shell $(SEQ) $(_HEADER_DIRLEVELS) | while read n; do $(ECHO) $$($(SEQ) $$n)" " | $(SED) 's/[^ ]* /\/\*/g'; done | $(XARGS) $(ECHO)),src$(W).h) -endif -endif -endif -endif - -# Directory for the binary if there is only one binary. -ifndef _BINDIR -_BINDIR = BINDIR -endif - - -# BUILD RULES: - -.PHONY: cmd-c -cmd-c: $(foreach B,$(_BIN) $(_SBIN) $(_LIBEXEC),bin/$(B)) - -.PHONY: lib-c -lib-c: $(foreach B,$(_LIB),bin/$(B).so) - -# Compile a C file into an object file for a command. -aux/%.o: $(v)src/%.c $(foreach H,$(__H),$(v)$(H)) - @$(PRINTF_INFO) '\e[00;01;31mCC\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p $(shell $(DIRNAME) $@) - $(Q)$(__CC) -o $@ $< $(__CC_POST) #$Z - @$(ECHO_EMPTY) - -# Compile a C file into an object file for a library. -aux/%.pic.o: $(v)src/%.c $(foreach H,$(__H),$(v)$(H)) - @$(PRINTF_INFO) '\e[00;01;31mCC\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p $(shell $(DIRNAME) $@) - $(Q)$(__CC) -fPIC -o $@ $< $(__CC_POST) #$Z - @$(ECHO_EMPTY) - -# Link object files into a library. -# Dependencies are declared below. -bin/%.so: - @$(PRINTF_INFO) '\e[00;01;31mLD\e[34m %s\e[00;32m$A\n' "$@" - @$(MKDIR) -p bin - $(Q)$(__LD) -shared -Wl,-soname,$*.so.$(_SO_MAJOR_$*) -o $@ $^ $(__LD_POST) #$Z - @$(ECHO_EMPTY) - -# Link object files into a command. -# Dependencies are declared below. -bin/%: - @$(PRINTF_INFO) '\e[00;01;31mLD\e[34m %s\e[00;32m$A\n' "$@" - @$(MKDIR) -p bin - $(Q)$(__LD) -o $@ $^ $(__LD_POST) #$Z - @$(ECHO_EMPTY) - -# Dependencies for the rule above. -include aux/lang-c.mk -aux/lang-c.mk: Makefile - @$(MKDIR) -p aux - @$(ECHO) > aux/lang-c.mk - @$(foreach B,$(_BIN) $(_SBIN) $(_LIBEXEC),$(ECHO) bin/$(B): $(foreach O,$(_OBJ_$(B)),aux/$(O).o) >> aux/lang-c.mk &&) $(TRUE) - @$(foreach B,$(_LIB),$(ECHO) bin/$(B).so: $(foreach O,$(_OBJ_$(B)),aux/$(O).pic.o) >> aux/lang-c.mk &&) $(TRUE) - - -# INSTALL RULES: - -.PHONY: install-cmd-c -install-cmd-c: $(foreach B,$(_BIN) $(_SBIN) $(_LIBEXEC),bin/$(B)) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" -ifndef COMMAND -ifdef _BIN - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(BINDIR)" - $(Q)$(INSTALL_PROGRAM) $(__STRIP) $(foreach B,$(_BIN),bin/$(B)) -- "$(DESTDIR)$(BINDIR)" -endif -ifdef _SBIN - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(SBINDIR)" - $(Q)$(INSTALL_PROGRAM) $(__STRIP) $(foreach B,$(_SBIN),bin/$(B)) -- "$(DESTDIR)$(SBINDIR)" -endif -ifdef _LIBEXEC - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)" - $(Q)$(INSTALL_PROGRAM) $(__STRIP) $(foreach B,$(_LIBEXEC),bin/$(B)) -- "$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)" -endif -endif -ifdef COMMAND - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$($(_BINDIR))" - $(Q)$(INSTALL_PROGRAM) $(__STRIP) $^ -- "$(DESTDIR)$($(_BINDIR))/$(COMMAND)" -endif - @$(ECHO_EMPTY) - -.PHONY: install-lib-c -install-lib-c: $(foreach B,$(_LIB),bin/$(B).so) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(LIBDIR)" - $(Q)$(foreach B,$(_LIB),$(LN) -sf -- "$(B).so.$(_SO_VERSION_$(B))" "$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_MAJOR_$(B))" &&) $(TRUE) - $(Q)$(foreach B,$(_LIB),$(INSTALL_PROGRAM) $(foreach B,$(_LIB),bin/$(B).so) -- "$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_VERSION_$(B))" &&) $(TRUE) - $(Q)$(foreach B,$(_LIB),$(LN) -sf -- "$(B).so.$(_SO_VERSION_$(B))" "$(DESTDIR)$(LIBDIR)/$(B).so" &&) $(TRUE) - $(Q)$(INSTALL_DIR) -- $(foreach H,$(_H),"$(DESTDIR)$(INCLUDEDIR)/$(shell $(DIRNAME) "$(H)")") - $(Q)$(foreach H,$(_H),$(INSTALL_DATA) "src/$(H).h" -- "$(DESTDIR)$(INCLUDEDIR)/$(H).h" &&) $(TRUE) - @$(ECHO_EMPTY) - - -# UNINSTALL RULES: - -.PHONY: uninstall-cmd-c -uninstall-cmd-c: -ifdef COMMAND - -$(Q)$(RM) -- "$(DESTDIR)$($(_BINDIR))/$(COMMAND)" -endif -ifndef COMMAND -ifdef _BIN - -$(Q)$(RM) -- $(foreach B,$(_BIN),"$(DESTDIR)$(BINDIR)/$(B)") -endif -ifdef _SBIN - -$(Q)$(RM) -- $(foreach B,$(_SBIN),"$(DESTDIR)$(SBINDIR)/$(B)") -endif -ifdef _LIBEXEC - -$(Q)$(RM) -- $(foreach B,$(_LIBEXEC),"$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)/$(B)") - -$(Q)$(RMDIR) -- "$(DESTDIR)$(LIBEXECDIR)/$(PKGNAME)" -endif -endif - -.PHONY: uninstall-lib-c -uninstall-lib-c: - -$(Q)$(RM) -- $(foreach B,$(_LIB),"$(DESTDIR)$(LIBDIR)/$(B).so") - -$(Q)$(RM) -- $(foreach B,$(_LIB),"$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_MAJOR_$(B))") - -$(Q)$(RM) -- $(foreach B,$(_LIB),"$(DESTDIR)$(LIBDIR)/$(B).so.$(_SO_VERSION_$(B))") - -$(Q)$(RM) -- $(foreach H,$(_H),"$(DESTDIR)$(INCLUDEDIR)/$(H).h") - -$(Q)$(foreach H,$(_H),if ! $(TEST) "$(shell $(ECHO) "$(H)" | $(CUT) -d / -f 1)" = "$(H)"; then $(RMDIR) -- "$(DESTDIR)$(INCLUDEDIR)/$(shell $(DIRNAME) "$(H)")"; fi;) - -endif - diff --git a/mk/lowerpath.mk b/mk/lowerpath.mk deleted file mode 100644 index 77b3542..0000000 --- a/mk/lowerpath.mk +++ /dev/null @@ -1,279 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== This file overrides values uppercase path variables with values lowercase path variables. ===# - - -ifdef srcdir -VPATH = $(srcdir) -endif - -ifdef prefix -PREFIX = $(prefix) -endif - -ifdef sysconfdir -SYSCONFDIR = $(sysconfdir) -endif - -ifdef sharedstatedir -COMDIR = $(sharedstatedir) -endif - -ifdef localstatedir -VARDIR = $(localstatedir) -endif - -ifdef runstatedir -RUNDIR = $(runstatedir) -endif - -ifdef tmpdir -TMPDIR = $(tmpdir) -endif - -ifdef devdir -DEVDIR = $(devdir) -endif - -ifdef sysdir -SYSDIR = $(sysdir) -endif - -ifdef procdir -PROCDIR = $(procdir) -endif - -ifdef exec_prefix -EXEC_PREFIX = $(exec_prefix) -endif - -ifdef bindir -BINDIR = $(bindir) -endif - -ifdef sbindir -SBINDIR = $(sbindir) -endif - -ifdef libexecdir -LIBEXECDIR = $(libexecdir) -endif - -ifdef libdir -LIBDIR = $(libdir) -endif - -ifdef includedir -INCLUDEDIR = $(includedir) -endif - -ifdef oldincludedir -OLDINCLUDEDIR = $(oldincludedir) -endif - -ifdef datarootdir -DATADIR = $(datarootdir) -endif - -ifdef datadir -RESDIR = $(datadir) -endif - -ifdef libdatarootdir -SYSDEPDATADIR = $(libdatarootdir) -endif - -ifdef libdatadir -SYSDEPRESDIR = $(libdatadir) -endif - -ifdef lispdir -LISPDIR = $(lispdir) -endif - -ifdef localedir -LOCALEDIR = $(localedir) -endif - -ifdef licensedir -LICENSEDIR = $(licensedir) -endif - -ifdef cachedir -CACHEDIR = $(cachedir) -endif - -ifdef spooldir -SPOOLDIR = $(spooldir) -endif - -ifdef emptydir -EMPTYDIR = $(emptydir) -endif - -ifdef logdir -LOGDIR = $(logdir) -endif - -ifdef statedir -STATEDIR = $(statedir) -endif - -ifdef gamedir -GAMEDIR = $(gamedir) -endif - -ifdef sharedcachedir -COMCACHEDIR = $(sharedcachedir) -endif - -ifdef sharedpooldir -COMPOOLDIR = $(sharedpooldir) -endif - -ifdef sharedlogdir -COMLOGDIR = $(sharedlogdir) -endif - -ifdef sharedlogdir -COMSTATEDIR = $(sharedstatedir) -endif - -ifdef sharedgamedir -COMGAMEDIR = $(sharedgamedir) -endif - -ifdef localtmpdir -VARTMPDIR = $(localtmpdir) -endif - -ifdef sharedtmpdir -COMTMPDIR = $(sharedtmpdir) -endif - -ifdef lockdir -LOCKDIR = $(lockdir) -endif - -ifdef skeldir -SKELDIR = $(skeldir) -endif - -ifdef selfprocdir -SELFPROCDIR = $(selfprocdir) -endif - -ifdef docdir -DOCDIR = $(docdir) -endif - -ifdef infodir -INFODIR = $(infodir) -endif - -ifdef dvidir -DVIDIR = $(dvidir) -endif - -ifdef pdfdir -PDFDIR = $(pdfdir) -endif - -ifdef psdir -PSDIR = $(psdir) -endif - -ifdef htmldir -HTMLDIR = $(htmldir) -endif - -ifdef mandir -MANDIR = $(mandir) -endif - -ifdef man0 -MAN0 = $(man0) -endif - -ifdef man1 -MAN1 = $(man1) -endif - -ifdef man2 -MAN2 = $(man2) -endif - -ifdef man3 -MAN3 = $(man3) -endif - -ifdef man4 -MAN4 = $(man4) -endif - -ifdef man5 -MAN5 = $(man5) -endif - -ifdef man6 -MAN6 = $(man6) -endif - -ifdef man7 -MAN7 = $(man7) -endif - -ifdef man8 -MAN8 = $(man8) -endif - -ifdef man9 -MAN9 = $(man9) -endif - -ifdef man0ext -MAN0EXT = $(man0ext) -endif - -ifdef man1ext -MAN1EXT = $(man1ext) -endif - -ifdef man2ext -MAN2EXT = $(man2ext) -endif - -ifdef man3ext -MAN3EXT = $(man3ext) -endif - -ifdef man4ext -MAN4EXT = $(man4ext) -endif - -ifdef man5ext -MAN5EXT = $(man5ext) -endif - -ifdef man6ext -MAN6EXT = $(man6ext) -endif - -ifdef man7ext -MAN7EXT = $(man7ext) -endif - -ifdef man8ext -MAN8EXT = $(man8ext) -endif - -ifdef man9ext -MAN9EXT = $(man9ext) -endif - diff --git a/mk/man.mk b/mk/man.mk deleted file mode 100644 index 0cd7ca9..0000000 --- a/mk/man.mk +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== These rules are used for man pages. ===# - - -# Enables the rules: -# install-man Install all man page -# install-man-untranslated Install untranslated man page -# install-man-locale Install translated man page -# -# This file is ignored unless _MAN_PAGE_SECTIONS -# is defined. _MAN_PAGE_SECTIONS should list all -# used man page sections. For all used sections -# there should also be a variable named -# _MAN_$(SECTION) that lists the suffixless -# basename of all man pages in that section. -# -# The pathname of a man page should look -# like this: doc/man/$(DOCUMENT).$(SECTION) -# Translations looks like this: -# doc/man/$(DOCUMENT).$(LANGUAGE).$(SECTION) -# -# For each language and section, there should -# be a variable _MAN_$(LANGUAGE)_$(SECTION) -# that lists all translated documents in that -# section and for that lanuage. These should -# be suffixless basenames. The lanuage counts -# as a suffix. -# -# The translations of the man pages to -# install should be specified, by language, -# in the variable MAN_LOCALES. - - -ifdef _MAN_PAGE_SECTIONS - - -# WHEN TO BUILD, INSTALL, AND UNINSTALL: - -install: install-man -install-everything: install-man -install-doc: install-man -uninstall: uninstall-man - - -# HELP VARIABLES - -# Customisable man page filename. -ifdef COMMAND -ifeq ($(shell $(PRINTF) '%s\n' $(COMMAND) | $(WC) -l),1) -ifeq ($(shell $(PRINTF) '%s\n' $(_MAN_PAGE_SECTIONS) | $(WC) -l),1) -ifeq ($(shell $(PRINTF) '%s\n' $(_MAN_$(_MAN_PAGE_SECTIONS)) | $(WC) -l),1) -__MAN_COMMAND = $(COMMAND)$(MAN$(_MAN_PAGE_SECTIONS)EXT) -endif -endif -endif -endif - - -# INSTALL RULES: - -.PHONY: install-man -install-man: install-man-untranslated install-man-locale - -.PHONY: install-man-untranslated -install-man-untranslated: - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- $(foreach S,$(_MAN_PAGE_SECTIONS),"$(DESTDIR)$(MANDIR)/$(MAN$(S))") -ifndef __MAN_COMMAND - $(Q)$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(S) -- "$(DESTDIR)$(MANDIR)/$(MAN$(S))/$(P)$(MAN$(S)EXT)" &&)) $(TRUE) -endif -ifdef __MAN_COMMAND - $(Q)$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(S) -- "$(DESTDIR)$(MANDIR)/$(MAN$(S))/$(__MAN_COMMAND)" &&)) $(TRUE) -endif - @$(ECHO_EMPTY) - -.PHONY: install-man-locale -install-man-locale: - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(foreach L,$(MAN_LOCALES),$(INSTALL_DIR) -- $(foreach S,$(_MAN_PAGE_SECTIONS),"$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))") &&) $(TRUE) -ifndef __MAN_COMMAND - $(Q)$(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(L).$(S) -- "$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(P)$(MAN$(S)EXT)" &&))) $(TRUE) -endif -ifdef __MAN_COMMAND - $(Q)$(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),$(INSTALL_DATA) $(v)doc/man/$(P).$(L).$(S) -- "$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(__MAN_COMMAND)" &&))) $(TRUE) -endif - @$(ECHO_EMPTY) - - -# UNINSTALL RULES: - -.PHONY: uninstall-man -uninstall-man: -ifndef __MAN_COMMAND - -$(Q)$(RM) -- $(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(S)),"$(DESTDIR)$(MANDIR)/$(MAN$(S))/$(P)$(MAN$(S)EXT)")) - -$(Q)$(RM) -- $(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),"$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(P)$(MAN$(S)EXT)"))) -endif -ifdef __MAN_COMMAND - -$(Q)$(RM) -- "$(DESTDIR)$(MANDIR)/$(MAN$(_MAN_PAGE_SECTIONS))/$(__MAN_COMMAND)" - -$(Q)$(RM) -- $(foreach L,$(MAN_LOCALES),$(foreach S,$(_MAN_PAGE_SECTIONS),$(foreach P,$(_MAN_$(L)_$(S)),"$(DESTDIR)$(MANDIR)/$(L)/$(MAN$(S))/$(__MAN_COMMAND)"))) -endif - - -endif - diff --git a/mk/path.mk b/mk/path.mk deleted file mode 100644 index 9d9d855..0000000 --- a/mk/path.mk +++ /dev/null @@ -1,176 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== This file define path variables. ===# - - -ifndef __PATH_MK_INCLUDED -__PATH_MK_INCLUDED = 1 - - -# DIRECTORIES: - -# The package path prefix, if you want to install to another root, set DESTDIR to that root. -PREFIX = /usr -# The package path prefix for /bin, /sbin, /lib and /libexec. -EXEC_PREFIX = /usr -# The command path excluding prefix. -BIN = /bin -# The administration command path excluding prefix. -SBIN = /sbin -# The library path excluding prefix. -LIB = /lib -# The executable library path excluding prefix. -LIBEXEC = /libexec -# The header-file path excluding prefix. -INCLUDE = /include -# The resource path excluding prefix. -DATA = /share -# The man page sections path excluding prefix. -MAN0 = /man0 -MAN1 = /man1 -MAN2 = /man2 -MAN3 = /man3 -MAN4 = /man4 -MAN5 = /man5 -MAN6 = /man6 -MAN7 = /man7 -MAN8 = /man8 -MAN9 = /man9 - -# The command path including prefix. -BINDIR = $(EXEC_PREFIX)$(BIN) -# The administration command path including prefix. -SBINDIR = $(EXEC_PREFIX)$(SBIN) -# The library path including prefix. -LIBDIR = $(EXEC_PREFIX)$(LIB) -# The executable library path including prefix. -LIBEXECDIR = $(EXEC_PREFIX)$(LIBEXEC) -# The header-file path including prefix. -INCLUDEDIR = $(PREFIX)$(INCLUDE) -# The header-file path including prefix. Must not be /usr/local. -ifeq ($(PREFIX),/usr/lcoal) -OLDINCLUDEDIR = /usr$(INCLUDE) -endif -ifneq ($(PREFIX),/usr/lcoal) -OLDINCLUDEDIR = $(PREFIX)$(INCLUDE) -endif -# The data path including prefix. -DATADIR = $(PREFIX)$(DATA) -# The architecture-dependent data path including prefix. -SYSDEPDATADIR = $(DATADIR) -# The resource path including prefix. -RESDIR = $(DATADIR) -# The architecture-dependent resource path including prefix. -SYSDEPRESDIR = $(RESDIR) -# The generic documentation path including prefix. -DOCDIR = $(DATADIR)/doc/$(PKGNAME) -# The info manual documentation path including prefix. -INFODIR = $(DATADIR)/info -# The DVI documentation path including prefix. -DVIDIR = $(DOCDIR) -# The PDF documentation path including prefix. -PDFDIR = $(DOCDIR) -# The PostScript documentation path including prefix. -PSDIR = $(DOCDIR) -# The HTML documentation path including prefix. -HTMLDIR = $(DOCDIR) -# The man page documentation path including prefix. -MANDIR = $(DATADIR)/man -# The Emacs LISP path including prefix. -LISPDIR = $(DATADIR)/emacs/site-lisp -# The locale path including prefix. -LOCALEDIR = $(DATADIR)/locale -# The license base path including prefix. -LICENSEDIR = $(DATADIR)/licenses -# The persistent variable data directory. -VARDIR = /var -# The persistent directory for temporary files. -VARTMPDIR = $(VARDIR)/tmp -# The network-common persistent variable data directory. -COMDIR = /com -# The network-common persistent directory for temporary files. -COMTMPDIR = $(COMDIR)/tmp -# The transient directory for temporary files. -TMPDIR = /tmp -# The transient directory for runtime files. -RUNDIR = /run -# The directory for site-specific configurations. -SYSCONFDIR = /etc -# The directory for pseudo-devices. -DEVDIR = /dev -# The /sys directory. -SYSDIR = /sys -# The /proc directory -PROCDIR = /proc -# The /proc/self directory -SELFPROCDIR = $(PROCDIR)/self -# The cache directory. -CACHEDIR = $(VARDIR)/cache -# The spool directory. -SPOOLDIR = $(VARDIR)/spool -# The empty directory. -EMPTYDIR = $(VARDIR)/empty -# The logfile directory. -LOGDIR = $(VARDIR)/log -# The state directory. -STATEDIR = $(VARDIR)/lib -# The highscore directory. -GAMEDIR = $(VARDIR)/games -# The lockfile directory. -LOCKDIR = $(RUNDIR)/lock -# The user skeleton directory. -SKELDIR = $(SYSCONFDIR)/skel -# The network-common cache directory. -COMCACHEDIR = $(COMDIR)/cache -# The network-common spool directory. -COMSPOOLDIR = $(COMDIR)/spool -# The network-common logfile directory. -COMLOGDIR = $(COMDIR)/log -# The network-common state directory. -COMSTATEDIR = $(COMDIR)/lib -# The network-common highscore directory. -COMGAMEDIR = $(COMDIR)/games - - -# FILENAME SUFFIXES: - -# Filename suffixes for man pages by section. -MAN0EXT = .0 -MAN1EXT = .1 -MAN2EXT = .2 -MAN3EXT = .3 -MAN4EXT = .4 -MAN5EXT = .5 -MAN6EXT = .6 -MAN7EXT = .7 -MAN8EXT = .8 -MAN9EXT = .9 - - -# HELP VARIABLES: - -# All path variables that includes the prefix, -# or are unaffected by the prefix. -_ALL_DIRS = BINDIR SBINDIR LIBDIR LIBEXECDIR INCLUDEDIR DATADIR SYSDEPDATADIR DOCDIR \ - INFODIR DVIDIR PDFDIR PSDIR HTMLDIR MANDIR LOCALEDIR LICENSEDIR VARDIR \ - RESDIR VARTMPDIR COMDIR COMTMPDIR TMPDIR RUNDIR SYSCONFDIR DEVDIR SYSDIR \ - PROCDIR SELFPROCDIR CACHEDIR SPOOLDIR EMPTYDIR LOGDIR STATEDIR GAMEDIR \ - LOCKDIR SKELDIR COMCACHEDIR COMSPOOLDIR COMLOGDIR COMSTATEDIR COMGAMEDIR \ - SYSDEPRESDIR OLDINCLUDEDIR - -# ../, ../../, and ../../../, ignored if v is used, which if an absolute path. -ifndef v -__back1unless_v = ../ -__back2unless_v = ../../ -__back3unless_v = ../../../ -endif - - -endif - diff --git a/mk/prologue.mk b/mk/prologue.mk deleted file mode 100644 index 5d9a558..0000000 --- a/mk/prologue.mk +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== This file includes rules for automatically rebuilding the makefile. ===# - - -base: Makefile - -Makefile: $(v)Makefile.in config.status $(v)configure $(v)mk/configure - ./config.status - diff --git a/mk/shell.mk b/mk/shell.mk deleted file mode 100644 index 2747152..0000000 --- a/mk/shell.mk +++ /dev/null @@ -1,233 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== These rules are used for shell tab-completion using auto-auto-complete. ===# - - -# Enables the rules: -# shell Build tab-completion for all supported shells -# bash Build GNU Bash tab-completion -# fish Build fish tab-completion -# zhs Build Z shell tab-completion -# install-shell Install tab-completion for all supported shells -# install-bash Install GNU Bash tab-completion -# install-fish Install fish tab-completion -# install-zsh Install Z shell tab-completion -# -# This file is ignored unless -# _AUTO_COMPLETE is defined. -# -# _AUTO_COMPLETE shall list all commands that -# have an auto-auto-complete. These should be -# named src/$(COMMAND).auto-completion, where -# $(COMMAND) is the command with the script. -# If all auto-auto-complete scripts translations -# named src/$(COMMAND).$(LOCALE).auto-completion, -# SHELL_LOCALE can be set to install exactly -# on translation in place of the non-translated -# versions. -# -# Although not used by this file, you should -# define _SHELL_LOCALES that lists all available -# translations. (it is used by dist.mk.) -# -# You should also define _WITH_SHELL if you -# want shell tab-completion unless the user -# specifies otherwise. If you want it for -# just some shells, define _WITH_$(SHELL) -# for those shells instead of _WITH_SHELL. - - -ifdef _AUTO_COMPLETE - - -# HELP VARIABLES: - -# Include all that were not explicitly excluded? -ifdef _WITH_SHELL -_WITH_BASH = 1 -_WITH_FISH = 1 -_WITH_ZSH = 1 -endif - -# Include for GNU Bash? -ifdef WITH_BASH -__WITH_BASH = 1 -endif -ifndef WITH_BASH -ifndef WITHOUT_BASH -ifdef _WITH_BASH -__WITH_BASH = 1 -endif -endif -endif - -# Include for fish? -ifdef WITH_FISH -__WITH_FISH = 1 -endif -ifndef WITH_FISH -ifndef WITHOUT_FISH -ifdef _WITH_FISH -__WITH_FISH = 1 -endif -endif -endif - -# Include for Z Shell? -ifdef WITH_ZSH -__WITH_ZSH = 1 -endif -ifndef WITH_ZSH -ifndef WITHOUT_ZSH -ifdef _WITH_ZSH -__WITH_ZSH = 1 -endif -endif -endif - -# WHEN TO BUILD, INSTALL, AND UNINSTALL: - -all: shell -everything: shell -install: install-shell -install-doc: install-info install-dvi install-pdf install-ps install-html -uninstall: uninstall-shell - -shell: -install-shell: - -ifdef __WITH_BASH -shell: bash -install-shell: install-bash -endif -ifdef __WITH_FISH -shell: fish -install-shell: install-fish -endif -ifdef __WITH_ZSH -shell: zsh -install-shell: install-zsh -endif - - -# HELP VARIABLES: - -# Affixes on the source files. -ifdef SHELL_LOCALE -__AAC_L = .$(SHELL_LOCALE) -endif -__AAC = $(__AAC_L).auto-completion - -# Customised command name. -ifdef COMMAND -ifeq ($(shell $(PRINTF) '%s\n' $(COMMAND) | $(WC) -l),1) -ifeq ($(shell $(PRINTF) '%s\n' $(_AUTO_COMPLETE) | $(WC) -l),1) -__SHELL_COMMAND = "command=$(COMMAND)" -endif -endif -endif - - -# BUILD RULES: - -# Built tab-completion scripts for GNU Bash. -.PHONY: bash -bash: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).bash-completion) - -# Built tab-completion scripts for fish. -.PHONY: fish -fish: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).fish-completion) - -# Built tab-completion scripts for Z shell. -.PHONY: zsh -zsh: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).zsh-completion) - -# Built a tab-completion script for GNU Bash. -bin/%.bash-completion: $(v)src/%$(__AAC) - @$(PRINTF_INFO) '\e[00;01;31mAUTO-AUTO-COMPLETE\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p bin - $(Q)$(AUTO_AUTO_COMPLETE) bash -o $@ -s $< $(__SHELL_COMMAND) #$Z - @$(ECHO_EMPTY) - -# Built a tab-completion script for fish. -bin/%.fish-completion: $(v)src/%$(__AAC) - @$(PRINTF_INFO) '\e[00;01;31mAUTO-AUTO-COMPLETE\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p bin - $(Q)$(AUTO_AUTO_COMPLETE) fish -o $@ -s $< $(__SHELL_COMMAND) #$Z - @$(ECHO_EMPTY) - -# Built a tab-completion script for Z shell. -bin/%.zsh-completion: $(v)src/%$(__AAC) - @$(PRINTF_INFO) '\e[00;01;31mAUTO-AUTO-COMPLETE\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p bin - $(Q)$(AUTO_AUTO_COMPLETE) zsh -o $@ -s $< $(__SHELL_COMMAND) #$Z - @$(ECHO_EMPTY) - - -# INSTALL RULES: - -# Install tab-completion scripts for GNU Bash. -.PHONY: install-bash -install-bash: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).bash-completion) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DATADIR)/bash-completion/completions" -ifndef __SHELL_COMMAND - $(Q)$(foreach F,$(_AUTO_COMPLETE),$(INSTALL_DATA) bin/$(F).bash-completion -- "$(DESTDIR)$(DATADIR)/bash-completion/completions/$(F)" &&) $(TRUE) -endif -ifdef __SHELL_COMMAND - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DATADIR)/bash-completion/completions/$(COMMAND)" -endif - @$(ECHO_EMPTY) - -# Install tab-completion scripts for fish. -.PHONY: install-fish -install-fish: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).fish-completion) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DATADIR)/fish/completions" -ifndef __SHELL_COMMAND - $(Q)$(foreach F,$(_AUTO_COMPLETE),$(INSTALL_DATA) bin/$(F).fish-completion -- "$(DESTDIR)$(DATADIR)/fish/completions/$(F).fish" &&) $(TRUE) -endif -ifdef __SHELL_COMMAND - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DATADIR)/fish/completions/$(COMMAND).fish" -endif - @$(ECHO_EMPTY) - -# Install tab-completion scripts for Z shell. -.PHONY: install-zsh -install-zsh: $(foreach F,$(_AUTO_COMPLETE),bin/$(F).zsh-completion) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DATADIR)/zsh/site-functions" -ifndef __SHELL_COMMAND - $(Q)$(foreach F,$(_AUTO_COMPLETE),$(INSTALL_DATA) bin/$(F).zsh-completion -- "$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(F)" &&) $(TRUE) -endif -ifdef __SHELL_COMMAND - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(COMMAND)" -endif - @$(ECHO_EMPTY) - - -# UNINSTALL RULES: - -# Uninstall tab-completion. -.PHONY: uninstall-shell -uninstall-shell: -ifndef __SHELL_COMMAND - -$(Q)$(RM) -- $(foreach F,$(_AUTO_COMPLETE),"$(DESTDIR)$(DATADIR)/bash-completion/completions/$(F)") - -$(Q)$(RM) -- $(foreach F,$(_AUTO_COMPLETE),"$(DESTDIR)$(DATADIR)/fish/completions/$(F).fish") - -$(Q)$(RM) -- $(foreach F,$(_AUTO_COMPLETE),"$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(F)") -endif -ifdef __SHELL_COMMAND - -$(Q)$(RM) -- "$(DESTDIR)$(DATADIR)/bash-completion/completions/$(COMMAND)" - -$(Q)$(RM) -- "$(DESTDIR)$(DATADIR)/fish/completions/$(COMMAND).fish" - -$(Q)$(RM) -- "$(DESTDIR)$(DATADIR)/zsh/site-functions/_$(COMMAND)" -endif - - -endif - diff --git a/mk/tags.mk b/mk/tags.mk deleted file mode 100644 index 926cb5d..0000000 --- a/mk/tags.mk +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== These rules are used for generate etags- and ctags-tablse. ===# - - -# Generate etags-table. -.PHONY: TAGS -TAGS: - @$(ECHO) - @$(ECHO) "TAGS is not implemented. Did not see the need. Feel free to implement if you want." - @$(ECHO) - -# Generate ctags-table -.PHONY: tags -tags: - @$(ECHO) - @$(ECHO) "tags is not implemented. Did not see the need. Feel free to implement if you want." - @$(ECHO) - diff --git a/mk/texinfo.mk b/mk/texinfo.mk deleted file mode 100644 index e2ccb12..0000000 --- a/mk/texinfo.mk +++ /dev/null @@ -1,294 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -# TODO ((support translations)) -#=== These rules are used for Texinfo manuals. ===# - - -# Enables the rules: -# info Build info manual -# dvi Build DVI manual -# pdf Build PDF manual -# ps Build PostScript manual -# html Build HTML manual -# install-info Install info manual -# install-dvi Install DVI manual -# install-pdf Install PDF manual -# install-ps Install PostScript manual -# install-html Install HTML manual -# -# This file is ignored unless -# _HAVE_TEXINFO_MANUAL is defined. -# -# This file can only build output for -# one Texinfo manual. This manual must -# be named doc/info/$(_PROJECT).texinfo. -# Additional sourced are set by specifing -# how man directories deep doc/info nests -# in the variable _TEXINFO_DIRLEVELS. -# -# If the info manual splits, specify the -# split-number, of the file with the highest -# split-number, in the variable _INFOPARTS. -# -# If the project has a logo, _LOGO should -# name the suffixless basename of the SVG -# files that contains the logo. This file -# must be located in doc/. -# -# _HTML_FILES should the basename (with -# suffix) of all files generated by `html`. -# -# The user may define TEXINFO_FLAGS that -# adds additional flags when compiling -# DVI, PDF, and PostScript manuals. The -# user may also define INFO_FLAGS that -# adds additional flags when compiling -# info and HTML manuals. - - -ifdef _HAVE_TEXINFO_MANUAL - - -# WHEN TO BUILD, INSTALL, AND UNINSTALL: - -all: info -everything: info dvi pdf ps html -doc: info dvi pdf ps html -install: install-info -install-everything: install-info install-dvi install-pdf install-ps install-html -install-doc: install-info install-dvi install-pdf install-ps install-html -uninstall: uninstall-info uninstall-dvi uninstall-pdf uninstall-ps uninstall-html - - -# HELP VARIABLES: - -# Files from which the Texinfo manuals are built. -ifdef _TEXINFO_DIRLEVELS -ifeq ($(_TEXINFO_DIRLEVELS),1) -__TEXI_SRC_ = *.texinfo -endif -ifeq ($(_TEXINFO_DIRLEVELS),2) -__TEXI_SRC_ = *.texinfo */*.texinfo -endif -ifeq ($(_TEXINFO_DIRLEVELS),3) -__TEXI_SRC_ = *.texinfo */*.texinfo */*/*.texinfo -endif -ifneq ($(_TEXINFO_DIRLEVELS),1) -ifneq ($(_TEXINFO_DIRLEVELS),2) -ifneq ($(_TEXINFO_DIRLEVELS),3) -__TEXI_SRC_ = $(foreach W,$(shell $(SEQ) $(_TEXINFO_DIRLEVELS) | while read n; do $(ECHO) $$($(SEQ) $$n)" " | $(SED) 's/[^ ]* /\/\*/g'; done | $(XARGS) $(ECHO)),$(shell $(ECHO) $(W).texinfo | $(SED) 's/^.//')) -endif -endif -endif -__TEXI_SRC = $(foreach S,$(__TEXI_SRC_),$(foreach F,$(shell cd $(v)doc/info && $(ECHO) $(S)),aux/doc/$(F))) -endif - -# Split parts of the info manual. -ifdef _INFOPARTS -ifneq ($(_INFOPARTS),0) -__INFOPARTS = $(shell $(SEQ)) -endif -endif - -# Flags for TeX processed output. -__TEXINFO_FLAGS = $(TEXINFO_FLAGS) -ifdef _LOGO -__TEXINFO_FLAGS += '--texinfo="@set LOGO $(_LOGO)"' -endif - - -# BUILD RULES: - -ifdef _LOGO -# Prepare conversion of logo. -aux/$(_LOGO).svg: $(v)doc/$(_LOGO).svg - @$(PRINTF_INFO) '\e[00;01;31mCP\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p aux - $(Q)$(CP) $^ $@ #$Z - @$(ECHO_EMPTY) - -# Intermediate format for the logo for DVI and PostScript manuals. -aux/$(_LOGO).ps: $(v)doc/$(_LOGO).svg - @$(PRINTF_INFO) '\e[00;01;31mPS\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p aux - $(Q)$(SVG2PS) $^ > $@ #$Z - @$(ECHO_EMPTY) - -# Logo for DVI and PostScript manuals. -aux/$(_LOGO).eps: aux/$(_LOGO).ps - @$(PRINTF_INFO) '\e[00;01;31mEPS\e[34m %s\e[00m$A\n' "$@" - $(Q)$(PS2EPS) $^ #$Z - @$(ECHO_EMPTY) - -# Logo for PDF manual. -aux/$(_LOGO).pdf: $(v)doc/$(_LOGO).svg - @$(PRINTF_INFO) '\e[00;01;31mPDF\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p aux - $(Q)$(SVG2PDF) $^ > $@ #$Z - @$(ECHO_EMPTY) -endif - -# Copy texinfo files to aux/doc. -aux/doc/%.texinfo: $(v)doc/info/%.texinfo - @$(PRINTF_INFO) '\e[00;01;31mCP\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p $(shell $(DIRNAME) $@) - $(Q)$(CP) $< $@ #$Z - @$(ECHO_EMPTY) - -# Build info manual. -.PHONY: info -info: $(__TEXI_SRC) bin/$(_PROJECT).info -bin/%.info $(foreach P,$(__INFOPARTS),bin/%.info-$(P)): aux/doc/%.texinfo $(__TEXI_SRC) - @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" - @$(MKDIR) -p bin - $(Q)$(MAKEINFO) $(INFO_FLAGS) $< #$Z - @$(PRINTF_INFO) '$A' - $(Q)$(MV) $*.info $@ #$Z - @$(ECHO_EMPTY) - -# Build DVI manual. -.PHONY: dvi -dvi: $(__TEXI_SRC) bin/$(_PROJECT).dvi -bin/%.dvi: aux/doc/%.texinfo $(__TEXI_SRC) $(foreach L,$(_LOGO),aux/$(L).eps) - @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" - @! $(TEST) -d aux/dvi/$* || $(RM) -rf aux/dvi/$* - @$(MKDIR) -p aux/dvi/$* bin - $(Q)cd aux/dvi/$* && $(TEXI2DVI) $(__back3unless_v)$< $(__TEXINFO_FLAGS) < /dev/null #$Z - @$(PRINTF_INFO) '$A' - $(Q)$(MV) aux/dvi/$*/$*.dvi $@ #$Z - @$(ECHO_EMPTY) - -# Build PDF manual. -.PHONY: pdf -pdf: $(__TEXI_SRC) bin/$(_PROJECT).pdf -bin/%.pdf: aux/doc/%.texinfo $(__TEXI_SRC) $(foreach L,$(_LOGO),aux/$(L).pdf) - @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" - @! $(TEST) -d aux/pdf/$* || $(RM) -rf aux/pdf/$* - @$(MKDIR) -p aux/pdf/$* bin - $(Q)cd aux/pdf/$* && $(TEXI2PDF) $(__back3unless_v)$< $(__TEXINFO_FLAGS) < /dev/null #$Z - @$(PRINTF_INFO) '$A' - $(Q)$(MV) aux/pdf/$*/$*.pdf $@ #$Z - @$(ECHO_EMPTY) - -# Build PostScript manual. -.PHONY: ps -ps: $(__TEXI_SRC) bin/$(_PROJECT).ps -bin/%.ps: aux/doc/%.texinfo $(__TEXI_SRC) $(foreach L,$(_LOGO),aux/$(L).eps) - @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" - @! $(TEST) -d aux/ps/$* || $(RM) -rf aux/ps/$* - @$(MKDIR) -p aux/ps/$* bin - $(Q)cd aux/ps/$* && $(TEXI2PS) $(__back3unless_v)$< $(__TEXINFO_FLAGS) < /dev/null #$Z - @$(PRINTF_INFO) '$A' - $(Q)$(MV) aux/ps/$*/$*.ps $@ #$Z - @$(ECHO_EMPTY) - -# Build HTML manual. -.PHONY: html -html: $(__TEXI_SRC) bin/html/$(_PROJECT)/index.html -bin/html/%/index.html: aux/doc/%.texinfo $(__TEXI_SRC) - @$(PRINTF_INFO) '\e[00;01;31mTEXI\e[34m %s\e[00m$A\n' "$@" - @! $(TEST) -d bin/html/$* || $(RM) -rf bin/html/$* - @$(MKDIR) -p bin/html - $(Q)cd bin/html && $(MAKEINFO_HTML) $(INFO_FLAGS) $(__back2unless_v)$< < /dev/null #$Z - @$(ECHO_EMPTY) - - -# INSTALL RULES: - -# Install info manual. -.PHONY: install-info -install-info: bin/$(_PROJECT).info $(foreach P,$(__INFOPARTS),bin/%.info-$(P)) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(INFODIR)" - $(Q)$(INSTALL_DATA) bin/$(_PROJECT).info -- "$(DESTDIR)$(INFODIR)/$(PKGNAME).info" - $(Q)$(forearch P,$(__INFOPARTS),$(INSTALL_DATA) bin/$*.info-$(P) -- "$(DESTDIR)$(INFODIR)/$(PKGNAME).info-$(P)" &&) $(TRUE) -ifdef POST_INSTALL - $(POST_INSTALL) -endif - $(Q)if $(SHELL) -c '$(N) $(INSTALL_INFO) --version' > /dev/null 2>&1; then \ - $(N)$(z) $(INSTALL_INFO) -- "${DESTDIR}${INFODIR}/$(PKGNAME).info" "${DESTDIR}${INFODIR}/dir"; \ - else \ - $(TRUE); \ - fi -ifdef POST_INSTALL - $(NORMAL_INSTALL) -endif - @$(ECHO_EMPTY) - -# Install DVI manual. -.PHONY: install-dvi -install-dvi: bin/$(_PROJECT).dvi - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(DVIDIR)" - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(DVIDIR)/$(PKGNAME).dvi" - @$(ECHO_EMPTY) - -# Install PDF manual. -.PHONY: install-pdf -install-pdf: bin/$(_PROJECT).pdf - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(PDFDIR)" - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(PDFDIR)/$(PKGNAME).pdf" - @$(ECHO_EMPTY) - -# Install PostScript manual. -.PHONY: install-ps -install-ps: bin/$(_PROJECT).ps - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(PSDIR)" - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(PSDIR)/$(PKGNAME).ps" - @$(ECHO_EMPTY) - -# Install HTML manual. -.PHONY: install-html -install-html: $(foreach F,$(_HTML_FILES),bin/html/$(_PROJECT)/$(F)) - @$(PRINTF_INFO) '\e[00;01;31mINSTALL\e[34m %s\e[00m\n' "$@" - $(Q)$(INSTALL_DIR) -- "$(DESTDIR)$(HTMLDIR)/$(PKGNAME)" - $(Q)$(INSTALL_DATA) $^ -- "$(DESTDIR)$(HTMLDIR)/$(PKGNAME)/" - @$(ECHO_EMPTY) - - -# UNINSTALL RULES: - -# Uninstall info manual. -.PHONY: uninstall-info -uninstall-info: -ifdef PRE_UNINSTALL - $(PRE_UNINSTALL) -endif - -$(Q)$(N)$(a) $(INSTALL_INFO) --delete -- "${DESTDIR}${INFODIR}/$(PKGNAME).info" "${DESTDIR}${INFODIR}/dir" -ifdef PRE_UNINSTALL - $(NORMAL_UNINSTALL) -endif - -$(Q)$(RM) -- "$(DESTDIR)$(INFODIR)/$(PKGNAME).info" $(forearch P,$(__INFOPARTS),"$(DESTDIR)$(INFODIR)/$(PKGNAME).info-$(P)") - -# Uninstall DVI manual. -.PHONY: uninstall-dvi -uninstall-dvi: - -$(Q)$(RM) -- "$(DESTDIR)$(DVIDIR)/$(PKGNAME).dvi" - -# Uninstall PDF manual. -.PHONY: uninstall-pdf -uninstall-pdf: - -$(Q)$(RM) -- "$(DESTDIR)$(PDFDIR)/$(PKGNAME).pdf" - -# Uninstall PostScript manual. -.PHONY: uninstall-ps -uninstall-ps: - -$(Q)$(RM) -- "$(DESTDIR)$(PSDIR)/$(PKGNAME).ps" - -# Uninstall HTML manual. -.PHONY: uninstall-html -uninstall-html: - -$(Q)$(RM) -- $(foreach F,$(_HTML_FILES),"$(DESTDIR)$(HTMLDIR)/$(PKGNAME)/$(F)") - -$(Q)$(RM) -- "$(DESTDIR)$(HTMLDIR)/$(PKGNAME)" - - -endif - diff --git a/mk/tools.mk b/mk/tools.mk deleted file mode 100644 index e3d9bfe..0000000 --- a/mk/tools.mk +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (C) 2015, 2016 Mattias Andrée -# -# Copying and distribution of this file, with or without modification, -# are permitted in any medium without royalty provided the copyright -# notice and this notice are preserved. This file is offered as-is, -# without any warranty. - - -#=== This file defines variables for all used commands. ===# - - -# Part of GNU Coreutils: -BASENAME ?= basename -CHGRP ?= chgrp -CHMOD ?= chmod -CHOWN ?= chown -CP ?= cp -CPLIT ?= cplit -CUT ?= cut -DATE ?= date -DIRNAME ?= dirname -ECHO ?= echo -ENV ?= env -EXPAND ?= expand -EXPR ?= expr -FALS ?= false -FMT ?= fmt -FOLD ?= fold -HEAD ?= head -INSTALL ?= install -INSTALL_DATA ?= $(INSTALL) -m644 -INSTALL_DIR ?= $(INSTALL) -dm755 -INSTALL_PROGRAM ?= $(INSTALL) -m755 -JOIN ?= join -LN ?= ln -MKDIR ?= mkdir -MKFIFO ?= mkfifo -MKNOD ?= mknod -MV ?= mv -NL ?= nl -NPROC ?= nproc -NUMFMT ?= numfmt -OD ?= od -PASTE ?= paste -PATHCHK ?= pathchk -PR ?= pr -PRINTF ?= printf -READLINK ?= readlink -REALPATH ?= realpath -RM ?= rm -RMDIR ?= rmdir -SEQ ?= seq -SLEEP ?= sleep -SORT ?= sort -SPLIT ?= split -STAT ?= stat -TAC ?= tac -TAIL ?= tail -TEE ?= tee -TEST ?= test -TOUCH ?= touch -TR ?= tr -TRUE ?= true -TRUNCATE ?= truncate -TSORT ?= tsort -UNAME ?= uname -UNEXPAND ?= unexpand -UNIQ ?= uniq -WC ?= wc -YES ?= yes - -# Part of GNU help2man: -HELP2MAN ?= help2man - -# Part of GNU tar: -TAR ?= tar - -# Part of GNU Findutils: -FIND ?= find -XARGS ?= xargs - -# Part of GNU Grep: -GREP ?= grep -EGREP ?= egrep -FGREP ?= fgrep - -# Part of GNU Sed: -SED ?= sed - -# Part of GNU Privacy Guard: -GPG ?= gpg - -# Part of Texinfo: -MAKEINFO ?= makeinfo -MAKEINFO_HTML ?= $(MAKEINFO) --html -INSTALL_INFO ?= install-info - -# Part of Texlive-plainextra: -TEXI2PDF ?= texi2pdf -TEXI2DVI ?= texi2dvi -TEXI2PS ?= texi2pdf --ps - -# Part of Texlive-core: -PS2EPS ?= ps2eps - -# Part of librsvg: -RSVG_CONVERT ?= rsvg-convert -SVG2PS ?= $(RSVG_CONVERT) --format=ps -SVG2PDF ?= $(RSVG_CONVERT) --format=pdf - -# Part of GNU Compiler Collection: -CC ?= cc -CPP ?= cpp -CXX ?= c++ - -# Part of GNU Binutils: -AR ?= ar -LD ?= ld -RANLIB ?= ranlib - -# Part of GNU Bison: -BISON ?= bison -YACC ?= yacc - -# Part of Flex: -FLEX ?= FLEX -LEX ?= lex - -# Part of GNU C Library: -LDCONFIG ?= ldconfig - -# Part of GNU Gettext: -XGETTEXT ?= xgettext -MSGFMT ?= msgfmt -MSGMERGE ?= msgmerge -MSGINIT ?= msginit - -# Part of gzip: -GZIP ?= gzip -GZIP_COMPRESS ?= $(GZIP) -k9 - -# Part of bzip2: -BZIP2 ?= bzip2 -BZIP2_COMPRESS ?= $(BZIP2) -k9 - -# Part of xz: -XZ ?= xz -XZ_COMPRESS ?= $(XZ) -ke9 - -# Part of auto-auto-complete: -AUTO_AUTO_COMPLETE ?= auto-auto-complete - - -# Change to $(TRUE) to suppress the bold red and blue output. -ifndef PRINTF_INFO -PRINTF_INFO = $(PRINTF) -endif - -# Change to $(TRUE) to suppress empty lines -ifndef ECHO_EMPTY -ECHO_EMPTY = $(ECHO) -endif - diff --git a/src/libcoopgamma.c b/src/libcoopgamma.c deleted file mode 100644 index 40baf77..0000000 --- a/src/libcoopgamma.c +++ /dev/null @@ -1,2620 +0,0 @@ -/** - * libcoopgamma -- Library for interfacing with cooperative gamma servers - * Copyright (C) 2016 Mattias Andrée (maandree@kth.se) - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this library. If not, see . - */ -#define _DEFAULT_SOURCE -#define _BSD_SOURCE - -#include "libcoopgamma.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - - -#if !defined(COOPGAMMAD) -# define COOPGAMMAD "coopgammad" -#endif - - - -#if defined(__clang__) -# pragma GCC diagnostic ignored "-Wdocumentation" -# pragma GCC diagnostic ignored "-Wcovered-switch-default" -# pragma GCC diagnostic ignored "-Wcast-align" -#endif - - - -#if defined(__GNUC__) -# define NAME_OF_THE_PROCESS (argv0) -extern const char* argv0; -const char* argv0 __attribute__((weak)) = "libcoopgamma"; -#else -# define NAME_OF_THE_PROCESS ("libcoopgamma") -#endif - - - -#define SUBBUF \ - (buf ? buf + off : NULL) - -#define NNSUBBUF \ - (buf + off) - -#define MARSHAL_PROLOGUE \ - char* restrict buf = vbuf; \ - size_t off = 0; - -#define UNMARSHAL_PROLOGUE \ - const char* restrict buf = vbuf; \ - size_t off = 0; - -#define MARSHAL_EPILOGUE \ - return off - -#define UNMARSHAL_EPILOGUE \ - return *np = off, LIBCOOPGAMMA_SUCCESS - -#define marshal_prim(datum, type) \ - ((buf != NULL ? *(type*)(buf + off) = (datum) : 0), off += sizeof(type)) - -#define unmarshal_prim(datum, type) \ - ((datum) = *(const type*)(buf + off), off += sizeof(type)) - -#define marshal_version(version) \ - marshal_prim(version, int) - -#define unmarshal_version(version) \ - do \ - { \ - int version__; \ - unmarshal_prim(version__, int); \ - if (version__ < (version)) \ - return LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE; \ - if (version__ > (version)) \ - return LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE; \ - } \ - while (0) - -#define marshal_buffer(data, n) \ - ((buf != NULL ? (memcpy(buf + off, (data), (n)), 0) : 0), off += (n)) - -#define unmarshal_buffer(data, n) \ - do \ - { \ - (data) = malloc(n); \ - if ((data) == NULL) \ - return LIBCOOPGAMMA_ERRNO_SET; \ - memcpy((data), buf + off, (n)); \ - off += (n); \ - } \ - while (0) - -#define marshal_string(datum) \ - ((datum) == NULL ? marshal_prim(0, char) : \ - (marshal_prim(1, char), marshal_buffer((datum), strlen(datum) + 1))) - -#define unmarshal_string(datum) \ - do \ - { \ - char nonnull__; \ - unmarshal_prim(nonnull__, char); \ - if (nonnull__) \ - unmarshal_buffer((datum), strlen(buf + off) + 1); \ - else \ - (datum) = NULL; \ - } \ - while (0) - - - -#define copy_errno(ctx) \ - ((errno == 0) ? NULL : \ - ((ctx)->error.number = (uint64_t)errno, \ - (ctx)->error.custom = 0, \ - (ctx)->error.server_side = 0, \ - free((ctx)->error.description), \ - (ctx)->error.description = NULL)) - - -#define SYNC_CALL(send_call, recv_call, fail_return) \ - libcoopgamma_async_context_t async; \ - size_t _selected; \ - if (send_call < 0) \ - { \ - reflush: \ - if (errno != EINTR) \ - return fail_return; \ - if (libcoopgamma_flush(ctx) < 0) \ - goto reflush; \ - } \ -resync: \ - if (libcoopgamma_synchronise(ctx, &async, (size_t)1, &_selected) < 0) \ - { \ - if ((errno != EINTR) && (errno != 0)) \ - return fail_return; \ - goto resync; \ - } \ - return recv_call - - -#define INTEGRAL_DEPTHS \ - case LIBCOOPGAMMA_UINT8: \ - case LIBCOOPGAMMA_UINT16: \ - case LIBCOOPGAMMA_UINT32: \ - case LIBCOOPGAMMA_UINT64: - - - -/** - * Initialise a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` - * - * `this->red_size`, `this->green_size`, and `this->blue_size` must already be set - * - * @param this The record to initialise - * @param width The `sizeof(*(this->red))` - * @return Zero on success, -1 on error - */ -int libcoopgamma_ramps_initialise_(void* restrict this, size_t width) -{ - libcoopgamma_ramps8_t* restrict this8 = (libcoopgamma_ramps8_t* restrict)this; - this8->red = this8->green = this8->blue = NULL; - this8->red = malloc((this8->red_size + this8->green_size + this8->blue_size) * width); - if (this8->red == NULL) - return -1; - this8->green = this8->red + this8->red_size * width; - this8->blue = this8->green + this8->green_size * width; - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, - * `libcoopgamma_ramps32_t`, `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, - * `libcoopgamma_rampsd_t`, or `libcoopgamma_ramps_t`, the allocation of the record - * itself is not freed - * - * Always call this function after failed call to `libcoopgamma_ramps_initialise` - * or failed call to `libcoopgamma_ramps_unmarshal` - * - * @param this The record to destroy - */ -void libcoopgamma_ramps_destroy(void* restrict this) -{ - libcoopgamma_ramps8_t* restrict this8 = (libcoopgamma_ramps8_t* restrict)this; - free(this8->red); - this8->red = this8->green = this8->blue = NULL; -} - - -/** - * Marshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @param width The `sizeof(*(this->red))` - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_ramps_marshal_(const void* restrict this, void* restrict vbuf, size_t width) -{ - const libcoopgamma_ramps8_t* restrict this8 = (const libcoopgamma_ramps8_t* restrict)this; - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_RAMPS_VERSION); - marshal_prim(this8->red_size, size_t); - marshal_prim(this8->green_size, size_t); - marshal_prim(this8->blue_size, size_t); - marshal_buffer(this8->red, (this8->red_size + this8->green_size + this8->blue_size) * width); - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @param width The `sizeof(*(this->red))` - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_ramps_unmarshal_(void* restrict this, const void* restrict vbuf, - size_t* restrict np, size_t width) -{ - libcoopgamma_ramps8_t* restrict this8 = (libcoopgamma_ramps8_t* restrict)this; - UNMARSHAL_PROLOGUE; - unmarshal_version(LIBCOOPGAMMA_RAMPS_VERSION); - unmarshal_prim(this8->red_size, size_t); - unmarshal_prim(this8->green_size, size_t); - unmarshal_prim(this8->blue_size, size_t); - unmarshal_buffer(this8->red, (this8->red_size + this8->green_size + this8->blue_size) * width); - this8->green = this8->red + this8->red_size * width; - this8->blue = this8->green + this8->green_size * width; - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_filter_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_filter_initialise(libcoopgamma_filter_t* restrict this) -{ - memset(this, 0, sizeof(*this)); - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_filter_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_filter_initialise` - * or failed call to `libcoopgamma_filter_unmarshal` - * - * @param this The record to destroy - */ -void libcoopgamma_filter_destroy(libcoopgamma_filter_t* restrict this) -{ - free(this->crtc); - free(this->class); - free(this->ramps.u8.red); - memset(this, 0, sizeof(*this)); -} - - -/** - * Marshal a `libcoopgamma_filter_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_filter_marshal(const libcoopgamma_filter_t* restrict this, void* restrict vbuf) -{ - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_FILTER_VERSION); - marshal_version(LIBCOOPGAMMA_DEPTH_VERSION); - marshal_version(LIBCOOPGAMMA_LIFESPAN_VERSION); - marshal_prim(this->depth, libcoopgamma_depth_t); - marshal_prim(this->priority, int64_t); - marshal_string(this->crtc); - marshal_string(this->class); - marshal_prim(this->lifespan, libcoopgamma_lifespan_t); - switch (this->depth) - { - case LIBCOOPGAMMA_UINT8: off += libcoopgamma_ramps_marshal(&(this->ramps.u8), SUBBUF); break; - case LIBCOOPGAMMA_UINT16: off += libcoopgamma_ramps_marshal(&(this->ramps.u16), SUBBUF); break; - case LIBCOOPGAMMA_UINT32: off += libcoopgamma_ramps_marshal(&(this->ramps.u32), SUBBUF); break; - case LIBCOOPGAMMA_UINT64: off += libcoopgamma_ramps_marshal(&(this->ramps.u64), SUBBUF); break; - case LIBCOOPGAMMA_FLOAT: off += libcoopgamma_ramps_marshal(&(this->ramps.f), SUBBUF); break; - case LIBCOOPGAMMA_DOUBLE: off += libcoopgamma_ramps_marshal(&(this->ramps.d), SUBBUF); break; - default: - break; - } - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_filter_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_filter_unmarshal(libcoopgamma_filter_t* restrict this, - const void* restrict vbuf, size_t* restrict np) -{ - int r = LIBCOOPGAMMA_SUCCESS; - size_t n = 0; - UNMARSHAL_PROLOGUE; - memset(this, 0, sizeof(*this)); - unmarshal_version(LIBCOOPGAMMA_FILTER_VERSION); - unmarshal_version(LIBCOOPGAMMA_DEPTH_VERSION); - unmarshal_version(LIBCOOPGAMMA_LIFESPAN_VERSION); - unmarshal_prim(this->depth, libcoopgamma_depth_t); - unmarshal_prim(this->priority, int64_t); - unmarshal_string(this->crtc); - unmarshal_string(this->class); - unmarshal_prim(this->lifespan, libcoopgamma_lifespan_t); - switch (this->depth) - { - case LIBCOOPGAMMA_UINT8: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u8), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_UINT16: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u16), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_UINT32: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u32), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_UINT64: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u64), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_FLOAT: r = libcoopgamma_ramps_unmarshal(&(this->ramps.f), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_DOUBLE: r = libcoopgamma_ramps_unmarshal(&(this->ramps.d), NNSUBBUF, &n); break; - default: - break; - } - if (r != LIBCOOPGAMMA_SUCCESS) - return r; - off += n; - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_crtc_info_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_crtc_info_initialise(libcoopgamma_crtc_info_t* restrict this) -{ - memset(this, 0, sizeof(*this)); - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_crtc_info_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_crtc_info_initialise` - * or failed call to `libcoopgamma_crtc_info_unmarshal` - * - * @param this The record to destroy - */ -#if defined(__GNUC__) -__attribute__((__const__)) -#endif -void libcoopgamma_crtc_info_destroy(libcoopgamma_crtc_info_t* restrict this) -{ - (void) this; -} - - -/** - * Marshal a `libcoopgamma_crtc_info_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_crtc_info_marshal(const libcoopgamma_crtc_info_t* restrict this, void* restrict vbuf) -{ - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_CRTC_INFO_VERSION); - marshal_version(LIBCOOPGAMMA_DEPTH_VERSION); - marshal_version(LIBCOOPGAMMA_SUPPORT_VERSION); - marshal_version(LIBCOOPGAMMA_COLOURSPACE_VERSION); - marshal_prim(this->cooperative, int); - marshal_prim(this->depth, libcoopgamma_depth_t); - marshal_prim(this->red_size, size_t); - marshal_prim(this->green_size, size_t); - marshal_prim(this->blue_size, size_t); - marshal_prim(this->supported, libcoopgamma_support_t); - marshal_prim(this->colourspace, libcoopgamma_colourspace_t); - marshal_prim(this->have_gamut, int); - marshal_prim(this->red_x, unsigned); - marshal_prim(this->red_y, unsigned); - marshal_prim(this->green_x, unsigned); - marshal_prim(this->green_y, unsigned); - marshal_prim(this->blue_x, unsigned); - marshal_prim(this->blue_y, unsigned); - marshal_prim(this->white_x, unsigned); - marshal_prim(this->white_y, unsigned); - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_crtc_info_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_crtc_info_unmarshal(libcoopgamma_crtc_info_t* restrict this, - const void* restrict vbuf, size_t* restrict np) -{ - UNMARSHAL_PROLOGUE; - unmarshal_version(LIBCOOPGAMMA_CRTC_INFO_VERSION); - unmarshal_version(LIBCOOPGAMMA_DEPTH_VERSION); - unmarshal_version(LIBCOOPGAMMA_SUPPORT_VERSION); - unmarshal_version(LIBCOOPGAMMA_COLOURSPACE_VERSION); - unmarshal_prim(this->cooperative, int); - unmarshal_prim(this->depth, libcoopgamma_depth_t); - unmarshal_prim(this->red_size, size_t); - unmarshal_prim(this->green_size, size_t); - unmarshal_prim(this->blue_size, size_t); - unmarshal_prim(this->supported, libcoopgamma_support_t); - unmarshal_prim(this->colourspace, libcoopgamma_colourspace_t); - unmarshal_prim(this->have_gamut, int); - unmarshal_prim(this->red_x, unsigned); - unmarshal_prim(this->red_y, unsigned); - unmarshal_prim(this->green_x, unsigned); - unmarshal_prim(this->green_y, unsigned); - unmarshal_prim(this->blue_x, unsigned); - unmarshal_prim(this->blue_y, unsigned); - unmarshal_prim(this->white_x, unsigned); - unmarshal_prim(this->white_y, unsigned); - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_filter_query_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_filter_query_initialise(libcoopgamma_filter_query_t* restrict this) -{ - this->crtc = NULL; - this->coalesce = 0; - this->high_priority = INT64_MAX; - this->low_priority = INT64_MIN; - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_filter_query_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_filter_query_initialise` - * or failed call to `libcoopgamma_filter_query_unmarshal` - * - * @param this The record to destroy - */ -void libcoopgamma_filter_query_destroy(libcoopgamma_filter_query_t* restrict this) -{ - free(this->crtc), this->crtc = NULL; -} - - -/** - * Marshal a `libcoopgamma_filter_query_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_filter_query_marshal(const libcoopgamma_filter_query_t* restrict this, void* restrict vbuf) -{ - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_FILTER_QUERY_VERSION); - marshal_string(this->crtc); - marshal_prim(this->coalesce, int); - marshal_prim(this->high_priority, int64_t); - marshal_prim(this->low_priority, int64_t); - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_filter_query_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_filter_query_unmarshal(libcoopgamma_filter_query_t* restrict this, - const void* restrict vbuf, size_t* restrict np) -{ - UNMARSHAL_PROLOGUE; - this->crtc = NULL; - unmarshal_version(LIBCOOPGAMMA_FILTER_QUERY_VERSION); - unmarshal_string(this->crtc); - unmarshal_prim(this->coalesce, int); - unmarshal_prim(this->high_priority, int64_t); - unmarshal_prim(this->low_priority, int64_t); - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_queried_filter_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_queried_filter_initialise(libcoopgamma_queried_filter_t* restrict this) -{ - memset(this, 0, sizeof(*this)); - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_queried_filter_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_queried_filter_initialise` - * or failed call to `libcoopgamma_queried_filter_unmarshal` - * - * @param this The record to destroy - */ -void libcoopgamma_queried_filter_destroy(libcoopgamma_queried_filter_t* restrict this) -{ - free(this->class), this->class = NULL; - libcoopgamma_ramps_destroy(&(this->ramps.u8)); -} - - -/** - * Marshal a `libcoopgamma_queried_filter_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @param depth The type used of ramp stops - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_queried_filter_marshal(const libcoopgamma_queried_filter_t* restrict this, - void* restrict vbuf, libcoopgamma_depth_t depth) -{ - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_QUERIED_FILTER_VERSION); - marshal_prim(this->priority, int64_t); - marshal_string(this->class); - switch (depth) - { - case LIBCOOPGAMMA_UINT8: off += libcoopgamma_ramps_marshal(&(this->ramps.u8), SUBBUF); break; - case LIBCOOPGAMMA_UINT16: off += libcoopgamma_ramps_marshal(&(this->ramps.u16), SUBBUF); break; - case LIBCOOPGAMMA_UINT32: off += libcoopgamma_ramps_marshal(&(this->ramps.u32), SUBBUF); break; - case LIBCOOPGAMMA_UINT64: off += libcoopgamma_ramps_marshal(&(this->ramps.u64), SUBBUF); break; - case LIBCOOPGAMMA_FLOAT: off += libcoopgamma_ramps_marshal(&(this->ramps.f), SUBBUF); break; - case LIBCOOPGAMMA_DOUBLE: off += libcoopgamma_ramps_marshal(&(this->ramps.d), SUBBUF); break; - default: - break; - } - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_queried_filter_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @param depth The type used of ramp stops - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_queried_filter_unmarshal(libcoopgamma_queried_filter_t* restrict this, - const void* restrict vbuf, size_t* restrict np, - libcoopgamma_depth_t depth) -{ - int r = LIBCOOPGAMMA_SUCCESS; - size_t n = 0; - UNMARSHAL_PROLOGUE; - memset(this, 0, sizeof(*this)); - unmarshal_version(LIBCOOPGAMMA_QUERIED_FILTER_VERSION); - unmarshal_prim(this->priority, int64_t); - unmarshal_string(this->class); - switch (depth) - { - case LIBCOOPGAMMA_UINT8: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u8), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_UINT16: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u16), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_UINT32: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u32), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_UINT64: r = libcoopgamma_ramps_unmarshal(&(this->ramps.u64), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_FLOAT: r = libcoopgamma_ramps_unmarshal(&(this->ramps.f), NNSUBBUF, &n); break; - case LIBCOOPGAMMA_DOUBLE: r = libcoopgamma_ramps_unmarshal(&(this->ramps.d), NNSUBBUF, &n); break; - default: - break; - } - if (r != LIBCOOPGAMMA_SUCCESS) - return r; - off += n; - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_filter_table_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_filter_table_initialise(libcoopgamma_filter_table_t* restrict this) -{ - memset(this, 0, sizeof(*this)); - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_filter_table_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_filter_table_initialise` - * or failed call to `libcoopgamma_filter_table_unmarshal` - * - * @param this The record to destroy - */ -void libcoopgamma_filter_table_destroy(libcoopgamma_filter_table_t* restrict this) -{ - while (this->filter_count) - libcoopgamma_queried_filter_destroy(this->filters + --(this->filter_count)); - free(this->filters), this->filters = NULL; -} - - -/** - * Marshal a `libcoopgamma_filter_table_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_filter_table_marshal(const libcoopgamma_filter_table_t* restrict this, void* restrict vbuf) -{ - size_t i; - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_FILTER_TABLE_VERSION); - marshal_version(LIBCOOPGAMMA_DEPTH_VERSION); - marshal_prim(this->depth, libcoopgamma_depth_t); - marshal_prim(this->red_size, size_t); - marshal_prim(this->green_size, size_t); - marshal_prim(this->blue_size, size_t); - marshal_prim(this->filter_count, size_t); - for (i = 0; i < this->filter_count; i++) - off += libcoopgamma_queried_filter_marshal(this->filters + i, SUBBUF, this->depth); - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_filter_table_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_filter_table_unmarshal(libcoopgamma_filter_table_t* restrict this, - const void* restrict vbuf, size_t* restrict np) -{ - size_t i, n, fn; - int r; - UNMARSHAL_PROLOGUE; - this->filter_count = 0; - this->filters = NULL; - unmarshal_version(LIBCOOPGAMMA_FILTER_TABLE_VERSION); - unmarshal_version(LIBCOOPGAMMA_DEPTH_VERSION); - unmarshal_prim(this->depth, libcoopgamma_depth_t); - unmarshal_prim(this->red_size, size_t); - unmarshal_prim(this->green_size, size_t); - unmarshal_prim(this->blue_size, size_t); - unmarshal_prim(fn, size_t); - this->filters = malloc(fn * sizeof(*(this->filters))); - if (this->filters == NULL) - return LIBCOOPGAMMA_ERRNO_SET; - for (i = 0; i < fn; i++) - { - r = libcoopgamma_queried_filter_unmarshal(this->filters + i, NNSUBBUF, &n, this->depth); - if (r != LIBCOOPGAMMA_SUCCESS) - return r; - off += n; - this->filter_count += 1; - } - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_error_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_error_initialise(libcoopgamma_error_t* restrict this) -{ - this->number = 0; - this->custom = 0; - this->description = NULL; - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_error_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_error_initialise` - * or failed call to `libcoopgamma_error_unmarshal` - * - * @param this The record to destroy - */ -void libcoopgamma_error_destroy(libcoopgamma_error_t* restrict this) -{ - free(this->description), this->description = NULL; -} - - -/** - * Marshal a `libcoopgamma_error_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_error_marshal(const libcoopgamma_error_t* restrict this, void* restrict vbuf) -{ - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_ERROR_VERSION); - marshal_prim(this->number, uint64_t); - marshal_prim(this->custom, int); - marshal_prim(this->server_side, int); - marshal_string(this->description); - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_error_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_error_unmarshal(libcoopgamma_error_t* restrict this, - const void* restrict vbuf, size_t* restrict np) -{ - UNMARSHAL_PROLOGUE; - this->description = NULL; - unmarshal_version(LIBCOOPGAMMA_ERROR_VERSION); - unmarshal_prim(this->number, uint64_t); - unmarshal_prim(this->custom, int); - unmarshal_prim(this->server_side, int); - unmarshal_string(this->description); - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_context_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_context_initialise(libcoopgamma_context_t* restrict this) -{ - memset(this, 0, sizeof(*this)); - this->fd = -1; - this->blocking = 1; - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_context_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_context_initialise` - * or failed call to `libcoopgamma_context_unmarshal` - * - * @param this The record to destroy - * @param disconnect Disconnect from the server? - */ -void libcoopgamma_context_destroy(libcoopgamma_context_t* restrict this, int disconnect) -{ - if (disconnect && (this->fd >= 0)) - { - shutdown(this->fd, SHUT_RDWR); - close(this->fd); - } - this->fd = -1; - libcoopgamma_error_destroy(&(this->error)); - free(this->outbound), this->outbound = NULL; - free(this->inbound), this->inbound = NULL; -} - - -/** - * Marshal a `libcoopgamma_context_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_context_marshal(const libcoopgamma_context_t* restrict this, void* restrict vbuf) -{ - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_CONTEXT_VERSION); - marshal_prim(this->fd, int); - off += libcoopgamma_error_marshal(&(this->error), SUBBUF); - marshal_prim(this->message_id, uint32_t); - marshal_prim(this->outbound_head - this->outbound_tail, size_t); - marshal_buffer(this->outbound + this->outbound_tail, this->outbound_head - this->outbound_tail); - marshal_prim(this->inbound_head - this->inbound_tail, size_t); - marshal_buffer(this->inbound + this->inbound_tail, this->inbound_head - this->inbound_tail); - marshal_prim(this->length, size_t); - marshal_prim(this->curline, size_t); - marshal_prim(this->in_response_to, uint32_t); - marshal_prim(this->have_all_headers, int); - marshal_prim(this->bad_message, int); - marshal_prim(this->blocking, int); - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_context_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_context_unmarshal(libcoopgamma_context_t* restrict this, - const void* restrict vbuf, size_t* restrict np) -{ - size_t n; - int r; - UNMARSHAL_PROLOGUE; - memset(this, 0, sizeof(*this)); - unmarshal_version(LIBCOOPGAMMA_CONTEXT_VERSION); - unmarshal_prim(this->fd, int); - r = libcoopgamma_error_unmarshal(&(this->error), NNSUBBUF, &n); - if (r != LIBCOOPGAMMA_SUCCESS) - return r; - off += n; - unmarshal_prim(this->message_id, uint32_t); - unmarshal_prim(this->outbound_head, size_t); - this->outbound_size = this->outbound_head; - unmarshal_buffer(this->outbound, this->outbound_head); - unmarshal_prim(this->inbound_head, size_t); - this->inbound_size = this->inbound_head; - unmarshal_buffer(this->inbound, this->inbound_head); - unmarshal_prim(this->length, size_t); - unmarshal_prim(this->curline, size_t); - unmarshal_prim(this->in_response_to, uint32_t); - unmarshal_prim(this->have_all_headers, int); - unmarshal_prim(this->bad_message, int); - unmarshal_prim(this->blocking, int); - UNMARSHAL_EPILOGUE; -} - - - -/** - * Initialise a `libcoopgamma_async_context_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -int libcoopgamma_async_context_initialise(libcoopgamma_async_context_t* restrict this) -{ - this->message_id = 0; - this->coalesce = 0; - return 0; -} - - -/** - * Release all resources allocated to a `libcoopgamma_async_context_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_async_context_initialise` - * or failed call to `libcoopgamma_async_context_unmarshal` - * - * @param this The record to destroy - */ -#if defined(__GNUC__) -__attribute__((__const__)) -#endif -void libcoopgamma_async_context_destroy(libcoopgamma_async_context_t* restrict this) -{ - (void) this; -} - - -/** - * Marshal a `libcoopgamma_async_context_t` into a buffer - * - * @param this The record to marshal - * @param vbuf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -size_t libcoopgamma_async_context_marshal(const libcoopgamma_async_context_t* restrict this, - void* restrict vbuf) -{ - MARSHAL_PROLOGUE; - marshal_version(LIBCOOPGAMMA_ASYNC_CONTEXT_VERSION); - marshal_prim(this->message_id, uint32_t); - marshal_prim(this->coalesce, int); - MARSHAL_EPILOGUE; -} - - -/** - * Unmarshal a `libcoopgamma_async_context_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param vbuf The buffer with the marshalled record - * @param np Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -int libcoopgamma_async_context_unmarshal(libcoopgamma_async_context_t* restrict this, - const void* restrict vbuf, size_t* restrict np) -{ - UNMARSHAL_PROLOGUE; - unmarshal_version(LIBCOOPGAMMA_ASYNC_CONTEXT_VERSION); - unmarshal_prim(this->message_id, uint32_t); - unmarshal_prim(this->coalesce, int); - UNMARSHAL_EPILOGUE; -} - - - -/** - * List all recognised adjustment method - * - * SIGCHLD must not be ignored or blocked - * - * @return A `NULL`-terminated list of names. You should only free - * the outer pointer, inner pointers are subpointers of the - * outer pointer and cannot be freed. `NULL` on error. - */ -char** libcoopgamma_get_methods(void) -{ - char num[5]; /* The size is base on the fact that we have limited `n` in the loop below */ - char** methods = NULL; - char** rc; - char* buffer; - int n = 0, saved_errno; - size_t size = 0; - - methods = malloc(4 * sizeof(*methods)); - if (methods == NULL) - goto fail; - - for (n = 0; n < 10000 /* just to be safe */; n++) - { - char* method; - if ((n >= 4) && ((n & -n) == n)) - { - void* new = realloc(methods, (size_t)(n << 1) * sizeof(*methods)); - if (new == NULL) - goto fail; - methods = new; - } - sprintf(num, "%i", n); - if (libcoopgamma_get_method_and_site(num, NULL, &method, NULL)) - goto fail; - if (!strcmp(method, num)) - { - free(method); - break; - } - methods[n] = method; - size += strlen(method) + 1; - } - - rc = malloc((size_t)(n + 1) * sizeof(char*) + size); - if (rc == NULL) - goto fail; - buffer = ((char*)rc) + (size_t)(n + 1) * sizeof(char*); - rc[n] = NULL; - while (n--) - { - rc[n] = buffer; - buffer = stpcpy(buffer, methods[n]) + 1; - free(methods[n]); - } - free(methods); - - return rc; - - fail: - saved_errno = errno; - while (n--) - free(methods[n]); - free(methods); - errno = saved_errno; - return NULL; -} - - -/** - * Run coopgammad with -q or -qq and return the response - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @param arg "-q" or "-qq", which shall be passed to coopgammad? - * @return The output of coopgammad, `NULL` on error. This - * will be NUL-terminated and will not contain any - * other `NUL` bytes. - */ -static char* libcoopgamma_query(const char* restrict method, const char* restrict site, const char* restrict arg) -{ - const char* (args[7]) = {COOPGAMMAD, arg}; - size_t i = 2, n = 0, size = 0; - int pipe_rw[2] = { -1, -1 }; - pid_t pid; - int saved_errno, status; - char* msg = NULL; - ssize_t got; - - if (method != NULL) args[i++] = "-m", args[i++] = method; - if (site != NULL) args[i++] = "-s", args[i++] = site; - args[i] = NULL; - - if (pipe(pipe_rw) < 0) - goto fail; - - switch ((pid = fork())) - { - case -1: - goto fail; - case 0: - /* Child */ - close(pipe_rw[0]); - if (pipe_rw[1] != STDOUT_FILENO) - { - close(STDOUT_FILENO); - if (dup2(pipe_rw[1], STDOUT_FILENO) < 0) - goto fail_child; - close(pipe_rw[1]); - } -#if defined(__GNUC__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wcast-qual" -#endif - execvp(COOPGAMMAD, (char* const*)(args)); -#if defined(__GNUC__) -# pragma GCC diagnostic pop -#endif - fail_child: - saved_errno = errno; - perror(NAME_OF_THE_PROCESS); - if (write(STDOUT_FILENO, &saved_errno, sizeof(int)) != sizeof(int)) - perror(NAME_OF_THE_PROCESS); - exit(1); - default: - /* Parent */ - close(pipe_rw[1]), pipe_rw[1] = -1; - for (;;) - { - if (n == size) - { - void* new = realloc(msg, size = (n ? (n << 1) : 256)); - if (new == NULL) - goto fail; - msg = new; - } - got = read(pipe_rw[0], msg + n, size - n); - if (got < 0) - { - if (errno == EINTR) - continue; - goto fail; - } - else if (got == 0) - break; - n += (size_t)got; - } - close(pipe_rw[0]), pipe_rw[0] = -1; - if (waitpid(pid, &status, 0) < 0) - goto fail; - if (status) - { - errno = EINVAL; - if ((n == sizeof(int)) && (*(int*)msg != 0)) - errno = *(int*)msg; - } - break; - } - - if (n == size) - { - void* new = realloc(msg, n + 1); - if (new == NULL) - goto fail; - msg = new; - } - msg[n] = '\0'; - - if (strchr(msg, '\0') != msg + n) - { - errno = EBADMSG; - goto fail; - } - - return msg; - fail: - saved_errno = errno; - if (pipe_rw[0] >= 0) close(pipe_rw[0]); - if (pipe_rw[1] >= 0) close(pipe_rw[1]); - free(msg); - errno = saved_errno; - return NULL; -} - - -/** - * Get the adjustment method and site - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @param methodp Output pointer for the selected adjustment method, - * which cannot be `NULL`. It is safe to call - * this function with this parameter set to `NULL`. - * @param sitep Output pointer for the selected site, which will - * be `NULL` the method only supports one site or if - * `site == NULL` and no site can be selected - * automatically. It is safe to call this function - * with this parameter set to `NULL`. - * @return Zero on success, -1 on error - */ -int libcoopgamma_get_method_and_site(const char* restrict method, const char* restrict site, - char** restrict methodp, char** restrict sitep) -{ - int saved_errno; - char* raw; - char* p; - char* q; - - raw = libcoopgamma_query(method, site, "-q"); - if (raw == NULL) - return -1; - - if (methodp != NULL) *methodp = NULL; - if (sitep != NULL) *sitep = NULL; - - p = strchr(raw, '\n'); - if (p == NULL) - { - errno = EBADMSG; - goto fail; - } - *p++ = '\0'; - - if (methodp != NULL) - { - *methodp = malloc(strlen(raw) + 1); - if (*methodp == NULL) - goto fail; - strcpy(*methodp, raw); - } - - if ((site != NULL) && *(q = strchr(p, '\0') - 1)) - { - if (*q != '\n') - { - errno = EBADMSG; - goto fail; - } - *q = '\0'; - *sitep = malloc(strlen(p) + 1); - if (*sitep == NULL) - goto fail; - strcpy(*sitep, p); - } - - free(raw); - return 0; - fail: - saved_errno = errno; - if (methodp != NULL) - free(*methodp), *methodp = NULL; - free(raw); - errno = saved_errno; - return -1; -} - - -/** - * Get the PID file of the coopgamma server - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @return The pathname of the server's PID file, `NULL` on error - * or if there server does not use PID files. The later - * case is detected by checking that `errno` is set to 0. - */ -char* libcoopgamma_get_pid_file(const char* restrict method, const char* restrict site) -{ - char* path; - size_t n; - - path = libcoopgamma_get_socket_file(method, site); - if (path == NULL) - return NULL; - - n = strlen(path); - if (n < 7 || strcmp(path + n - 7, ".socket")) - { - free(path); - errno = EBADMSG; - return NULL; - } - - strcpy(path + n - 7, ".pid"); - return path; -} - - -/** - * Get the socket file of the coopgamma server - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @return The pathname of the server's socket, `NULL` on error - * or if there server does have its own socket. The later - * case is detected by checking that `errno` is set to 0, - * and is the case when communicating with a server in a - * multi-server display server like mds. - */ -char* libcoopgamma_get_socket_file(const char* restrict method, const char* restrict site) -{ - int saved_errno; - char* raw; - char* p; - - raw = libcoopgamma_query(method, site, "-qq"); - if (raw == NULL) - return NULL; - - p = strchr(raw, '\0') - 1; - if ((p < raw) || (*p != '\n')) - { - errno = EBADMSG; - goto fail; - } - *p = '\0'; - if (*raw == '\0') - { - errno = EBADMSG; - goto fail; - } - - return raw; - fail: - saved_errno = errno; - free(raw); - errno = saved_errno; - return NULL; -} - - - -/** - * Connect to a coopgamma server, and start it if necessary - * - * Use `libcoopgamma_context_destroy` to disconnect - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @param ctx The state of the library, must be initialised - * @return Zero on success, -1 on error. On error, `errno` is set - * to 0 if the server could not be initialised. - */ -int libcoopgamma_connect(const char* restrict method, const char* restrict site, - libcoopgamma_context_t* restrict ctx) -{ - const char* (args[6]) = {COOPGAMMAD}; - struct sockaddr_un address; - char* path; - int saved_errno; - int tries = 0, status; - pid_t pid; - size_t i = 1; - - ctx->blocking = 1; - - if (method != NULL) args[i++] = "-m", args[i++] = method; - if (site != NULL) args[i++] = "-s", args[i++] = site; - args[i] = NULL; - - path = libcoopgamma_get_socket_file(method, site); - if (path == NULL) - return -1; - if (strlen(path) >= sizeof(address.sun_path)) - { - free(path); - errno = ENAMETOOLONG; - return -1; - } - - address.sun_family = AF_UNIX; - strcpy(address.sun_path, path); - free(path); - if ((ctx->fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) - return -1; - - retry: - if (connect(ctx->fd, (struct sockaddr*)(&address), (socklen_t)sizeof(address)) < 0) - { - if (((errno == ECONNREFUSED) || (errno == ENOENT) || (errno == ENOTDIR)) && !tries++) - { - switch ((pid = fork())) - { - case -1: - goto fail; - case 0: - /* Child */ - close(ctx->fd); -#if defined(__GNUC__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wcast-qual" -#endif - execvp(COOPGAMMAD, (char* const*)(args)); -#if defined(__GNUC__) -# pragma GCC diagnostic pop -#endif - perror(NAME_OF_THE_PROCESS); - exit(1); - default: - /* Parent */ - if (waitpid(pid, &status, 0) < 0) - goto fail; - if (status) - { - errno = 0; - goto fail; - } - break; - } - goto retry; - } - goto fail; - } - - return 0; - fail: - saved_errno = errno; - close(ctx->fd), ctx->fd = -1; - errno = saved_errno; - return -1; -} - - -/** - * By default communication is blocking, this function - * can be used to switch between blocking and nonblocking - * - * After setting the communication to nonblocking, - * `libcoopgamma_flush`, `libcoopgamma_synchronise` and - * and request-sending functions can fail with EAGAIN and - * EWOULDBLOCK. It is safe to continue with `libcoopgamma_flush` - * (for `libcoopgamma_flush` it selfand equest-sending functions) - * or `libcoopgamma_synchronise` just like EINTR failure. - * - * @param ctx The state of the library, must be connected - * @param nonblocking Nonblocking mode? - * @return Zero on success, -1 on error - */ -int libcoopgamma_set_nonblocking(libcoopgamma_context_t* restrict ctx, int nonblocking) -{ - int flags = fcntl(ctx->fd, F_GETFL); - if (flags == -1) - return -1; - if (nonblocking) - flags |= O_NONBLOCK; - else - flags &= ~O_NONBLOCK; - if (fcntl(ctx->fd, F_SETFL, flags) == -1) - return -1; - ctx->blocking = !nonblocking; - return 0; -} - - -/** - * Send all pending outbound data - * - * If this function or another function that sends a request - * to the server fails with EINTR, call this function to - * complete the transfer. The `async` parameter will always - * be in a properly configured state if a function fails - * with EINTR. - * - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error - */ -int libcoopgamma_flush(libcoopgamma_context_t* restrict ctx) -{ - ssize_t sent; - size_t chunksize = ctx->outbound_head - ctx->outbound_tail; - size_t sendsize; - - while (ctx->outbound_tail < ctx->outbound_head) - { - sendsize = ctx->outbound_head - ctx->outbound_tail; - sendsize = sendsize < chunksize ? sendsize : chunksize; - sent = send(ctx->fd, ctx->outbound + ctx->outbound_tail, sendsize, MSG_NOSIGNAL); - if (sent < 0) - { - if (errno == EPIPE) - errno = ECONNRESET; - if (errno != EMSGSIZE) - return -1; - if ((chunksize >>= 1) == 0) - return -1; - continue; - } - -#ifdef DEBUG_MODE - fprintf(stderr, "\033[31m"); - fwrite(ctx->outbound + ctx->outbound_tail, (size_t)sent, 1, stderr); - fprintf(stderr, "\033[m"); - fflush(stderr); -#endif - - ctx->outbound_tail += (size_t)sent; - } - - return 0; -} - - -/** - * Wait for the next message to be received - * - * @param ctx The state of the library, must be connected - * @param pending Information for each pending request - * @param n The number of elements in `pending` - * @param selected The index of the element in `pending` which corresponds - * to the first inbound message, note that this only means - * that the message is not for any of the other request, - * if the message is corrupt any of the listed requests can - * be selected even if it is not for any of the requests. - * Functions that parse the message will detect such corruption. - * @return Zero on success, -1 on error. If the the message is ignored, - * which happens if corresponding `libcoopgamma_async_context_t` - * is not listed, -1 is returned and `errno` is set to 0. If -1 - * is returned, `errno` is set to `ENOTRECOVERABLE` you have - * received a corrupt message and the context has been tainted - * beyond recover. - */ -int libcoopgamma_synchronise(libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict pending, - size_t n, size_t* restrict selected) -{ - char temp[3 * sizeof(size_t) + 1]; - ssize_t got; - size_t i; - char* p; - char* line; - char* value; - struct pollfd pollfd; - - if (ctx->inbound_head == ctx->inbound_tail) - ctx->inbound_head = ctx->inbound_tail = ctx->curline = 0; - else if (ctx->inbound_tail > 0) - { - memmove(ctx->inbound, ctx->inbound + ctx->inbound_tail, ctx->inbound_head -= ctx->inbound_tail); - ctx->curline -= ctx->inbound_tail; - ctx->inbound_tail = 0; - } - - pollfd.fd = ctx->fd; - pollfd.events = POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI; - - if (ctx->inbound_head) - goto skip_recv; - for (;;) - { - if (ctx->inbound_head == ctx->inbound_size) - { - size_t new_size = ctx->inbound_size ? (ctx->inbound_size << 1) : 1024; - void* new = realloc(ctx->inbound, new_size); - if (new == NULL) - return -1; - ctx->inbound = new; - ctx->inbound_size = new_size; - } - - if (ctx->blocking) - { - pollfd.revents = 0; - if (poll(&pollfd, (nfds_t)1, -1) < 0) - return -1; - } - got = recv(ctx->fd, ctx->inbound + ctx->inbound_head, ctx->inbound_size - ctx->inbound_head, 0); - if (got <= 0) - { - if (got == 0) - errno = ECONNRESET; - return -1; - } - -#ifdef DEBUG_MODE - fprintf(stderr, "\033[32m"); - fwrite(ctx->inbound + ctx->inbound_head, (size_t)got, 1, stderr); - fprintf(stderr, "\033[m"); - fflush(stderr); -#endif - - ctx->inbound_head += (size_t)got; - - skip_recv: - while (ctx->have_all_headers == 0) - { - line = ctx->inbound + ctx->curline; - p = memchr(line, '\n', ctx->inbound_head - ctx->curline); - if (p == NULL) - break; - if (memchr(line, '\0', (size_t)(p - line)) != NULL) - ctx->bad_message = 1; - *p++ = '\0'; - ctx->curline = (size_t)(p - ctx->inbound); - if (!*line) - { - ctx->have_all_headers = 1; - } - else if (strstr(line, "In response to: ") == line) - { - value = line + (sizeof("In response to: ") - 1); - ctx->in_response_to = (uint32_t)atol(value); - } - else if (strstr(line, "Length: ") == line) - { - value = line + (sizeof("Length: ") - 1); - ctx->length = (size_t)atol(value); - sprintf(temp, "%zu", ctx->length); - if (strcmp(value, temp)) - goto fatal; - } - } - - if (ctx->have_all_headers && (ctx->inbound_head >= ctx->curline + ctx->length)) - { - ctx->curline += ctx->length; - if (ctx->bad_message) - { - ctx->bad_message = 0; - ctx->have_all_headers = 0; - ctx->length = 0; - ctx->inbound_tail = ctx->curline; - errno = EBADMSG; - return -1; - } - for (i = 0; i < n; i++) - if (pending[i].message_id == ctx->in_response_to) - { - *selected = i; - return 0; - } - *selected = 0; - ctx->bad_message = 0; - ctx->have_all_headers = 0; - ctx->length = 0; - ctx->inbound_tail = ctx->curline; - errno = 0; - return -1; - } - } - - fatal: - errno = ENOTRECOVERABLE; - return -1; -} - - -/** - * Send a message to the server and wait for response - * - * @param resp:char** Output parameter for the response, - * will be NUL-terminated - * @param ctx:libcoopgamma_context_t* The state of the library - * @param payload:void* Data to append to the end of the message - * @param payload_size:size_t Byte-size of `payload` - * @param format:string-literal Message formatting string - * @param ... Message formatting arguments - * - * On error, the macro goes to `fail`. - */ -#define SEND_MESSAGE(ctx, payload, payload_size, format, ...) \ - do \ - { \ - ssize_t n__; \ - char* msg__; \ - snprintf(NULL, (size_t)0, format "%zn", __VA_ARGS__, &n__); \ - msg__ = malloc((size_t)n__ + (payload_size) + (size_t)1); \ - if (msg__ == NULL) \ - goto fail; \ - sprintf(msg__, format, __VA_ARGS__); \ - if ((payload) != NULL) \ - memcpy(msg__ + n__, (payload), (payload_size)); \ - if (send_message((ctx), msg__, (size_t)n__ + (payload_size)) < 0) \ - goto fail; \ - } \ - while (0) - - -/** - * Send a message to the server and wait for response - * - * @param ctx The state of the library - * @param msg The message to send - * @param n The length of `msg` - * @return Zero on success, -1 on error - */ -static int send_message(libcoopgamma_context_t* restrict ctx, char* msg, size_t n) -{ - if (ctx->outbound_head == ctx->outbound_tail) - { - free(ctx->outbound); - ctx->outbound = msg; - ctx->outbound_tail = 0; - ctx->outbound_head = n; - ctx->outbound_size = n; - } - else - { - if (ctx->outbound_head + n > ctx->outbound_size) - { - memmove(ctx->outbound, ctx->outbound + ctx->outbound_tail, ctx->outbound_head -= ctx->outbound_tail); - ctx->outbound_tail = 0; - } - if (ctx->outbound_head + n > ctx->outbound_size) - { - void* new = realloc(ctx->outbound, ctx->outbound_head + n); - if (new == NULL) - { - int saved_errno = errno; - free(msg); - errno = saved_errno; - return -1; - } - ctx->outbound = new; - ctx->outbound_size = ctx->outbound_head + n; - } - memcpy(ctx->outbound + ctx->outbound_head, msg, n); - ctx->outbound_head += n; - free(msg); - } - ctx->message_id += 1; - return libcoopgamma_flush(ctx); -} - - -/** - * Get the next header of the inbound message - * - * All headers must be read before the payload is read - * - * @param ctx The state of the library, must be connected - * @return The next header line, can never be `NULL`, - * the empty string marks the end of the headers. - * This memory segment must not be freed. - */ -static char* next_header(libcoopgamma_context_t* restrict ctx) -{ - char* rc = ctx->inbound + ctx->inbound_tail; - ctx->inbound_tail += strlen(rc) + 1; - return rc; -} - - -/** - * Get the payload of the inbound message - * - * Calling this function marks that the inbound message - * has been fully ready. You must call this function - * even if you do not expect a payload - * - * @param ctx The state of the library, must be connected - * @param n Output parameter for the size of the payload - * @return The payload (not NUL-terminated), `NULL` if - * there is no payload. Failure is impossible. - * This memory segment must not be freed. - */ -static char* next_payload(libcoopgamma_context_t* restrict ctx, size_t* n) -{ - ctx->have_all_headers = 0; - if ((*n = ctx->length)) - { - char* rc = ctx->inbound + ctx->inbound_tail; - ctx->inbound_tail += *n; - ctx->length = 0; - return rc; - } - else - return NULL; -} - - -/** - * Tell the library that you will not be parsing a receive message - * - * @param ctx The state of the library, must be connected - */ -void libcoopgamma_skip_message(libcoopgamma_context_t* restrict ctx) -{ - size_t _n; - while (*next_header(ctx)); - (void) next_payload(ctx, &_n); -} - - -/** - * Check whether the server sent an error, if so copy it to `ctx` - * - * This function will also reports EBADMSG if the message ID - * that the message is a response to does not match the request - * information, or if it is missing - * - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return 1 if the server sent an error (even indicating success), - * 0 on success, -1 on failure. Information about failure - * is copied `ctx`. - */ -static int check_error(libcoopgamma_context_t* restrict ctx, libcoopgamma_async_context_t* restrict async) -{ - char temp[3 * sizeof(uint64_t) + 1]; - size_t old_tail = ctx->inbound_tail; - char* line; - char* value; - int command_ok = 0; - int have_in_response_to = 0; - int have_error = 0; - int bad = 0; - char* payload; - size_t n; - - for (;;) - { - line = next_header(ctx); - value = strchr(line, ':') + 2; - if (!*line) - break; - else if (!strcmp(line, "Command: error")) - command_ok = 1; - else if (strstr(line, "In response to: ") == line) - { - uint32_t id = (uint32_t)atol(value); - have_in_response_to = 1 + !!have_in_response_to; - if (id != async->message_id) - bad = 1; - else - { - sprintf(temp, "%" PRIu32, id); - if (strcmp(value, temp)) - bad = 1; - } - } - else if (strstr(line, "Error: ") == line) - { - have_error = 1 + !!have_error; - ctx->error.server_side = 1; - ctx->error.custom = (strstr(value, "custom") == value); - if (ctx->error.custom) - { - if (value[6] == '\0') - { - ctx->error.number = 0; - continue; - } - else if (value[6] != ' ') - { - bad = 1; - continue; - } - value += 7; - } - ctx->error.number = (uint64_t)atoll(value); - sprintf(temp, "%" PRIu64, ctx->error.number); - if (strcmp(value, temp)) - bad = 1; - } - } - - if (command_ok == 0) - { - ctx->inbound_tail = old_tail; - return 0; - } - - payload = next_payload(ctx, &n); - if (payload != NULL) - { - if (memchr(payload, '\0', n) || (payload[n - 1] != '\n')) - goto badmsg; - ctx->error.description = malloc(n); - if (ctx->error.description == NULL) - goto fail; - memcpy(ctx->error.description, payload, n - 1); - ctx->error.description[n - 1] = '\0'; - } - - if (bad || (have_in_response_to != 1) || (have_error != 1)) - goto badmsg; - - return 1; -badmsg: - errno = EBADMSG; -fail: - copy_errno(ctx); - return -1; -} - - - -#if defined(__GNUC__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wnonnull" -#endif - - - -/** - * List all available CRTC:s, send request part - * - * Cannot be used before connecting to the server - * - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -int libcoopgamma_get_crtcs_send(libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ - async->message_id = ctx->message_id; - SEND_MESSAGE(ctx, NULL, (size_t)0, - "Command: enumerate-crtcs\n" - "Message ID: %" PRIu32 "\n" - "\n", - ctx->message_id); - - return 0; - fail: - copy_errno(ctx); - return -1; -} - - -/** - * List all available CRTC:s, receive response part - * - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return A `NULL`-terminated list of names. You should only free - * the outer pointer, inner pointers are subpointers of the - * outer pointer and cannot be freed. `NULL` on error, in - * which case `ctx->error` (rather than `errno`) is read - * for information about the error. - */ -char** libcoopgamma_get_crtcs_recv(libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ - char* line; - char* payload; - char* end; - int command_ok = 0; - size_t i, n, lines, len, length; - char** rc; - - if (check_error(ctx, async)) - return NULL; - - for (;;) - { - line = next_header(ctx); - if (!*line) - break; - else if (!strcmp(line, "Command: crtc-enumeration")) - command_ok = 1; - } - - payload = next_payload(ctx, &n); - - if (!command_ok || ((n > 0) && (payload[n - 1] != '\n'))) - { - errno = EBADMSG; - copy_errno(ctx); - return NULL; - } - - line = payload; - end = payload + n; - lines = length = 0; - while (line != end) - { - lines += 1; - length += len = (size_t)(strchr(line, '\n') + 1 - line); - line += len; - line[-1] = '\0'; - } - - rc = malloc((lines + 1) * sizeof(char*) + length); - if (rc == NULL) - { - copy_errno(ctx); - return NULL; - } - - line = ((char*)rc) + (lines + 1) * sizeof(char*); - memcpy(line, payload, length); - rc[lines] = NULL; - for (i = 0; i < lines; i++) - { - rc[i] = line; - line = strchr(line, '\0') + 1; - } - - return rc; -} - - -/** - * List all available CRTC:s, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param ctx The state of the library, must be connected - * @return A `NULL`-terminated list of names. You should only free - * the outer pointer, inner pointers are subpointers of the - * outer pointer and cannot be freed. `NULL` on error, in - * which case `ctx->error` (rather than `errno`) is read - * for information about the error. - */ -char** libcoopgamma_get_crtcs_sync(libcoopgamma_context_t* restrict ctx) -{ - SYNC_CALL(libcoopgamma_get_crtcs_send(ctx, &async), - libcoopgamma_get_crtcs_recv(ctx, &async), (copy_errno(ctx), NULL)); -} - - - -/** - * Retrieve information about a CRTC:s gamma ramps, send request part - * - * Cannot be used before connecting to the server - * - * @param crtc The name of the CRTC - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -int libcoopgamma_get_gamma_info_send(const char* restrict crtc, libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wnonnull-compare" -#endif - if ((crtc == NULL) || strchr(crtc, '\n')) - { - errno = EINVAL; - goto fail; - } -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -#endif - - async->message_id = ctx->message_id; - SEND_MESSAGE(ctx, NULL, (size_t)0, - "Command: get-gamma-info\n" - "Message ID: %" PRIu32 "\n" - "CRTC: %s\n" - "\n", - ctx->message_id, crtc); - - return 0; - fail: - copy_errno(ctx); - return 0; -} - - -/** - * Retrieve information about a CRTC:s gamma ramps, receive response part - * - * @param info Output parameter for the information, must be initialised - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -int libcoopgamma_get_gamma_info_recv(libcoopgamma_crtc_info_t* restrict info, - libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ - char temp[3 * sizeof(size_t) + 1]; - char* line; - char* value; - size_t _n; - int have_cooperative = 0, have_gamma_support = 0, have_colourspace = 0; - int have_depth = 0, have_white_x = 0, have_white_y = 0; - int have_red_size = 0, have_red_x = 0, have_red_y = 0; - int have_green_size = 0, have_green_x = 0, have_green_y = 0; - int have_blue_size = 0, have_blue_x = 0, have_blue_y = 0; - int bad = 0, r = 0, g = 0, b = 0, x = 0; - - if (check_error(ctx, async)) - return -1; - - info->cooperative = 0; /* Should be in the response, but ... */ - info->colourspace = LIBCOOPGAMMA_UNKNOWN; - - for (;;) - { - line = next_header(ctx); - value = strchr(line, ':') + 2; - if (!*line) - break; - else if (strstr(line, "Cooperative: ") == line) - { - have_cooperative = 1 + !!have_cooperative; - if (!strcmp(value, "yes")) info->cooperative = 1; - else if (!strcmp(value, "no")) info->cooperative = 0; - else - bad = 1; - } - else if (strstr(line, "Depth: ") == line) - { - have_depth = 1 + !!have_depth; - if (!strcmp(value, "8")) info->depth = LIBCOOPGAMMA_UINT8; - else if (!strcmp(value, "16")) info->depth = LIBCOOPGAMMA_UINT16; - else if (!strcmp(value, "32")) info->depth = LIBCOOPGAMMA_UINT32; - else if (!strcmp(value, "64")) info->depth = LIBCOOPGAMMA_UINT64; - else if (!strcmp(value, "f")) info->depth = LIBCOOPGAMMA_FLOAT; - else if (!strcmp(value, "d")) info->depth = LIBCOOPGAMMA_DOUBLE; - else - bad = 1; - } - else if (strstr(line, "Gamma support: ") == line) - { - have_gamma_support = 1 + !!have_gamma_support; - if (!strcmp(value, "yes")) info->supported = LIBCOOPGAMMA_YES; - else if (!strcmp(value, "no")) info->supported = LIBCOOPGAMMA_NO; - else if (!strcmp(value, "maybe")) info->supported = LIBCOOPGAMMA_MAYBE; - else - bad = 1; - } - else if (((r = (strstr(line, "Red size: ") == line))) || - ((g = (strstr(line, "Green size: ") == line))) || - (strstr(line, "Blue size: ") == line)) - { - size_t* out; - if (r) have_red_size = 1 + !!have_red_size, out = &(info->red_size); - else if (g) have_green_size = 1 + !!have_green_size, out = &(info->green_size); - else have_blue_size = 1 + !!have_blue_size, out = &(info->blue_size); - *out = (size_t)atol(value); - sprintf(temp, "%zu", *out); - if (strcmp(value, temp)) - bad = 1; - } - else if ((x = r = (strstr(line, "Red x: ") == line)) || - (r = (strstr(line, "Red y: ") == line)) || - (x = g = (strstr(line, "Green x: ") == line)) || - (g = (strstr(line, "Green y: ") == line)) || - (x = b = (strstr(line, "Blue x: ") == line)) || - (b = (strstr(line, "Blue y: ") == line)) || - (x = (strstr(line, "White x: ") == line)) || - (strstr(line, "White y: ") == line)) - { - unsigned* out; - int* have; - if (r && x) have = &have_red_x, out = &(info->red_x); - else if (r) have = &have_red_y, out = &(info->red_y); - else if (g && x) have = &have_green_x, out = &(info->green_x); - else if (g) have = &have_green_y, out = &(info->green_y); - else if (b && x) have = &have_blue_x, out = &(info->blue_x); - else if (b) have = &have_blue_y, out = &(info->blue_y); - else if (x) have = &have_white_x, out = &(info->white_x); - else have = &have_white_y, out = &(info->white_y); - *have = 1 + !!*have; - *out = (unsigned)atoi(value); - sprintf(temp, "%u", *out); - if (strcmp(value, temp)) - bad = 1; - } - else if (strstr(line, "Colour space: ") == line) - { - have_colourspace = 1 + !!have_colourspace; - if (!strcmp(value, "sRGB")) info->colourspace = LIBCOOPGAMMA_SRGB; - else if (!strcmp(value, "RGB")) info->colourspace = LIBCOOPGAMMA_RGB; - else if (!strcmp(value, "non-RGB")) info->colourspace = LIBCOOPGAMMA_NON_RGB; - else if (!strcmp(value, "grey")) info->colourspace = LIBCOOPGAMMA_GREY; - else - info->colourspace = LIBCOOPGAMMA_UNKNOWN; - } - } - - (void) next_payload(ctx, &_n); - - info->have_gamut = (have_red_x && have_green_x && have_blue_x && have_white_x && - have_red_y && have_green_y && have_blue_y && have_white_y); - - if (bad || (have_gamma_support != 1) || (have_red_x > 1) || (have_red_y > 1) || - (have_green_x > 1) || (have_green_y > 1) || (have_blue_x > 1) || (have_blue_y > 1) || - (have_white_x > 1) || (have_white_y > 1) || (have_colourspace > 1)) - { - errno = EBADMSG; - copy_errno(ctx); - return -1; - } - if (info->supported != LIBCOOPGAMMA_NO) - if ((have_cooperative > 1) || (have_depth != 1) || (have_gamma_support != 1) || - (have_red_size != 1) || (have_green_size != 1) || (have_blue_size != 1)) - { - errno = EBADMSG; - copy_errno(ctx); - return -1; - } - - return 0; -} - - -/** - * Retrieve information about a CRTC:s gamma ramps, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param crtc The name of the CRTC - * @param info Output parameter for the information, must be initialised - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -int libcoopgamma_get_gamma_info_sync(const char* restrict ctrc, libcoopgamma_crtc_info_t* restrict info, - libcoopgamma_context_t* restrict ctx) -{ - SYNC_CALL(libcoopgamma_get_gamma_info_send(ctrc, ctx, &async), - libcoopgamma_get_gamma_info_recv(info, ctx, &async), (copy_errno(ctx), -1)); -} - - - -/** - * Retrieve the current gamma ramp adjustments, send request part - * - * Cannot be used before connecting to the server - * - * @param query The query to send - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -int libcoopgamma_get_gamma_send(const libcoopgamma_filter_query_t* restrict query, - libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wnonnull-compare" -#endif - if ((query == NULL) || (query->crtc == NULL) || strchr(query->crtc, '\n')) - { - errno = EINVAL; - goto fail; - } -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -#endif - - async->message_id = ctx->message_id; - async->coalesce = query->coalesce; - SEND_MESSAGE(ctx, NULL, (size_t)0, - "Command: get-gamma\n" - "Message ID: %" PRIu32 "\n" - "CRTC: %s\n" - "Coalesce: %s\n" - "High priority: %" PRIi64 "\n" - "Low priority: %" PRIi64 "\n" - "\n", - ctx->message_id, query->crtc, query->coalesce ? "yes" : "no", - query->high_priority, query->low_priority); - - return 0; - fail: - copy_errno(ctx); - return -1; -} - - -/** - * Retrieve the current gamma ramp adjustments, receive response part - * - * @param table Output for the response, must be initialised - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -int libcoopgamma_get_gamma_recv(libcoopgamma_filter_table_t* restrict table, - libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ - char temp[3 * sizeof(size_t) + 1]; - char* line; - char* value; - char* payload; - size_t i, n, width, clutsize; - int have_depth = 0; - int have_red_size = 0; - int have_green_size = 0; - int have_blue_size = 0; - int have_tables = 0; - int bad = 0, r = 0, g = 0; - - if (check_error(ctx, async)) - return -1; - - libcoopgamma_filter_table_destroy(table); - - for (;;) - { - line = next_header(ctx); - value = strchr(line, ':') + 2; - if (!*line) - break; - else if (strstr(line, "Depth: ") == line) - { - have_depth = 1 + !!have_depth; - if (!strcmp(value, "8")) table->depth = LIBCOOPGAMMA_UINT8; - else if (!strcmp(value, "16")) table->depth = LIBCOOPGAMMA_UINT16; - else if (!strcmp(value, "32")) table->depth = LIBCOOPGAMMA_UINT32; - else if (!strcmp(value, "64")) table->depth = LIBCOOPGAMMA_UINT64; - else if (!strcmp(value, "f")) table->depth = LIBCOOPGAMMA_FLOAT; - else if (!strcmp(value, "d")) table->depth = LIBCOOPGAMMA_DOUBLE; - else - bad = 1; - } - else if (((r = (strstr(line, "Red size: ") == line))) || - ((g = (strstr(line, "Green size: ") == line))) || - (strstr(line, "Blue size: ") == line)) - { - size_t* out; - if (r) have_red_size = 1 + !!have_red_size, out = &(table->red_size); - else if (g) have_green_size = 1 + !!have_green_size, out = &(table->green_size); - else have_blue_size = 1 + !!have_blue_size, out = &(table->blue_size); - *out = (size_t)atol(value); - sprintf(temp, "%zu", *out); - if (strcmp(value, temp)) - bad = 1; - } - else if (strstr(line, "Tables: ") == line) - { - have_tables = 1 + have_tables; - table->filter_count = (size_t)atol(value); - sprintf(temp, "%zu", table->filter_count); - if (strcmp(value, temp)) - bad = 1; - } - } - - payload = next_payload(ctx, &n); - - if (bad || (have_depth != 1) || (have_red_size != 1) || (have_green_size != 1) || - (have_blue_size != 1) || (async->coalesce ? (have_tables > 1) : (have_tables == 0)) || - (((payload == NULL) || (n == 0)) && (async->coalesce || (table->filter_count > 0))) || - ((n > 0) && have_tables && (table->filter_count == 0)) || - (async->coalesce && have_tables && (table->filter_count != 1))) - goto bad; - - switch (table->depth) - { - case LIBCOOPGAMMA_FLOAT: width = sizeof(float); break; - case LIBCOOPGAMMA_DOUBLE: width = sizeof(double); break; - default: INTEGRAL_DEPTHS - if ((table->depth <= 0) || ((table->depth & 7) != 0)) - goto bad; - width = (size_t)(table->depth / 8); - break; - } - - clutsize = table->red_size + table->green_size + table->blue_size; - clutsize *= width; - - if (async->coalesce) - { - if (n != clutsize) - goto bad; - table->filters = malloc(sizeof(*(table->filters))); - if (table->filters == NULL) - goto fail; - table->filters->priority = 0; - table->filters->class = NULL; - table->filters->ramps.u8.red_size = table->red_size; - table->filters->ramps.u8.green_size = table->green_size; - table->filters->ramps.u8.blue_size = table->blue_size; - if (libcoopgamma_ramps_initialise_(&(table->filters->ramps), width) < 0) - goto fail; - memcpy(table->filters->ramps.u8.red, payload, clutsize); - table->filter_count = 1; - } - else if (table->filter_count == 0) - table->filters = NULL; - else - { - size_t off = 0, len; - table->filters = calloc(table->filter_count, sizeof(*(table->filters))); - if (table->filters == NULL) - goto fail; - for (i = 0; i < table->filter_count; i++) - { - if (off + sizeof(int64_t) > n) - goto bad; - table->filters[i].priority = *(int64_t*)(payload + off); - off += sizeof(int64_t); - if (memchr(payload + off, '\0', n - off) == NULL) - goto bad; - len = strlen(payload + off) + 1; - table->filters[i].class = malloc(len); - if (table->filters[i].class == NULL) - goto fail; - memcpy(table->filters[i].class, payload + off, len); - off += len; - if (off + clutsize > n) - goto bad; - table->filters[i].ramps.u8.red_size = table->red_size; - table->filters[i].ramps.u8.green_size = table->green_size; - table->filters[i].ramps.u8.blue_size = table->blue_size; - if (libcoopgamma_ramps_initialise_(&(table->filters[i].ramps), width) < 0) - goto fail; - memcpy(table->filters->ramps.u8.red, payload + off, clutsize); - off += clutsize; - } - if (off != n) - goto bad; - } - - return 0; - bad: - errno = EBADMSG; - fail: - copy_errno(ctx); - return -1; -} - - -/** - * Retrieve the current gamma ramp adjustments, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param query The query to send - * @param table Output for the response, must be initialised - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -int libcoopgamma_get_gamma_sync(const libcoopgamma_filter_query_t* restrict query, - libcoopgamma_filter_table_t* restrict table, - libcoopgamma_context_t* restrict ctx) -{ - SYNC_CALL(libcoopgamma_get_gamma_send(query, ctx, &async), - libcoopgamma_get_gamma_recv(table, ctx, &async), (copy_errno(ctx), -1)); -} - - - -/** - * Apply, update, or remove a gamma ramp adjustment, send request part - * - * Cannot be used before connecting to the server - * - * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -int libcoopgamma_set_gamma_send(const libcoopgamma_filter_t* restrict filter, - libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ - const void* payload = NULL; - const char* lifespan; - char priority[sizeof("Priority: \n") + 3 * sizeof(int64_t)] = {'\0'}; - char length [sizeof("Length: \n") + 3 * sizeof(size_t) ] = {'\0'}; - size_t payload_size = 0, stopwidth = 0; - -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wnonnull-compare" -#endif - if ((filter == NULL) || (filter->crtc == NULL) || strchr(filter->crtc, '\n') || - (filter->class == NULL) || strchr(filter->class, '\n')) - { - errno = EINVAL; - goto fail; - } -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -#endif - - switch (filter->lifespan) - { - case LIBCOOPGAMMA_REMOVE: lifespan = "remove"; break; - case LIBCOOPGAMMA_UNTIL_DEATH: lifespan = "until-death"; break; - case LIBCOOPGAMMA_UNTIL_REMOVAL: lifespan = "until-removal"; break; - default: - errno = EINVAL; - goto fail; - } - - if (filter->lifespan != LIBCOOPGAMMA_REMOVE) - { - switch (filter->depth) - { - case LIBCOOPGAMMA_FLOAT: stopwidth = sizeof(float); break; - case LIBCOOPGAMMA_DOUBLE: stopwidth = sizeof(double); break; - default: INTEGRAL_DEPTHS - if ((filter->depth <= 0) || ((filter->depth & 7) != 0)) - { - errno = EINVAL; - goto fail; - } - stopwidth = (size_t)(filter->depth / 8); - break; - } - - payload_size = filter->ramps.u8.red_size; - payload_size += filter->ramps.u8.green_size; - payload_size += filter->ramps.u8.blue_size; - payload_size *= stopwidth; - payload = filter->ramps.u8.red; - sprintf(priority, "Priority: %" PRIi64 "\n", filter->priority); - sprintf(length, "Length: %zu\n", payload_size); - } - - async->message_id = ctx->message_id; - SEND_MESSAGE(ctx, payload, payload_size, - "Command: set-gamma\n" - "Message ID: %" PRIu32 "\n" - "CRTC: %s\n" - "Class: %s\n" - "Lifespan: %s\n" - "%s" - "%s" - "\n", - ctx->message_id, filter->crtc, filter->class, lifespan, - priority, length); - - return 0; - fail: - copy_errno(ctx); - return -1; -} - - -/** - * Apply, update, or remove a gamma ramp adjustment, receive response part - * - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -int libcoopgamma_set_gamma_recv(libcoopgamma_context_t* restrict ctx, - libcoopgamma_async_context_t* restrict async) -{ - size_t _n = 0; - - if (check_error(ctx, async)) - return -(ctx->error.custom || ctx->error.number); - - while (*next_header(ctx)); - (void) next_payload(ctx, &_n); - - errno = EBADMSG; - copy_errno(ctx); - return -1; -} - - -/** - * Apply, update, or remove a gamma ramp adjustment, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's - * @param depth The datatype for the stops in the gamma ramps, must match the CRTC's - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -int libcoopgamma_set_gamma_sync(const libcoopgamma_filter_t* restrict filter, - libcoopgamma_context_t* restrict ctx) -{ - SYNC_CALL(libcoopgamma_set_gamma_send(filter, ctx, &async), - libcoopgamma_set_gamma_recv(ctx, &async), (copy_errno(ctx), -1)); -} - - - -#if defined(__GNUC__) -# pragma GCC diagnostic pop -#endif - diff --git a/src/libcoopgamma.h b/src/libcoopgamma.h deleted file mode 100644 index 723d5a3..0000000 --- a/src/libcoopgamma.h +++ /dev/null @@ -1,1680 +0,0 @@ -/** - * libcoopgamma -- Library for interfacing with cooperative gamma servers - * Copyright (C) 2016 Mattias Andrée (maandree@kth.se) - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this library. If not, see . - */ -#ifndef LIBCOOPGAMMA_H -#define LIBCOOPGAMMA_H - - - -#include -#include -#include - - - -#if defined(__clang__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wdocumentation" -#endif - -#if defined(__GNUC__) && !defined(__clang__) -# define LIBCOOPGAMMA_GCC_ONLY(...) __VA_ARGS__ -#else -# define LIBCOOPGAMMA_GCC_ONLY(...) /* ignore */ -#endif - - - -/** - * Unmarshal was successful - * - * This value will always be zero - */ -#define LIBCOOPGAMMA_SUCCESS 0 - -/** - * Unmarshal failed: the marshalled data was created - * with a older version of libcoopgamma that does not - * marshall the data in a compatible way - * - * This value will always be positive - */ -#define LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE 1 - -/** - * Unmarshal failed: the marshalled data was created with - * a newer version libcoopgamma that does not marshall - * the data in a compatible way - * - * This value will always be positive - */ -#define LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE 2 - -/** - * Unmarshal failed because of an error, `errno` has been set - * - * This value will always be -1 and will be the - * only negative value in this category of constants - */ -#define LIBCOOPGAMMA_ERRNO_SET -1 - - - -/** - * Number used to identify implementation - * version of `libcoopgamma_support_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_SUPPORT_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_depth_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_DEPTH_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_lifespan_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_LIFESPAN_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_colourspace_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_COLOURSPACE_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_ramps*_t`, if they - * are ever modified, this number is increased - */ -#define LIBCOOPGAMMA_RAMPS_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_filter_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_FILTER_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_ctrc_info_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_CRTC_INFO_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_filter_query_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_FILTER_QUERY_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_queried_filter_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_QUERIED_FILTER_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_filter_table_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_FILTER_TABLE_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_error_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_ERROR_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_context_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_CONTEXT_VERSION 0 - -/** - * Number used to identify implementation - * version of `libcoopgamma_async_context_t`, if it - * is ever modified, this number is increased - */ -#define LIBCOOPGAMMA_ASYNC_CONTEXT_VERSION 0 - - - -/** - * Values used to indicate the support - * for gamma adjustments - */ -typedef enum libcoopgamma_support -{ - /** - * Gamma adjustments are not supported - * - * This value will always be 0 - */ - LIBCOOPGAMMA_NO = 0, - - /** - * Don't know whether gamma - * adjustments are supported - * - * This value will always be 1 - */ - LIBCOOPGAMMA_MAYBE = 1, - - /** - * Gamma adjustments are supported - * - * This value will always be 2 - */ - LIBCOOPGAMMA_YES = 2 - -} libcoopgamma_support_t; - - -/** - * Values used to tell which datatype - * is used for the gamma ramp stops - * - * The values will always be the number - * of bits for integral types, and - * negative for floating-point types - */ -typedef enum libcoopgamma_depth -{ - /** - * `uint8_t` - */ - LIBCOOPGAMMA_UINT8 = 8, - - /** - * `uint16_t` - */ - LIBCOOPGAMMA_UINT16 = 16, - - /** - * `uint32_t` - */ - LIBCOOPGAMMA_UINT32 = 32, - - /** - * `uint64_t` - */ - LIBCOOPGAMMA_UINT64 = 64, - - /** - * `float` - */ - LIBCOOPGAMMA_FLOAT = -1, - - /** - * `double` - */ - LIBCOOPGAMMA_DOUBLE = -2 - -} libcoopgamma_depth_t; - - -/** - * Values used to tell when a filter - * should be removed - */ -typedef enum libcoopgamma_lifespan -{ - /** - * Remove the filter now - * - * This value will always be 0 - */ - LIBCOOPGAMMA_REMOVE = 0, - - /** - * Remove the filter when disconnecting - * from the coopgamma server - */ - LIBCOOPGAMMA_UNTIL_DEATH = 1, - - /** - * Only remove the filter when it - * is explicitly requested - */ - LIBCOOPGAMMA_UNTIL_REMOVAL = 2 - -} libcoopgamma_lifespan_t; - - -/** - * Colourspaces - */ -typedef enum libcoopgamma_colourspace -{ - /** - * The colourspace is unknown - * - * This value will always be 0 - */ - LIBCOOPGAMMA_UNKNOWN = 0, - - /** - * sRGB (Standard RGB) - */ - LIBCOOPGAMMA_SRGB = 1, - - /** - * RGB other than sRGB - */ - LIBCOOPGAMMA_RGB = 2, - - /** - * Non-RGB multicolour - */ - LIBCOOPGAMMA_NON_RGB = 3, - - /** - * Monochrome, greyscale, or some - * other singlecolour scale - */ - LIBCOOPGAMMA_GREY = 4 - -} libcoopgamma_colourspace_t; - - -/** - * Define a gamma ramp structure - * - * @param suffix:identifier The end of the name of the `struct` - * @param type:scalar-type The datatype of the stops - */ -#define LIBCOOPGAMMA_RAMPS__(suffix, type) \ -typedef struct libcoopgamma_ramps##suffix \ -{ \ - /** - * The number of stops in the red ramp - */ \ - size_t red_size; \ - \ - /** - * The number of stops in the green ramp - */ \ - size_t green_size; \ - \ - /** - * The number of stops in the blue ramp - */ \ - size_t blue_size; \ - \ - /** - * The red ramp - */ \ - type* red; \ - \ - /** - * The green ramp - */ \ - type* green; \ - \ - /** - * The blue ramp - */ \ - type* blue; \ - \ -} libcoopgamma_ramps##suffix##_t - -/** - * `typedef struct libcoopgamma_ramps8 libcoopgamma_ramps8_t` - * - * Gamma ramp structure with `uint8_t` stops - */ -LIBCOOPGAMMA_RAMPS__(8, uint8_t); - -/** - * `typedef struct libcoopgamma_ramps16 libcoopgamma_ramps16_t` - * - * Gamma ramp structure with `uint16_t` stops - */ -LIBCOOPGAMMA_RAMPS__(16, uint16_t); - -/** - * `typedef struct libcoopgamma_ramps32 libcoopgamma_ramps32_t` - * - * Gamma ramp structure with `uint32_t` stops - */ -LIBCOOPGAMMA_RAMPS__(32, uint32_t); - -/** - * `typedef struct libcoopgamma_ramps64 libcoopgamma_ramps64_t` - * - * Gamma ramp structure with `uint64_t` stops - */ -LIBCOOPGAMMA_RAMPS__(64, uint64_t); - -/** - * `typedef struct libcoopgamma_rampsf libcoopgamma_rampsf_t` - * - * Gamma ramp structure with `float` stops - */ -LIBCOOPGAMMA_RAMPS__(f, float); - -/** - * `typedef struct libcoopgamma_rampsd libcoopgamma_rampsd_t` - * - * Gamma ramp structure with `double` stops - */ -LIBCOOPGAMMA_RAMPS__(d, double); - - -/** - * Union with all ramp types. - */ -typedef union libcoopgamma_ramps -{ - /** - * 8-bit version - */ - libcoopgamma_ramps8_t u8; - - /** - * 16-bit version - */ - libcoopgamma_ramps16_t u16; - - /** - * 32-bit version - */ - libcoopgamma_ramps32_t u32; - - /** - * 64-bit version - */ - libcoopgamma_ramps64_t u64; - - /** - * Single precision floating-point version - */ - libcoopgamma_rampsf_t f; - - /** - * Double precision floating-point version - */ - libcoopgamma_rampsd_t d; - -} libcoopgamma_ramps_t; - - -/** - * Data set to the coopgamma server to apply, - * update, or remove a filter. - */ -typedef struct libcoopgamma_filter -{ - /** - * The priority of the filter, higher priority - * is applied first. The gamma correction should - * have priority 0. - */ - int64_t priority; - - /** - * The CRTC for which this filter shall be applied - */ - char* crtc; - - /** - * Identifier for the filter - * - * The syntax must be "${PACKAGE_NAME}::${COMMAND_NAME}::${RULE}" - */ - char* class; - - /** - * When shall the filter be removed? - * - * If this member's value is `LIBCOOPGAMMA_REMOVE`, - * only `.crtc` and `.class` need also be defined - */ - libcoopgamma_lifespan_t lifespan; - - /** - * The data type and bit-depth of the ramp stops - */ - libcoopgamma_depth_t depth; - - /** - * The gamma ramp adjustments of the filter - */ - libcoopgamma_ramps_t ramps; - -} libcoopgamma_filter_t; - - -/** - * Gamma ramp meta information for a CRTC - */ -typedef struct libcoopgamma_crtc_info -{ - /** - * Is cooperative gamma server running? - */ - int cooperative; - - /** - * The data type and bit-depth of the ramp stops - */ - libcoopgamma_depth_t depth; - - /** - * Is gamma adjustments supported on the CRTC? - * If not, `.depth`, `.red_size`, `.green_size`, - * and `.blue_size` are undefined - */ - libcoopgamma_support_t supported; - -#if INT_MAX != LONG_MAX - int padding__; -#endif - - /** - * The number of stops in the red ramp - */ - size_t red_size; - - /** - * The number of stops in the green ramp - */ - size_t green_size; - - /** - * The number of stops in the blue ramp - */ - size_t blue_size; - - /** - * The monitor's colourspace - */ - libcoopgamma_colourspace_t colourspace; - - /** - * Whether `.red_x`, `.red_y`, `.green_x`, - * `.green_y`, `.blue_x`, `.blue_y`, - * `.white_x`, and `.white_y` are set. - * - * If this is true, but the colourspace - * is not RGB (or sRGB), there is something - * wrong. Please also check the colourspace. - */ - int have_gamut; - - /** - * The x-value (CIE xyY) of the monitor's - * red colour, multiplied by 1024 - */ - unsigned red_x; - - /** - * The y-value (CIE xyY) of the monitor's - * red colour, multiplied by 1024 - */ - unsigned red_y; - - /** - * The x-value (CIE xyY) of the monitor's - * green colour, multiplied by 1024 - */ - unsigned green_x; - - /** - * The y-value (CIE xyY) of the monitor's - * green colour, multiplied by 1024 - */ - unsigned green_y; - - /** - * The x-value (CIE xyY) of the monitor's - * blue colour, multiplied by 1024 - */ - unsigned blue_x; - - /** - * The y-value (CIE xyY) of the monitor's - * blue colour, multiplied by 1024 - */ - unsigned blue_y; - - /** - * The x-value (CIE xyY) of the monitor's - * default white point, multiplied by 1024 - */ - unsigned white_x; - - /** - * The y-value (CIE xyY) of the monitor's - * default white point, multiplied by 1024 - */ - unsigned white_y; - -} libcoopgamma_crtc_info_t; - - -/** - * Data sent to the coopgamma server - * when requestng the current filter - * table - */ -typedef struct libcoopgamma_filter_query -{ - /** - * Do no return filters with higher - * priority than this value - */ - int64_t high_priority; - - /** - * Do no return filters with lower - * priority than this value - */ - int64_t low_priority; - - /** - * The CRTC for which the the current - * filters shall returned - */ - char* crtc; - - /** - * Whether to coalesce all filters - * into one gamma ramp triplet - */ - int coalesce; - -#if INT_MAX != LONG_MAX - int padding__; -#endif - -} libcoopgamma_filter_query_t; - - -/** - * Stripped down version of `libcoopgamma_filter` - * which only contains the information returned - * in response to "Command: get-gamma" - */ -typedef struct libcoopgamma_queried_filter -{ - /** - * The filter's priority - */ - int64_t priority; - - /** - * The filter's class - */ - char* class; - - /** - * The gamma ramp adjustments of the filter - */ - libcoopgamma_ramps_t ramps; - -} libcoopgamma_queried_filter_t; - - -/** - * Response type for "Command: get-gamma": a - * list of applied filters and meta-information - * that was necessary for decoding the response - */ -typedef struct libcoopgamma_filter_table -{ - /** - * The number of stops in the red ramp - */ - size_t red_size; - - /** - * The number of stops in the green ramp - */ - size_t green_size; - - /** - * The number of stops in the blue ramp - */ - size_t blue_size; - - /** - * The number of filters - */ - size_t filter_count; - - /** - * The filters, should be ordered by priority - * in descending order, lest there is something - * wrong with the coopgamma server - * - * If filter coalition was requested, there will - * be exactly one filter (`.filter_count == 1`) - * and `.filters->class == NULL` and - * `.filters->priority` is undefined. - */ - libcoopgamma_queried_filter_t* filters; - - /** - * The data type and bit-depth of the ramp stops - */ - libcoopgamma_depth_t depth; - -#if INT_MAX != LONG_MAX - int padding__; -#endif - -} libcoopgamma_filter_table_t; - - -/** - * Error message from coopgamma server - */ -typedef struct libcoopgamma_error -{ - /** - * Error code - * - * If `.custom` is false, 0 indicates - * success, otherwise, 0 indicates that - * no error code has been assigned - */ - uint64_t number; - - /** - * Is this a custom error? - */ - int custom; - - /** - * Did the error occur on the server-side? - */ - int server_side; - - /** - * Error message, can be `NULL` if - * `.custom` is false - */ - char* description; - -} libcoopgamma_error_t; - - -/** - * Library state - * - * Use of this structure is not thread-safe, - * create one instance per thread that uses - * this structure - */ -typedef struct libcoopgamma_context -{ - /** - * The error of the last failed function call - * - * This member is undefined after successful function call - */ - libcoopgamma_error_t error; - - /** - * File descriptor for the socket - */ - int fd; - - /* The members below are internal. */ - - /** - * Whether `libcoopgamma_synchronise` have - * read the empty end-of-headers line - */ - int have_all_headers; - - /** - * Whether `libcoopgamma_synchronise` is reading - * a corrupt but recoverable message - */ - int bad_message; - - /** - * Is communication blocking? - */ - int blocking; - - /** - * Message ID of the next message - */ - uint32_t message_id; - - /** - * The ID of outbound message to which the inbound - * message being read by `libcoopgamma_synchronise` - * is a response - */ - uint32_t in_response_to; - - /** - * Buffer with the outbound message - */ - char* outbound; - - /** - * The write head for `outbound` - */ - size_t outbound_head; - - /** - * The read head for `outbound` - */ - size_t outbound_tail; - - /** - * The allocation size of `outbound` - */ - size_t outbound_size; - - /** - * Buffer with the inbound message - */ - char* inbound; - - /** - * The write head for `inbound` - */ - size_t inbound_head; - - /** - * The read head for `inbound` - */ - size_t inbound_tail; - - /** - * The allocation size of `inbound` - */ - size_t inbound_size; - - /** - * The value of 'Length' header in - * the inbound message - */ - size_t length; - - /** - * The beginning of the current line that - * is being read by `libcoopgamma_synchronise` - */ - size_t curline; - -} libcoopgamma_context_t; - - -/** - * Information necessary to identify and - * parse a response from the server - */ -typedef struct libcoopgamma_async_context -{ - /* All members are internal. */ - - /** - * The value of the 'In response to' header - * in the waited message - */ - uint32_t message_id; - - /** - * Whether to coalesce all filters - * into one gamma ramp triplet - */ - int coalesce; - -} libcoopgamma_async_context_t; - - - -/** - * Initialise a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` - * - * `this->red_size`, `this->green_size`, and `this->blue_size` must already be set - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -#define libcoopgamma_ramps_initialise(this) \ - (libcoopgamma_ramps_initialise_((this), sizeof(*((this)->red)))) - -/** - * Marshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -#define libcoopgamma_ramps_marshal(this, buf) \ - (libcoopgamma_ramps_marshal_((this), (buf), sizeof(*((this)->red)))) - -/** - * Unmarshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -#define libcoopgamma_ramps_unmarshal(this, buf, n) \ - (libcoopgamma_ramps_unmarshal_((this), (buf), (n), sizeof(*((this)->red)))) - - -/** - * Initialise a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` - * - * `this->red_size`, `this->green_size`, and `this->blue_size` must already be set - * - * @param this The record to initialise - * @param width The `sizeof(*(this->red))` - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_ramps_initialise_(void* restrict, size_t); - -/** - * Release all resources allocated to a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, - * `libcoopgamma_ramps32_t`, `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, - * `libcoopgamma_rampsd_t`, or `libcoopgamma_ramps_t`, the allocation of the record - * itself is not freed - * - * Always call this function after failed call to `libcoopgamma_ramps_initialise` - * or failed call to `libcoopgamma_ramps_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -void libcoopgamma_ramps_destroy(void* restrict); - -/** - * Marshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @param width The `sizeof(*(this->red))` - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) -size_t libcoopgamma_ramps_marshal_(const void* restrict, void* restrict, size_t); - -/** - * Unmarshal a `libcoopgamma_ramps8_t`, `libcoopgamma_ramps16_t`, `libcoopgamma_ramps32_t`, - * `libcoopgamma_ramps64_t`, `libcoopgamma_rampsf_t`, or `libcoopgamma_rampsd_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @param width The `sizeof(*(this->red))` - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_ramps_unmarshal_(void* restrict, const void* restrict, size_t* restrict, size_t); - - -/** - * Initialise a `libcoopgamma_filter_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_filter_initialise(libcoopgamma_filter_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_filter_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_filter_initialise` - * or failed call to `libcoopgamma_filter_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -void libcoopgamma_filter_destroy(libcoopgamma_filter_t* restrict); - -/** - * Marshal a `libcoopgamma_filter_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) -size_t libcoopgamma_filter_marshal(const libcoopgamma_filter_t* restrict, void* restrict); - -/** - * Unmarshal a `libcoopgamma_filter_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_filter_unmarshal(libcoopgamma_filter_t* restrict, const void* restrict, size_t* restrict); - - -/** - * Initialise a `libcoopgamma_crtc_info_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_crtc_info_initialise(libcoopgamma_crtc_info_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_crtc_info_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_crtc_info_initialise` - * or failed call to `libcoopgamma_crtc_info_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -void libcoopgamma_crtc_info_destroy(libcoopgamma_crtc_info_t* restrict); - -/** - * Marshal a `libcoopgamma_crtc_info_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) -size_t libcoopgamma_crtc_info_marshal(const libcoopgamma_crtc_info_t* restrict, void* restrict); - -/** - * Unmarshal a `libcoopgamma_crtc_info_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_crtc_info_unmarshal(libcoopgamma_crtc_info_t* restrict, - const void* restrict, size_t* restrict); - - -/** - * Initialise a `libcoopgamma_filter_query_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_filter_query_initialise(libcoopgamma_filter_query_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_filter_query_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_filter_query_initialise` - * or failed call to `libcoopgamma_filter_query_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -void libcoopgamma_filter_query_destroy(libcoopgamma_filter_query_t* restrict); - -/** - * Marshal a `libcoopgamma_filter_query_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) -size_t libcoopgamma_filter_query_marshal(const libcoopgamma_filter_query_t* restrict, void* restrict); - -/** - * Unmarshal a `libcoopgamma_filter_query_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_filter_query_unmarshal(libcoopgamma_filter_query_t* restrict, - const void* restrict, size_t* restrict); - - -/** - * Initialise a `libcoopgamma_queried_filter_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_queried_filter_initialise(libcoopgamma_queried_filter_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_queried_filter_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_queried_filter_initialise` - * or failed call to `libcoopgamma_queried_filter_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -void libcoopgamma_queried_filter_destroy(libcoopgamma_queried_filter_t* restrict); - -/** - * Marshal a `libcoopgamma_queried_filter_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @param depth The type used of ramp stops - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) -size_t libcoopgamma_queried_filter_marshal(const libcoopgamma_queried_filter_t* restrict, void* restrict, - libcoopgamma_depth_t); - -/** - * Unmarshal a `libcoopgamma_queried_filter_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @param depth The type used of ramp stops - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_queried_filter_unmarshal(libcoopgamma_queried_filter_t* restrict, - const void* restrict, size_t* restrict, libcoopgamma_depth_t); - - -/** - * Initialise a `libcoopgamma_filter_table_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_filter_table_initialise(libcoopgamma_filter_table_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_filter_table_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_filter_table_initialise` - * or failed call to `libcoopgamma_filter_table_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -void libcoopgamma_filter_table_destroy(libcoopgamma_filter_table_t* restrict); - -/** - * Marshal a `libcoopgamma_filter_table_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) -size_t libcoopgamma_filter_table_marshal(const libcoopgamma_filter_table_t* restrict, void* restrict); - -/** - * Unmarshal a `libcoopgamma_filter_table_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_filter_table_unmarshal(libcoopgamma_filter_table_t* restrict, - const void* restrict, size_t* restrict); - - -/** - * Initialise a `libcoopgamma_error_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_error_initialise(libcoopgamma_error_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_error_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_error_initialise` - * or failed call to `libcoopgamma_error_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -void libcoopgamma_error_destroy(libcoopgamma_error_t* restrict); - -/** - * Marshal a `libcoopgamma_error_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) -size_t libcoopgamma_error_marshal(const libcoopgamma_error_t* restrict, void* restrict); - -/** - * Unmarshal a `libcoopgamma_error_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_error_unmarshal(libcoopgamma_error_t* restrict, const void* restrict, size_t* restrict); - - -/** - * Initialise a `libcoopgamma_context_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_context_initialise(libcoopgamma_context_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_context_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_context_initialise` - * or failed call to `libcoopgamma_context_unmarshal` - * - * @param this The record to destroy - * @param disconnect Disconnect from the server? - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -void libcoopgamma_context_destroy(libcoopgamma_context_t* restrict, int); - -/** - * Marshal a `libcoopgamma_context_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1)))) -size_t libcoopgamma_context_marshal(const libcoopgamma_context_t* restrict, void* restrict); - -/** - * Unmarshal a `libcoopgamma_context_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_context_unmarshal(libcoopgamma_context_t* restrict, const void* restrict, size_t* restrict); - - -/** - * Initialise a `libcoopgamma_async_context_t` - * - * @param this The record to initialise - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_async_context_initialise(libcoopgamma_async_context_t* restrict); - -/** - * Release all resources allocated to a `libcoopgamma_async_context_t`, - * the allocation of the record itself is not freed - * - * Always call this function after failed call to `libcoopgamma_async_context_initialise` - * or failed call to `libcoopgamma_async_context_unmarshal` - * - * @param this The record to destroy - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -void libcoopgamma_async_context_destroy(libcoopgamma_async_context_t* restrict); - -/** - * Marshal a `libcoopgamma_async_context_t` into a buffer - * - * @param this The record to marshal - * @param buf The output buffer, `NULL` to only measure - * how large this buffer has to be - * @return The number of marshalled bytes, or if `buf == NULL`, - * how many bytes would be marshalled if `buf != NULL` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1), __leaf__))) -size_t libcoopgamma_async_context_marshal(const libcoopgamma_async_context_t* restrict, void* restrict); - -/** - * Unmarshal a `libcoopgamma_async_context_t` from a buffer - * - * @param this The output parameter for unmarshalled record - * @param buf The buffer with the marshalled record - * @param n Output parameter for the number of unmarshalled bytes, undefined on failure - * @return `LIBCOOPGAMMA_SUCCESS` (0), `LIBCOOPGAMMA_INCOMPATIBLE_DOWNGRADE`, - * `LIBCOOPGAMMA_INCOMPATIBLE_UPGRADE`, or `LIBCOOPGAMMA_ERRNO_SET` - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_async_context_unmarshal(libcoopgamma_async_context_t* restrict, const void* restrict, - size_t* restrict); - - -/** - * List all recognised adjustment method - * - * SIGCHLD must not be ignored or blocked - * - * @return A `NULL`-terminated list of names. You should only free - * the outer pointer, inner pointers are subpointers of the - * outer pointer and cannot be freed. `NULL` on error. - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__))) -char** libcoopgamma_get_methods(void); - -/** - * Get the adjustment method and site - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @param methodp Output pointer for the selected adjustment method, - * which cannot be `NULL`. It is safe to call - * this function with this parameter set to `NULL`. - * @param sitep Output pointer for the selected site, which will - * be `NULL` the method only supports one site or if - * `site == NULL` and no site can be selected - * automatically. It is safe to call this function - * with this parameter set to `NULL`. - * @return Zero on success, -1 on error - */ -int libcoopgamma_get_method_and_site(const char* restrict, const char* restrict, - char** restrict, char** restrict); - -/** - * Get the PID file of the coopgamma server - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @return The pathname of the server's PID file, `NULL` on error - * or if there server does not use PID files. The later - * case is detected by checking that `errno` is set to 0. - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__))) -char* libcoopgamma_get_pid_file(const char* restrict, const char* restrict); - -/** - * Get the socket file of the coopgamma server - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @return The pathname of the server's socket, `NULL` on error - * or if there server does have its own socket. The later - * case is detected by checking that `errno` is set to 0, - * and is the case when communicating with a server in a - * multi-server display server like mds. - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__))) -char* libcoopgamma_get_socket_file(const char* restrict, const char* restrict); - - -/** - * Connect to a coopgamma server, and start it if necessary - * - * Use `libcoopgamma_context_destroy` to disconnect - * - * SIGCHLD must not be ignored or blocked - * - * @param method The adjustment method, `NULL` for automatic - * @param site The site, `NULL` for automatic - * @param ctx The state of the library, must be initialised - * @return Zero on success, -1 on error. On error, `errno` is set - * to 0 if the server could not be initialised. - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(3)))) -int libcoopgamma_connect(const char* restrict, const char* restrict, libcoopgamma_context_t* restrict); - -/** - * By default communication is blocking, this function - * can be used to switch between blocking and nonblocking - * - * After setting the communication to nonblocking, - * `libcoopgamma_flush`, `libcoopgamma_synchronise` and - * and request-sending functions can fail with EAGAIN and - * EWOULDBLOCK. It is safe to continue with `libcoopgamma_flush` - * (for `libcoopgamma_flush` it selfand equest-sending functions) - * or `libcoopgamma_synchronise` just like EINTR failure. - * - * @param ctx The state of the library, must be connected - * @param nonblocking Nonblocking mode? - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_set_nonblocking(libcoopgamma_context_t* restrict, int); - -/** - * Send all pending outbound data - * - * If this function or another function that sends a request - * to the server fails with EINTR, call this function to - * complete the transfer. The `async` parameter will always - * be in a properly configured state if a function fails - * with EINTR. - * - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__, __leaf__))) -int libcoopgamma_flush(libcoopgamma_context_t* restrict); - -/** - * Wait for the next message to be received - * - * @param ctx The state of the library, must be connected - * @param pending Information for each pending request - * @param n The number of elements in `pending` - * @param selected The index of the element in `pending` which corresponds - * to the first inbound message, note that this only means - * that the message is not for any of the other request, - * if the message is corrupt any of the listed requests can - * be selected even if it is not for any of the requests. - * Functions that parse the message will detect such corruption. - * @return Zero on success, -1 on error. If the the message is ignored, - * which happens if corresponding `libcoopgamma_async_context_t` - * is not listed, -1 is returned and `errno` is set to 0. If -1 - * is returned, `errno` is set to `ENOTRECOVERABLE` you have - * received a corrupt message and the context has been tainted - * beyond recover. - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__(1, 4), __leaf__))) -int libcoopgamma_synchronise(libcoopgamma_context_t* restrict, libcoopgamma_async_context_t* restrict, - size_t, size_t* restrict); - -/** - * Tell the library that you will not be parsing a receive message - * - * @param ctx The state of the library, must be connected - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -void libcoopgamma_skip_message(libcoopgamma_context_t* restrict); - - -/** - * List all available CRTC:s, send request part - * - * Cannot be used before connecting to the server - * - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_get_crtcs_send(libcoopgamma_context_t* restrict, libcoopgamma_async_context_t* restrict); - -/** - * List all available CRTC:s, receive response part - * - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return A `NULL`-terminated list of names. You should only free - * the outer pointer, inner pointers are subpointers of the - * outer pointer and cannot be freed. `NULL` on error, in - * which case `ctx->error` (rather than `errno`) is read - * for information about the error. - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__, __nonnull__))) -char** libcoopgamma_get_crtcs_recv(libcoopgamma_context_t* restrict, libcoopgamma_async_context_t* restrict); - -/** - * List all available CRTC:s, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param ctx The state of the library, must be connected - * @return A `NULL`-terminated list of names. You should only free - * the outer pointer, inner pointers are subpointers of the - * outer pointer and cannot be freed. `NULL` on error, in - * which case `ctx->error` (rather than `errno`) is read - * for information about the error. - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__malloc__, __nonnull__))) -char** libcoopgamma_get_crtcs_sync(libcoopgamma_context_t* restrict); - - -/** - * Retrieve information about a CRTC:s gamma ramps, send request part - * - * Cannot be used before connecting to the server - * - * @param crtc The name of the CRTC - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_get_gamma_info_send(const char* restrict, libcoopgamma_context_t* restrict, - libcoopgamma_async_context_t* restrict); - -/** - * Retrieve information about a CRTC:s gamma ramps, receive response part - * - * @param info Output parameter for the information, must be initialised - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_get_gamma_info_recv(libcoopgamma_crtc_info_t* restrict, libcoopgamma_context_t* restrict, - libcoopgamma_async_context_t* restrict); - -/** - * Retrieve information about a CRTC:s gamma ramps, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param crtc The name of the CRTC - * @param info Output parameter for the information, must be initialised - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_get_gamma_info_sync(const char* restrict, libcoopgamma_crtc_info_t* restrict, - libcoopgamma_context_t* restrict); - - -/** - * Retrieve the current gamma ramp adjustments, send request part - * - * Cannot be used before connecting to the server - * - * @param query The query to send - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_get_gamma_send(const libcoopgamma_filter_query_t* restrict, libcoopgamma_context_t* restrict, - libcoopgamma_async_context_t* restrict); - -/** - * Retrieve the current gamma ramp adjustments, receive response part - * - * @param table Output for the response, must be initialised - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_get_gamma_recv(libcoopgamma_filter_table_t* restrict, libcoopgamma_context_t* restrict, - libcoopgamma_async_context_t* restrict); - -/** - * Retrieve the current gamma ramp adjustments, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param query The query to send - * @param table Output for the response, must be initialised - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_get_gamma_sync(const libcoopgamma_filter_query_t* restrict, - libcoopgamma_filter_table_t* restrict, - libcoopgamma_context_t* restrict); - - -/** - * Apply, update, or remove a gamma ramp adjustment, send request part - * - * Cannot be used before connecting to the server - * - * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's - * @param ctx The state of the library, must be connected - * @param async Information about the request, that is needed to - * identify and parse the response, is stored here - * @return Zero on success, -1 on error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_set_gamma_send(const libcoopgamma_filter_t* restrict, - libcoopgamma_context_t* restrict, libcoopgamma_async_context_t* restrict); - -/** - * Apply, update, or remove a gamma ramp adjustment, receive response part - * - * @param ctx The state of the library, must be connected - * @param async Information about the request - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_set_gamma_recv(libcoopgamma_context_t* restrict, libcoopgamma_async_context_t* restrict); - -/** - * Apply, update, or remove a gamma ramp adjustment, synchronous version - * - * This is a synchronous request function, as such, - * you have to ensure that communication is blocking - * (default), and that there are not asynchronous - * requests waiting, it also means that EINTR:s are - * silently ignored and there no wait to cancel the - * operation without disconnection from the server - * - * @param filter The filter to apply, update, or remove, gamma ramp meta-data must match the CRTC's - * @param ctx The state of the library, must be connected - * @return Zero on success, -1 on error, in which case `ctx->error` - * (rather than `errno`) is read for information about the error - */ -LIBCOOPGAMMA_GCC_ONLY(__attribute__((__nonnull__))) -int libcoopgamma_set_gamma_sync(const libcoopgamma_filter_t* restrict, libcoopgamma_context_t* restrict); - - - -#if defined(__clang__) -# pragma GCC diagnostic pop -#endif - -#undef LIBCOOPGAMMA_GCC_ONLY - - - -#endif - diff --git a/src/test.c b/src/test.c deleted file mode 100644 index 4a94a42..0000000 --- a/src/test.c +++ /dev/null @@ -1,273 +0,0 @@ -/** - * libcoopgamma -- Library for interfacing with cooperative gamma servers - * Copyright (C) 2016 Mattias Andrée (maandree@kth.se) - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this library. If not, see . - */ -#include "libcoopgamma.h" - -#include -#include -#include - - -static int streq(const char* a, const char* b) -{ - if ((a == NULL) != (b == NULL)) - return 0; - return (a == NULL) || !strcmp(a, b); -} - - -static int rampseq(const libcoopgamma_ramps_t* a, const libcoopgamma_ramps_t* b, libcoopgamma_depth_t depth) -{ - size_t nr, ng, nb, width; - - if ((a->u8.red_size != b->u8.red_size) || - (a->u8.green_size != b->u8.green_size) || - (a->u8.blue_size != b->u8.blue_size)) - return 0; - - if (depth == -2) - width = sizeof(double); - else if (depth == -1) - width = sizeof(float); - else - width = ((size_t)depth) / 8; - - nr = a->u8.red_size * width; - ng = a->u8.green_size * width; - nb = a->u8.blue_size * width; - - if (memcmp(a->u8.red, b->u8.red, nr + ng + nb)) - return 0; - if (memcmp(a->u8.green, b->u8.green, ng + nb)) - return 0; - if (memcmp(a->u8.blue, b->u8.blue, nb)) - return 0; - - return 1; -} - - -int main(void) -{ - libcoopgamma_filter_t filter1, filter2; - libcoopgamma_crtc_info_t crtc1, crtc2; - libcoopgamma_filter_query_t query1, query2; - libcoopgamma_filter_table_t table1, table2; - libcoopgamma_context_t ctx1, ctx2; - libcoopgamma_async_context_t async1, async2; - size_t n, m, i; - char* buf; - - filter1.priority = INT64_MIN; - filter1.crtc = "CRTC"; - filter1.class = "A::B::C::D"; - filter1.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; - filter1.depth = LIBCOOPGAMMA_DOUBLE; - filter1.ramps.d.red_size = 4; - filter1.ramps.d.green_size = 5; - filter1.ramps.d.blue_size = 6; - filter1.ramps.d.red = (double[]){0.0, 0.1, 0.2, 0.5, - 0.3, 0.11, 0.22, 0.45, 0.9, - -1, -0.5, 0, 0.5, 1, 1.5}; - filter1.ramps.d.green = filter1.ramps.d.red + filter1.ramps.d.red_size; - filter1.ramps.d.blue = filter1.ramps.d.green + filter1.ramps.d.green_size; - - crtc1.cooperative = 0; - crtc1.depth = LIBCOOPGAMMA_DOUBLE; - crtc1.supported = LIBCOOPGAMMA_YES; - crtc1.red_size = 4; - crtc1.green_size = 5; - crtc1.blue_size = 6; - crtc1.colourspace = LIBCOOPGAMMA_SRGB; - crtc1.have_gamut = 1; - crtc1.red_x = 100; - crtc1.red_y = 50; - crtc1.green_x = 300; - crtc1.green_y = 350; - crtc1.blue_x = 200; - crtc1.blue_y = 260; - crtc1.white_x = 500; - crtc1.white_y = 999; - - query1.high_priority = INT64_MIN; - query1.low_priority = INT64_MIN; - query1.crtc = "crtc"; - query1.coalesce = 1; - - table1.red_size = 4; - table1.green_size = 5; - table1.blue_size = 6; - table1.filter_count = 2; - table1.filters = (libcoopgamma_queried_filter_t[]){ - { - .priority = UINT64_MAX, - .class = "a::b::c", - .ramps.d = { - .red_size = 4, - .green_size = 5, - .blue_size = 6, - .red = (double[]){0.0, 0.1, 0.2, 0.5, - 0.3, 0.11, 0.22, 0.45, 0.9, - -1, -0.5, 0, 0.5, 1, 1.5} - } - }, { - .priority = UINT64_MAX - 1, - .class = NULL, - .ramps.d = { - .red_size = 4, - .green_size = 5, - .blue_size = 6, - .red = (double[]){0.02, 0.12, 0.22, 0.52, - 0.32, 0.112, 0.222, 0.452, 0.92, - -12, -0.52, 0.2, 0.52, 12, 1.52} - } - } - }; - table1.depth = LIBCOOPGAMMA_DOUBLE; - table1.filters[0].ramps.d.green = table1.filters[0].ramps.d.red + table1.filters[0].ramps.d.red_size; - table1.filters[1].ramps.d.green = table1.filters[1].ramps.d.red + table1.filters[1].ramps.d.red_size; - table1.filters[0].ramps.d.blue = table1.filters[0].ramps.d.green + table1.filters[0].ramps.d.green_size; - table1.filters[1].ramps.d.blue = table1.filters[1].ramps.d.green + table1.filters[1].ramps.d.green_size; - - ctx1.error.number = UINT64_MAX; - ctx1.error.custom = 1; - ctx1.error.server_side = 0; - ctx1.error.description = "description"; - ctx1.fd = 3; - ctx1.have_all_headers = 1; - ctx1.bad_message = 0; - ctx1.blocking = 2; - ctx1.message_id = UINT32_MAX; - ctx1.in_response_to = UINT32_MAX - 1; - ctx1.outbound = "0123456789"; - ctx1.outbound_head = 7; - ctx1.outbound_tail = 2; - ctx1.outbound_size = 10; - ctx1.inbound = "abcdefghi"; - ctx1.inbound_head = 6; - ctx1.inbound_tail = 3; - ctx1.inbound_size = 9; - ctx1.length = 100; - ctx1.curline = 5; - - async1.message_id = UINT32_MAX; - async1.coalesce = 1; - - n = libcoopgamma_filter_marshal(&filter1, NULL); - n += libcoopgamma_crtc_info_marshal(&crtc1, NULL); - n += libcoopgamma_filter_query_marshal(&query1, NULL); - n += libcoopgamma_filter_table_marshal(&table1, NULL); - n += libcoopgamma_context_marshal(&ctx1, NULL); - n += libcoopgamma_async_context_marshal(&async1, NULL); - - buf = malloc(n); - n = libcoopgamma_filter_marshal(&filter1, buf); - n += libcoopgamma_crtc_info_marshal(&crtc1, buf + n); - n += libcoopgamma_filter_query_marshal(&query1, buf + n); - n += libcoopgamma_filter_table_marshal(&table1, buf + n); - n += libcoopgamma_context_marshal(&ctx1, buf + n); - n += libcoopgamma_async_context_marshal(&async1, buf + n); - - if (libcoopgamma_filter_unmarshal(&filter2, buf, &m)) return 1; else n = m; - if (libcoopgamma_crtc_info_unmarshal(&crtc2, buf + n, &m)) return 2; else n += m; - if (libcoopgamma_filter_query_unmarshal(&query2, buf + n, &m)) return 3; else n += m; - if (libcoopgamma_filter_table_unmarshal(&table2, buf + n, &m)) return 4; else n += m; - if (libcoopgamma_context_unmarshal(&ctx2, buf + n, &m)) return 5; else n += m; - if (libcoopgamma_async_context_unmarshal(&async2, buf + n, &m)) return 6; - free(buf); - - if ((filter1.priority != filter2.priority) || - (!streq(filter1.crtc, filter2.crtc)) || - (!streq(filter1.class, filter2.class)) || - (filter1.lifespan != filter2.lifespan) || - (filter1.depth != filter2.depth) || - (!rampseq(&(filter1.ramps), &(filter2.ramps), filter1.depth))) - return 7; - - if ((crtc1.cooperative != crtc2.cooperative) || - (crtc1.depth != crtc2.depth) || - (crtc1.supported != crtc2.supported) || - (crtc1.red_size != crtc2.red_size) || - (crtc1.green_size != crtc2.green_size) || - (crtc1.blue_size != crtc2.blue_size) || - (crtc1.colourspace != crtc2.colourspace) || - (crtc1.have_gamut != crtc2.have_gamut) || - (crtc1.red_x != crtc2.red_x) || - (crtc1.red_y != crtc2.red_y) || - (crtc1.green_x != crtc2.green_x) || - (crtc1.green_y != crtc2.green_y) || - (crtc1.blue_x != crtc2.blue_x) || - (crtc1.blue_y != crtc2.blue_y) || - (crtc1.white_x != crtc2.white_x) || - (crtc1.white_y != crtc2.white_y)) - return 8; - - if ((query1.high_priority != query2.high_priority) || - (query1.low_priority != query2.low_priority) || - !streq(query1.crtc, query2.crtc) || - (query1.coalesce != query2.coalesce)) - return 9; - - if ((table1.red_size != table2.red_size) || - (table1.green_size != table2.green_size) || - (table1.blue_size != table2.blue_size) || - (table1.filter_count != table2.filter_count) || - (table1.depth != table2.depth)) - return 10; - for (i = 0; i < table1.filter_count; i++) - if ((table1.filters[i].priority != table2.filters[i].priority) || - !streq(table1.filters[i].class, table2.filters[i].class) || - !rampseq(&(table1.filters[i].ramps), &(table2.filters[i].ramps), table1.depth)) - return 11; - - if ((ctx1.error.number != ctx2.error.number) || - (ctx1.error.custom != ctx2.error.custom) || - (ctx1.error.server_side != ctx2.error.server_side) || - !streq(ctx1.error.description, ctx2.error.description)) - return 12; - - if ((ctx1.fd != ctx2.fd) || - (ctx1.have_all_headers != ctx2.have_all_headers) || - (ctx1.bad_message != ctx2.bad_message) || - (ctx1.blocking != ctx2.blocking) || - (ctx1.message_id != ctx2.message_id) || - (ctx1.in_response_to != ctx2.in_response_to) || - (ctx1.length != ctx2.length) || - (ctx1.curline != ctx2.curline)) - return 13; - - if ((ctx2.outbound_head > ctx2.outbound_size) || - (ctx2.outbound_tail > ctx2.outbound_size) || - (ctx2.inbound_head > ctx2.inbound_size) || - (ctx2.inbound_tail > ctx2.inbound_size)) - return 14; - - if (((n = ctx1.outbound_head - ctx1.outbound_tail) != ctx2.outbound_head - ctx2.outbound_tail) || - ((m = ctx1.inbound_head - ctx1.inbound_tail) != ctx2.inbound_head - ctx2.inbound_tail)) - return 15; - - if (memcmp(ctx1.outbound + ctx1.outbound_tail, ctx2.outbound + ctx2.outbound_tail, n) || - memcmp(ctx1.inbound + ctx1.inbound_tail, ctx2.inbound + ctx2.inbound_tail, m)) - return 16; - - if ((async1.message_id != async2.message_id) || - (async1.coalesce != async2.coalesce)) - return 17; - - return 0; -} - diff --git a/test.c b/test.c new file mode 100644 index 0000000..11842c0 --- /dev/null +++ b/test.c @@ -0,0 +1,257 @@ +/* See LICENSE file for copyright and license details. */ +#include "libcoopgamma.h" + +#include +#include +#include + + +static int +streq(const char *a, const char *b) +{ + if (!a != !b) + return 0; + return !a || !strcmp(a, b); +} + + +static int +rampseq(const libcoopgamma_ramps_t *a, const libcoopgamma_ramps_t *b, libcoopgamma_depth_t depth) +{ + size_t nr, ng, nb, width; + + if (a->u8.red_size != b->u8.red_size || + a->u8.green_size != b->u8.green_size || + a->u8.blue_size != b->u8.blue_size) + return 0; + + if (depth == -2) + width = sizeof(double); + else if (depth == -1) + width = sizeof(float); + else + width = ((size_t)depth) / 8; + + nr = a->u8.red_size * width; + ng = a->u8.green_size * width; + nb = a->u8.blue_size * width; + + if (memcmp(a->u8.red, b->u8.red, nr + ng + nb) || + memcmp(a->u8.green, b->u8.green, ng + nb) || + memcmp(a->u8.blue, b->u8.blue, nb)) + return 0; + + return 1; +} + + +int +main(void) +{ + libcoopgamma_filter_t filter1, filter2; + libcoopgamma_crtc_info_t crtc1, crtc2; + libcoopgamma_filter_query_t query1, query2; + libcoopgamma_filter_table_t table1, table2; + libcoopgamma_context_t ctx1, ctx2; + libcoopgamma_async_context_t async1, async2; + size_t n, m, i; + char* buf; + + filter1.priority = INT64_MIN; + filter1.crtc = "CRTC"; + filter1.class = "A::B::C::D"; + filter1.lifespan = LIBCOOPGAMMA_UNTIL_REMOVAL; + filter1.depth = LIBCOOPGAMMA_DOUBLE; + filter1.ramps.d.red_size = 4; + filter1.ramps.d.green_size = 5; + filter1.ramps.d.blue_size = 6; + filter1.ramps.d.red = (double[]){0.0, 0.1, 0.2, 0.5, + 0.3, 0.11, 0.22, 0.45, 0.9, + -1, -0.5, 0, 0.5, 1, 1.5}; + filter1.ramps.d.green = filter1.ramps.d.red + filter1.ramps.d.red_size; + filter1.ramps.d.blue = filter1.ramps.d.green + filter1.ramps.d.green_size; + + crtc1.cooperative = 0; + crtc1.depth = LIBCOOPGAMMA_DOUBLE; + crtc1.supported = LIBCOOPGAMMA_YES; + crtc1.red_size = 4; + crtc1.green_size = 5; + crtc1.blue_size = 6; + crtc1.colourspace = LIBCOOPGAMMA_SRGB; + crtc1.have_gamut = 1; + crtc1.red_x = 100; + crtc1.red_y = 50; + crtc1.green_x = 300; + crtc1.green_y = 350; + crtc1.blue_x = 200; + crtc1.blue_y = 260; + crtc1.white_x = 500; + crtc1.white_y = 999; + + query1.high_priority = INT64_MIN; + query1.low_priority = INT64_MIN; + query1.crtc = "crtc"; + query1.coalesce = 1; + + table1.red_size = 4; + table1.green_size = 5; + table1.blue_size = 6; + table1.filter_count = 2; + table1.filters = (libcoopgamma_queried_filter_t[]){ + { + .priority = UINT64_MAX, + .class = "a::b::c", + .ramps.d = {.red_size = 4, + .green_size = 5, + .blue_size = 6, + .red = (double[]){0.0, 0.1, 0.2, 0.5, + 0.3, 0.11, 0.22, 0.45, 0.9, + -1, -0.5, 0, 0.5, 1, 1.5}} + }, { + .priority = UINT64_MAX - 1, + .class = NULL, + .ramps.d = {.red_size = 4, + .green_size = 5, + .blue_size = 6, + .red = (double[]){0.02, 0.12, 0.22, 0.52, + 0.32, 0.112, 0.222, 0.452, 0.92, + -12, -0.52, 0.2, 0.52, 12, 1.52}} + } + }; + table1.depth = LIBCOOPGAMMA_DOUBLE; + table1.filters[0].ramps.d.green = table1.filters[0].ramps.d.red + table1.filters[0].ramps.d.red_size; + table1.filters[1].ramps.d.green = table1.filters[1].ramps.d.red + table1.filters[1].ramps.d.red_size; + table1.filters[0].ramps.d.blue = table1.filters[0].ramps.d.green + table1.filters[0].ramps.d.green_size; + table1.filters[1].ramps.d.blue = table1.filters[1].ramps.d.green + table1.filters[1].ramps.d.green_size; + + ctx1.error.number = UINT64_MAX; + ctx1.error.custom = 1; + ctx1.error.server_side = 0; + ctx1.error.description = "description"; + ctx1.fd = 3; + ctx1.have_all_headers = 1; + ctx1.bad_message = 0; + ctx1.blocking = 2; + ctx1.message_id = UINT32_MAX; + ctx1.in_response_to = UINT32_MAX - 1; + ctx1.outbound = "0123456789"; + ctx1.outbound_head = 7; + ctx1.outbound_tail = 2; + ctx1.outbound_size = 10; + ctx1.inbound = "abcdefghi"; + ctx1.inbound_head = 6; + ctx1.inbound_tail = 3; + ctx1.inbound_size = 9; + ctx1.length = 100; + ctx1.curline = 5; + + async1.message_id = UINT32_MAX; + async1.coalesce = 1; + + n = libcoopgamma_filter_marshal(&filter1, NULL); + n += libcoopgamma_crtc_info_marshal(&crtc1, NULL); + n += libcoopgamma_filter_query_marshal(&query1, NULL); + n += libcoopgamma_filter_table_marshal(&table1, NULL); + n += libcoopgamma_context_marshal(&ctx1, NULL); + n += libcoopgamma_async_context_marshal(&async1, NULL); + + buf = malloc(n); + n = libcoopgamma_filter_marshal(&filter1, buf); + n += libcoopgamma_crtc_info_marshal(&crtc1, &buf[n]); + n += libcoopgamma_filter_query_marshal(&query1, &buf[n]); + n += libcoopgamma_filter_table_marshal(&table1, &buf[n]); + n += libcoopgamma_context_marshal(&ctx1, &buf[n]); + n += libcoopgamma_async_context_marshal(&async1, &buf[n]); + + if (libcoopgamma_filter_unmarshal(&filter2, buf, &m)) return 1; else n = m; + if (libcoopgamma_crtc_info_unmarshal(&crtc2, &buf[n], &m)) return 2; else n += m; + if (libcoopgamma_filter_query_unmarshal(&query2, &buf[n], &m)) return 3; else n += m; + if (libcoopgamma_filter_table_unmarshal(&table2, &buf[n], &m)) return 4; else n += m; + if (libcoopgamma_context_unmarshal(&ctx2, &buf[n], &m)) return 5; else n += m; + if (libcoopgamma_async_context_unmarshal(&async2, &buf[n], &m)) return 6; + free(buf); + + if (filter1.priority != filter2.priority || + !streq(filter1.crtc, filter2.crtc) || + !streq(filter1.class, filter2.class) || + filter1.lifespan != filter2.lifespan || + filter1.depth != filter2.depth || + !rampseq(&filter1.ramps, &filter2.ramps, filter1.depth)) + return 7; + + if (crtc1.cooperative != crtc2.cooperative || + crtc1.depth != crtc2.depth || + crtc1.supported != crtc2.supported || + crtc1.red_size != crtc2.red_size || + crtc1.green_size != crtc2.green_size || + crtc1.blue_size != crtc2.blue_size || + crtc1.colourspace != crtc2.colourspace || + crtc1.have_gamut != crtc2.have_gamut || + crtc1.red_x != crtc2.red_x || + crtc1.red_y != crtc2.red_y || + crtc1.green_x != crtc2.green_x || + crtc1.green_y != crtc2.green_y || + crtc1.blue_x != crtc2.blue_x || + crtc1.blue_y != crtc2.blue_y || + crtc1.white_x != crtc2.white_x || + crtc1.white_y != crtc2.white_y) + return 8; + + if (query1.high_priority != query2.high_priority || + query1.low_priority != query2.low_priority || + !streq(query1.crtc, query2.crtc) || + query1.coalesce != query2.coalesce) + return 9; + + if (table1.red_size != table2.red_size || + table1.green_size != table2.green_size || + table1.blue_size != table2.blue_size || + table1.filter_count != table2.filter_count || + table1.depth != table2.depth) + return 10; + for (i = 0; i < table1.filter_count; i++) + if (table1.filters[i].priority != table2.filters[i].priority || + !streq(table1.filters[i].class, table2.filters[i].class) || + !rampseq(&table1.filters[i].ramps, &table2.filters[i].ramps, table1.depth)) + return 11; + + if (ctx1.error.number != ctx2.error.number || + ctx1.error.custom != ctx2.error.custom || + ctx1.error.server_side != ctx2.error.server_side || + !streq(ctx1.error.description, ctx2.error.description)) + return 12; + + if (ctx1.fd != ctx2.fd || + ctx1.have_all_headers != ctx2.have_all_headers || + ctx1.bad_message != ctx2.bad_message || + ctx1.blocking != ctx2.blocking || + ctx1.message_id != ctx2.message_id || + ctx1.in_response_to != ctx2.in_response_to || + ctx1.length != ctx2.length || + ctx1.curline != ctx2.curline) + return 13; + + if (ctx2.outbound_head > ctx2.outbound_size || + ctx2.outbound_tail > ctx2.outbound_size || + ctx2.inbound_head > ctx2.inbound_size || + ctx2.inbound_tail > ctx2.inbound_size) + return 14; + + if ((n = ctx1.outbound_head - ctx1.outbound_tail) != ctx2.outbound_head - ctx2.outbound_tail || + (m = ctx1.inbound_head - ctx1.inbound_tail) != ctx2.inbound_head - ctx2.inbound_tail) + return 15; + + if (memcmp(ctx1.outbound + ctx1.outbound_tail, ctx2.outbound + ctx2.outbound_tail, n) || + memcmp(ctx1.inbound + ctx1.inbound_tail, ctx2.inbound + ctx2.inbound_tail, m)) + return 16; + + if (async1.message_id != async2.message_id || + async1.coalesce != async2.coalesce) + return 17; + + libcoopgamma_context_destroy(&ctx2, 1); + libcoopgamma_filter_destroy(&filter2); + libcoopgamma_filter_query_destroy(&query2); + libcoopgamma_filter_table_destroy(&table2); + return 0; +} -- cgit v1.2.3-70-g09d2