diff --git a/.gitignore b/.gitignore
index ea2a934..d0d3e2a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,3 @@
/LICENSE.*
/test/
/todo/
-/c/lib/
-/c/obj/
-compile_commands.json
diff --git a/c/COPYING b/c/COPYING
deleted file mode 100644
index f288702..0000000
--- a/c/COPYING
+++ /dev/null
@@ -1,674 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 3, 29 June 2007
-
- 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.
-
- Preamble
-
- 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
-.
diff --git a/c/Makefile b/c/Makefile
deleted file mode 100644
index 623fa85..0000000
--- a/c/Makefile
+++ /dev/null
@@ -1,59 +0,0 @@
-# Tools Makefile
-#
-# Copyright (C) 2023 Bruno Raoult ("br")
-# Licensed under the GNU General Public License v3.0 or later.
-# Some rights reserved. See COPYING.
-#
-# You should have received a copy of the GNU General Public License along with this
-# program. If not, see .
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-
-SHELL := /bin/bash
-CC := gcc
-BEAR := bear
-
-CFLAGS += -std=gnu11
-CFLAGS += -O2
-CFLAGS += -g
-CFLAGS += -Wall
-CFLAGS += -Wextra
-CFLAGS += -march=native
-CFLAGS += -Wmissing-declarations
-CFLAGS += -Wno-unused-result
-# for gprof
-#CFLAGS += -pg
-# Next one may be useful for valgrind (some invalid instructions)
-#CFLAGS += -mno-tbm
-
-CPPFLAGS += -DDEBUG_DEBUG # activate general debug (debug.c)
-CPPFLAGS += -DDEBUG_POOL # memory pools management
-
-INCDIR := ./include
-LIBDIR := ./lib
-OBJDIR := ./obj
-BRLIBDIR := ./brlib
-
-LIBNAME := br_$(shell uname -m)
-#LIB := lib$(LIBNAME)
-
-
-all: brlib
-
-#export LD_LIBRARY_PATH = $(LIBDIR)
-
-.PHONY: all brlib clean
-
-all: brlib
-
-brlib:
- $(MAKE) -C $(BRLIBDIR)
-
-bear ccls:
- @echo building ccls language server compilation database
- $(MAKE) -C $(BRLIBDIR) ccls
-
-clean:
- @echo cleaning brlib.
- @$(MAKE) -C $(BRLIBDIR) clean
diff --git a/c/brlib/Makefile b/c/brlib/Makefile
deleted file mode 100644
index 083645a..0000000
--- a/c/brlib/Makefile
+++ /dev/null
@@ -1,298 +0,0 @@
-# brlib Makefile - GNU make only
-#
-# Copyright (C) 2021-2023 Bruno Raoult ("br")
-# Licensed under the GNU General Public License v3.0 or later.
-# Some rights reserved. See COPYING.
-#
-# You should have received a copy of the GNU General Public License along with this
-# program. If not, see .
-#
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-
-# important to know where exactly is project root dir
-ROOTDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
-
-SHELL := /bin/bash
-CC := gcc
-LD := ld
-BEAR := bear
-TOUCH := touch
-RM := rm
-MKDIR := mkdir -p
-RMDIR := rmdir
-
-SRCDIR := ./src
-INCDIR := ./include
-OBJDIR := ./obj
-LIBDIR := ./lib
-BINDIR := ./bin
-DEPDIR := ./dep
-TESTDIR := ./test
-
-SRC := $(wildcard $(SRCDIR)/*.c) # brlib sources
-SRC_FN := $(notdir $(SRC)) # source basename
-OBJ := $(addprefix $(OBJDIR)/,$(SRC_FN:.c=.o))
-
-LIB := br_$(shell uname -m) # library name
-SLIB := $(addsuffix .a, $(LIBDIR)/lib$(LIB)) # static lib
-DLIB := $(addsuffix .so, $(LIBDIR)/lib$(LIB)) # dynamic lib
-
-DEP_FN := $(SRC_FN) $(LIBSRC_FN)
-DEP := $(addprefix $(DEPDIR)/,$(DEP_FN:.c=.d))
-
-TESTSRC := $(wildcard $(TESTDIR)/*.c)
-TEST_FN := $(notdir $(TESTSRC))
-BIN := $(addprefix $(BINDIR)/,$(TEST_FN:.c=))
-
-##################################### emacs projectile/ccls dirs & files
-PRJROOT := .projectile
-EMACSLSP := .dir-locals.el
-
-CCLSROOT := .ccls-root
-CCLSFILE := .ccls
-CCLSCMDS := compile_commands.json
-
-##################################### pre-processor flags
-CPPFLAGS := -I$(INCDIR)
-#CPPFLAGS += -DDEBUG # global
-#CPPFLAGS += -DDEBUG_DEBUG_C # log() funcs debug
-CPPFLAGS += -DDEBUG_DEBUG # activate logs funcs
-CPPFLAGS += -DDEBUG_POOL # mem pools
-
-# remove extraneous spaces (due to spaces before comments)
-CPPFLAGS := $(strip $(CPPFLAGS))
-
-##################################### compiler flags
-CFLAGS := -std=gnu11
-CFLAGS += -O2
-CFLAGS += -g
-CFLAGS += -Wall
-CFLAGS += -Wextra
-CFLAGS += -march=native
-CFLAGS += -Wmissing-declarations
-CFLAGS += -Wno-unused-result
-CFLAGS += -fPIC
-# for gprof
-#CFLAGS += -pg
-# Next one may be useful for valgrind (some invalid instructions)
-# CFLAGS += -mno-tbm
-
-CFLAGS := $(strip $(CFLAGS))
-
-##################################### archiver/linker/dependency flags
-ARFLAGS := rcs
-LDFLAGS := -L$(LIBDIR)
-DEPFLAGS = -MMD -MP -MF $(DEPDIR)/$*.d
-
-##################################### General targets
-.PHONY: all compile clean cleanall cleanallall
-
-all: libs
-
-compile: objs
-
-test: testbins
-
-clean: cleandep cleanobj cleanlib cleanbin
-
-cleanall: clean cleandepdir cleanobjdir cleanlibdir cleanbindir
-
-cleanallall: cleanall cleanemacs
-
-# setup emacs projectile/ccls
-emacs: emacs-setup
-# update compile-commands.json
-ccls: $(CCLSCMDS)
-
-##################################### cleaning functions
-# rmfiles - deletes a list of files in a directory if they exist.
-# $(1): the directory
-# $(2): the list of files to delete
-# $(3): The string to include in action output - "cleaning X files."
-# see: https://stackoverflow.com/questions/6783243/functions-in-makefiles
-#
-# Don't use wildcard like "$(DIR)/*.o", so we can control mismatches between
-# list and actual files in directory.
-# See rmdir below.
-define rmfiles
- @#echo "rmfiles=+$(1)+"
- $(eval $@_EXIST = $(wildcard $(1)))
- @#echo "existfile=+${$@_EXIST}+"
- @if [[ -n "${$@_EXIST}" ]]; then \
- echo "cleaning $(2) files." ; \
- $(RM) ${$@_EXIST} ; \
- fi
-endef
-
-# rmdir - deletes a directory if it exists.
-# $(1): the directory
-# $(2): The string to include in action output - "removing X dir."
-#
-# Don't use $(RM) -rf, to control unexpected dep files.
-# See rmfile above.
-define rmdir
- @#echo "rmdir +$(1)+"
- $(eval $@_EXIST = $(wildcard $(1)))
- @#echo "existdir=+${$@_EXIST}+"
- @if [[ -n "${$@_EXIST}" ]]; then \
- echo "removing $(2) dir." ; \
- $(RMDIR) ${$@_EXIST} ; \
- fi
-endef
-
-##################################### dirs creation
-.PHONY: alldirs
-
-ALLDIRS := $(DEPDIR) $(OBJDIR) $(LIBDIR) $(BINDIR)
-
-alldirs: $(ALLDIRS)
-
-# Here, we have something like:
-# a: a
-# a will be built if (1) older than a, or (2) does not exist. Here only (2).
-$(ALLDIRS): $@
- @echo creating $@ directory.
- @$(MKDIR) $@
-
-##################################### Dependencies files
-.PHONY: cleandep cleandepdir
-
--include $(wildcard $(DEP))
-
-# Don't use $(DEPDIR)/*.d, to control mismatches between dep and src files.
-# See second rule below.
-cleandep:
- $(call rmfiles,$(DEP),depend)
- @#echo cleaning dependency files.
- @#$(RM) -f $(DEP)
-
-cleandepdir:
- $(call rmdir,$(DEPDIR),depend)
- @#[ -d $(DEPDIR) ] && echo cleaning depend files && $(RM) -f $(DEP) || true
-
-##################################### objects
-.PHONY: objs cleanobj cleanobjdir
-
-objs: $(OBJ)
-
-cleanobj:
- $(call rmfiles,$(OBJ),brlib object)
-
-cleanobjdir:
- $(call rmdir,$(OBJDIR),brlib objects)
-
-$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR) $(DEPDIR)
- @echo compiling $< "->" $@.
- $(CC) -c $(DEPFLAGS) $(CPPFLAGS) $(CFLAGS) $< -o $@
-
-##################################### brlib libraries
-.PHONY: libs cleanlib cleanlibdir
-
-libs: $(DLIB) $(SLIB)
-
-cleanlib:
- $(call rmfiles,$(DLIB) $(SLIB),library)
-
-cleanlibdir:
- $(call rmdir,$(LIBDIR),libraries)
-
-#$(DLIB): CFLAGS += -fPIC
-$(DLIB): LDFLAGS += -shared
-$(DLIB): $(OBJ) | $(LIBDIR)
- @echo "building shared library ($@)."
- $(CC) $(CFLAGS) $(LDFLAGS) $? -o $@
-
-$(SLIB): $(OBJ) | $(LIBDIR)
- @echo "building static library ($@)."
- $(AR) $(ARFLAGS) $@ $? > /dev/null
-
-##################################### tests
-.PHONY: testbins cleanbin cleanbindir
-
-testbins: $(BIN)
- echo $^
-
-cleanbin:
- $(call rmfiles,$(TARGET),binary)
-
-cleanbindir:
- $(call rmdir,$(BINDIR),binaries)
-
-##################################### pre-processed (.i) and assembler (.s) output
-%.i: %.c
- @echo generating $@
- @$(CC) -E $(CPPFLAGS) $(CFLAGS) $< -o $@
-
-%.s: %.c
- @echo generating $@
- @$(CC) -S -fverbose-asm $(CPPFLAGS) $(CFLAGS) $< -o $@
-
-##################################### Emacs
-.PHONY: emacs-setup cleanemacs
-
-emacs-setup: $(PRJROOT) $(EMACSLSP)
-
-cleanemacs:
- $(call rmfiles, $(PRJROOT) $(EMACSLSP), Emacs);
-
-$(PRJROOT) $(EMACSLSP):
- @if [[ $(@) = $(PRJROOT) ]] ; \
- then \
- echo "creating Emacs's projectile root file." ; \
- else \
- echo "creating Emacs's ccls root file." ; \
- fi
- @$(TOUCH) $@
-
-##################################### LSP (ccls)
-.PHONY: cleanccls
-
-cleanccls:
- $(call rmfiles, $(CCLSROOT), ccls);
-
-$(CCLSROOT):
- echo "creating ccls root file."
- @$(TOUCH) $@
-
-# generate compile_commands.json.
-# TODO: add includes and Makefile dependencies.
-# also, if cclsfile is newer than sources, no need to clean objects file
-# (and to run bear).
-# maybe run cleanobj cleanlibobj in commands ?
-$(CCLSCMDS): cleanobj $(SRC) | $(CCLSROOT)
- @echo "Generating ccls compile commands file ($@)."
- @$(BEAR) -- make compile
-
-#.PHONY: bear
-#bear: cleanobj cleanlibobj Makefile | $(CCLSROOT)
-# @$(BEAR) -- make compile
-
-##################################### valgrind (mem check)
-.PHONY: memcheck
-
-VALGRIND := valgrind
-VALGRINDFLAGS := --leak-check=full --show-leak-kinds=all
-VALGRINDFLAGS += --track-origins=yes --sigill-diagnostics=yes
-VALGRINDFLAGS += --quiet --show-error-list=yes
-VALGRINDFLAGS += --log-file=valgrind.out
-# We need to suppress libreadline leaks here. See :
-# https://stackoverflow.com/questions/72840015
-VALGRINDFLAGS += --suppressions=etc/libreadline.supp
-
-memcheck: targets
- @$(VALGRIND) $(VALGRINDFLAGS) $(BINDIR)/brchess
-
-##################################### Makefile debug
-.PHONY: showflags wft
-
-showflags:
- @echo CFLAGS: "$(CFLAGS)"
- @echo CPPFLAGS: $(CPPFLAGS)
- @echo DEPFLAGS: $(DEPFLAGS)
- @echo LDFLAGS: $(LDFLAGS)
-
-wtf:
- @printf "ROOTDIR=+%s+\n\n" "$(ROOTDIR)"
- @printf "OBJDIR=%s\n\n" "$(OBJDIR)"
- @printf "OBJ=%s\n\n" "$(OBJ)"
diff --git a/c/brlib/include/bits.h b/c/brlib/include/bits.h
deleted file mode 100644
index 6ca0aa9..0000000
--- a/c/brlib/include/bits.h
+++ /dev/null
@@ -1,499 +0,0 @@
-/* bits.h - bits functions.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-#ifndef _BITS_H
-#define _BITS_H
-
-#include
-#include
-#include /* defines __WORDSIZE: 32 or 64 */
-
-void bits_implementation(void);
-
-#ifndef __has_builtin
-#define __has_builtin(x) 0
-#endif
-
-/* no plan to support 32bits for now...
- * #if __WORDSIZE != 64
- * #error "Only 64 bits word size supported."
- * #endif
- */
-
-/* fixed-size types
- */
-typedef int64_t s64;
-typedef int32_t s32;
-typedef int16_t s16;
-typedef int8_t s8;
-
-typedef uint64_t u64;
-typedef uint32_t u32;
-typedef uint16_t u16;
-typedef uint8_t u8;
-
-/* convenience types
- */
-typedef long long int llong;
-typedef unsigned long long int ullong;
-typedef unsigned long int ulong;
-typedef unsigned int uint;
-typedef unsigned short ushort;
-typedef unsigned char uchar;
-/* char is a special case, as it can be signed or unsigned
- */
-typedef signed char schar;
-
-/* define common types sizes
- */
-#define BITS_PER_CHAR 8
-
-#ifndef BITS_PER_SHORT
-#define BITS_PER_SHORT (BITS_PER_CHAR * sizeof (short))
-#endif
-#ifndef BITS_PER_INT
-#define BITS_PER_INT (BITS_PER_CHAR * sizeof (int))
-#endif
-#ifndef BITS_PER_LONG
-#define BITS_PER_LONG (BITS_PER_CHAR * sizeof (long))
-#endif
-#ifndef BITS_PER_LLONG
-#define BITS_PER_LLONG (BITS_PER_CHAR * sizeof (long long))
-#endif
-
-/* count set bits: 10101000 -> 3
- * ^ ^ ^
- */
-static __always_inline int popcount64(u64 n)
-{
-# if __has_builtin(__builtin_popcountl)
- return __builtin_popcountl(n);
-
-# else
- int count = 0;
- while (n) {
- count++;
- n &= (n - 1);
- }
- return count;
-# endif
-}
-
-static __always_inline int popcount32(u32 n)
-{
-# if __has_builtin(__builtin_popcount)
- return __builtin_popcount(n);
-
-# else
- int count = 0;
- while (n) {
- count++;
- n &= (n - 1);
- }
- return count;
-# endif
-}
-
-/* count trailing zeroes : 00101000 -> 3
- * ^^^
- */
-static __always_inline int ctz64(u64 n)
-{
-# if __has_builtin(__builtin_ctzl)
- return __builtin_ctzl(n);
-
-# elif __has_builtin(__builtin_clzl)
- return __WORDSIZE - (__builtin_clzl(n & -n) + 1);
-
-# else
- return popcount64((n & -n) - 1);
-# endif
-}
-
-static __always_inline int ctz32(u32 n)
-{
-# if __has_builtin(__builtin_ctz)
- return __builtin_ctzl(n);
-
-# elif __has_builtin(__builtin_clz)
- return __WORDSIZE - (__builtin_clz(n & -n) + 1);
-
-# else
- return popcount32((n & -n) - 1);
-# endif
-}
-
-/* clz - count leading zeroes : 00101000 -> 2
- * ^^
- */
-static __always_inline int clz64(u64 n)
-{
-# if __has_builtin(__builtin_clzl)
- return __builtin_clzl(n);
-
-# else
- u64 r, q;
-
- r = (n > 0xFFFFFFFF) << 5; n >>= r;
- q = (n > 0xFFFF) << 4; n >>= q; r |= q;
- q = (n > 0xFF ) << 3; n >>= q; r |= q;
- q = (n > 0xF ) << 2; n >>= q; r |= q;
- q = (n > 0x3 ) << 1; n >>= q; r |= q;
- r |= (n >> 1);
- return 64 - r - 1;
-# endif
-}
-
-static __always_inline int clz32(u32 n)
-{
-# if __has_builtin(__builtin_clz)
- return __builtin_clz(n);
-
-# else
- u32 r, q;
-
- r = (n > 0xFFFF) << 4; n >>= r;
- q = (n > 0xFF ) << 3; n >>= q; r |= q;
- q = (n > 0xF ) << 2; n >>= q; r |= q;
- q = (n > 0x3 ) << 1; n >>= q; r |= q;
- r |= (n >> 1);
- return 32 - r - 1;
-# endif
-}
-
-/* fls - find last set : 00101000 -> 6
- * ^
- */
-static __always_inline int fls64(u64 n)
-{
- if (!n)
- return 0;
- return 64 - clz64(n);
-}
-
-static __always_inline int fls32(u32 n)
-{
- if (!n)
- return 0;
- return 32 - clz32(n);
-}
-
-/* find first set : 00101000 -> 4
- * ^
- */
-static __always_inline uint ffs64(u64 n)
-{
-# if __has_builtin(__builtin_ffsl)
- return __builtin_ffsl(n);
-
-# elif __has_builtin(__builtin_ctzl)
- if (n == 0)
- return (0);
- return __builtin_ctzl(n) + 1;
-
-# else
- return popcount64(n ^ ~-n);
-# endif
-}
-
-static __always_inline uint ffs32(u32 n)
-{
-# if __has_builtin(__builtin_ffs)
- return __builtin_ffs(n);
-
-# elif __has_builtin(__builtin_ctz)
- if (n == 0)
- return (0);
- return __builtin_ctz(n) + 1;
-
-# else
- return popcount32(n ^ ~-n);
-# endif
-}
-
-/* rolXX/rorXX are taken from kernel's are are:
- * SPDX-License-Identifier: GPL-2.0
- */
-
-/**
- * rol64 - rotate a 64-bit value left
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u64 rol64(u64 word, unsigned int shift)
-{
- return (word << (shift & 63)) | (word >> ((-shift) & 63));
-}
-
-/**
- * ror64 - rotate a 64-bit value right
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u64 ror64(u64 word, unsigned int shift)
-{
- return (word >> (shift & 63)) | (word << ((-shift) & 63));
-}
-
-/**
- * rol32 - rotate a 32-bit value left
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u32 rol32(u32 word, unsigned int shift)
-{
- return (word << (shift & 31)) | (word >> ((-shift) & 31));
-}
-
-/**
- * ror32 - rotate a 32-bit value right
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u32 ror32(u32 word, unsigned int shift)
-{
- return (word >> (shift & 31)) | (word << ((-shift) & 31));
-}
-
-/**
- * rol16 - rotate a 16-bit value left
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u16 rol16(u16 word, unsigned int shift)
-{
- return (word << (shift & 15)) | (word >> ((-shift) & 15));
-}
-
-/**
- * ror16 - rotate a 16-bit value right
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u16 ror16(u16 word, unsigned int shift)
-{
- return (word >> (shift & 15)) | (word << ((-shift) & 15));
-}
-
-/**
- * rol8 - rotate an 8-bit value left
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u8 rol8(u8 word, unsigned int shift)
-{
- return (word << (shift & 7)) | (word >> ((-shift) & 7));
-}
-
-/**
- * ror8 - rotate an 8-bit value right
- * @word: value to rotate
- * @shift: bits to roll
- */
-static inline u8 ror8(u8 word, unsigned int shift)
-{
- return (word >> (shift & 7)) | (word << ((-shift) & 7));
-}
-
-/**
- * __ilog2 - non-constant log of base 2 calculators
- * - the arch may override these in asm/bitops.h if they can be implemented
- * more efficiently than using fls() and fls64()
- * - the arch is not required to handle n==0 if implementing the fallback
- */
-static __always_inline __attribute__((const))
-int __ilog2_u64(u64 n)
-{
- return fls64(n) - 1;
-}
-
-static __always_inline __attribute__((const))
-int __ilog2_u32(u32 n)
-{
- return fls32(n) - 1;
-}
-
-/**
- * is_power_of_2() - check if a value is a power of two
- * @n: the value to check
- *
- * Determine whether some value is a power of two, where zero is
- * *not* considered a power of two.
- * Return: true if @n is a power of 2, otherwise false.
- */
-static inline __attribute__((const))
-bool is_power_of_2(unsigned long n)
-{
- return (n != 0 && ((n & (n - 1)) == 0));
-}
-
-/**
- * __roundup_pow_of_two() - round up to nearest power of two
- * @n: value to round up
- */
-static inline __attribute__((const))
-u64 __roundup_pow_of_two(u64 n)
-{
- return 1UL << fls64(n - 1);
-}
-
-/**
- * __rounddown_pow_of_two() - round down to nearest power of two
- * @n: value to round down
- */
-static inline __attribute__((const)) u64 __rounddown_pow_of_two(u64 n)
-{
- return 1UL << (fls64(n) - 1);
-}
-
-/**
- * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value
- * @n: parameter
- *
- * constant-capable log of base 2 calculation
- * - this can be used to initialise global variables from constant data, hence
- * the massive ternary operator construction
- *
- * selects the appropriately-sized optimised version depending on sizeof(n)
- */
-#define ilog2(n) \
-( \
- __builtin_constant_p(n) ? \
- ((n) < 2 ? 0 : \
- 63 - __builtin_clzll(n)) : \
- (sizeof(n) <= 4) ? \
- __ilog2_u32(n) : \
- __ilog2_u64(n) \
- )
-
-/**
- * roundup_pow_of_two - round the given value up to nearest power of two
- * @n: parameter
- *
- * round the given value up to the nearest power of two
- * - the result is undefined when n == 0
- * - this can be used to initialise global variables from constant data
- */
-#define roundup_pow_of_two(n) \
-( \
- __builtin_constant_p(n) ? ( \
- ((n) == 1) ? 1 : \
- (1UL << (ilog2((n) - 1) + 1)) \
- ) : \
- __roundup_pow_of_two(n) \
- )
-
-/**
- * rounddown_pow_of_two - round the given value down to nearest power of two
- * @n: parameter
- *
- * round the given value down to the nearest power of two
- * - the result is undefined when n == 0
- * - this can be used to initialise global variables from constant data
- */
-#define rounddown_pow_of_two(n) \
-( \
- __builtin_constant_p(n) ? ( \
- (1UL << ilog2(n))) : \
- __rounddown_pow_of_two(n) \
- )
-
-static inline __attribute_const__ int __order_base_2(unsigned long n)
-{
- return n > 1 ? ilog2(n - 1) + 1 : 0;
-}
-
-/**
- * order_base_2 - calculate the (rounded up) base 2 order of the argument
- * @n: parameter
- *
- * The first few values calculated by this routine:
- * ob2(0) = 0
- * ob2(1) = 0
- * ob2(2) = 1
- * ob2(3) = 2
- * ob2(4) = 2
- * ob2(5) = 3
- * ... and so on.
- */
-#define order_base_2(n) \
-( \
- __builtin_constant_p(n) ? ( \
- ((n) == 0 || (n) == 1) ? \
- 0 : \
- ilog2((n) - 1) + 1) : \
- __order_base_2(n) \
-)
-
-static inline __attribute__((const)) int __bits_per(unsigned long n)
-{
- if (n < 2)
- return 1;
- if (is_power_of_2(n))
- return order_base_2(n) + 1;
- return order_base_2(n);
-}
-
-/**
- * bits_per - calculate the number of bits required for the argument
- * @n: parameter
- *
- * This is constant-capable and can be used for compile time
- * initializations, e.g bitfields.
- *
- * The first few values calculated by this routine:
- * bf(0) = 1
- * bf(1) = 1
- * bf(2) = 2
- * bf(3) = 2
- * bf(4) = 3
- * ... and so on.
- */
-#define bits_per(n) \
-( \
- __builtin_constant_p(n) ? ( \
- ((n) == 0 || (n) == 1) ? \
- 1 : \
- ilog2(n) + 1 : \
- __bits_per(n) \
-)
-
-/** bit_for_each - iterate over an u64/u32 bits
- * @pos: an int used as current bit
- * @tmp: a temp u64/u32 used as temporary storage
- * @ul: the u64/u32 to loop over
- *
- * Usage:
- * u64 u=139, _t; // u=b10001011
- * int cur;
- * bit_for_each64(cur, _t, u) {
- * printf("%d\n", cur);
- * }
- * This will display the position of each bit set in ul: 1, 2, 4, 8
- *
- * I should probably re-think the implementation...
- */
-#define bit_for_each64(pos, tmp, ul) \
- for (tmp = ul, pos = ffs64(tmp); tmp; tmp &= (tmp - 1), pos = ffs64(tmp))
-
-#define bit_for_each32(pos, tmp, ul) \
- for (tmp = ul, pos = ffs32(tmp); tmp; tmp &= (tmp - 1), pos = ffs32(tmp))
-
-/** or would it be more useful (counting bits from zero instead of 1) ?
- */
-#define bit_for_each64_2(pos, tmp, ul) \
- for (tmp = ul, pos = ctz64(tmp); tmp; tmp ^= 1UL << pos, pos = ctz64(tmp))
-
-#define bit_for_each32_2(pos, tmp, ul) \
- for (tmp = ul, pos = ctz32(tmp); tmp; tmp ^= 1U << pos, pos = ctz32(tmp))
-
-#endif /* _BITS_H */
diff --git a/c/brlib/include/br.h b/c/brlib/include/br.h
deleted file mode 100644
index 8475d55..0000000
--- a/c/brlib/include/br.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/* br.h - misc macros.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- * Some parts are taken from Linux's kernel and others, and are :
- * SPDX-License-Identifier: GPL-2.0
- *
- * This header contains generic stuff.
- */
-
-#ifndef _BR_H
-#define _BR_H
-
-#include "struct-group.h"
-
-/* Indirect stringification. Doing two levels allows the parameter to be a
- * macro itself. For example, compile with -DFOO=bar, __stringify(FOO)
- * converts to "bar".
- */
-#define __stringify_1(x...) #x
-#define __stringify(x...) __stringify_1(x)
-
-/* generate a (maybe) unique id.
- */
-#define ___PASTE(x, y) x##y
-#define __PASTE(x, y) ___PASTE(x, y)
-#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
-
-/* unused/used parameters/functions
- * https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute
- * https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-unused-type-attribute
- * https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-unused-variable-attribute
- * https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-unused-label-attribute
- * https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute
- * https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute
- */
-#define __unused __attribute__((__unused__))
-#define __used __attribute__((__used__))
-
-/* see https://lkml.org/lkml/2018/3/20/845 for explanation of this monster
- */
-#define __is_constexpr(x) \
- (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8)))
-
-/*
- * min()/max()/clamp() macros must accomplish three things:
- *
- * - avoid multiple evaluations of the arguments (so side-effects like
- * "x++" happen only once) when non-constant.
- * - perform strict type-checking (to generate warnings instead of
- * nasty runtime surprises). See the "unnecessary" pointer comparison
- * in __typecheck().
- * - retain result as a constant expressions when called with only
- * constant expressions (to avoid tripping VLA warnings in stack
- * allocation usage).
- */
-#define __typecheck(x, y) \
- (!!(sizeof((typeof(x) *)1 == (typeof(y) *)1)))
-
-#define __no_side_effects(x, y) \
- (__is_constexpr(x) && __is_constexpr(y))
-
-#define __safe_cmp(x, y) \
- (__typecheck(x, y) && __no_side_effects(x, y))
-
-#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
-
-#define __cmp_once(x, y, unique_x, unique_y, op) ({ \
- typeof(x) unique_x = (x); \
- typeof(y) unique_y = (y); \
- __cmp(unique_x, unique_y, op); })
-
-#define __careful_cmp(x, y, op) \
- __builtin_choose_expr(__safe_cmp(x, y), \
- __cmp(x, y, op), \
- __cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
-
-#define __pure __attribute__((__pure__))
-
-/**
- * min - return minimum of two values of the same or compatible types
- * @x: first value
- * @y: second value
- */
-#define min(x, y) __careful_cmp(x, y, <)
-
-/**
- * max - return maximum of two values of the same or compatible types
- * @x: first value
- * @y: second value
- */
-#define max(x, y) __careful_cmp(x, y, >)
-
-/**
- * min3 - return minimum of three values
- * @x: first value
- * @y: second value
- * @z: third value
- */
-#define min3(x, y, z) min((typeof(x))min(x, y), z)
-
-/**
- * max3 - return maximum of three values
- * @x: first value
- * @y: second value
- * @z: third value
- */
-#define max3(x, y, z) max((typeof(x))max(x, y), z)
-
-/**
- * min_not_zero - return the minimum that is _not_ zero, unless both are zero
- * @x: value1
- * @y: value2
- */
-#define min_not_zero(x, y) ({ \
- typeof(x) __x = (x); \
- typeof(y) __y = (y); \
- __x == 0 ? __y : ((__y == 0) ? __x : min(__x, __y)); })
-
-/**
- * clamp - return a value clamped to a given range with strict typechecking
- * @val: current value
- * @lo: lowest allowable value
- * @hi: highest allowable value
- *
- * This macro does strict typechecking of @lo/@hi to make sure they are of the
- * same type as @val. See the unnecessary pointer comparisons.
- */
-#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi)
-
-/*
- * ..and if you can't take the strict
- * types, you can specify one yourself.
- *
- * Or not use min/max/clamp at all, of course.
- */
-
-/**
- * min_t - return minimum of two values, using the specified type
- * @type: data type to use
- * @x: first value
- * @y: second value
- */
-#define min_t(type, x, y) __careful_cmp((type)(x), (type)(y), <)
-
-/**
- * max_t - return maximum of two values, using the specified type
- * @type: data type to use
- * @x: first value
- * @y: second value
- */
-#define max_t(type, x, y) __careful_cmp((type)(x), (type)(y), >)
-
-/**
- * clamp_t - return a value clamped to a given range using a given type
- * @type: the type of variable to use
- * @val: current value
- * @lo: minimum allowable value
- * @hi: maximum allowable value
- *
- * This macro does no typechecking and uses temporary variables of type
- * @type to make all the comparisons.
- */
-#define clamp_t(type, val, lo, hi) min_t(type, max_t(type, val, lo), hi)
-
-/**
- * clamp_val - return a value clamped to a given range using val's type
- * @val: current value
- * @lo: minimum allowable value
- * @hi: maximum allowable value
- *
- * This macro does no typechecking and uses temporary variables of whatever
- * type the input argument @val is. This is useful when @val is an unsigned
- * type and @lo and @hi are literals that will otherwise be assigned a signed
- * integer type.
- */
-#define clamp_val(val, lo, hi) clamp_t(typeof(val), val, lo, hi)
-
-/**
- * swap - swap values of @a and @b
- * @a: first value
- * @b: second value
- */
-#define swap(a, b) \
- do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
-
-/**
- * ARRAY_SIZE - get the number of elements in array @arr
- * @arr: array to be sized
- */
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
-
-/**
- * abs - return absolute value of an argument
- * @x: the value. If it is unsigned type, it is converted to signed type first.
- * char is treated as if it was signed (regardless of whether it really is)
- * but the macro's return type is preserved as char.
- *
- * Return: an absolute value of x.
- */
-#define abs(x) __abs_choose_expr(x, long long, \
- __abs_choose_expr(x, long, \
- __abs_choose_expr(x, int, \
- __abs_choose_expr(x, short, \
- __abs_choose_expr(x, char, \
- __builtin_choose_expr( \
- __builtin_types_compatible_p(typeof(x), char), \
- (char)({ signed char __x = (x); __x<0?-__x:__x; }), \
- ((void)0)))))))
-
-#define __abs_choose_expr(x, type, other) __builtin_choose_expr( \
- __builtin_types_compatible_p(typeof(x), signed type) || \
- __builtin_types_compatible_p(typeof(x), unsigned type), \
- ({ signed type __x = (x); __x < 0 ? -__x : __x; }), other)
-
-
-#endif /* _BR_H */
diff --git a/c/brlib/include/bug.h b/c/brlib/include/bug.h
deleted file mode 100644
index fdff9b8..0000000
--- a/c/brlib/include/bug.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _BR_BUG_H
-#define _BR_BUG_H
-
-#include
-#include
-#include
-#include "likely.h"
-#include "debug.h"
-
-/* BUG functions inspired by Linux kernel's
- */
-
-#define panic() exit(0xff)
-
-/*
- * Don't use BUG() or BUG_ON() unless there's really no way out; one
- * example might be detecting data structure corruption in the middle
- * of an operation that can't be backed out of. If the (sub)system
- * can somehow continue operating, perhaps with reduced functionality,
- * it's probably not BUG-worthy.
- *
- * If you're tempted to BUG(), think again: is completely giving up
- * really the *only* solution? There are usually better options, where
- * users don't need to reboot ASAP and can mostly shut down cleanly.
- */
-#define BUG() do { \
- fprintf(stderr, "BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
- panic(); \
- } while (0)
-
-#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
-
-/*
- * WARN(), WARN_ON(), WARN_ON_ONCE, and so on can be used to report
- * significant kernel issues that need prompt attention if they should ever
- * appear at runtime.
- *
- * Do not use these macros when checking for invalid external inputs
- * (e.g. invalid system call arguments, or invalid data coming from
- * network/devices), and on transient conditions like ENOMEM or EAGAIN.
- * These macros should be used for recoverable kernel issues only.
- * For invalid external inputs, transient conditions, etc use
- * pr_err[_once/_ratelimited]() followed by dump_stack(), if necessary.
- * Do not include "BUG"/"WARNING" in format strings manually to make these
- * conditions distinguishable from kernel issues.
- *
- * Use the versions with printk format strings to provide better diagnostics.
- */
-#define __WARN() do { \
- fprintf(stderr, "WARNING: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
- } while (0)
-#define __WARN_printf(arg...) do { \
- vfprintf(stderr, arg); \
- } while (0)
-
-#define WARN_ON(condition) ({ \
- int __ret_warn_on = !!(condition); \
- if (unlikely(__ret_warn_on)) \
- __WARN(); \
- unlikely(__ret_warn_on); \
- })
-
-#define WARN(condition, format...) ({ \
- int __ret_warn_on = !!(condition); \
- if (unlikely(__ret_warn_on)) \
- __WARN_printf(format); \
- unlikely(__ret_warn_on); \
- })
-
-#endif /* _BR_BUG_H */
diff --git a/c/brlib/include/container-of.h b/c/brlib/include/container-of.h
deleted file mode 100644
index 1c7f54f..0000000
--- a/c/brlib/include/container-of.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-/* adaptation of Linux kernel's
- */
-#ifndef _BR_CONTAINER_OF_H
-#define _BR_CONTAINER_OF_H
-
-/* Are two types/vars the same type (ignoring qualifiers)? */
-#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
-
-/**
- * typeof_member -
- */
-#define typeof_member(T, m) typeof(((T*)0)->m)
-
-/**
- * container_of - cast a member of a structure out to the containing structure
- * @ptr: the pointer to the member.
- * @type: the type of the container struct this is embedded in.
- * @member: the name of the member within the struct.
- *
- */
-#define container_of(ptr, type, member) ({ \
- void *__mptr = (void *)(ptr); \
- _Static_assert(__same_type(*(ptr), ((type *)0)->member) || \
- __same_type(*(ptr), void), \
- "pointer type mismatch in container_of()"); \
- ((type *)(__mptr - offsetof(type, member))); })
-
-#endif /* BR_CONTAINER_OF_H */
diff --git a/c/brlib/include/debug.h b/c/brlib/include/debug.h
deleted file mode 100644
index 60c6447..0000000
--- a/c/brlib/include/debug.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/* debug.h - debug/log management.
- *
- * Copyright (C) 2021-2023 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#ifndef DEBUG_H
-#define DEBUG_H
-
-#include
-#include
-#include
-
-#include
-
-#define NANOSEC 1000000000 /* nano sec in sec */
-#define MILLISEC 1000000 /* milli sec in sec */
-
-#define _printf __attribute__ ((format (printf, 6, 7)))
-
-#ifdef DEBUG_DEBUG
-
-void debug_init(int level, FILE *stream, bool flush);
-void debug_level_set(int level);
-int debug_level_get(void);
-void debug_stream_set(FILE *stream);
-long long debug_timer_elapsed(void);
-void debug_flush_set(bool flush);
-void _printf debug(int level, bool timestamp,
- int indent, const char *src,
- int line, const char *fmt, ...);
-
-#else /* DEBUG_DEBUG */
-
-static inline void debug_init(__unused int level,
- __unused FILE *stream,
- __unused bool flush) {}
-static inline void debug_level_set(__unused int level) {}
-static inline int debug_level_get(void) {return 0;}
-static inline void debug_stream_set(__unused FILE *stream) {}
-static inline long long debug_timer_elapsed(void) {return 0LL;}
-static inline void debug_flush_set(__unused bool level) {}
-static inline void _printf debug(__unused int level, __unused bool timestamp,
- __unused int indent, __unused const char *src,
- __unused int line, __unused const char *fmt, ...) {}
-
-#endif /* DEBUG_DEBUG */
-
-#undef _printf
-
-/**
- * log - simple log (no function name, no indent, no timestamp)
- * @level: log level
- * @fmt: printf format string
- * @args: subsequent arguments to printf
- */
-#define log(level, fmt, args...) \
- debug((level), false, 0, NULL, 0, fmt, ##args)
-
-/**
- * log_i - log with indent (no function name, no timestamp)
- * @level: log level
- * @fmt: printf format string
- * @args: subsequent arguments to printf
- *
- * Output example:
- * >>>>val=2
- */
-#define log_i(level, fmt, args...) \
- debug((level), false, (level), NULL, 0, fmt, ##args)
-
-/**
- * log_f - log with function name (no indent name, no timestamp)
- * @level: log level
- * @fmt: printf format string
- * @args: subsequent arguments to printf
- *
- * Output example:
- * [function] val=2
- */
-#define log_f(level, fmt, args...) \
- debug((level), false, 0, __func__, 0, fmt, ##args)
-
-/**
- * log_if - log with function name and line number (no indent name, no timestamp)
- * @level: log level
- * @fmt: printf format string
- * @args: subsequent arguments to printf
- *
- * Output example:
- * >>>> [function:15] val=2
- */
-#define log_if(level, fmt, args...) \
- debug((level), false, (level), __func__, __LINE__, fmt, ##args)
-
-/**
- * log_it - log with function name, line number, indent, and timestamp
- * @level: log level
- * @fmt: printf format string
- * @args: subsequent arguments to printf
- *
- * Output example:
- * >>>> [function:15] val=2
- */
-#define log_it(level, fmt, args...) \
- debug((level), true, (level), __func__, __LINE__, fmt, ##args)
-
-#endif /* DEBUG_H */
diff --git a/c/brlib/include/hash.h b/c/brlib/include/hash.h
deleted file mode 100644
index 3c9b99d..0000000
--- a/c/brlib/include/hash.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-#ifndef _BR_HASH_H
-#define _BR_HASH_H
-/* adaptation of Linux kernel's and
- */
-
-/* Fast hashing routine for ints, longs and pointers.
- (C) 2002 Nadia Yvette Chambers, IBM */
-
-#include
-#include "bits.h"
-#include "br.h"
-
-/*
- * The "GOLDEN_RATIO_PRIME" is used in ifs/btrfs/brtfs_inode.h and
- * fs/inode.c. It's not actually prime any more (the previous primes
- * were actively bad for hashing), but the name remains.
- */
-#if __BITS_PER_LONG == 32
-#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_32
-#define hash_long(val, bits) hash_32(val, bits)
-#elif __BITS_PER_LONG == 64
-#define hash_long(val, bits) hash_64(val, bits)
-#define GOLDEN_RATIO_PRIME GOLDEN_RATIO_64
-#else
-#error Wordsize not 32 or 64
-#endif
-
-/*
- * This hash multiplies the input by a large odd number and takes the
- * high bits. Since multiplication propagates changes to the most
- * significant end only, it is essential that the high bits of the
- * product be used for the hash value.
- *
- * Chuck Lever verified the effectiveness of this technique:
- * http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf
- *
- * Although a random odd number will do, it turns out that the golden
- * ratio phi = (sqrt(5)-1)/2, or its negative, has particularly nice
- * properties. (See Knuth vol 3, section 6.4, exercise 9.)
- *
- * These are the negative, (1 - phi) = phi**2 = (3 - sqrt(5))/2,
- * which is very slightly easier to multiply by and makes no
- * difference to the hash distribution.
- */
-#define GOLDEN_RATIO_32 0x61C88647
-#define GOLDEN_RATIO_64 0x61C8864680B583EBull
-
-/*
- * The _generic versions exist only so lib/test_hash.c can compare
- * the arch-optimized versions with the generic.
- *
- * Note that if you change these, any that aren't updated
- * to match need to have their HAVE_ARCH_* define values updated so the
- * self-test will not false-positive.
- */
-#ifndef HAVE_ARCH__HASH_32
-#define __hash_32 __hash_32_generic
-#endif
-static inline u32 __hash_32_generic(u32 val)
-{
- return val * GOLDEN_RATIO_32;
-}
-
-static inline u32 hash_32(u32 val, unsigned int bits)
-{
- /* High bits are more random, so use them. */
- return __hash_32(val) >> (32 - bits);
-}
-
-#ifndef HAVE_ARCH_HASH_64
-#define hash_64 hash_64_generic
-#endif
-static __always_inline u32 hash_64_generic(u64 val, unsigned int bits)
-{
-#if __BITS_PER_LONG == 64
- /* 64x64-bit multiply is efficient on all 64-bit processors */
- return val * GOLDEN_RATIO_64 >> (64 - bits);
-#else
- /* Hash 64 bits using only 32x32-bit multiply. */
- return hash_32((u32)val ^ __hash_32(val >> 32), bits);
-#endif
-}
-
-static inline u32 hash_ptr(const void *ptr, unsigned int bits)
-{
- return hash_long((unsigned long)ptr, bits);
-}
-
-/* This really should be called fold32_ptr; it does no hashing to speak of. */
-static inline u32 hash32_ptr(const void *ptr)
-{
- unsigned long val = (unsigned long)ptr;
-
-#if __BITS_PER_LONG == 64
- val ^= (val >> 32);
-#endif
- return (u32)val;
-}
-
-/*
- * Routines for hashing strings of bytes to a 32-bit hash value.
- *
- * These hash functions are NOT GUARANTEED STABLE between kernel
- * versions, architectures, or even repeated boots of the same kernel.
- * (E.g. they may depend on boot-time hardware detection or be
- * deliberately randomized.)
- *
- * They are also not intended to be secure against collisions caused by
- * malicious inputs; much slower hash functions are required for that.
- *
- * They are optimized for pathname components, meaning short strings.
- * Even if a majority of files have longer names, the dynamic profile of
- * pathname components skews short due to short directory names.
- * (E.g. /usr/lib/libsesquipedalianism.so.3.141.)
- */
-
-/*
- * Version 1: one byte at a time. Example of use:
- *
- * unsigned long hash = init_name_hash;
- * while (*p)
- * hash = partial_name_hash(tolower(*p++), hash);
- * hash = end_name_hash(hash);
- *
- * Although this is designed for bytes, fs/hfsplus/unicode.c
- * abuses it to hash 16-bit values.
- */
-
-/* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
-#define init_name_hash(salt) (unsigned long)(salt)
-
-/* partial hash update function. Assume roughly 4 bits per character */
-static inline unsigned long
-partial_name_hash(unsigned long c, unsigned long prevhash)
-{
- return (prevhash + (c << 4) + (c >> 4)) * 11;
-}
-
-/*
- * Finally: cut down the number of bits to a int value (and try to avoid
- * losing bits). This also has the property (wanted by the dcache)
- * that the msbits make a good hash table index.
- */
-static inline unsigned int end_name_hash(unsigned long hash)
-{
- return hash_long(hash, 32);
-}
-
-/*
- * Version 2: One word (32 or 64 bits) at a time.
- * If CONFIG_DCACHE_WORD_ACCESS is defined (meaning
- * exists, which describes major Linux platforms like x86 and ARM), then
- * this computes a different hash function much faster.
- *
- * If not set, this falls back to a wrapper around the preceding.
- */
-extern unsigned int __pure hash_string(const void *salt, const char *, unsigned int);
-
-/*
- * A hash_len is a u64 with the hash of a string in the low
- * half and the length in the high half.
- */
-#define hashlen_hash(hashlen) ((u32)(hashlen))
-#define hashlen_len(hashlen) ((u32)((hashlen) >> 32))
-#define hashlen_create(hash, len) ((u64)(len)<<32 | (u32)(hash))
-
-/* Return the "hash_len" (hash and length) of a null-terminated string */
-extern u64 __pure hashlen_string(const void *salt, const char *name);
-
-#endif /* _BR_HASH_H */
diff --git a/c/brlib/include/hashtable.h b/c/brlib/include/hashtable.h
deleted file mode 100644
index b8d844e..0000000
--- a/c/brlib/include/hashtable.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* adaptation of Linux kernel's
- */
-
-
-/*
- * Statically sized hash table implementation
- * (C) 2012 Sasha Levin
- */
-
-#ifndef _LINUX_HASHTABLE_H
-#define _LINUX_HASHTABLE_H
-
-#include "list.h"
-#include "hash.h"
-//#include
-
-#define DEFINE_HASHTABLE(name, bits) \
- struct hlist_head name[1 << (bits)] = \
- { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT }
-
-#define DEFINE_READ_MOSTLY_HASHTABLE(name, bits) \
- struct hlist_head name[1 << (bits)] __read_mostly = \
- { [0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT }
-
-#define DECLARE_HASHTABLE(name, bits) \
- struct hlist_head name[1 << (bits)]
-
-#define HASH_SIZE(name) (ARRAY_SIZE(name))
-#define HASH_BITS(name) ilog2(HASH_SIZE(name))
-
-/* Use hash_32 when possible to allow for fast 32bit hashing in 64bit kernels. */
-#define hash_min(val, bits) \
- (sizeof(val) <= 4 ? hash_32(val, bits) : hash_long(val, bits))
-
-static inline void __hash_init(struct hlist_head *ht, unsigned int sz)
-{
- unsigned int i;
-
- for (i = 0; i < sz; i++)
- INIT_HLIST_HEAD(&ht[i]);
-}
-
-/**
- * hash_init - initialize a hash table
- * @hashtable: hashtable to be initialized
- *
- * Calculates the size of the hashtable from the given parameter, otherwise
- * same as hash_init_size.
- *
- * This has to be a macro since HASH_BITS() will not work on pointers since
- * it calculates the size during preprocessing.
- */
-#define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable))
-
-/**
- * hash_add - add an object to a hashtable
- * @hashtable: hashtable to add to
- * @node: the &struct hlist_node of the object to be added
- * @key: the key of the object to be added
- */
-#define hash_add(hashtable, node, key) \
- hlist_add_head(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
-
-/**
- * hash_add_rcu - add an object to a rcu enabled hashtable
- * @hashtable: hashtable to add to
- * @node: the &struct hlist_node of the object to be added
- * @key: the key of the object to be added
- */
-#define hash_add_rcu(hashtable, node, key) \
- hlist_add_head_rcu(node, &hashtable[hash_min(key, HASH_BITS(hashtable))])
-
-/**
- * hash_hashed - check whether an object is in any hashtable
- * @node: the &struct hlist_node of the object to be checked
- */
-static inline bool hash_hashed(struct hlist_node *node)
-{
- return !hlist_unhashed(node);
-}
-
-static inline bool __hash_empty(struct hlist_head *ht, unsigned int sz)
-{
- unsigned int i;
-
- for (i = 0; i < sz; i++)
- if (!hlist_empty(&ht[i]))
- return false;
-
- return true;
-}
-
-/**
- * hash_empty - check whether a hashtable is empty
- * @hashtable: hashtable to check
- *
- * This has to be a macro since HASH_BITS() will not work on pointers since
- * it calculates the size during preprocessing.
- */
-#define hash_empty(hashtable) __hash_empty(hashtable, HASH_SIZE(hashtable))
-
-/**
- * hash_del - remove an object from a hashtable
- * @node: &struct hlist_node of the object to remove
- */
-static inline void hash_del(struct hlist_node *node)
-{
- hlist_del_init(node);
-}
-
-/**
- * hash_for_each - iterate over a hashtable
- * @name: hashtable to iterate
- * @bkt: integer to use as bucket loop cursor
- * @obj: the type * to use as a loop cursor for each entry
- * @member: the name of the hlist_node within the struct
- */
-#define hash_for_each(name, bkt, obj, member) \
- for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
- (bkt)++)\
- hlist_for_each_entry(obj, &name[bkt], member)
-
-/**
- * hash_for_each_rcu - iterate over a rcu enabled hashtable
- * @name: hashtable to iterate
- * @bkt: integer to use as bucket loop cursor
- * @obj: the type * to use as a loop cursor for each entry
- * @member: the name of the hlist_node within the struct
- */
-#define hash_for_each_rcu(name, bkt, obj, member) \
- for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
- (bkt)++)\
- hlist_for_each_entry_rcu(obj, &name[bkt], member)
-
-/**
- * hash_for_each_safe - iterate over a hashtable safe against removal of
- * hash entry
- * @name: hashtable to iterate
- * @bkt: integer to use as bucket loop cursor
- * @tmp: a &struct hlist_node used for temporary storage
- * @obj: the type * to use as a loop cursor for each entry
- * @member: the name of the hlist_node within the struct
- */
-#define hash_for_each_safe(name, bkt, tmp, obj, member) \
- for ((bkt) = 0, obj = NULL; obj == NULL && (bkt) < HASH_SIZE(name);\
- (bkt)++)\
- hlist_for_each_entry_safe(obj, tmp, &name[bkt], member)
-
-/**
- * hash_for_each_possible - iterate over all possible objects hashing to the
- * same bucket
- * @name: hashtable to iterate
- * @obj: the type * to use as a loop cursor for each entry
- * @member: the name of the hlist_node within the struct
- * @key: the key of the objects to iterate over
- */
-#define hash_for_each_possible(name, obj, member, key) \
- hlist_for_each_entry(obj, &name[hash_min(key, HASH_BITS(name))], member)
-
-/**
- * hash_for_each_possible_rcu - iterate over all possible objects hashing to the
- * same bucket in an rcu enabled hashtable
- * @name: hashtable to iterate
- * @obj: the type * to use as a loop cursor for each entry
- * @member: the name of the hlist_node within the struct
- * @key: the key of the objects to iterate over
- */
-#define hash_for_each_possible_rcu(name, obj, member, key, cond...) \
- hlist_for_each_entry_rcu(obj, &name[hash_min(key, HASH_BITS(name))],\
- member, ## cond)
-
-/**
- * hash_for_each_possible_rcu_notrace - iterate over all possible objects hashing
- * to the same bucket in an rcu enabled hashtable in a rcu enabled hashtable
- * @name: hashtable to iterate
- * @obj: the type * to use as a loop cursor for each entry
- * @member: the name of the hlist_node within the struct
- * @key: the key of the objects to iterate over
- *
- * This is the same as hash_for_each_possible_rcu() except that it does
- * not do any RCU debugging or tracing.
- */
-#define hash_for_each_possible_rcu_notrace(name, obj, member, key) \
- hlist_for_each_entry_rcu_notrace(obj, \
- &name[hash_min(key, HASH_BITS(name))], member)
-
-/**
- * hash_for_each_possible_safe - iterate over all possible objects hashing to the
- * same bucket safe against removals
- * @name: hashtable to iterate
- * @obj: the type * to use as a loop cursor for each entry
- * @tmp: a &struct hlist_node used for temporary storage
- * @member: the name of the hlist_node within the struct
- * @key: the key of the objects to iterate over
- */
-#define hash_for_each_possible_safe(name, obj, tmp, member, key) \
- hlist_for_each_entry_safe(obj, tmp,\
- &name[hash_min(key, HASH_BITS(name))], member)
-
-
-#endif
diff --git a/c/brlib/include/likely.h b/c/brlib/include/likely.h
deleted file mode 100644
index a5d151d..0000000
--- a/c/brlib/include/likely.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-/* taken from Kernel's
- *
- */
-
-#ifndef __BR_LIST_H
-#define __BR_LIST_H
-
-#include
-#include
-#include "rwonce.h"
-#include "container-of.h"
-
-/************ originally in */
-struct list_head {
- struct list_head *next, *prev;
-};
-struct hlist_head {
- struct hlist_node *first;
-};
-
-struct hlist_node {
- struct hlist_node *next, **pprev;
-};
-
-/************ originally in */
-# define POISON_POINTER_DELTA 0
-/* These are non-NULL pointers that will result in page faults
- * under normal circumstances, used to verify that nobody uses
- * non-initialized list entries.
- */
-#define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA)
-#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA)
-
-/*
- * Circular doubly linked list implementation.
- *
- * Some of the internal functions ("__xxx") are useful when
- * manipulating whole lists rather than single entries, as
- * sometimes we already know the next/prev entries and we can
- * generate better code by using them directly rather than
- * using the generic single-entry routines.
- */
-
-#define LIST_HEAD_INIT(name) { &(name), &(name) }
-
-#define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
-
-/**
- * INIT_LIST_HEAD - Initialize a list_head structure
- * @list: list_head structure to be initialized.
- *
- * Initializes the list_head to point to itself. If it is a list header,
- * the result is an empty list.
- */
-static inline void INIT_LIST_HEAD(struct list_head *list)
-{
- WRITE_ONCE(list->next, list);
- list->prev = list;
-}
-
-/*
- * Insert a new entry between two known consecutive entries.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void __list_add(struct list_head *new,
- struct list_head *prev,
- struct list_head *next)
-{
- next->prev = new;
- new->next = next;
- new->prev = prev;
- WRITE_ONCE(prev->next, new);
-}
-
-/**
- * list_add - add a new entry
- * @new: new entry to be added
- * @head: list head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-static inline void list_add(struct list_head *new, struct list_head *head)
-{
- __list_add(new, head, head->next);
-}
-
-
-/**
- * list_add_tail - add a new entry
- * @new: new entry to be added
- * @head: list head to add it before
- *
- * Insert a new entry before the specified head.
- * This is useful for implementing queues.
- */
-static inline void list_add_tail(struct list_head *new, struct list_head *head)
-{
- __list_add(new, head->prev, head);
-}
-
-/*
- * Delete a list entry by making the prev/next entries
- * point to each other.
- *
- * This is only for internal list manipulation where we know
- * the prev/next entries already!
- */
-static inline void __list_del(struct list_head * prev, struct list_head * next)
-{
- next->prev = prev;
- WRITE_ONCE(prev->next, next);
-}
-
-/*
- * Delete a list entry and clear the 'prev' pointer.
- *
- * This is a special-purpose list clearing method used in the networking code
- * for lists allocated as per-cpu, where we don't want to incur the extra
- * WRITE_ONCE() overhead of a regular list_del_init(). The code that uses this
- * needs to check the node 'prev' pointer instead of calling list_empty().
- */
-static inline void __list_del_clearprev(struct list_head *entry)
-{
- __list_del(entry->prev, entry->next);
- entry->prev = NULL;
-}
-
-static inline void __list_del_entry(struct list_head *entry)
-{
- __list_del(entry->prev, entry->next);
-}
-
-/**
- * list_del - deletes entry from list.
- * @entry: the element to delete from the list.
- * Note: list_empty() on entry does not return true after this, the entry is
- * in an undefined state.
- */
-static inline void list_del(struct list_head *entry)
-{
- __list_del_entry(entry);
- entry->next = LIST_POISON1;
- entry->prev = LIST_POISON2;
-}
-
-/**
- * list_replace - replace old entry by new one
- * @old : the element to be replaced
- * @new : the new element to insert
- *
- * If @old was empty, it will be overwritten.
- */
-static inline void list_replace(struct list_head *old,
- struct list_head *new)
-{
- new->next = old->next;
- new->next->prev = new;
- new->prev = old->prev;
- new->prev->next = new;
-}
-
-/**
- * list_replace_init - replace old entry by new one and initialize the old one
- * @old : the element to be replaced
- * @new : the new element to insert
- *
- * If @old was empty, it will be overwritten.
- */
-static inline void list_replace_init(struct list_head *old,
- struct list_head *new)
-{
- list_replace(old, new);
- INIT_LIST_HEAD(old);
-}
-
-/**
- * list_swap - replace entry1 with entry2 and re-add entry1 at entry2's position
- * @entry1: the location to place entry2
- * @entry2: the location to place entry1
- */
-static inline void list_swap(struct list_head *entry1,
- struct list_head *entry2)
-{
- struct list_head *pos = entry2->prev;
-
- list_del(entry2);
- list_replace(entry1, entry2);
- if (pos == entry1)
- pos = entry2;
- list_add(entry1, pos);
-}
-
-/**
- * list_del_init - deletes entry from list and reinitialize it.
- * @entry: the element to delete from the list.
- */
-static inline void list_del_init(struct list_head *entry)
-{
- __list_del_entry(entry);
- INIT_LIST_HEAD(entry);
-}
-
-/**
- * list_move - delete from one list and add as another's head
- * @list: the entry to move
- * @head: the head that will precede our entry
- */
-static inline void list_move(struct list_head *list, struct list_head *head)
-{
- __list_del_entry(list);
- list_add(list, head);
-}
-
-/**
- * list_move_tail - delete from one list and add as another's tail
- * @list: the entry to move
- * @head: the head that will follow our entry
- */
-static inline void list_move_tail(struct list_head *list,
- struct list_head *head)
-{
- __list_del_entry(list);
- list_add_tail(list, head);
-}
-
-/**
- * list_bulk_move_tail - move a subsection of a list to its tail
- * @head: the head that will follow our entry
- * @first: first entry to move
- * @last: last entry to move, can be the same as first
- *
- * Move all entries between @first and including @last before @head.
- * All three entries must belong to the same linked list.
- */
-static inline void list_bulk_move_tail(struct list_head *head,
- struct list_head *first,
- struct list_head *last)
-{
- first->prev->next = last->next;
- last->next->prev = first->prev;
-
- head->prev->next = first;
- first->prev = head->prev;
-
- last->next = head;
- head->prev = last;
-}
-
-/**
- * list_is_first -- tests whether @list is the first entry in list @head
- * @list: the entry to test
- * @head: the head of the list
- */
-static inline int list_is_first(const struct list_head *list,
- const struct list_head *head)
-{
- return list->prev == head;
-}
-
-/**
- * list_is_last - tests whether @list is the last entry in list @head
- * @list: the entry to test
- * @head: the head of the list
- */
-static inline int list_is_last(const struct list_head *list,
- const struct list_head *head)
-{
- return list->next == head;
-}
-
-/**
- * list_empty - tests whether a list is empty
- * @head: the list to test.
- */
-static inline int list_empty(const struct list_head *head)
-{
- return READ_ONCE(head->next) == head;
-}
-
-/**
- * list_rotate_left - rotate the list to the left
- * @head: the head of the list
- */
-static inline void list_rotate_left(struct list_head *head)
-{
- struct list_head *first;
-
- if (!list_empty(head)) {
- first = head->next;
- list_move_tail(first, head);
- }
-}
-
-/**
- * list_rotate_to_front() - Rotate list to specific item.
- * @list: The desired new front of the list.
- * @head: The head of the list.
- *
- * Rotates list so that @list becomes the new front of the list.
- */
-static inline void list_rotate_to_front(struct list_head *list,
- struct list_head *head)
-{
- /*
- * Deletes the list head from the list denoted by @head and
- * places it as the tail of @list, this effectively rotates the
- * list so that @list is at the front.
- */
- list_move_tail(head, list);
-}
-
-/**
- * list_is_singular - tests whether a list has just one entry.
- * @head: the list to test.
- */
-static inline int list_is_singular(const struct list_head *head)
-{
- return !list_empty(head) && (head->next == head->prev);
-}
-
-static inline void __list_cut_position(struct list_head *list,
- struct list_head *head, struct list_head *entry)
-{
- struct list_head *new_first = entry->next;
- list->next = head->next;
- list->next->prev = list;
- list->prev = entry;
- entry->next = list;
- head->next = new_first;
- new_first->prev = head;
-}
-
-/**
- * list_cut_position - cut a list into two
- * @list: a new list to add all removed entries
- * @head: a list with entries
- * @entry: an entry within head, could be the head itself
- * and if so we won't cut the list
- *
- * This helper moves the initial part of @head, up to and
- * including @entry, from @head to @list. You should
- * pass on @entry an element you know is on @head. @list
- * should be an empty list or a list you do not care about
- * losing its data.
- *
- */
-static inline void list_cut_position(struct list_head *list,
- struct list_head *head, struct list_head *entry)
-{
- if (list_empty(head))
- return;
- if (list_is_singular(head) &&
- (head->next != entry && head != entry))
- return;
- if (entry == head)
- INIT_LIST_HEAD(list);
- else
- __list_cut_position(list, head, entry);
-}
-
-/**
- * list_cut_before - cut a list into two, before given entry
- * @list: a new list to add all removed entries
- * @head: a list with entries
- * @entry: an entry within head, could be the head itself
- *
- * This helper moves the initial part of @head, up to but
- * excluding @entry, from @head to @list. You should pass
- * in @entry an element you know is on @head. @list should
- * be an empty list or a list you do not care about losing
- * its data.
- * If @entry == @head, all entries on @head are moved to
- * @list.
- */
-static inline void list_cut_before(struct list_head *list,
- struct list_head *head,
- struct list_head *entry)
-{
- if (head->next == entry) {
- INIT_LIST_HEAD(list);
- return;
- }
- list->next = head->next;
- list->next->prev = list;
- list->prev = entry->prev;
- list->prev->next = list;
- head->next = entry;
- entry->prev = head;
-}
-
-static inline void __list_splice(const struct list_head *list,
- struct list_head *prev,
- struct list_head *next)
-{
- struct list_head *first = list->next;
- struct list_head *last = list->prev;
-
- first->prev = prev;
- prev->next = first;
-
- last->next = next;
- next->prev = last;
-}
-
-/**
- * list_splice - join two lists, this is designed for stacks
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void list_splice(const struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list))
- __list_splice(list, head, head->next);
-}
-
-/**
- * list_splice_tail - join two lists, each list being a queue
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- */
-static inline void list_splice_tail(struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list))
- __list_splice(list, head->prev, head);
-}
-
-/**
- * list_splice_init - join two lists and reinitialise the emptied list.
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * The list at @list is reinitialised
- */
-static inline void list_splice_init(struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list)) {
- __list_splice(list, head, head->next);
- INIT_LIST_HEAD(list);
- }
-}
-
-/**
- * list_splice_tail_init - join two lists and reinitialise the emptied list
- * @list: the new list to add.
- * @head: the place to add it in the first list.
- *
- * Each of the lists is a queue.
- * The list at @list is reinitialised
- */
-static inline void list_splice_tail_init(struct list_head *list,
- struct list_head *head)
-{
- if (!list_empty(list)) {
- __list_splice(list, head->prev, head);
- INIT_LIST_HEAD(list);
- }
-}
-
-/**
- * list_entry - get the struct for this entry
- * @ptr: the &struct list_head pointer.
- * @type: the type of the struct this is embedded in.
- * @member: the name of the list_head within the struct.
- */
-#define list_entry(ptr, type, member) \
- container_of(ptr, type, member)
-
-/**
- * list_first_entry - get the first element from a list
- * @ptr: the list head to take the element from.
- * @type: the type of the struct this is embedded in.
- * @member: the name of the list_head within the struct.
- *
- * Note, that list is expected to be not empty.
- */
-#define list_first_entry(ptr, type, member) \
- list_entry((ptr)->next, type, member)
-
-/**
- * list_last_entry - get the last element from a list
- * @ptr: the list head to take the element from.
- * @type: the type of the struct this is embedded in.
- * @member: the name of the list_head within the struct.
- *
- * Note, that list is expected to be not empty.
- */
-#define list_last_entry(ptr, type, member) \
- list_entry((ptr)->prev, type, member)
-
-/**
- * list_first_entry_or_null - get the first element from a list
- * @ptr: the list head to take the element from.
- * @type: the type of the struct this is embedded in.
- * @member: the name of the list_head within the struct.
- *
- * Note that if the list is empty, it returns NULL.
- */
-#define list_first_entry_or_null(ptr, type, member) ({ \
- struct list_head *head__ = (ptr); \
- struct list_head *pos__ = READ_ONCE(head__->next); \
- pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
- })
-
-/**
- * list_next_entry - get the next element in list
- * @pos: the type * to cursor
- * @member: the name of the list_head within the struct.
- */
-#define list_next_entry(pos, member) \
- list_entry((pos)->member.next, __typeof__(*(pos)), member)
-
-/**
- * list_prev_entry - get the prev element in list
- * @pos: the type * to cursor
- * @member: the name of the list_head within the struct.
- */
-#define list_prev_entry(pos, member) \
- list_entry((pos)->member.prev, __typeof__(*(pos)), member)
-
-/**
- * list_for_each - iterate over a list
- * @pos: the &struct list_head to use as a loop cursor.
- * @head: the head for your list.
- */
-#define list_for_each(pos, head) \
- for (pos = (head)->next; pos != (head); pos = pos->next)
-
-/**
- * list_for_each_continue - continue iteration over a list
- * @pos: the &struct list_head to use as a loop cursor.
- * @head: the head for your list.
- *
- * Continue to iterate over a list, continuing after the current position.
- */
-#define list_for_each_continue(pos, head) \
- for (pos = pos->next; pos != (head); pos = pos->next)
-
-/**
- * list_for_each_prev - iterate over a list backwards
- * @pos: the &struct list_head to use as a loop cursor.
- * @head: the head for your list.
- */
-#define list_for_each_prev(pos, head) \
- for (pos = (head)->prev; pos != (head); pos = pos->prev)
-
-/**
- * list_for_each_safe - iterate over a list safe against removal of list entry
- * @pos: the &struct list_head to use as a loop cursor.
- * @n: another &struct list_head to use as temporary storage
- * @head: the head for your list.
- */
-#define list_for_each_safe(pos, n, head) \
- for (pos = (head)->next, n = pos->next; pos != (head); \
- pos = n, n = pos->next)
-
-/**
- * list_for_each_prev_safe - iterate over a list backwards safe against removal of list entry
- * @pos: the &struct list_head to use as a loop cursor.
- * @n: another &struct list_head to use as temporary storage
- * @head: the head for your list.
- */
-#define list_for_each_prev_safe(pos, n, head) \
- for (pos = (head)->prev, n = pos->prev; \
- pos != (head); \
- pos = n, n = pos->prev)
-
-/**
- * list_entry_is_head - test if the entry points to the head of the list
- * @pos: the type * to cursor
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- */
-#define list_entry_is_head(pos, head, member) \
- (&pos->member == (head))
-
-/**
- * list_for_each_entry - iterate over list of given type
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- */
-#define list_for_each_entry(pos, head, member) \
- for (pos = list_first_entry(head, __typeof__(*pos), member); \
- !list_entry_is_head(pos, head, member); \
- pos = list_next_entry(pos, member))
-
-/**
- * list_for_each_entry_reverse - iterate backwards over list of given type.
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- */
-#define list_for_each_entry_reverse(pos, head, member) \
- for (pos = list_last_entry(head, __typeof__(*pos), member); \
- !list_entry_is_head(pos, head, member); \
- pos = list_prev_entry(pos, member))
-
-/**
- * list_prepare_entry - prepare a pos entry for use in list_for_each_entry_continue()
- * @pos: the type * to use as a start point
- * @head: the head of the list
- * @member: the name of the list_head within the struct.
- *
- * Prepares a pos entry for use as a start point in list_for_each_entry_continue().
- */
-#define list_prepare_entry(pos, head, member) \
- ((pos) ? : list_entry(head, __typeof__(*pos), member))
-
-/**
- * list_for_each_entry_continue - continue iteration over list of given type
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- *
- * Continue to iterate over list of given type, continuing after
- * the current position.
- */
-#define list_for_each_entry_continue(pos, head, member) \
- for (pos = list_next_entry(pos, member); \
- !list_entry_is_head(pos, head, member); \
- pos = list_next_entry(pos, member))
-
-/**
- * list_for_each_entry_continue_reverse - iterate backwards from the given point
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- *
- * Start to iterate over list of given type backwards, continuing after
- * the current position.
- */
-#define list_for_each_entry_continue_reverse(pos, head, member) \
- for (pos = list_prev_entry(pos, member); \
- !list_entry_is_head(pos, head, member); \
- pos = list_prev_entry(pos, member))
-
-/**
- * list_for_each_entry_from - iterate over list of given type from the current point
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- *
- * Iterate over list of given type, continuing from current position.
- */
-#define list_for_each_entry_from(pos, head, member) \
- for (; !list_entry_is_head(pos, head, member); \
- pos = list_next_entry(pos, member))
-
-/**
- * list_for_each_entry_from_reverse - iterate backwards over list of given type
- * from the current point
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- *
- * Iterate backwards over list of given type, continuing from current position.
- */
-#define list_for_each_entry_from_reverse(pos, head, member) \
- for (; !list_entry_is_head(pos, head, member); \
- pos = list_prev_entry(pos, member))
-
-/**
- * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- */
-#define list_for_each_entry_safe(pos, n, head, member) \
- for (pos = list_first_entry(head, __typeof__(*pos), member), \
- n = list_next_entry(pos, member); \
- !list_entry_is_head(pos, head, member); \
- pos = n, n = list_next_entry(n, member))
-
-/**
- * list_for_each_entry_safe_continue - continue list iteration safe against removal
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- *
- * Iterate over list of given type, continuing after current point,
- * safe against removal of list entry.
- */
-#define list_for_each_entry_safe_continue(pos, n, head, member) \
- for (pos = list_next_entry(pos, member), \
- n = list_next_entry(pos, member); \
- !list_entry_is_head(pos, head, member); \
- pos = n, n = list_next_entry(n, member))
-
-/**
- * list_for_each_entry_safe_from - iterate over list from current point safe against removal
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- *
- * Iterate over list of given type from current point, safe against
- * removal of list entry.
- */
-#define list_for_each_entry_safe_from(pos, n, head, member) \
- for (n = list_next_entry(pos, member); \
- !list_entry_is_head(pos, head, member); \
- pos = n, n = list_next_entry(n, member))
-
-/**
- * list_for_each_entry_safe_reverse - iterate backwards over list safe against removal
- * @pos: the type * to use as a loop cursor.
- * @n: another type * to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the list_head within the struct.
- *
- * Iterate backwards over list of given type, safe against removal
- * of list entry.
- */
-#define list_for_each_entry_safe_reverse(pos, n, head, member) \
- for (pos = list_last_entry(head, __typeof__(*pos), member), \
- n = list_prev_entry(pos, member); \
- !list_entry_is_head(pos, head, member); \
- pos = n, n = list_prev_entry(n, member))
-
-/**
- * list_safe_reset_next - reset a stale list_for_each_entry_safe loop
- * @pos: the loop cursor used in the list_for_each_entry_safe loop
- * @n: temporary storage used in list_for_each_entry_safe
- * @member: the name of the list_head within the struct.
- *
- * list_safe_reset_next is not safe to use in general if the list may be
- * modified concurrently (eg. the lock is dropped in the loop body). An
- * exception to this is if the cursor element (pos) is pinned in the list,
- * and list_safe_reset_next is called after re-taking the lock and before
- * completing the current iteration of the loop body.
- */
-#define list_safe_reset_next(pos, n, member) \
- n = list_next_entry(pos, member)
-
-/*
- * Double linked lists with a single pointer list head.
- * Mostly useful for hash tables where the two pointer list head is
- * too wasteful.
- * You lose the ability to access the tail in O(1).
- */
-
-#define HLIST_HEAD_INIT { .first = NULL }
-#define HLIST_HEAD(name) struct hlist_head name = { .first = NULL }
-#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
-static inline void INIT_HLIST_NODE(struct hlist_node *h)
-{
- h->next = NULL;
- h->pprev = NULL;
-}
-
-/**
- * hlist_unhashed - Has node been removed from list and reinitialized?
- * @h: Node to be checked
- *
- * Not that not all removal functions will leave a node in unhashed
- * state. For example, hlist_nulls_del_init_rcu() does leave the
- * node in unhashed state, but hlist_nulls_del() does not.
- */
-static inline int hlist_unhashed(const struct hlist_node *h)
-{
- return !h->pprev;
-}
-
-/**
- * hlist_unhashed_lockless - Version of hlist_unhashed for lockless use
- * @h: Node to be checked
- *
- * This variant of hlist_unhashed() must be used in lockless contexts
- * to avoid potential load-tearing. The READ_ONCE() is paired with the
- * various WRITE_ONCE() in hlist helpers that are defined below.
- */
-static inline int hlist_unhashed_lockless(const struct hlist_node *h)
-{
- return !READ_ONCE(h->pprev);
-}
-
-/**
- * hlist_empty - Is the specified hlist_head structure an empty hlist?
- * @h: Structure to check.
- */
-static inline int hlist_empty(const struct hlist_head *h)
-{
- return !READ_ONCE(h->first);
-}
-
-static inline void __hlist_del(struct hlist_node *n)
-{
- struct hlist_node *next = n->next;
- struct hlist_node **pprev = n->pprev;
-
- WRITE_ONCE(*pprev, next);
- if (next)
- WRITE_ONCE(next->pprev, pprev);
-}
-
-/**
- * hlist_del - Delete the specified hlist_node from its list
- * @n: Node to delete.
- *
- * Note that this function leaves the node in hashed state. Use
- * hlist_del_init() or similar instead to unhash @n.
- */
-static inline void hlist_del(struct hlist_node *n)
-{
- __hlist_del(n);
- n->next = LIST_POISON1;
- n->pprev = LIST_POISON2;
-}
-
-/**
- * hlist_del_init - Delete the specified hlist_node from its list and initialize
- * @n: Node to delete.
- *
- * Note that this function leaves the node in unhashed state.
- */
-static inline void hlist_del_init(struct hlist_node *n)
-{
- if (!hlist_unhashed(n)) {
- __hlist_del(n);
- INIT_HLIST_NODE(n);
- }
-}
-
-/**
- * hlist_add_head - add a new entry at the beginning of the hlist
- * @n: new entry to be added
- * @h: hlist head to add it after
- *
- * Insert a new entry after the specified head.
- * This is good for implementing stacks.
- */
-static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
-{
- struct hlist_node *first = h->first;
- WRITE_ONCE(n->next, first);
- if (first)
- WRITE_ONCE(first->pprev, &n->next);
- WRITE_ONCE(h->first, n);
- WRITE_ONCE(n->pprev, &h->first);
-}
-
-/**
- * hlist_add_before - add a new entry before the one specified
- * @n: new entry to be added
- * @next: hlist node to add it before, which must be non-NULL
- */
-static inline void hlist_add_before(struct hlist_node *n,
- struct hlist_node *next)
-{
- WRITE_ONCE(n->pprev, next->pprev);
- WRITE_ONCE(n->next, next);
- WRITE_ONCE(next->pprev, &n->next);
- WRITE_ONCE(*(n->pprev), n);
-}
-
-/**
- * hlist_add_behind - add a new entry after the one specified
- * @n: new entry to be added
- * @prev: hlist node to add it after, which must be non-NULL
- */
-static inline void hlist_add_behind(struct hlist_node *n,
- struct hlist_node *prev)
-{
- WRITE_ONCE(n->next, prev->next);
- WRITE_ONCE(prev->next, n);
- WRITE_ONCE(n->pprev, &prev->next);
-
- if (n->next)
- WRITE_ONCE(n->next->pprev, &n->next);
-}
-
-/**
- * hlist_add_fake - create a fake hlist consisting of a single headless node
- * @n: Node to make a fake list out of
- *
- * This makes @n appear to be its own predecessor on a headless hlist.
- * The point of this is to allow things like hlist_del() to work correctly
- * in cases where there is no list.
- */
-static inline void hlist_add_fake(struct hlist_node *n)
-{
- n->pprev = &n->next;
-}
-
-/**
- * hlist_fake: Is this node a fake hlist?
- * @h: Node to check for being a self-referential fake hlist.
- */
-static inline bool hlist_fake(struct hlist_node *h)
-{
- return h->pprev == &h->next;
-}
-
-/**
- * hlist_is_singular_node - is node the only element of the specified hlist?
- * @n: Node to check for singularity.
- * @h: Header for potentially singular list.
- *
- * Check whether the node is the only node of the head without
- * accessing head, thus avoiding unnecessary cache misses.
- */
-static inline bool
-hlist_is_singular_node(struct hlist_node *n, struct hlist_head *h)
-{
- return !n->next && n->pprev == &h->first;
-}
-
-/**
- * hlist_move_list - Move an hlist
- * @old: hlist_head for old list.
- * @new: hlist_head for new list.
- *
- * Move a list from one list head to another. Fixup the pprev
- * reference of the first entry if it exists.
- */
-static inline void hlist_move_list(struct hlist_head *old,
- struct hlist_head *new)
-{
- new->first = old->first;
- if (new->first)
- new->first->pprev = &new->first;
- old->first = NULL;
-}
-
-#define hlist_entry(ptr, type, member) container_of(ptr,type,member)
-
-#define hlist_for_each(pos, head) \
- for (pos = (head)->first; pos ; pos = pos->next)
-
-#define hlist_for_each_safe(pos, n, head) \
- for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
- pos = n)
-
-#define hlist_entry_safe(ptr, type, member) \
- ({ __typeof__(ptr) ____ptr = (ptr); \
- ____ptr ? hlist_entry(____ptr, type, member) : NULL; \
- })
-
-/**
- * hlist_for_each_entry - iterate over list of given type
- * @pos: the type * to use as a loop cursor.
- * @head: the head for your list.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry(pos, head, member) \
- for (pos = hlist_entry_safe((head)->first, __typeof__(*(pos)), member); \
- pos; \
- pos = hlist_entry_safe((pos)->member.next, __typeof__(*(pos)), member))
-
-/**
- * hlist_for_each_entry_continue - iterate over a hlist continuing after current point
- * @pos: the type * to use as a loop cursor.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_continue(pos, member) \
- for (pos = hlist_entry_safe((pos)->member.next, __typeof__(*(pos)), member); \
- pos; \
- pos = hlist_entry_safe((pos)->member.next, __typeof__(*(pos)), member))
-
-/**
- * hlist_for_each_entry_from - iterate over a hlist continuing from current point
- * @pos: the type * to use as a loop cursor.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_from(pos, member) \
- for (; pos; \
- pos = hlist_entry_safe((pos)->member.next, __typeof__(*(pos)), member))
-
-/**
- * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry
- * @pos: the type * to use as a loop cursor.
- * @n: a &struct hlist_node to use as temporary storage
- * @head: the head for your list.
- * @member: the name of the hlist_node within the struct.
- */
-#define hlist_for_each_entry_safe(pos, n, head, member) \
- for (pos = hlist_entry_safe((head)->first, __typeof__(*pos), member); \
- pos && ({ n = pos->member.next; 1; }); \
- pos = hlist_entry_safe(n, __typeof__(*pos), member))
-
-#endif /* __BR_LIST_H */
diff --git a/c/brlib/include/pjwhash-inline.h b/c/brlib/include/pjwhash-inline.h
deleted file mode 100644
index ed5e8f5..0000000
--- a/c/brlib/include/pjwhash-inline.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/* pjwhash-inline.h - PJW hash function, inline version.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#ifndef _PJWHASH_INLINE_H
-#define _PJWHASH_INLINE_H
-
-#include "bits.h"
-
-#define THREE_QUARTERS ((int) ((BITS_PER_INT * 3) / 4))
-#define ONE_EIGHTH ((int) (BITS_PER_INT / 8))
-#define HIGH_BITS ( ~((uint)(~0) >> ONE_EIGHTH ))
-
-#ifndef _pjw_inline
-#define _pjw_inline static inline
-#endif
-
-/**
- * unsigned int pjwhash - PJW hash function
- * @key: the key address.
- * @length: the length of key.
- *
- * This hash was created by Peter Jay Weinberger (AT&T Bell Labs):
- * https://en.wikipedia.org/wiki/PJW_hash_function
- *
- * Return: the PJW hash.
- */
-_pjw_inline uint pjwhash(const void* key, uint length)
-{
- uint hash = 0, high;
- const u8 *k = key;
-
- for (uint i = 0; i < length; ++k, ++i) {
- hash = (hash << ONE_EIGHTH) + *k;
- high = hash & HIGH_BITS;
- if (high != 0) {
- hash ^= high >> THREE_QUARTERS;
- hash &= ~high;
- }
- }
- return hash;
-}
-
-#endif /* _PJWHASH_INLINE_H */
diff --git a/c/brlib/include/pjwhash.h b/c/brlib/include/pjwhash.h
deleted file mode 100644
index 19b0d76..0000000
--- a/c/brlib/include/pjwhash.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* pjwhash.h - PJW hash function, extern version.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
-
-#ifndef _PJWHASH_H
-#define _PJWHASH_H
-
-#include "bits.h"
-
-/**
- * unsigned int pjwhash - PJW hash function
- * @key: the key address.
- * @length: the length of key.
- *
- * This hash was created by Peter Jay Weinberger (AT&T Bell Labs):
- * https://en.wikipedia.org/wiki/PJW_hash_function
- *
- * Return: the PJW hash.
- */
-extern uint pjwhash (const void* key, uint length);
-
-#endif /* _PJWHASH_H */
diff --git a/c/brlib/include/plist.h b/c/brlib/include/plist.h
deleted file mode 100644
index fc0bb3d..0000000
--- a/c/brlib/include/plist.h
+++ /dev/null
@@ -1,345 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-
-/* adaptation of kernel's
- *
- */
-
-/*
- * Descending-priority-sorted double-linked list
- *
- * (C) 2002-2003 Intel Corp
- * Inaky Perez-Gonzalez .
- *
- * 2001-2005 (c) MontaVista Software, Inc.
- * Daniel Walker
- *
- * (C) 2005 Thomas Gleixner
- *
- * Simplifications of the original code by
- * Oleg Nesterov
- *
- * Based on simple lists (include/linux/list.h).
- *
- * This is a priority-sorted list of nodes; each node has a
- * priority from INT_MIN (highest) to INT_MAX (lowest).
- *
- * Addition is O(K), removal is O(1), change of priority of a node is
- * O(K) and K is the number of RT priority levels used in the system.
- * (1 <= K <= 99)
- *
- * This list is really a list of lists:
- *
- * - The tier 1 list is the prio_list, different priority nodes.
- *
- * - The tier 2 list is the node_list, serialized nodes.
- *
- * Simple ASCII art explanation:
- *
- * pl:prio_list (only for plist_node)
- * nl:node_list
- * HEAD| NODE(S)
- * |
- * ||------------------------------------|
- * ||->|pl|<->|pl|<--------------->|pl|<-|
- * | |10| |21| |21| |21| |40| (prio)
- * | | | | | | | | | | |
- * | | | | | | | | | | |
- * |->|nl|<->|nl|<->|nl|<->|nl|<->|nl|<->|nl|<-|
- * |-------------------------------------------|
- *
- * The nodes on the prio_list list are sorted by priority to simplify
- * the insertion of new nodes. There are no nodes with duplicate
- * priorites on the list.
- *
- * The nodes on the node_list are ordered by priority and can contain
- * entries which have the same priority. Those entries are ordered
- * FIFO
- *
- * Addition means: look for the prio_list node in the prio_list
- * for the priority of the node and insert it before the node_list
- * entry of the next prio_list node. If it is the first node of
- * that priority, add it to the prio_list in the right position and
- * insert it into the serialized node_list list
- *
- * Removal means remove it from the node_list and remove it from
- * the prio_list if the node_list list_head is non empty. In case
- * of removal from the prio_list it must be checked whether other
- * entries of the same priority are on the list or not. If there
- * is another entry of the same priority then this entry has to
- * replace the removed entry on the prio_list. If the entry which
- * is removed is the only entry of this priority then a simple
- * remove from both list is sufficient.
- *
- * INT_MIN is the highest priority, 0 is the medium highest, INT_MAX
- * is lowest priority.
- *
- * No locking is done, up to the caller.
- */
-#ifndef _LINUX_PLIST_H_
-#define _LINUX_PLIST_H_
-
-#include "container-of.h"
-#include "list.h"
-//#include
-
-// #include
-
-struct plist_head {
- struct list_head node_list;
-};
-
-struct plist_node {
- int prio;
- struct list_head prio_list;
- struct list_head node_list;
-};
-
-/**
- * PLIST_HEAD_INIT - static struct plist_head initializer
- * @head: struct plist_head variable name
- */
-#define PLIST_HEAD_INIT(head) \
- { \
- .node_list = LIST_HEAD_INIT((head).node_list) \
- }
-
-/**
- * PLIST_HEAD - declare and init plist_head
- * @head: name for struct plist_head variable
- */
-#define PLIST_HEAD(head) \
- struct plist_head head = PLIST_HEAD_INIT(head)
-
-/**
- * PLIST_NODE_INIT - static struct plist_node initializer
- * @node: struct plist_node variable name
- * @__prio: initial node priority
- */
-#define PLIST_NODE_INIT(node, __prio) \
- { \
- .prio = (__prio), \
- .prio_list = LIST_HEAD_INIT((node).prio_list), \
- .node_list = LIST_HEAD_INIT((node).node_list), \
- }
-
-/**
- * plist_head_init - dynamic struct plist_head initializer
- * @head: &struct plist_head pointer
- */
-static inline void
-plist_head_init(struct plist_head *head)
-{
- INIT_LIST_HEAD(&head->node_list);
-}
-
-/**
- * plist_node_init - Dynamic struct plist_node initializer
- * @node: &struct plist_node pointer
- * @prio: initial node priority
- */
-static inline void plist_node_init(struct plist_node *node, int prio)
-{
- node->prio = prio;
- INIT_LIST_HEAD(&node->prio_list);
- INIT_LIST_HEAD(&node->node_list);
-}
-
-extern void plist_add(struct plist_node *node, struct plist_head *head);
-extern void plist_del(struct plist_node *node, struct plist_head *head);
-
-extern void plist_requeue(struct plist_node *node, struct plist_head *head);
-
-/**
- * plist_for_each - iterate over the plist
- * @pos: the type * to use as a loop counter
- * @head: the head for your list
- */
-#define plist_for_each(pos, head) \
- list_for_each_entry(pos, &(head)->node_list, node_list)
-
-/**
- * plist_for_each_reverse - iterate backwards over the plist
- * @pos: the type * to use as a loop counter
- * @head: the head for your list
- */
-#define plist_for_each_reverse(pos, head) \
- list_for_each_entry_reverse(pos, &(head)->node_list, node_list)
-
-/**
- * plist_for_each_continue - continue iteration over the plist
- * @pos: the type * to use as a loop cursor
- * @head: the head for your list
- *
- * Continue to iterate over plist, continuing after the current position.
- */
-#define plist_for_each_continue(pos, head) \
- list_for_each_entry_continue(pos, &(head)->node_list, node_list)
-
-/**
- * plist_for_each_continue_reverse - continue iteration over the plist
- * @pos: the type * to use as a loop cursor
- * @head: the head for your list
- *
- * Continue to iterate backwards over plist, continuing after the current
- * position.
- */
-#define plist_for_each_continue_reverse(pos, head) \
- list_for_each_entry_continue_reverse(pos, &(head)->node_list, node_list)
-
-/**
- * plist_for_each_safe - iterate safely over a plist of given type
- * @pos: the type * to use as a loop counter
- * @n: another type * to use as temporary storage
- * @head: the head for your list
- *
- * Iterate over a plist of given type, safe against removal of list entry.
- */
-#define plist_for_each_safe(pos, n, head) \
- list_for_each_entry_safe(pos, n, &(head)->node_list, node_list)
-
-/**
- * plist_for_each_safe_reverse - iterate backwards safely over a plist of given type
- * @pos: the type * to use as a loop counter
- * @n: another type * to use as temporary storage
- * @head: the head for your list
- *
- * Iterate backwards over a plist of given type, safe against removal of list entry.
- */
-#define plist_for_each_safe_reverse(pos, n, head) \
- list_for_each_entry_safe_reverse(pos, n, &(head)->node_list, node_list)
-
-/**
- * plist_for_each_entry - iterate over list of given type
- * @pos: the type * to use as a loop counter
- * @head: the head for your list
- * @mem: the name of the list_head within the struct
- */
-#define plist_for_each_entry(pos, head, mem) \
- list_for_each_entry(pos, &(head)->node_list, mem.node_list)
-
-/**
- * plist_for_each_entry_reverse - iterate backwards over list of given type
- * @pos: the type * to use as a loop counter
- * @head: the head for your list
- * @mem: the name of the list_head within the struct
- */
-#define plist_for_each_entry_reverse(pos, head, mem) \
- list_for_each_entry_reverse(pos, &(head)->node_list, mem.node_list)
-
-/**
- * plist_for_each_entry_continue - continue iteration over list of given type
- * @pos: the type * to use as a loop cursor
- * @head: the head for your list
- * @m: the name of the list_head within the struct
- *
- * Continue to iterate over list of given type, continuing after
- * the current position.
- */
-#define plist_for_each_entry_continue(pos, head, m) \
- list_for_each_entry_continue(pos, &(head)->node_list, m.node_list)
-
-/**
- * plist_for_each_entry_safe - iterate safely over list of given type
- * @pos: the type * to use as a loop counter
- * @n: another type * to use as temporary storage
- * @head: the head for your list
- * @m: the name of the list_head within the struct
- *
- * Iterate over list of given type, safe against removal of list entry.
- */
-#define plist_for_each_entry_safe(pos, n, head, m) \
- list_for_each_entry_safe(pos, n, &(head)->node_list, m.node_list)
-
-/**
- * plist_head_empty - return !0 if a plist_head is empty
- * @head: &struct plist_head pointer
- */
-static inline int plist_head_empty(const struct plist_head *head)
-{
- return list_empty(&head->node_list);
-}
-
-/**
- * plist_node_empty - return !0 if plist_node is not on a list
- * @node: &struct plist_node pointer
- */
-static inline int plist_node_empty(const struct plist_node *node)
-{
- return list_empty(&node->node_list);
-}
-
-/* All functions below assume the plist_head is not empty. */
-
-/**
- * plist_first_entry - get the struct for the first entry
- * @head: the &struct plist_head pointer
- * @type: the type of the struct this is embedded in
- * @member: the name of the list_head within the struct
- */
-#ifdef CONFIG_DEBUG_PLIST
-# define plist_first_entry(head, type, member) \
- ({ \
- WARN_ON(plist_head_empty(head)); \
- container_of(plist_first(head), type, member); \
- })
-#else
-# define plist_first_entry(head, type, member) \
- container_of(plist_first(head), type, member)
-#endif
-
-/**
- * plist_last_entry - get the struct for the last entry
- * @head: the &struct plist_head pointer
- * @type: the type of the struct this is embedded in
- * @member: the name of the list_head within the struct
- */
-#ifdef CONFIG_DEBUG_PLIST
-# define plist_last_entry(head, type, member) \
- ({ \
- WARN_ON(plist_head_empty(head)); \
- container_of(plist_last(head), type, member); \
- })
-#else
-# define plist_last_entry(head, type, member) \
- container_of(plist_last(head), type, member)
-#endif
-
-/**
- * plist_next - get the next entry in list
- * @pos: the type * to cursor
- */
-#define plist_next(pos) \
- list_next_entry(pos, node_list)
-
-/**
- * plist_prev - get the prev entry in list
- * @pos: the type * to cursor
- */
-#define plist_prev(pos) \
- list_prev_entry(pos, node_list)
-
-/**
- * plist_first - return the first node (and thus, highest priority)
- * @head: the &struct plist_head pointer
- *
- * Assumes the plist is _not_ empty.
- */
-static inline struct plist_node *plist_first(const struct plist_head *head)
-{
- return list_entry(head->node_list.next,
- struct plist_node, node_list);
-}
-
-/**
- * plist_last - return the last node (and thus, lowest priority)
- * @head: the &struct plist_head pointer
- *
- * Assumes the plist is _not_ empty.
- */
-static inline struct plist_node *plist_last(const struct plist_head *head)
-{
- return list_entry(head->node_list.prev,
- struct plist_node, node_list);
-}
-
-#endif
diff --git a/c/brlib/include/pool.h b/c/brlib/include/pool.h
deleted file mode 100644
index a207012..0000000
--- a/c/brlib/include/pool.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/* pool.h - A simple memory pool manager.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#ifndef POOL_H
-#define POOL_H
-
-#include
-#include
-#include "list.h"
-#include "bits.h"
-
-#define POOL_NAME_LENGTH (16) /* max name length including trailing \0 */
-
-typedef struct {
- struct list_head list_blocks; /* list of allocated blocks in pool */
- char data[]; /* objects block */
-} block_t;
-
-typedef struct {
- char name[POOL_NAME_LENGTH]; /* pool name */
- size_t eltsize; /* object size */
- u32 available; /* current available elements */
- u32 allocated; /* total objects allocated */
- u32 growsize; /* number of objects per block allocated */
- u32 nblocks; /* number of blocks allocated */
- struct list_head list_available; /* available nodes */
- struct list_head list_blocks; /* allocated blocks */
-} pool_t;
-
-/**
- * pool_stats - display some pool statistics
- * @pool: the pool address.
- */
-void pool_stats(pool_t *pool);
-
-/**
- * pool_create - create a new memory pool
- * @name: the name to give to the pool.
- * @grow: the number of elements to add when no more available.
- * @size: the size of an element in pool.
- *
- * The name will be truncated to 16 characters (including the final '\0').
- *
- * Return: The address of the created pool, or NULL if error.
- */
-pool_t *pool_create(const char *name, u32 grow, size_t size);
-
-/**
- * pool_get() - Get an element from a pool.
- * @pool: The pool address.
- *
- * Get an object from the pool.
- *
- * Return: The address of the object, or NULL if error.
- */
-void *pool_get(pool_t *pool);
-
-/**
- * pool_add() - Add (free) an element to a pool.
- * @pool: The pool address.
- * @elt: The address of the object to add to the pool.
- *
- * The object will be available for further pool_get().
- *
- * Return: The current number of available elements in pool (including
- * @elt).
- */
-u32 pool_add(pool_t *pool, void *elt);
-
-/**
- * pool_destroy() - destroy a pool.
- * @pool: The pool address.
- *
- * Attention: All memory is freed, but no check is done whether all pool
- * elements have been released. Referencing any pool object after this call
- * will likely imply some memory corruption.
- */
-void pool_destroy(pool_t *pool);
-
-#endif
diff --git a/c/brlib/include/rwonce.h b/c/brlib/include/rwonce.h
deleted file mode 100644
index 90a28bc..0000000
--- a/c/brlib/include/rwonce.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-/* adaptation of kernel's
- * See https://www.kernel.org/doc/Documentation/memory-barriers.txt
- */
-/*
- * Prevent the compiler from merging or refetching reads or writes. The
- * compiler is also forbidden from reordering successive instances of
- * READ_ONCE and WRITE_ONCE, but only when the compiler is aware of some
- * particular ordering. One way to make the compiler aware of ordering is to
- * put the two invocations of READ_ONCE or WRITE_ONCE in different C
- * statements.
- *
- * These two macros will also work on aggregate data types like structs or
- * unions.
- *
- * Their two major use cases are: (1) Mediating communication between
- * process-level code and irq/NMI handlers, all running on the same CPU,
- * and (2) Ensuring that the compiler does not fold, spindle, or otherwise
- * mutilate accesses that either do not require ordering or that interact
- * with an explicit memory barrier or atomic instruction that provides the
- * required ordering.
- */
-#ifndef __BR_RWONCE_H
-#define __BR_RWONCE_H
-
-/************ originally in */
-#if __has_attribute(__error__)
-# define __compiletime_error(msg) __attribute__((__error__(msg)))
-#else
-# define __compiletime_error(msg)
-#endif
-
-/************ originally in */
-/*
- * __unqual_scalar_typeof(x) - Declare an unqualified scalar type, leaving
- * non-scalar types unchanged.
- */
-/*
- * Prefer C11 _Generic for better compile-times and simpler code. Note: 'char'
- * is not type-compatible with 'signed char', and we define a separate case.
- */
-#define __scalar_type_to_expr_cases(type) \
- unsigned type: (unsigned type)0, \
- signed type: (signed type)0
-
-#define __unqual_scalar_typeof(x) \
- typeof(_Generic((x), \
- char: (char)0, \
- __scalar_type_to_expr_cases(char), \
- __scalar_type_to_expr_cases(short), \
- __scalar_type_to_expr_cases(int), \
- __scalar_type_to_expr_cases(long), \
- __scalar_type_to_expr_cases(long long), \
- default: (x)))
-
-/* Is this type a native word size -- useful for atomic operations */
-#define __native_word(t) \
- (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \
- sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long))
-
-#ifdef __OPTIMIZE__
-# define __compiletime_assert(condition, msg, prefix, suffix) \
- do { \
- extern void prefix ## suffix(void) __compiletime_error(msg); \
- if (!(condition)) \
- prefix ## suffix(); \
- } while (0)
-#else
-# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0)
-#endif
-
-#define _compiletime_assert(condition, msg, prefix, suffix) \
- __compiletime_assert(condition, msg, prefix, suffix)
-
-/**
- * compiletime_assert - break build and emit msg if condition is false
- * @condition: a compile-time constant condition to check
- * @msg: a message to emit if condition is false
- *
- * In tradition of POSIX assert, this macro will break the build if the
- * supplied condition is *false*, emitting the supplied error message if the
- * compiler has support to do so.
- */
-#define compiletime_assert(condition, msg) \
- _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
-
-#define compiletime_assert_atomic_type(t) \
- compiletime_assert(__native_word(t), \
- "Need native word sized stores/loads for atomicity.")
-
-/************ originally in */
-/*
- * Yes, this permits 64-bit accesses on 32-bit architectures. These will
- * actually be atomic in some cases (namely Armv7 + LPAE), but for others we
- * rely on the access being split into 2x32-bit accesses for a 32-bit quantity
- * (e.g. a virtual address) and a strong prevailing wind.
- */
-#define compiletime_assert_rwonce_type(t) \
- compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \
- "Unsupported access size for {READ,WRITE}_ONCE().")
-
-/*
- * Use __READ_ONCE() instead of READ_ONCE() if you do not require any
- * atomicity. Note that this may result in tears!
- */
-#ifndef __READ_ONCE
-#define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x))
-#endif
-
-#define READ_ONCE(x) \
-({ \
- compiletime_assert_rwonce_type(x); \
- __READ_ONCE(x); \
-})
-
-#define __WRITE_ONCE(x, val) \
-do { \
- *(volatile typeof(x) *)&(x) = (val); \
-} while (0)
-
-#define WRITE_ONCE(x, val) \
-do { \
- compiletime_assert_rwonce_type(x); \
- __WRITE_ONCE(x, val); \
-} while (0)
-
-#endif /* __BR_RWONCE_H */
diff --git a/c/brlib/include/stringhash.h b/c/brlib/include/stringhash.h
deleted file mode 100644
index c0c5c5b..0000000
--- a/c/brlib/include/stringhash.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __LINUX_STRINGHASH_H
-#define __LINUX_STRINGHASH_H
-
-#include /* For __pure */
-#include /* For u32, u64 */
-#include
-
-/*
- * Routines for hashing strings of bytes to a 32-bit hash value.
- *
- * These hash functions are NOT GUARANTEED STABLE between kernel
- * versions, architectures, or even repeated boots of the same kernel.
- * (E.g. they may depend on boot-time hardware detection or be
- * deliberately randomized.)
- *
- * They are also not intended to be secure against collisions caused by
- * malicious inputs; much slower hash functions are required for that.
- *
- * They are optimized for pathname components, meaning short strings.
- * Even if a majority of files have longer names, the dynamic profile of
- * pathname components skews short due to short directory names.
- * (E.g. /usr/lib/libsesquipedalianism.so.3.141.)
- */
-
-/*
- * Version 1: one byte at a time. Example of use:
- *
- * unsigned long hash = init_name_hash;
- * while (*p)
- * hash = partial_name_hash(tolower(*p++), hash);
- * hash = end_name_hash(hash);
- *
- * Although this is designed for bytes, fs/hfsplus/unicode.c
- * abuses it to hash 16-bit values.
- */
-
-/* Hash courtesy of the R5 hash in reiserfs modulo sign bits */
-#define init_name_hash(salt) (unsigned long)(salt)
-
-/* partial hash update function. Assume roughly 4 bits per character */
-static inline unsigned long
-partial_name_hash(unsigned long c, unsigned long prevhash)
-{
- return (prevhash + (c << 4) + (c >> 4)) * 11;
-}
-
-/*
- * Finally: cut down the number of bits to a int value (and try to avoid
- * losing bits). This also has the property (wanted by the dcache)
- * that the msbits make a good hash table index.
- */
-static inline unsigned int end_name_hash(unsigned long hash)
-{
- return hash_long(hash, 32);
-}
-
-/*
- * Version 2: One word (32 or 64 bits) at a time.
- * If CONFIG_DCACHE_WORD_ACCESS is defined (meaning
- * exists, which describes major Linux platforms like x86 and ARM), then
- * this computes a different hash function much faster.
- *
- * If not set, this falls back to a wrapper around the preceding.
- */
-extern unsigned int __pure full_name_hash(const void *salt, const char *, unsigned int);
-
-/*
- * A hash_len is a u64 with the hash of a string in the low
- * half and the length in the high half.
- */
-#define hashlen_hash(hashlen) ((u32)(hashlen))
-#define hashlen_len(hashlen) ((u32)((hashlen) >> 32))
-#define hashlen_create(hash, len) ((u64)(len)<<32 | (u32)(hash))
-
-/* Return the "hash_len" (hash and length) of a null-terminated string */
-extern u64 __pure hashlen_string(const void *salt, const char *name);
-
-#endif /* __LINUX_STRINGHASH_H */
diff --git a/c/brlib/include/struct-group.h b/c/brlib/include/struct-group.h
deleted file mode 100644
index 4afeeb3..0000000
--- a/c/brlib/include/struct-group.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/* struct-group.h - mirrored structure macros.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- * Some parts are taken from Linux's kernel and others, and are :
- * SPDX-License-Identifier: GPL-2.0
- *
- */
-
-#ifndef _STRUCT_GROUP_H
-#define _STRUCT_GROUP_H
-
-/**
- * __struct_group() - Create a mirrored named and anonyomous struct
- *
- * @TAG: The tag name for the named sub-struct (usually empty)
- * @NAME: The identifier name of the mirrored sub-struct
- * @ATTRS: Any struct attributes (usually empty)
- * @MEMBERS: The member declarations for the mirrored structs
- *
- * Used to create an anonymous union of two structs with identical layout
- * and size: one anonymous and one named. The former's members can be used
- * normally without sub-struct naming, and the latter can be used to
- * reason about the start, end, and size of the group of struct members.
- * The named struct can also be explicitly tagged for layer reuse, as well
- * as both having struct attributes appended.
- */
-#define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \
- union { \
- struct { MEMBERS } ATTRS; \
- struct TAG { MEMBERS } ATTRS NAME; \
- }
-
-/**
- * DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union
- *
- * @TYPE: The type of each flexible array element
- * @NAME: The name of the flexible array member
- *
- * In order to have a flexible array member in a union or alone in a
- * struct, it needs to be wrapped in an anonymous struct with at least 1
- * named member, but that member can be empty.
- */
-#define DECLARE_FLEX_ARRAY(TYPE, NAME) \
- struct { \
- struct { } __empty_ ## NAME; \
- TYPE NAME[]; \
- }
-
-/**
- * struct_group() - Wrap a set of declarations in a mirrored struct
- *
- * @NAME: The identifier name of the mirrored sub-struct
- * @MEMBERS: The member declarations for the mirrored structs
- *
- * Used to create an anonymous union of two structs with identical
- * layout and size: one anonymous and one named. The former can be
- * used normally without sub-struct naming, and the latter can be
- * used to reason about the start, end, and size of the group of
- * struct members.
- */
-#define struct_group(NAME, MEMBERS...) \
- __struct_group(/* no tag */, NAME, /* no attrs */, MEMBERS)
-
-/**
- * struct_group_attr() - Create a struct_group() with trailing attributes
- *
- * @NAME: The identifier name of the mirrored sub-struct
- * @ATTRS: Any struct attributes to apply
- * @MEMBERS: The member declarations for the mirrored structs
- *
- * Used to create an anonymous union of two structs with identical
- * layout and size: one anonymous and one named. The former can be
- * used normally without sub-struct naming, and the latter can be
- * used to reason about the start, end, and size of the group of
- * struct members. Includes structure attributes argument.
- */
-#define struct_group_attr(NAME, ATTRS, MEMBERS...) \
- __struct_group(/* no tag */, NAME, ATTRS, MEMBERS)
-
-/**
- * struct_group_tagged() - Create a struct_group with a reusable tag
- *
- * @TAG: The tag name for the named sub-struct
- * @NAME: The identifier name of the mirrored sub-struct
- * @MEMBERS: The member declarations for the mirrored structs
- *
- * Used to create an anonymous union of two structs with identical
- * layout and size: one anonymous and one named. The former can be
- * used normally without sub-struct naming, and the latter can be
- * used to reason about the start, end, and size of the group of
- * struct members. Includes struct tag argument for the named copy,
- * so the specified layout can be reused later.
- */
-#define struct_group_tagged(TAG, NAME, MEMBERS...) \
- __struct_group(TAG, NAME, /* no attrs */, MEMBERS)
-
-#endif /* _STRUCT_GROUP_H */
diff --git a/c/brlib/src/bits.c b/c/brlib/src/bits.c
deleted file mode 100644
index bd4282e..0000000
--- a/c/brlib/src/bits.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/* bits.c - information about bitops implementation.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#include "bits.h"
-#include "debug.h"
-
-/**
- * bits_implementation - display bitops implementation.
- *
- * For basic bitops (popcount, ctz, etc...), print the implementation
- * (builtin, emulated).
- */
-void bits_implementation(void)
-{
- log(0, "bitops implementation: ");
-
- log(0, "popcount64: ");
-# if __has_builtin(__builtin_popcountl)
- log(0, "builtin, ");
-# else
- log(0, "emulated, ");
-# endif
-
- log(0, "popcount32: ");
-# if __has_builtin(__builtin_popcount)
- log(0, "builtin, ");
-# else
- log(0, "emulated, ");
-# endif
-
- log(0, "ctz64: ");
-# if __has_builtin(__builtin_ctzl)
- log(0, "builtin, ");
-# elif __has_builtin(__builtin_clzl)
- log(0, "builtin (clzl), ");
-# else
- log(0, "emulated, ");
-# endif
-
- log(0, "ctz32: ");
-# if __has_builtin(__builtin_ctz)
- log(0, "builtin, ");
-# elif __has_builtin(__builtin_clz)
- log(0, "builtin (clz), ");
-# else
- log(0, "emulated, ");
-# endif
-
- log(0, "clz64: ");
-# if __has_builtin(__builtin_clzl)
- log(0, "builtin, ");
-# else
- log(0, "emulated, ");
-# endif
-
- log(0, "clz32: ");
-# if __has_builtin(__builtin_clz)
- log(0, "builtin, ");
-# else
- log(0, "emulated, ");
-# endif
-
- log(0, "ffs64: ");
-# if __has_builtin(__builtin_ffsl)
- log(0, "builtin, ");
-# elif __has_builtin(__builtin_ctzl)
- log(0, "builtin (ctzl), ");
-# else
- log(0, "emulated, ");
-# endif
-
- log(0, "ffs32: ");
-# if __has_builtin(__builtin_ffs)
- log(0, "builtin, ");
-# elif __has_builtin(__builtin_ctz)
- log(0, "builtin (ctzl), ");
-# else
- log(0, "emulated, ");
-# endif
- log(0, "\n");
-}
diff --git a/c/brlib/src/debug.c b/c/brlib/src/debug.c
deleted file mode 100644
index 164a04b..0000000
--- a/c/brlib/src/debug.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/* debug.c - debug/log management
- *
- * Copyright (C) 2021-2023 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#include
-#include
-#include
-
-#ifndef DEBUG_DEBUG
-#define DEBUG_DEBUG
-#endif
-
-#include "debug.h"
-
-static long long timer_start; /* in nanosecond */
-static int level = 0; /* output log when < level */
-static int flush = false; /* force flush after logs */
-static FILE *stream = NULL; /* stream to use */
-
-/**
- * debug_level_set() - set debug level.
- * @_level: debug level (integer).
- */
-void debug_level_set(int _level)
-{
- level = _level;
-# ifdef DEBUG_DEBUG_C
- log(0, "debug level set to %u\n", level);
-# endif
-}
-
-/**
- * debug_level_get() - get debug level.
- * @return: current level debug (integer).
- */
-int debug_level_get(void)
-{
- return level;
-}
-
-void debug_stream_set(FILE *_stream)
-{
- stream = _stream;
-# ifdef DEBUG_DEBUG_C
- log(0, "stream set to %d\n", stream? fileno(stream): -1);
-# endif
-}
-
-void debug_flush_set(bool _flush)
-{
- flush = _flush;
-# ifdef DEBUG_DEBUG_C
- log(0, "debug flush %s.\n", flush? "set": "unset");
-# endif
-}
-
-void debug_init(int _level, FILE *_stream, bool _flush)
-{
- struct timespec timer;
-
- debug_stream_set(_stream);
- debug_level_set(_level);
- debug_flush_set(_flush);
- if (!clock_gettime(CLOCK_MONOTONIC, &timer)) {
- timer_start = timer.tv_sec * NANOSEC + timer.tv_nsec;
- }
- else {
- timer_start = 0;
- }
- log(0, "timer started.\n");
-}
-
-long long debug_timer_elapsed(void)
-{
- struct timespec timer;
-
- clock_gettime(CLOCK_MONOTONIC, &timer);
- return (timer.tv_sec * NANOSEC + timer.tv_nsec) - timer_start;
-}
-
-/**
- * debug() - log function
- * @lev: log level
- * @timestamp: boolean, print timestamp if true
- * @indent: indent level (2 spaces each)
- * @src: source file/func name (or NULL)
- * @line: line number
- */
-void debug(int lev, bool timestamp, int indent, const char *src,
- int line, const char *fmt, ...)
-{
- if (!stream || lev > level)
- return;
-
- va_list ap;
-
- if (indent)
- fprintf(stream, "%*s", 2*(indent-1), "");
-
- if (timestamp) {
- long long diff = debug_timer_elapsed();
- fprintf(stream, "%lld.%03lld ", diff/NANOSEC, (diff/1000000)%1000);
- fprintf(stream, "%010lld ", diff);
- }
-
- if (src) {
- if (line)
- fprintf(stream, "[%s:%u] ", src, line);
- else
- fprintf(stream, "[%s] ", src);
- }
- va_start(ap, fmt);
- vfprintf(stream, fmt, ap);
- va_end(ap);
- if (flush)
- fflush(stream);
-}
diff --git a/c/brlib/src/hash.c b/c/brlib/src/hash.c
deleted file mode 100644
index c9c0093..0000000
--- a/c/brlib/src/hash.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-/* inspired from kernel's
- */
-#include "hash.h"
-
-/* Return the hash of a string of known length */
-unsigned int hash_string(const void *salt, const char *name, unsigned int len)
-{
- unsigned long hash = init_name_hash(salt);
- while (len--)
- hash = partial_name_hash((unsigned char)*name++, hash);
- return end_name_hash(hash);
-}
-
-/* Return the "hash_len" (hash and length) of a null-terminated string */
-u64 hashlen_string(const void *salt, const char *name)
-{
- unsigned long hash = init_name_hash(salt);
- unsigned long len = 0, c;
-
- c = (unsigned char)*name;
- while (c) {
- len++;
- hash = partial_name_hash(c, hash);
- c = (unsigned char)name[len];
- }
- return hashlen_create(end_name_hash(hash), len);
-}
diff --git a/c/brlib/src/pjwhash.c b/c/brlib/src/pjwhash.c
deleted file mode 100644
index 554f9e3..0000000
--- a/c/brlib/src/pjwhash.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/* pjwhash.c - PJW hash function.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#define _pjw_inline extern
-
-//#include "bits.h"
-//extern unsigned int pjwhash (const void* key, uint length);
-
-#include "pjwhash.h"
-#include "pjwhash-inline.h"
diff --git a/c/brlib/src/plist.c b/c/brlib/src/plist.c
deleted file mode 100644
index 72e1fb1..0000000
--- a/c/brlib/src/plist.c
+++ /dev/null
@@ -1,173 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * adapted from Linux kernel lib/plist.c
- *
- * Descending-priority-sorted double-linked list
- *
- * (C) 2002-2003 Intel Corp
- * Inaky Perez-Gonzalez .
- *
- * 2001-2005 (c) MontaVista Software, Inc.
- * Daniel Walker
- *
- * (C) 2005 Thomas Gleixner
- *
- * Simplifications of the original code by
- * Oleg Nesterov
- *
- * Based on simple lists (include/linux/list.h).
- *
- * This file contains the add / del functions which are considered to
- * be too large to inline. See include/linux/plist.h for further
- * information.
- */
-
-#include "plist.h"
-#include "bug.h"
-
-#ifdef DEBUG_PLIST
-
-static struct plist_head test_head;
-
-static void plist_check_prev_next(struct list_head *t, struct list_head *p,
- struct list_head *n)
-{
- WARN(n->prev != p || p->next != n,
- "top: %p, n: %p, p: %p\n"
- "prev: %p, n: %p, p: %p\n"
- "next: %p, n: %p, p: %p\n",
- t, t->next, t->prev,
- p, p->next, p->prev,
- n, n->next, n->prev);
-}
-
-static void plist_check_list(struct list_head *top)
-{
- struct list_head *prev = top, *next = top->next;
-
- plist_check_prev_next(top, prev, next);
- while (next != top) {
- prev = next;
- next = prev->next;
- plist_check_prev_next(top, prev, next);
- }
-}
-
-static void plist_check_head(struct plist_head *head)
-{
- if (!plist_head_empty(head))
- plist_check_list(&plist_first(head)->prio_list);
- plist_check_list(&head->node_list);
-}
-
-#else
-# define plist_check_head(h) do { } while (0)
-#endif
-
-/**
- * plist_add - add @node to @head
- *
- * @node: &struct plist_node pointer
- * @head: &struct plist_head pointer
- */
-void plist_add(struct plist_node *node, struct plist_head *head)
-{
- struct plist_node *first, *iter, *prev = NULL;
- struct list_head *node_next = &head->node_list;
-
- plist_check_head(head);
- WARN_ON(!plist_node_empty(node));
- WARN_ON(!list_empty(&node->prio_list));
-
- if (plist_head_empty(head))
- goto ins_node;
-
- first = iter = plist_first(head);
-
- do {
- if (node->prio < iter->prio) {
- node_next = &iter->node_list;
- break;
- }
-
- prev = iter;
- iter = list_entry(iter->prio_list.next,
- struct plist_node, prio_list);
- } while (iter != first);
-
- if (!prev || prev->prio != node->prio)
- list_add_tail(&node->prio_list, &iter->prio_list);
-ins_node:
- list_add_tail(&node->node_list, node_next);
-
- plist_check_head(head);
-}
-
-/**
- * plist_del - Remove a @node from plist.
- *
- * @node: &struct plist_node pointer - entry to be removed
- * @head: &struct plist_head pointer - list head
- */
-void plist_del(struct plist_node *node, struct plist_head *head)
-{
- plist_check_head(head);
-
- if (!list_empty(&node->prio_list)) {
- if (node->node_list.next != &head->node_list) {
- struct plist_node *next;
-
- next = list_entry(node->node_list.next,
- struct plist_node, node_list);
-
- /* add the next plist_node into prio_list */
- if (list_empty(&next->prio_list))
- list_add(&next->prio_list, &node->prio_list);
- }
- list_del_init(&node->prio_list);
- }
-
- list_del_init(&node->node_list);
-
- plist_check_head(head);
-}
-
-/**
- * plist_requeue - Requeue @node at end of same-prio entries.
- *
- * This is essentially an optimized plist_del() followed by
- * plist_add(). It moves an entry already in the plist to
- * after any other same-priority entries.
- *
- * @node: &struct plist_node pointer - entry to be moved
- * @head: &struct plist_head pointer - list head
- */
-void plist_requeue(struct plist_node *node, struct plist_head *head)
-{
- struct plist_node *iter;
- struct list_head *node_next = &head->node_list;
-
- plist_check_head(head);
- BUG_ON(plist_head_empty(head));
- BUG_ON(plist_node_empty(node));
-
- if (node == plist_last(head))
- return;
-
- iter = plist_next(node);
-
- if (node->prio != iter->prio)
- return;
-
- plist_del(node, head);
-
- plist_for_each_continue(iter, head) {
- if (node->prio != iter->prio) {
- node_next = &iter->node_list;
- break;
- }
- }
- list_add_tail(&node->node_list, node_next);
-
- plist_check_head(head);
-}
diff --git a/c/brlib/src/pool.c b/c/brlib/src/pool.c
deleted file mode 100644
index a423141..0000000
--- a/c/brlib/src/pool.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/* pool.c - A simple pool manager.
- *
- * Copyright (C) 2021-2022 Bruno Raoult ("br")
- * Licensed under the GNU General Public License v3.0 or later.
- * Some rights reserved. See COPYING.
- *
- * You should have received a copy of the GNU General Public License along with this
- * program. If not, see .
- *
- * SPDX-License-Identifier: GPL-3.0-or-later
- *
- */
-
-#include
-#include
-#include
-#include
-#include
-
-#include "list.h"
-#include "pool.h"
-#include "debug.h"
-#include "bits.h"
-
-void pool_stats(pool_t *pool)
-{
- if (pool) {
- block_t *block;
-
- log_f(1, "[%s] pool [%p]: blocks:%u avail:%u alloc:%u grow:%u eltsize:%zu\n",
- pool->name, (void *)pool, pool->nblocks, pool->available,
- pool->allocated, pool->growsize, pool->eltsize);
- log(5, "\tblocks: ");
- list_for_each_entry(block, &pool->list_blocks, list_blocks) {
- log(5, "%p ", block);
- }
- log(5, "\n");
- }
-}
-
-pool_t *pool_create(const char *name, u32 growsize, size_t eltsize)
-{
- pool_t *pool;
-
-# ifdef DEBUG_POOL
- log_f(1, "name=[%s] growsize=%u eltsize=%zu\n", name, growsize, eltsize);
-# endif
- /* we need at least sizeof(struct list_head) space in pool elements
- */
- if (eltsize < sizeof (struct list_head)) {
-# ifdef DEBUG_POOL
- log_f(1, "[%s]: structure size too small (%zu < %zu), adjusting to %zu.\n",
- name, eltsize, sizeof(struct list_head), sizeof(struct list_head));
-# endif
- eltsize = sizeof(struct list_head);
- }
- if ((pool = malloc(sizeof (*pool)))) {
- strncpy(pool->name, name, POOL_NAME_LENGTH - 1);
- pool->name[POOL_NAME_LENGTH - 1] = 0;
- pool->growsize = growsize;
- pool->eltsize = eltsize;
- pool->available = 0;
- pool->allocated = 0;
- pool->nblocks = 0;
- INIT_LIST_HEAD(&pool->list_available);
- INIT_LIST_HEAD(&pool->list_blocks);
- } else {
- errno = ENOMEM;
- }
- return pool;
-}
-
-static u32 _pool_add(pool_t *pool, struct list_head *elt)
-{
-# ifdef DEBUG_POOL
- log_f(6, "pool=%p &head=%p elt=%p off1=%zu off2=%zu\n",
- (void *)pool, (void *)&pool->list_available, (void *)elt,
- (void *)&pool->list_available - (void *)pool,
- offsetof(pool_t, list_available));
-# endif
-
- list_add(elt, &pool->list_available);
- return ++pool->available;
-}
-
-u32 pool_add(pool_t *pool, void *elt)
-{
- return _pool_add(pool, elt);
-}
-
-static struct list_head *_pool_get(pool_t *pool)
-{
- struct list_head *res = pool->list_available.next;
- pool->available--;
- list_del(res);
- return res;
-}
-
-void *pool_get(pool_t *pool)
-{
- if (!pool)
- return NULL;
- if (!pool->available) {
- block_t *block = malloc(sizeof(block_t) + pool->eltsize * pool->growsize);
- if (!block) {
-# ifdef DEBUG_POOL
- log_f(1, "[%s]: failed block allocation\n", pool->name);
-# endif
- errno = ENOMEM;
- return NULL;
- }
-
- /* maintain list of allocated blocks
- */
- list_add(&block->list_blocks, &pool->list_blocks);
- pool->nblocks++;
-
-# ifdef DEBUG_POOL
- log_f(1, "[%s]: growing pool from %u to %u elements. block=%p nblocks=%u\n",
- pool->name,
- pool->allocated,
- pool->allocated + pool->growsize,
- block,
- pool->nblocks);
-# endif
-
- pool->allocated += pool->growsize;
- for (u32 i = 0; i < pool->growsize; ++i) {
- void *cur = block->data + i * pool->eltsize;
-# ifdef DEBUG_POOL
- log_f(7, "alloc=%p cur=%p\n", block, cur);
-# endif
- _pool_add(pool, (struct list_head *)cur);
- }
- }
- /* this is the effective address of the object (and also the
- * pool list_head address)
- */
- return _pool_get(pool);
-}
-
-void pool_destroy(pool_t *pool)
-{
- block_t *block, *tmp;
- if (!pool)
- return;
- /* release memory blocks */
-# ifdef DEBUG_POOL
- log_f(1, "[%s]: releasing %d blocks and main structure\n", pool->name, pool->nblocks);
- log(5, "blocks:");
-# endif
- list_for_each_entry_safe(block, tmp, &pool->list_blocks, list_blocks) {
-# ifdef DEBUG_POOL
- log(5, " %p", block);
-# endif
- list_del(&block->list_blocks);
- free(block);
- }
-# ifdef DEBUG_POOL
- log(5, "\n");
-# endif
- free(pool);
-}
diff --git a/c/brlib/test/test/tst-debug.c b/c/brlib/test/test/tst-debug.c
deleted file mode 100644
index f294c89..0000000
--- a/c/brlib/test/test/tst-debug.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include
-#include "debug.h"
-
-int main()
-{
- int foo=1;
- debug_init(5);
-
- log(0, "log0=%d\n", foo++);
- log(1, "log1=%d\n", foo++);
- log(2, "log2=%d\n", foo++);
- log_i(2, "log_i 2=%d\n", foo++);
- log_i(5, "log_i 5=%d\n", foo++);
- log_i(6, "log_i 6=%d\n", foo++);
- log_it(4, "log_it 4=%d\n", foo++);
- log_f(1, "log_f 5=%d\n", foo++);
-}
diff --git a/c/brlib/test/tst-pool.c b/c/brlib/test/tst-pool.c
deleted file mode 100644
index 14ce9f7..0000000
--- a/c/brlib/test/tst-pool.c
+++ /dev/null
@@ -1,57 +0,0 @@
-#include
-#include "bits.h"
-#include "pool.h"
-
-struct d {
- u16 data1;
- char c;
- struct list_head list;
-};
-
-static LIST_HEAD (head);
-
-int main(int ac, char**av)
-{
- pool_t *pool;
- int total;
- int action=0;
- u16 icur=0;
- char ccur='z';
- struct d *elt;
-
- debug_init(3);
- log_f(1, "%s: sizeof(d)=%lu sizeof(*d)=%lu off=%lu\n", *av, sizeof(elt),
- sizeof(*elt), offsetof(struct d, list));
-
- if ((pool = pool_create("dummy", 3, sizeof(*elt)))) {
- pool_stats(pool);
- for (int cur=1; curdata1 = icur++;
- elt->c = ccur--;
- list_add(&elt->list, &head);
- }
- pool_stats(pool);
- action = 1;
- } else { /* remove one elt from list */
- log_f(2, "deleting %d elements\n", total);
- for (int i = 0; i < total; ++i) {
- if (!list_empty(&head)) {
- elt = list_last_entry(&head, struct d, list);
- printf("elt=[%d, %c]\n", elt->data1, elt->c);
- list_del(&elt->list);
- pool_add(pool, elt);
- }
- }
- pool_stats(pool);
- action = 0;
- }
- }
- }
- pool_stats(pool);
- pool_destroy(pool);
-}
diff --git a/c/brlib/todo/asm/unaligned.h b/c/brlib/todo/asm/unaligned.h
deleted file mode 100644
index 699650f..0000000
--- a/c/brlib/todo/asm/unaligned.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __ASM_GENERIC_UNALIGNED_H
-#define __ASM_GENERIC_UNALIGNED_H
-
-/*
- * This is the most generic implementation of unaligned accesses
- * and should work almost anywhere.
- */
-#include
-#include
-
-#define __get_unaligned_t(type, ptr) ({ \
- const struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr); \
- __pptr->x; \
-})
-
-#define __put_unaligned_t(type, val, ptr) do { \
- struct { type x; } __packed *__pptr = (typeof(__pptr))(ptr); \
- __pptr->x = (val); \
-} while (0)
-
-#define get_unaligned(ptr) __get_unaligned_t(typeof(*(ptr)), (ptr))
-#define put_unaligned(val, ptr) __put_unaligned_t(typeof(*(ptr)), (val), (ptr))
-
-static inline u16 get_unaligned_le16(const void *p)
-{
- return le16_to_cpu(__get_unaligned_t(__le16, p));
-}
-
-static inline u32 get_unaligned_le32(const void *p)
-{
- return le32_to_cpu(__get_unaligned_t(__le32, p));
-}
-
-static inline u64 get_unaligned_le64(const void *p)
-{
- return le64_to_cpu(__get_unaligned_t(__le64, p));
-}
-
-static inline void put_unaligned_le16(u16 val, void *p)
-{
- __put_unaligned_t(__le16, cpu_to_le16(val), p);
-}
-
-static inline void put_unaligned_le32(u32 val, void *p)
-{
- __put_unaligned_t(__le32, cpu_to_le32(val), p);
-}
-
-static inline void put_unaligned_le64(u64 val, void *p)
-{
- __put_unaligned_t(__le64, cpu_to_le64(val), p);
-}
-
-static inline u16 get_unaligned_be16(const void *p)
-{
- return be16_to_cpu(__get_unaligned_t(__be16, p));
-}
-
-static inline u32 get_unaligned_be32(const void *p)
-{
- return be32_to_cpu(__get_unaligned_t(__be32, p));
-}
-
-static inline u64 get_unaligned_be64(const void *p)
-{
- return be64_to_cpu(__get_unaligned_t(__be64, p));
-}
-
-static inline void put_unaligned_be16(u16 val, void *p)
-{
- __put_unaligned_t(__be16, cpu_to_be16(val), p);
-}
-
-static inline void put_unaligned_be32(u32 val, void *p)
-{
- __put_unaligned_t(__be32, cpu_to_be32(val), p);
-}
-
-static inline void put_unaligned_be64(u64 val, void *p)
-{
- __put_unaligned_t(__be64, cpu_to_be64(val), p);
-}
-
-static inline u32 __get_unaligned_be24(const u8 *p)
-{
- return p[0] << 16 | p[1] << 8 | p[2];
-}
-
-static inline u32 get_unaligned_be24(const void *p)
-{
- return __get_unaligned_be24(p);
-}
-
-static inline u32 __get_unaligned_le24(const u8 *p)
-{
- return p[0] | p[1] << 8 | p[2] << 16;
-}
-
-static inline u32 get_unaligned_le24(const void *p)
-{
- return __get_unaligned_le24(p);
-}
-
-static inline void __put_unaligned_be24(const u32 val, u8 *p)
-{
- *p++ = val >> 16;
- *p++ = val >> 8;
- *p++ = val;
-}
-
-static inline void put_unaligned_be24(const u32 val, void *p)
-{
- __put_unaligned_be24(val, p);
-}
-
-static inline void __put_unaligned_le24(const u32 val, u8 *p)
-{
- *p++ = val;
- *p++ = val >> 8;
- *p++ = val >> 16;
-}
-
-static inline void put_unaligned_le24(const u32 val, void *p)
-{
- __put_unaligned_le24(val, p);
-}
-
-static inline void __put_unaligned_be48(const u64 val, u8 *p)
-{
- *p++ = val >> 40;
- *p++ = val >> 32;
- *p++ = val >> 24;
- *p++ = val >> 16;
- *p++ = val >> 8;
- *p++ = val;
-}
-
-static inline void put_unaligned_be48(const u64 val, void *p)
-{
- __put_unaligned_be48(val, p);
-}
-
-static inline u64 __get_unaligned_be48(const u8 *p)
-{
- return (u64)p[0] << 40 | (u64)p[1] << 32 | (u64)p[2] << 24 |
- p[3] << 16 | p[4] << 8 | p[5];
-}
-
-static inline u64 get_unaligned_be48(const void *p)
-{
- return __get_unaligned_be48(p);
-}
-
-#endif /* __ASM_GENERIC_UNALIGNED_H */
diff --git a/c/brlib/todo/circ_buf.c b/c/brlib/todo/circ_buf.c
deleted file mode 100644
index a5aa0d2..0000000
--- a/c/brlib/todo/circ_buf.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * See Documentation/core-api/circular-buffers.rst for more information.
- */
-
-#include
-#include
-
-#define CIRC_BUF(name, type, bits) \
- struct s##name { \
- type buf[1 << (bits)]; \
- int head; \
- int tail; \
- } name = { \
- { 0 }, \
- 0, \
- 0 };
-
-struct circ_buf {
- char *buf;
- int head;
- int tail;
-};
-
-/* Return count in buffer. */
-#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))
-
-/* Return space available, 0..size-1. We always leave one free char
- as a completely full buffer has head == tail, which is the same as
- empty. */
-#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))
-
-/* Return count up to the end of the buffer. Carefully avoid
- accessing head and tail more than once, so they can change
- underneath us without returning inconsistent results. */
-#define CIRC_CNT_TO_END(head,tail,size) \
- ({int end = (size) - (tail); \
- int n = ((head) + end) & ((size)-1); \
- n < end ? n : end;})
-
-/* Return space available up to the end of the buffer. */
-#define CIRC_SPACE_TO_END(head,tail,size) \
- ({int end = (size) - 1 - (head); \
- int n = (end + (tail)) & ((size)-1); \
- n <= end ? n : end+1;})
-
-
-int main(int ac, char **av)
-{
- int size = 5;
-
- if (ac > 8) {
- size = atoi(*(av + 1));
- }
- printf("size-%d\n", size);
-
- CIRC_BUF(foo, int, 5);
- printf("sizeof(elt)=%lu\n", sizeof(foo.buf[0]));
- printf("sizeof(buf)=%lu\n", sizeof(foo.buf));
-
-}
diff --git a/c/brlib/todo/circ_buf.h b/c/brlib/todo/circ_buf.h
deleted file mode 100644
index 510baf0..0000000
--- a/c/brlib/todo/circ_buf.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * See Documentation/core-api/circular-buffers.rst for more information.
- */
-
-#ifndef _LINUX_CIRC_BUF_H
-#define _LINUX_CIRC_BUF_H 1
-
-#define CIRC_BUF(name, type, bits) \
- struct s##name { \
- type buf[1 << (bits)]; \
- int head; \
- int tail; \
- };
-
-struct circ_buf {
- char *buf;
- int head;
- int tail;
-};
-
-/* Return count in buffer. */
-#define CIRC_CNT(head,tail,size) (((head) - (tail)) & ((size)-1))
-
-/* Return space available, 0..size-1. We always leave one free char
- as a completely full buffer has head == tail, which is the same as
- empty. */
-#define CIRC_SPACE(head,tail,size) CIRC_CNT((tail),((head)+1),(size))
-
-/* Return count up to the end of the buffer. Carefully avoid
- accessing head and tail more than once, so they can change
- underneath us without returning inconsistent results. */
-#define CIRC_CNT_TO_END(head,tail,size) \
- ({int end = (size) - (tail); \
- int n = ((head) + end) & ((size)-1); \
- n < end ? n : end;})
-
-/* Return space available up to the end of the buffer. */
-#define CIRC_SPACE_TO_END(head,tail,size) \
- ({int end = (size) - 1 - (head); \
- int n = (end + (tail)) & ((size)-1); \
- n <= end ? n : end+1;})
-
-#endif /* _LINUX_CIRC_BUF_H */
diff --git a/c/brlib/todo/hashtest.c b/c/brlib/todo/hashtest.c
deleted file mode 100644
index b4666e4..0000000
--- a/c/brlib/todo/hashtest.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include
-#include "hash.h"
-
-int main()
-{
- printf("foo\n");
- return 1;
-}
diff --git a/c/brlib/todo/list_sort.c b/c/brlib/todo/list_sort.c
deleted file mode 100644
index 79180ea..0000000
--- a/c/brlib/todo/list_sort.c
+++ /dev/null
@@ -1,253 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-
-/*
- * Taken from linux kernel: lib/list_sort.c
- */
-#include "list_sort.h"
-#include "list.h"
-#include "bits.h"
-#include "likely.h"
-
-/*
- * Returns a list organized in an intermediate format suited
- * to chaining of merge() calls: null-terminated, no reserved or
- * sentinel head node, "prev" links not maintained.
- */
-__attribute__((nonnull(2,3,4)))
-static struct list_head *merge(void *priv, list_cmp_func_t cmp,
- struct list_head *a, struct list_head *b)
-{
- struct list_head *head, **tail = &head;
-
- for (;;) {
- /* if equal, take 'a' -- important for sort stability */
- if (cmp(priv, a, b) <= 0) {
- *tail = a;
- tail = &a->next;
- a = a->next;
- if (!a) {
- *tail = b;
- break;
- }
- } else {
- *tail = b;
- tail = &b->next;
- b = b->next;
- if (!b) {
- *tail = a;
- break;
- }
- }
- }
- return head;
-}
-
-/*
- * Combine final list merge with restoration of standard doubly-linked
- * list structure. This approach duplicates code from merge(), but
- * runs faster than the tidier alternatives of either a separate final
- * prev-link restoration pass, or maintaining the prev links
- * throughout.
- */
-__attribute__((nonnull(2,3,4,5)))
-static void merge_final(void *priv, list_cmp_func_t cmp, struct list_head *head,
- struct list_head *a, struct list_head *b)
-{
- struct list_head *tail = head;
- u8 count = 0;
-
- for (;;) {
- /* if equal, take 'a' -- important for sort stability */
- if (cmp(priv, a, b) <= 0) {
- tail->next = a;
- a->prev = tail;
- tail = a;
- a = a->next;
- if (!a)
- break;
- } else {
- tail->next = b;
- b->prev = tail;
- tail = b;
- b = b->next;
- if (!b) {
- b = a;
- break;
- }
- }
- }
-
- /* Finish linking remainder of list b on to tail */
- tail->next = b;
- do {
- /*
- * If the merge is highly unbalanced (e.g. the input is
- * already sorted), this loop may run many iterations.
- * Continue callbacks to the client even though no
- * element comparison is needed, so the client's cmp()
- * routine can invoke cond_resched() periodically.
- */
- if (unlikely(!++count))
- cmp(priv, b, b);
- b->prev = tail;
- tail = b;
- b = b->next;
- } while (b);
-
- /* And the final links to make a circular doubly-linked list */
- tail->next = head;
- head->prev = tail;
-}
-
-/**
- * list_sort - sort a list
- * @priv: private data, opaque to list_sort(), passed to @cmp
- * @head: the list to sort
- * @cmp: the elements comparison function
- *
- * The comparison function @cmp must return > 0 if @a should sort after
- * @b ("@a > @b" if you want an ascending sort), and <= 0 if @a should
- * sort before @b *or* their original order should be preserved. It is
- * always called with the element that came first in the input in @a,
- * and list_sort is a stable sort, so it is not necessary to distinguish
- * the @a < @b and @a == @b cases.
- *
- * This is compatible with two styles of @cmp function:
- * - The traditional style which returns <0 / =0 / >0, or
- * - Returning a boolean 0/1.
- * The latter offers a chance to save a few cycles in the comparison
- * (which is used by e.g. plug_ctx_cmp() in block/blk-mq.c).
- *
- * A good way to write a multi-word comparison is::
- *
- * if (a->high != b->high)
- * return a->high > b->high;
- * if (a->middle != b->middle)
- * return a->middle > b->middle;
- * return a->low > b->low;
- *
- *
- * This mergesort is as eager as possible while always performing at least
- * 2:1 balanced merges. Given two pending sublists of size 2^k, they are
- * merged to a size-2^(k+1) list as soon as we have 2^k following elements.
- *
- * Thus, it will avoid cache thrashing as long as 3*2^k elements can
- * fit into the cache. Not quite as good as a fully-eager bottom-up
- * mergesort, but it does use 0.2*n fewer comparisons, so is faster in
- * the common case that everything fits into L1.
- *
- *
- * The merging is controlled by "count", the number of elements in the
- * pending lists. This is beautifully simple code, but rather subtle.
- *
- * Each time we increment "count", we set one bit (bit k) and clear
- * bits k-1 .. 0. Each time this happens (except the very first time
- * for each bit, when count increments to 2^k), we merge two lists of
- * size 2^k into one list of size 2^(k+1).
- *
- * This merge happens exactly when the count reaches an odd multiple of
- * 2^k, which is when we have 2^k elements pending in smaller lists,
- * so it's safe to merge away two lists of size 2^k.
- *
- * After this happens twice, we have created two lists of size 2^(k+1),
- * which will be merged into a list of size 2^(k+2) before we create
- * a third list of size 2^(k+1), so there are never more than two pending.
- *
- * The number of pending lists of size 2^k is determined by the
- * state of bit k of "count" plus two extra pieces of information:
- *
- * - The state of bit k-1 (when k == 0, consider bit -1 always set), and
- * - Whether the higher-order bits are zero or non-zero (i.e.
- * is count >= 2^(k+1)).
- *
- * There are six states we distinguish. "x" represents some arbitrary
- * bits, and "y" represents some arbitrary non-zero bits:
- * 0: 00x: 0 pending of size 2^k; x pending of sizes < 2^k
- * 1: 01x: 0 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k
- * 2: x10x: 0 pending of size 2^k; 2^k + x pending of sizes < 2^k
- * 3: x11x: 1 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k
- * 4: y00x: 1 pending of size 2^k; 2^k + x pending of sizes < 2^k
- * 5: y01x: 2 pending of size 2^k; 2^(k-1) + x pending of sizes < 2^k
- * (merge and loop back to state 2)
- *
- * We gain lists of size 2^k in the 2->3 and 4->5 transitions (because
- * bit k-1 is set while the more significant bits are non-zero) and
- * merge them away in the 5->2 transition. Note in particular that just
- * before the 5->2 transition, all lower-order bits are 11 (state 3),
- * so there is one list of each smaller size.
- *
- * When we reach the end of the input, we merge all the pending
- * lists, from smallest to largest. If you work through cases 2 to
- * 5 above, you can see that the number of elements we merge with a list
- * of size 2^k varies from 2^(k-1) (cases 3 and 5 when x == 0) to
- * 2^(k+1) - 1 (second merge of case 5 when x == 2^(k-1) - 1).
- */
-__attribute__((nonnull(2,3)))
-void list_sort(void *priv, struct list_head *head, list_cmp_func_t cmp)
-{
- struct list_head *list = head->next, *pending = NULL;
- size_t count = 0; /* Count of pending */
-
- if (list == head->prev) /* Zero or one elements */
- return;
-
- /* Convert to a null-terminated singly-linked list. */
- head->prev->next = NULL;
-
- /*
- * Data structure invariants:
- * - All lists are singly linked and null-terminated; prev
- * pointers are not maintained.
- * - pending is a prev-linked "list of lists" of sorted
- * sublists awaiting further merging.
- * - Each of the sorted sublists is power-of-two in size.
- * - Sublists are sorted by size and age, smallest & newest at front.
- * - There are zero to two sublists of each size.
- * - A pair of pending sublists are merged as soon as the number
- * of following pending elements equals their size (i.e.
- * each time count reaches an odd multiple of that size).
- * That ensures each later final merge will be at worst 2:1.
- * - Each round consists of:
- * - Merging the two sublists selected by the highest bit
- * which flips when count is incremented, and
- * - Adding an element from the input as a size-1 sublist.
- */
- do {
- size_t bits;
- struct list_head **tail = &pending;
-
- /* Find the least-significant clear bit in count */
- for (bits = count; bits & 1; bits >>= 1)
- tail = &(*tail)->prev;
- /* Do the indicated merge */
- if (likely(bits)) {
- struct list_head *a = *tail, *b = a->prev;
-
- a = merge(priv, cmp, b, a);
- /* Install the merged result in place of the inputs */
- a->prev = b->prev;
- *tail = a;
- }
-
- /* Move one element from input list to pending */
- list->prev = pending;
- pending = list;
- list = list->next;
- pending->next = NULL;
- count++;
- } while (list);
-
- /* End of input; merge together all the pending lists. */
- list = pending;
- pending = pending->prev;
- for (;;) {
- struct list_head *next = pending->prev;
-
- if (!next)
- break;
- list = merge(priv, cmp, pending, list);
- pending = next;
- }
- /* The final merge, rebuilding prev links */
- merge_final(priv, cmp, head, pending, list);
-}
diff --git a/c/brlib/todo/list_sort.h b/c/brlib/todo/list_sort.h
deleted file mode 100644
index 6d67cbe..0000000
--- a/c/brlib/todo/list_sort.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-
-/*
- * Taken from linux kernel: lib/list_sort.c
- */
-
-#ifndef _BR_LIST_SORT_H
-#define _BR_LIST_SORT_H
-
-//#include
-
-struct list_head;
-
-typedef int __attribute__((nonnull(2,3))) (*list_cmp_func_t)(void *,
- const struct list_head *, const struct list_head *);
-
-__attribute__((nonnull(2,3)))
-void list_sort(void *priv, struct list_head *head, list_cmp_func_t cmp);
-
-#endif /* _BR_LIST_SORT */
diff --git a/c/brlib/todo/packed_struct.h b/c/brlib/todo/packed_struct.h
deleted file mode 100644
index f4c8eaf..0000000
--- a/c/brlib/todo/packed_struct.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef _LINUX_UNALIGNED_PACKED_STRUCT_H
-#define _LINUX_UNALIGNED_PACKED_STRUCT_H
-
-#include
-
-struct __una_u16 { u16 x; } __packed;
-struct __una_u32 { u32 x; } __packed;
-struct __una_u64 { u64 x; } __packed;
-
-static inline u16 __get_unaligned_cpu16(const void *p)
-{
- const struct __una_u16 *ptr = (const struct __una_u16 *)p;
- return ptr->x;
-}
-
-static inline u32 __get_unaligned_cpu32(const void *p)
-{
- const struct __una_u32 *ptr = (const struct __una_u32 *)p;
- return ptr->x;
-}
-
-static inline u64 __get_unaligned_cpu64(const void *p)
-{
- const struct __una_u64 *ptr = (const struct __una_u64 *)p;
- return ptr->x;
-}
-
-static inline void __put_unaligned_cpu16(u16 val, void *p)
-{
- struct __una_u16 *ptr = (struct __una_u16 *)p;
- ptr->x = val;
-}
-
-static inline void __put_unaligned_cpu32(u32 val, void *p)
-{
- struct __una_u32 *ptr = (struct __una_u32 *)p;
- ptr->x = val;
-}
-
-static inline void __put_unaligned_cpu64(u64 val, void *p)
-{
- struct __una_u64 *ptr = (struct __una_u64 *)p;
- ptr->x = val;
-}
-
-#endif /* _LINUX_UNALIGNED_PACKED_STRUCT_H */
diff --git a/c/brlib/todo/xxhash.c b/c/brlib/todo/xxhash.c
deleted file mode 100644
index bec62af..0000000
--- a/c/brlib/todo/xxhash.c
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * xxHash - Extremely Fast Hash algorithm
- * Copyright (C) 2012-2016, Yann Collet.
- *
- * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License version 2 as published by the
- * Free Software Foundation. This program is dual-licensed; you may select
- * either version 2 of the GNU General Public License ("GPL") or BSD license
- * ("BSD").
- *
- * You can contact the author at:
- * - xxHash homepage: https://cyan4973.github.io/xxHash/
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-#include
-#include
-#include
-
-//#include
-// #include
-#include "xxhash.h"
-#include "bits.h"
-#include "asm/unaligned.h"
-
-/*-*************************************
- * Macros
- **************************************/
-#define xxh_rotl32(x, r) ((x << r) | (x >> (32 - r)))
-#define xxh_rotl64(x, r) ((x << r) | (x >> (64 - r)))
-
-#ifdef __LITTLE_ENDIAN
-# define XXH_CPU_LITTLE_ENDIAN 1
-#else
-# define XXH_CPU_LITTLE_ENDIAN 0
-#endif
-
-/*-*************************************
- * Constants
- **************************************/
-static const uint32_t PRIME32_1 = 2654435761U;
-static const uint32_t PRIME32_2 = 2246822519U;
-static const uint32_t PRIME32_3 = 3266489917U;
-static const uint32_t PRIME32_4 = 668265263U;
-static const uint32_t PRIME32_5 = 374761393U;
-
-static const uint64_t PRIME64_1 = 11400714785074694791ULL;
-static const uint64_t PRIME64_2 = 14029467366897019727ULL;
-static const uint64_t PRIME64_3 = 1609587929392839161ULL;
-static const uint64_t PRIME64_4 = 9650029242287828579ULL;
-static const uint64_t PRIME64_5 = 2870177450012600261ULL;
-
-/*-**************************
- * Utils
- ***************************/
-void xxh32_copy_state(struct xxh32_state *dst, const struct xxh32_state *src)
-{
- memcpy(dst, src, sizeof(*dst));
-}
-
-void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state *src)
-{
- memcpy(dst, src, sizeof(*dst));
-}
-
-/*-***************************
- * Simple Hash Functions
- ****************************/
-static uint32_t xxh32_round(uint32_t seed, const uint32_t input)
-{
- seed += input * PRIME32_2;
- seed = xxh_rotl32(seed, 13);
- seed *= PRIME32_1;
- return seed;
-}
-
-uint32_t xxh32(const void *input, const size_t len, const uint32_t seed)
-{
- const uint8_t *p = (const uint8_t *)input;
- const uint8_t *b_end = p + len;
- uint32_t h32;
-
- if (len >= 16) {
- const uint8_t *const limit = b_end - 16;
- uint32_t v1 = seed + PRIME32_1 + PRIME32_2;
- uint32_t v2 = seed + PRIME32_2;
- uint32_t v3 = seed + 0;
- uint32_t v4 = seed - PRIME32_1;
-
- do {
- v1 = xxh32_round(v1, get_unaligned_le32(p));
- p += 4;
- v2 = xxh32_round(v2, get_unaligned_le32(p));
- p += 4;
- v3 = xxh32_round(v3, get_unaligned_le32(p));
- p += 4;
- v4 = xxh32_round(v4, get_unaligned_le32(p));
- p += 4;
- } while (p <= limit);
-
- h32 = xxh_rotl32(v1, 1) + xxh_rotl32(v2, 7) +
- xxh_rotl32(v3, 12) + xxh_rotl32(v4, 18);
- } else {
- h32 = seed + PRIME32_5;
- }
-
- h32 += (uint32_t)len;
-
- while (p + 4 <= b_end) {
- h32 += get_unaligned_le32(p) * PRIME32_3;
- h32 = xxh_rotl32(h32, 17) * PRIME32_4;
- p += 4;
- }
-
- while (p < b_end) {
- h32 += (*p) * PRIME32_5;
- h32 = xxh_rotl32(h32, 11) * PRIME32_1;
- p++;
- }
-
- h32 ^= h32 >> 15;
- h32 *= PRIME32_2;
- h32 ^= h32 >> 13;
- h32 *= PRIME32_3;
- h32 ^= h32 >> 16;
-
- return h32;
-}
-
-static uint64_t xxh64_round(uint64_t acc, const uint64_t input)
-{
- acc += input * PRIME64_2;
- acc = xxh_rotl64(acc, 31);
- acc *= PRIME64_1;
- return acc;
-}
-
-static uint64_t xxh64_merge_round(uint64_t acc, uint64_t val)
-{
- val = xxh64_round(0, val);
- acc ^= val;
- acc = acc * PRIME64_1 + PRIME64_4;
- return acc;
-}
-
-uint64_t xxh64(const void *input, const size_t len, const uint64_t seed)
-{
- const uint8_t *p = (const uint8_t *)input;
- const uint8_t *const b_end = p + len;
- uint64_t h64;
-
- if (len >= 32) {
- const uint8_t *const limit = b_end - 32;
- uint64_t v1 = seed + PRIME64_1 + PRIME64_2;
- uint64_t v2 = seed + PRIME64_2;
- uint64_t v3 = seed + 0;
- uint64_t v4 = seed - PRIME64_1;
-
- do {
- v1 = xxh64_round(v1, get_unaligned_le64(p));
- p += 8;
- v2 = xxh64_round(v2, get_unaligned_le64(p));
- p += 8;
- v3 = xxh64_round(v3, get_unaligned_le64(p));
- p += 8;
- v4 = xxh64_round(v4, get_unaligned_le64(p));
- p += 8;
- } while (p <= limit);
-
- h64 = xxh_rotl64(v1, 1) + xxh_rotl64(v2, 7) +
- xxh_rotl64(v3, 12) + xxh_rotl64(v4, 18);
- h64 = xxh64_merge_round(h64, v1);
- h64 = xxh64_merge_round(h64, v2);
- h64 = xxh64_merge_round(h64, v3);
- h64 = xxh64_merge_round(h64, v4);
-
- } else {
- h64 = seed + PRIME64_5;
- }
-
- h64 += (uint64_t)len;
-
- while (p + 8 <= b_end) {
- const uint64_t k1 = xxh64_round(0, get_unaligned_le64(p));
-
- h64 ^= k1;
- h64 = xxh_rotl64(h64, 27) * PRIME64_1 + PRIME64_4;
- p += 8;
- }
-
- if (p + 4 <= b_end) {
- h64 ^= (uint64_t)(get_unaligned_le32(p)) * PRIME64_1;
- h64 = xxh_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
- p += 4;
- }
-
- while (p < b_end) {
- h64 ^= (*p) * PRIME64_5;
- h64 = xxh_rotl64(h64, 11) * PRIME64_1;
- p++;
- }
-
- h64 ^= h64 >> 33;
- h64 *= PRIME64_2;
- h64 ^= h64 >> 29;
- h64 *= PRIME64_3;
- h64 ^= h64 >> 32;
-
- return h64;
-}
-
-/*-**************************************************
- * Advanced Hash Functions
- ***************************************************/
-void xxh32_reset(struct xxh32_state *statePtr, const uint32_t seed)
-{
- /* use a local state for memcpy() to avoid strict-aliasing warnings */
- struct xxh32_state state;
-
- memset(&state, 0, sizeof(state));
- state.v1 = seed + PRIME32_1 + PRIME32_2;
- state.v2 = seed + PRIME32_2;
- state.v3 = seed + 0;
- state.v4 = seed - PRIME32_1;
- memcpy(statePtr, &state, sizeof(state));
-}
-
-void xxh64_reset(struct xxh64_state *statePtr, const uint64_t seed)
-{
- /* use a local state for memcpy() to avoid strict-aliasing warnings */
- struct xxh64_state state;
-
- memset(&state, 0, sizeof(state));
- state.v1 = seed + PRIME64_1 + PRIME64_2;
- state.v2 = seed + PRIME64_2;
- state.v3 = seed + 0;
- state.v4 = seed - PRIME64_1;
- memcpy(statePtr, &state, sizeof(state));
-}
-
-int xxh32_update(struct xxh32_state *state, const void *input, const size_t len)
-{
- const uint8_t *p = (const uint8_t *)input;
- const uint8_t *const b_end = p + len;
-
- if (input == NULL)
- return -EINVAL;
-
- state->total_len_32 += (uint32_t)len;
- state->large_len |= (len >= 16) | (state->total_len_32 >= 16);
-
- if (state->memsize + len < 16) { /* fill in tmp buffer */
- memcpy((uint8_t *)(state->mem32) + state->memsize, input, len);
- state->memsize += (uint32_t)len;
- return 0;
- }
-
- if (state->memsize) { /* some data left from previous update */
- const uint32_t *p32 = state->mem32;
-
- memcpy((uint8_t *)(state->mem32) + state->memsize, input,
- 16 - state->memsize);
-
- state->v1 = xxh32_round(state->v1, get_unaligned_le32(p32));
- p32++;
- state->v2 = xxh32_round(state->v2, get_unaligned_le32(p32));
- p32++;
- state->v3 = xxh32_round(state->v3, get_unaligned_le32(p32));
- p32++;
- state->v4 = xxh32_round(state->v4, get_unaligned_le32(p32));
- p32++;
-
- p += 16-state->memsize;
- state->memsize = 0;
- }
-
- if (p <= b_end - 16) {
- const uint8_t *const limit = b_end - 16;
- uint32_t v1 = state->v1;
- uint32_t v2 = state->v2;
- uint32_t v3 = state->v3;
- uint32_t v4 = state->v4;
-
- do {
- v1 = xxh32_round(v1, get_unaligned_le32(p));
- p += 4;
- v2 = xxh32_round(v2, get_unaligned_le32(p));
- p += 4;
- v3 = xxh32_round(v3, get_unaligned_le32(p));
- p += 4;
- v4 = xxh32_round(v4, get_unaligned_le32(p));
- p += 4;
- } while (p <= limit);
-
- state->v1 = v1;
- state->v2 = v2;
- state->v3 = v3;
- state->v4 = v4;
- }
-
- if (p < b_end) {
- memcpy(state->mem32, p, (size_t)(b_end-p));
- state->memsize = (uint32_t)(b_end-p);
- }
-
- return 0;
-}
-
-uint32_t xxh32_digest(const struct xxh32_state *state)
-{
- const uint8_t *p = (const uint8_t *)state->mem32;
- const uint8_t *const b_end = (const uint8_t *)(state->mem32) +
- state->memsize;
- uint32_t h32;
-
- if (state->large_len) {
- h32 = xxh_rotl32(state->v1, 1) + xxh_rotl32(state->v2, 7) +
- xxh_rotl32(state->v3, 12) + xxh_rotl32(state->v4, 18);
- } else {
- h32 = state->v3 /* == seed */ + PRIME32_5;
- }
-
- h32 += state->total_len_32;
-
- while (p + 4 <= b_end) {
- h32 += get_unaligned_le32(p) * PRIME32_3;
- h32 = xxh_rotl32(h32, 17) * PRIME32_4;
- p += 4;
- }
-
- while (p < b_end) {
- h32 += (*p) * PRIME32_5;
- h32 = xxh_rotl32(h32, 11) * PRIME32_1;
- p++;
- }
-
- h32 ^= h32 >> 15;
- h32 *= PRIME32_2;
- h32 ^= h32 >> 13;
- h32 *= PRIME32_3;
- h32 ^= h32 >> 16;
-
- return h32;
-}
-
-int xxh64_update(struct xxh64_state *state, const void *input, const size_t len)
-{
- const uint8_t *p = (const uint8_t *)input;
- const uint8_t *const b_end = p + len;
-
- if (input == NULL)
- return -EINVAL;
-
- state->total_len += len;
-
- if (state->memsize + len < 32) { /* fill in tmp buffer */
- memcpy(((uint8_t *)state->mem64) + state->memsize, input, len);
- state->memsize += (uint32_t)len;
- return 0;
- }
-
- if (state->memsize) { /* tmp buffer is full */
- uint64_t *p64 = state->mem64;
-
- memcpy(((uint8_t *)p64) + state->memsize, input,
- 32 - state->memsize);
-
- state->v1 = xxh64_round(state->v1, get_unaligned_le64(p64));
- p64++;
- state->v2 = xxh64_round(state->v2, get_unaligned_le64(p64));
- p64++;
- state->v3 = xxh64_round(state->v3, get_unaligned_le64(p64));
- p64++;
- state->v4 = xxh64_round(state->v4, get_unaligned_le64(p64));
-
- p += 32 - state->memsize;
- state->memsize = 0;
- }
-
- if (p + 32 <= b_end) {
- const uint8_t *const limit = b_end - 32;
- uint64_t v1 = state->v1;
- uint64_t v2 = state->v2;
- uint64_t v3 = state->v3;
- uint64_t v4 = state->v4;
-
- do {
- v1 = xxh64_round(v1, get_unaligned_le64(p));
- p += 8;
- v2 = xxh64_round(v2, get_unaligned_le64(p));
- p += 8;
- v3 = xxh64_round(v3, get_unaligned_le64(p));
- p += 8;
- v4 = xxh64_round(v4, get_unaligned_le64(p));
- p += 8;
- } while (p <= limit);
-
- state->v1 = v1;
- state->v2 = v2;
- state->v3 = v3;
- state->v4 = v4;
- }
-
- if (p < b_end) {
- memcpy(state->mem64, p, (size_t)(b_end-p));
- state->memsize = (uint32_t)(b_end - p);
- }
-
- return 0;
-}
-
-uint64_t xxh64_digest(const struct xxh64_state *state)
-{
- const uint8_t *p = (const uint8_t *)state->mem64;
- const uint8_t *const b_end = (const uint8_t *)state->mem64 +
- state->memsize;
- uint64_t h64;
-
- if (state->total_len >= 32) {
- const uint64_t v1 = state->v1;
- const uint64_t v2 = state->v2;
- const uint64_t v3 = state->v3;
- const uint64_t v4 = state->v4;
-
- h64 = xxh_rotl64(v1, 1) + xxh_rotl64(v2, 7) +
- xxh_rotl64(v3, 12) + xxh_rotl64(v4, 18);
- h64 = xxh64_merge_round(h64, v1);
- h64 = xxh64_merge_round(h64, v2);
- h64 = xxh64_merge_round(h64, v3);
- h64 = xxh64_merge_round(h64, v4);
- } else {
- h64 = state->v3 + PRIME64_5;
- }
-
- h64 += (uint64_t)state->total_len;
-
- while (p + 8 <= b_end) {
- const uint64_t k1 = xxh64_round(0, get_unaligned_le64(p));
-
- h64 ^= k1;
- h64 = xxh_rotl64(h64, 27) * PRIME64_1 + PRIME64_4;
- p += 8;
- }
-
- if (p + 4 <= b_end) {
- h64 ^= (uint64_t)(get_unaligned_le32(p)) * PRIME64_1;
- h64 = xxh_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
- p += 4;
- }
-
- while (p < b_end) {
- h64 ^= (*p) * PRIME64_5;
- h64 = xxh_rotl64(h64, 11) * PRIME64_1;
- p++;
- }
-
- h64 ^= h64 >> 33;
- h64 *= PRIME64_2;
- h64 ^= h64 >> 29;
- h64 *= PRIME64_3;
- h64 ^= h64 >> 32;
-
- return h64;
-}
diff --git a/c/brlib/todo/xxhash.h b/c/brlib/todo/xxhash.h
deleted file mode 100644
index df42511..0000000
--- a/c/brlib/todo/xxhash.h
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * xxHash - Extremely Fast Hash algorithm
- * Copyright (C) 2012-2016, Yann Collet.
- *
- * BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License version 2 as published by the
- * Free Software Foundation. This program is dual-licensed; you may select
- * either version 2 of the GNU General Public License ("GPL") or BSD license
- * ("BSD").
- *
- * You can contact the author at:
- * - xxHash homepage: https://cyan4973.github.io/xxHash/
- * - xxHash source repository: https://github.com/Cyan4973/xxHash
- */
-
-/*
- * Notice extracted from xxHash homepage:
- *
- * xxHash is an extremely fast Hash algorithm, running at RAM speed limits.
- * It also successfully passes all tests from the SMHasher suite.
- *
- * Comparison (single thread, Windows Seven 32 bits, using SMHasher on a Core 2
- * Duo @3GHz)
- *
- * Name Speed Q.Score Author
- * xxHash 5.4 GB/s 10
- * CrapWow 3.2 GB/s 2 Andrew
- * MumurHash 3a 2.7 GB/s 10 Austin Appleby
- * SpookyHash 2.0 GB/s 10 Bob Jenkins
- * SBox 1.4 GB/s 9 Bret Mulvey
- * Lookup3 1.2 GB/s 9 Bob Jenkins
- * SuperFastHash 1.2 GB/s 1 Paul Hsieh
- * CityHash64 1.05 GB/s 10 Pike & Alakuijala
- * FNV 0.55 GB/s 5 Fowler, Noll, Vo
- * CRC32 0.43 GB/s 9
- * MD5-32 0.33 GB/s 10 Ronald L. Rivest
- * SHA1-32 0.28 GB/s 10
- *
- * Q.Score is a measure of quality of the hash function.
- * It depends on successfully passing SMHasher test set.
- * 10 is a perfect score.
- *
- * A 64-bits version, named xxh64 offers much better speed,
- * but for 64-bits applications only.
- * Name Speed on 64 bits Speed on 32 bits
- * xxh64 13.8 GB/s 1.9 GB/s
- * xxh32 6.8 GB/s 6.0 GB/s
- */
-
-#ifndef XXHASH_H
-#define XXHASH_H
-
-#include
-
-/*-****************************
- * Simple Hash Functions
- *****************************/
-
-/**
- * xxh32() - calculate the 32-bit hash of the input with a given seed.
- *
- * @input: The data to hash.
- * @length: The length of the data to hash.
- * @seed: The seed can be used to alter the result predictably.
- *
- * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark) : 5.4 GB/s
- *
- * Return: The 32-bit hash of the data.
- */
-uint32_t xxh32(const void *input, size_t length, uint32_t seed);
-
-/**
- * xxh64() - calculate the 64-bit hash of the input with a given seed.
- *
- * @input: The data to hash.
- * @length: The length of the data to hash.
- * @seed: The seed can be used to alter the result predictably.
- *
- * This function runs 2x faster on 64-bit systems, but slower on 32-bit systems.
- *
- * Return: The 64-bit hash of the data.
- */
-uint64_t xxh64(const void *input, size_t length, uint64_t seed);
-
-/**
- * xxhash() - calculate wordsize hash of the input with a given seed
- * @input: The data to hash.
- * @length: The length of the data to hash.
- * @seed: The seed can be used to alter the result predictably.
- *
- * If the hash does not need to be comparable between machines with
- * different word sizes, this function will call whichever of xxh32()
- * or xxh64() is faster.
- *
- * Return: wordsize hash of the data.
- */
-
-static inline unsigned long xxhash(const void *input, size_t length,
- uint64_t seed)
-{
-#if BITS_PER_LONG == 64
- return xxh64(input, length, seed);
-#else
- return xxh32(input, length, seed);
-#endif
-}
-
-/*-****************************
- * Streaming Hash Functions
- *****************************/
-
-/*
- * These definitions are only meant to allow allocation of XXH state
- * statically, on stack, or in a struct for example.
- * Do not use members directly.
- */
-
-/**
- * struct xxh32_state - private xxh32 state, do not use members directly
- */
-struct xxh32_state {
- uint32_t total_len_32;
- uint32_t large_len;
- uint32_t v1;
- uint32_t v2;
- uint32_t v3;
- uint32_t v4;
- uint32_t mem32[4];
- uint32_t memsize;
-};
-
-/**
- * struct xxh32_state - private xxh64 state, do not use members directly
- */
-struct xxh64_state {
- uint64_t total_len;
- uint64_t v1;
- uint64_t v2;
- uint64_t v3;
- uint64_t v4;
- uint64_t mem64[4];
- uint32_t memsize;
-};
-
-/**
- * xxh32_reset() - reset the xxh32 state to start a new hashing operation
- *
- * @state: The xxh32 state to reset.
- * @seed: Initialize the hash state with this seed.
- *
- * Call this function on any xxh32_state to prepare for a new hashing operation.
- */
-void xxh32_reset(struct xxh32_state *state, uint32_t seed);
-
-/**
- * xxh32_update() - hash the data given and update the xxh32 state
- *
- * @state: The xxh32 state to update.
- * @input: The data to hash.
- * @length: The length of the data to hash.
- *
- * After calling xxh32_reset() call xxh32_update() as many times as necessary.
- *
- * Return: Zero on success, otherwise an error code.
- */
-int xxh32_update(struct xxh32_state *state, const void *input, size_t length);
-
-/**
- * xxh32_digest() - produce the current xxh32 hash
- *
- * @state: Produce the current xxh32 hash of this state.
- *
- * A hash value can be produced at any time. It is still possible to continue
- * inserting input into the hash state after a call to xxh32_digest(), and
- * generate new hashes later on, by calling xxh32_digest() again.
- *
- * Return: The xxh32 hash stored in the state.
- */
-uint32_t xxh32_digest(const struct xxh32_state *state);
-
-/**
- * xxh64_reset() - reset the xxh64 state to start a new hashing operation
- *
- * @state: The xxh64 state to reset.
- * @seed: Initialize the hash state with this seed.
- */
-void xxh64_reset(struct xxh64_state *state, uint64_t seed);
-
-/**
- * xxh64_update() - hash the data given and update the xxh64 state
- * @state: The xxh64 state to update.
- * @input: The data to hash.
- * @length: The length of the data to hash.
- *
- * After calling xxh64_reset() call xxh64_update() as many times as necessary.
- *
- * Return: Zero on success, otherwise an error code.
- */
-int xxh64_update(struct xxh64_state *state, const void *input, size_t length);
-
-/**
- * xxh64_digest() - produce the current xxh64 hash
- *
- * @state: Produce the current xxh64 hash of this state.
- *
- * A hash value can be produced at any time. It is still possible to continue
- * inserting input into the hash state after a call to xxh64_digest(), and
- * generate new hashes later on, by calling xxh64_digest() again.
- *
- * Return: The xxh64 hash stored in the state.
- */
-uint64_t xxh64_digest(const struct xxh64_state *state);
-
-/*-**************************
- * Utils
- ***************************/
-
-/**
- * xxh32_copy_state() - copy the source state into the destination state
- *
- * @src: The source xxh32 state.
- * @dst: The destination xxh32 state.
- */
-void xxh32_copy_state(struct xxh32_state *dst, const struct xxh32_state *src);
-
-/**
- * xxh64_copy_state() - copy the source state into the destination state
- *
- * @src: The source xxh64 state.
- * @dst: The destination xxh64 state.
- */
-void xxh64_copy_state(struct xxh64_state *dst, const struct xxh64_state *src);
-
-#endif /* XXHASH_H */