]> git.xolatile.top Git - emil-bake.git/commitdiff
bump v20240804 public domain; rewrite; new macros: @line, @name; ; added options...
authorEmil Williams <emilemilemil@cock.li>
Mon, 5 Aug 2024 01:00:23 +0000 (01:00 +0000)
committerEmil Williams <emilemilemil@cock.li>
Mon, 5 Aug 2024 01:00:23 +0000 (01:00 +0000)
.gitignore [new file with mode: 0644]
LICENSE [deleted file]
README
TODO [deleted file]
bake.1
bake.c
config.h [deleted file]
dist.sh [deleted file]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..0e05920
--- /dev/null
@@ -0,0 +1 @@
+bake
diff --git a/LICENSE b/LICENSE
deleted file mode 100644 (file)
index f288702..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,674 +0,0 @@
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 3, 29 June 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
- 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.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    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 <https://www.gnu.org/licenses/>.
-
-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:
-
-    <program>  Copyright (C) <year>  <name of author>
-    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
-<https://www.gnu.org/licenses/>.
-
-  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
-<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/README b/README
index 5c6a7609c0c7f924289e7f008fa03fcb3b1ea568..8d7e8db13c38650bc69cf47049dae889ebd762df 100644 (file)
--- a/README
+++ b/README
@@ -1,96 +1,66 @@
---- Bake ---
+--- README
 
-Bake scripts into files.
+A tool to run embedded scripts.
 
-Executes @BAKE to the end of the line or until @STOP within in any given file.
+Bootstrap with ./shake bake.c
+then compile further with ./bake,
+install by running ./install.sh
 
-You may have multi-line commands, by either including a leading @STOP or by
- ending each line with a backslash.
+---
 
-The execution takes place at the root of the target file, so if you have:
-`test/file.c', and then execution takes place at `test' and the file is simply
-regarded as `file.c'.
+bake [-chln] [-s <n>] <FILENAME> [ARGS...]; version 20240804
 
-you may see a real example in the primary and only source file: `bake.c'.  this
-is not targeted toward any language and should be fairly flexible, especially
-when multi-line comments are available.  You should always consider your usecase
-before using a tool like this.  Bake is not an all-in-one solution, nor is it
-designed to be a sophisticated build system, consider something like GNU Make or
-Meson instead.
+Bake is a simple tool meant to execute embedded shell commands within
+any file.  It executes with /bin/sh the command after a "@BAKE " to
+the end of the line (a UNIX newline: '\n').
 
-Binary files (files that contain characters < ' ' or > '~') are supported.
+It expands some macros,
+       @NAME  - filename
+       @SHORT - shortened filename
+       @ARGS  - other arguments to the program
+       @LINE  - line number at the selected @BAKE
 
-Manpages are included: bake(1) shake(1)
+All macros can be exempted by prefixing them with a backslash,
+which'll be subtracted in the expansion. multi-line commands may be
+done by a leading backslash, which are NOT subtracted.
 
---- Building ---
+It has five options, this message (-h, --help); prevents the execution
+of the shell command (-n, --dry-run); disable color (-c, --color); list
+(-l, --list) and select (-s<n>, --select <n>) which respectively lists
+all @BAKE commands and select & run the Nth command.
 
-Bootstrapping may be done with Shake, simply run `./shake ./bake.c'
+It roots the shell execution in the directory of the given file.
 
-Or simply run `install.sh', you'll need to be a privileged user to install the
-files. See the file's content for more details regarding the installation.
+Licensed under the public domain.
 
---- Macro Extension ---
+---
 
-Macro provides various descriptive factors about the current context:
+Shake
 
- @FILENAME : Filename of the baked file (abc.x.txt)
- @SHORT : Shortened version of the Filename (^-> abc.x)
- @ARGS : the remaining arguments to Bake
-
-$@, $*, $+, are respectively mapped to @FILENAME, @SHORT, and @ARGS.  They have
-been partially deprecated, however they'll never be removed, use them if you'd
-like.
-
-They are most useful for a general template command, such as:
-
-@BAKE cc @FILENAME -o @{@SHORT} @ARGS
-
-Backslash, while otherwise ignored, will be respected at the end of the line to
-concatenate lines together or if added to before any of listed macros will yield
-the unfettered text. \SPECIAL_NAME will result in SPECIAL_NAME in the executed
-shell command. Backslashes are applicable to all symbols used by Bake.
-
---- Expunge Extension ---
-
-Removes any singular file or directory non recursively defined within @{...},
-this has no effect on the normal processing of the statement and is macro'd out
-before it is executed.
-
-This is useful in such cases that you create a temporary file or output file
-that may be later recreated or may need to be manually updated. It is most
-useful for simple scrubbing of outputs. You could have a directory of toy
-programs and wish to clean them all up, and using a command like:
-
-for i in `ls *.c`; do bake -x $i; done
-
-This is of course can also be done with another UNIX command like the following,
-assuming the other files outside of the regexp are not important:
-
-ls | egrep -v '.+\.[ch]' | xargs rm
-
-This feature was suggested by the original author of Shake, blame him for this.
-
---- Options ---
+Bake was inspired by the Bash-based Shake utility (formerly eMake, he
+liked my suggestion for a name).  It is included under authorization
+of its creator.  The original version of Shake may be found at:
+<http://bis64wqhh3louusbd45iyj76kmn4rzw5ysawyan5bkxwyzihj67c5lid.onion/anon/shake>
 
-Options must come before the filename, and may be merged together, such as -cxn.
+Bake includes a modified Shake, both after installation and as a
+bootstrapper.  The modified version includes all features of Bake with
+the exceptions of multi-line commands.  It is not a general
+replacement for Bake.
 
- -v, --version: Display versioning and licensing information.
- -h,    --help: Display the help message, similarly to empty input.
- -n, --dry-run: DRYRUN: does NOT run anything!
- -x, --expunge: See above Expunge Extension section.
- -c,   --color: Disables color for a clean output.
+Changelog
 
---- Shake ---
+Bake was created on 2023/09/13, and is complete as of 2024/03/02.
 
-Bake was inspired by the Bash-based Shake utility (formerly eMake, he liked my
-suggestion for a name).  It is included under authorization of its creator.  The
-original version of Shake may be found at:
-<http://bis64wqhh3louusbd45iyj76kmn4rzw5ysawyan5bkxwyzihj67c5lid.onion/anon/shake>
+24/08/04 - Updated version!
 
-Bake includes a modified Shake, both after installation and as a bootstrapper.
-The modified version includes all features of Bake with the exceptions of
-multi-line commands.  It is not a general replacement for Bake.
+Bake is has been finished for a while but I thought the code could use
+a checkup with GNU complexity, and this gave me a reason to rewrite
+the important parts into a more sane manner. I had, at the same time,
+been requested to extend Bake with the @LINE and list/select.
 
-Bake is licensed under the GPLv3-only, See LICENSE.
+The changeset is large enough to possibly introduce bugs, and the last
+version of Bake is, in my opinion, highly reliable. This newer version
+needs to be tested a bit more to confirm full compatibility.
 
-Bake was created on September 13th, 2023, and is complete as of 2024/03/02.
+changes - Rewrite of the code; Removal of -x --expunge; Addition of
+@LINE & @NAME, list, & select.
diff --git a/TODO b/TODO
deleted file mode 100644 (file)
index 5aa95fe..0000000
--- a/TODO
+++ /dev/null
@@ -1,31 +0,0 @@
-Select among the @BAKEs in a file? -- EXCESSIVE
-This could be user-useful but would require an overhaul of the options.
-
-Specify the shell environment somehow? -- NOT NEEDED
-Could be nice, could be easy to implement with some different starter
-command, such as @BAKE_ENV /bin/sh [command ...], but the power of
-regular old /bin/sh alone should be enough for everything. Calling
-a script is perfectly practical considering the rooting facilities.
-Use Make or a script, this is nearing overkill.
-
-Enviromental variables? -- WORKS, NO CHANGES NEEDED
-No idea how the support is currently, should be fine. Anything more is
-overkill, use Make if you need ?= and $(XXX).
-
-Longer @EMBEDDED_BAKE handle? -- NOT NEEDED
-Possibly a good idea for large binary files, but I would rather just
-write the "Select among @BAKEs" feature than cheap out with an additional
-handle. Besides, this is only useful for a gimick autonomous compile
-feature. If I decided to write the @BAKE_ENV feature, I'd probably need
-to also include a @EMBEDDED_BAKE_ENV which is a little ridiculous.
-This will at best make me consider writing/using hashmaps, which would
-be a techinical improvement, but definitely is overkill.
-
-More Macros? -- NOT NEEDED
-Luckily, with the rewrite to expand, this would be very easy to add.
-But I don't know of any that wouldn't be overkill. If I ever think of
-any that would be substantially useful, I might add them.
-
-Kill globals. -- DONE
-I'd need to first isolate them into bake_expand, which is a bit of a
-pain but a thing I'll definitely do.
diff --git a/bake.1 b/bake.1
index f30be94396df1314e8666ceab67858ed28900734..613ddacca4061e2611f38ed90bdb1c08ce56e8a0 100644 (file)
--- a/bake.1
+++ b/bake.1
@@ -1,33 +1,35 @@
-.TH BAKE "1" "April 2024" "bake 20240413" "User Commands"
+.TH BAKE "1" "August 2024" "bake 20240804" "User Commands"
 .SH NAME
 .B bake
 \- file embeddable scripts
 .SH SYNOPSIS
 .B bake
-[option] target\-file [\fBarguments\fP ...]
+[\-chln] [\-s <n>] <FILENAME> [ARGS...]
 .SH DESCRIPTION
-Use the format \fB@BAKE\fP cmd ... within the target\-file, this will execute the
-rest of line, or until the first \fB@STOP\fR marker.
+
+bake is a simple tool meant to execute embedded shell commands within
+any file.  It executes with /bin/sh the command after a "\fB@BAKE\fP " to
+the end of the line (a UNIX newline: '\fB\\n\fP').
 
 This format may be embedded within \fBbinary files\fP, or any file where no unwanted preceding
-instance of
-.B @BAKE
-appears.
+instance of \fB@BAKE\fP appears.
 
-\fBShake\fP does not support some features of \fBBake\fP, such as \fB@STOP\fP or \fBbinary files\fP,
-please avoid its use.
+It roots the shell execution in the directory of the given file.
 
-Options must always be put first, and may be merged together.
+Options must always be put first, and short options may be merged together.
 
 .HP
-\-v \-\-version, \-h \-\-help, \fB\-n \-\-dry\-run\fP, \fB\-x \-\-expunge\fP,
-\fB\-c \-\-color\fP
+ \fB\-c \-\-color\fP, \-h \-\-help, \fB\-n \-\-dry\-run\fP, \fB\-l \-\-list\fP, \fB\-s \-\-select\fP <\fBn\fP>
 .PP
-Expansions
+Macros
+
+All macros can be exempted by prefixing them with a backslash,
+which'll be subtracted in the expansion. multi-line commands may be
+done by a leading backslash, which are NOT subtracted.
 
-These symbols will expand to their counterpart before execution.
+These macros will expand to their counterpart before execution.
 .TP
-.B @FILENAME, $@
+.B @FILENAME, @NAME, $@
 returns target\-file (abc.x.txt)
 .TP
 .B @SHORT, $*
@@ -36,35 +38,21 @@ returns target\-file without suffix (abc.x.txt \-> abc.x)
 .B @ARGS, $+
 returns
 .B arguments
+.TP
+.B @LINE
+returns the line number
 
 .PP
 Additional Features And Notes
 
-Shell execution may be disabled with the
-.B -n or --dry-run
-option.
-
-\fB@{\fPEXPUNGE_THIS_FILE\fB}\fP is a inline block to delete files or
-directories, non-recursive, only one file per block, removed from left to right.
-Has no influence on the normal command execution. The deletion only occurs if
-you use the
-.B -x or --expunge
-option.
-
-Colors may be disabled with the
-.B -c or --color
-option.
+Shell execution may be disabled with the \fB-n\fP or \fB--dry-run\fP option.
 
-\\SPECIAL_NAME will result in SPECIAL_NAME in the executed shell
-command. Backslashes are applicable to all symbols used by Bake, they are
-ignored otherwise.
+Colors may be disabled with the \fB-c\fP or \fB--color\fP option.
 
 .SH EXAMPLE
 .\" SRC BEGIN (example.c)
 .EX
-// example.c
-// @BAKE cc -o @{@SHORT} @FILENAME @ARGS
-// or, simply, @BAKE cc -o @{$*} $@ $+
+// example.c @BAKE cc -o @SHORT @NAME @ARGS
 #include <stdio.h>
 int main (void) {
     puts("Hello.");
@@ -73,4 +61,4 @@ int main (void) {
 .EE
 .SH COPYRIGHT
 .PP
-Licensed under the GNU Public License version 3 only, see <https://www.gnu.org/licenses/gpl\-3.0\-standalone.html>.
+Licensed under the public domain.
diff --git a/bake.c b/bake.c
index dfc7a7bb955fe4b01e5957ea345e13e5abec4145..66b79cadecd41cc6038481cdda3a8ce4077a49e4 100644 (file)
--- a/bake.c
+++ b/bake.c
@@ -1,21 +1,12 @@
-/* bake.c - Ever burned a cake?
- * Copyright 2023 Emil Williams
- *
- * Licensed under the GNU Public License version 3 only, see LICENSE.
- *
- * @BAKE cc -std=c89 -O2 @FILENAME -o @{@SHORT} @ARGS @STOP
- */
+// @BAKE cc -std=c99 -O2 -Wall -Wextra -Wpedantic -Wno-implicit-fallthrough -o @SHORT @FILENAME @ARGS
 
 #define _GNU_SOURCE
-#define _POSIX_C_SOURCE 200809L
 
-#include <assert.h>
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
-#include <locale.h>
+#include <limits.h>
 #include <stdarg.h>
-#include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
 #include <unistd.h>
-#include <limits.h>
-
-#include "config.h"
-
-#define VERSION "20240413"
-
-#define  HELP                                                                                         \
-  BOLD "[option] target-file" RESET " [" GREEN "arguments" RESET " ...]\n"                            \
-  "Use the format `" BOLD "@BAKE" RESET " cmd ...' within the target-file, this will execute the\n"   \
-  "rest of line, or if found within the file, until the " BOLD "@STOP" RESET " marker.\n"
-
-#define DESC                                                                            \
-  "Options [Must always be put first, may be merged together]\n"                        \
-  "\t" DIM "-v --version" RESET ", " DIM "-h --help" RESET ", "                         \
-  BOLD "-n --dry-run" RESET ", " BOLD "-x --expunge" RESET ", "                         \
-  BOLD "-c --color\n" RESET                                                             \
-  "Expansions\n"                                                                        \
-  "\t" YELLOW "@FILENAME" RESET "  returns target-file                (abc.x.txt)\n"    \
-  "\t" YELLOW "@SHORT   " RESET "  returns target-file without suffix (^-> abc.x)\n"    \
-  "\t" YELLOW "@ARGS    " RESET "  returns " GREEN "arguments" RESET "\n"               \
-  "Additional Features And Notes\n"                                                     \
-  "\t" YELLOW "@{" RESET BOLD "EXPUNGE_THIS_FILE" YELLOW "}" RESET                      \
-  " inline region to delete this or many files or directories,\n"                       \
-  "\tnon-recursive, only one file per block, removed from left to right. This has no\n" \
-  "\tinfluence on the normal command execution.\n"                                      \
-  "\t" YELLOW "\\" RESET                                                                \
-  "SPECIAL_NAME will result in SPECIAL_NAME in the executed shell command.\n"           \
-  "Backslashing is applicable to all meaningful symbols in Bake, it is ignored otherwise."
-
-#define COPYRIGHT "2023 Emil Williams"
-#define LICENSE "Licensed under the GNU Public License version 3 only, see LICENSE."
-
-#define FILENAME_LIMIT (FILENAME_MAX)
-
-#define BAKE_ERROR 127
-
-enum {
-  BAKE_UNRECOGNIZED,
-  BAKE_MISSING_SUFFIX
-};
-
-enum {
-  BAKE_RUN     =       0,
-  BAKE_NORUN   = (1 << 0),
-  BAKE_EXPUNGE = (1 << 1)
-};
-
-
-#define ARRLEN(a) (sizeof(a) / sizeof(a[0]))
-
-#if INCLUDE_AUTONOMOUS_COMPILE
-  __attribute__((__section__(".text"))) static char autonomous_compile[] =
-  "@BAKE cc -std=c89 -O2 $@.c -o $@ $+ @STOP";
-#endif
-
-static int bake_errno;
-
-typedef struct {
-  size_t len;
-  char * buf;
-} string_t;
-
-typedef string_t map_t;
-
-/*** nocolor printf ***/
 
-#if ENABLE_COLOR
-# define color_printf(...) color_fprintf(stdout, __VA_ARGS__)
-/* not perfect, too simple, doesn't work with a var, only a literal. */
-# define color_puts(msg) color_fprintf(stdout, msg "\n")
+#define BUFFER_SIZE (1 << 12)
 
-int color = ENABLE_COLOR;
+#define START ("@" "BAKE" " ")
+#define STOP  ("@" "STOP")
 
-static char * expand(char * buf, char * macro, char * with);
+#define AUTONOMOUS_COMPILE 0
 
-color_fprintf(FILE * fp, char * format, ...) {
-  va_list ap;
-  char * buf;
-  va_start(ap, format);
-  if (!color) {
+#define ENABLE_COLOR 1
 
-    vasprintf(&buf, format, ap);
-
-    if (buf) {
-      expand(buf, RED, "");
-      expand(buf, GREEN, "");
-      expand(buf, YELLOW, "");
-      expand(buf, DIM, "");
-      expand(buf, BOLD, "");
-      expand(buf, RESET, "");
-
-      fwrite(buf, strlen(buf), 1, fp);
-    }
-
-    free(buf);
-  } else {
-    vfprintf(fp, format, ap);
-  }
-  va_end(ap);
-
-}
+#if ENABLE_COLOR == 1
+# define    RED "\033[91m"
+# define  GREEN "\033[92m"
+# define YELLOW "\033[93m"
+# define   BOLD "\033[1m"
+# define  RESET "\033[0m"
+#elif ENABLE_COLOR
+# define    RED "\033[91;5m"
+# define  GREEN "\033[96;7m"
+# define YELLOW "\033[94m"
+# define   BOLD "\033[1;4m"
+# define  RESET "\033[0m"
 #else
-# define color_printf(...) fprintf(stdout, __VA_ARGS__)
-# define color_puts(msg) puts(msg)
+# define    RED
+# define  GREEN
+# define YELLOW
+# define   BOLD
+# define  RESET
 #endif
 
-/*** root ***/
+#define ARRLEN(x) (sizeof (x) / sizeof (x [0]))
+
+#if AUTONOMOUS_COMPILE
+__attribute__((__section__(".text"))) static char autonomous_compile [] =
+  "@BAKE" " cc -w @FILENAME.c -o @FILENAME @ARGS\n";
+#endif
 
 static void
-swap(char * a, char * b) {
+swap (char * a, char * b) {
   *a ^= *b;
   *b ^= *a;
   *a ^= *b;
 }
 
 static int
-root(char ** rootp) {
-  char x[1] = {'\0'};
+root (char ** rootp) {
+  char x [1] = {'\0'};
   char * root = *rootp;
-  size_t len = strlen(root);
+  size_t len = strlen (root);
   int ret;
-
-  while (len && root[len] != '/') {
-    --len;
-  }
-
-  if (!len) {
-    return 0;
-  }
-
-  swap(root + len, x);
-  ret = chdir(root);
-  swap(root + len, x);
-
+  while (len && root [len] != '/') { --len; }
+  if (!len) { return 0; }
+  swap (root + len, x);
+  ret = chdir (root);
+  swap (root + len, x);
   *rootp += len + 1;
   return ret;
 }
 
-/*** find region in file ***/
-
-static map_t
-map(char * fn) {
-  struct stat s;
-  int fd;
-  map_t m;
-  m.buf = NULL;
-  m.len = 0;
-  fd = open(fn, O_RDONLY);
-
-  if (fd != -1) {
-    if (!fstat(fd, &s)
-        &&   s.st_mode & S_IFREG
-        &&   s.st_size) {
-      m.len = (size_t) s.st_size;
-      m.buf = (char *) mmap(NULL, m.len, PROT_READ, MAP_SHARED, fd, 0);
-    }
-
-    close(fd);
-  }
-
-  return m;
-}
-
 static char *
-find(char * buf, char * x, char * end) {
-  size_t xlen = strlen(x);
-  char * start = buf;
-
-  for (; buf <= end - xlen; ++buf) {
-    if (!strncmp(buf, x, xlen)) {
-      if (start < buf && buf[-1] == '\\') {
-        continue;
-      } else {
-        return buf;
-      }
-    }
-  }
-
-  return NULL;
-}
-
-static char *
-get_region(string_t m, char * findstart, char * findstop) {
-  char * buf = NULL, * start, * stop, * end = m.len + m.buf;
-  start = find(m.buf, findstart, end);
-
-  if (start) {
-    start += strlen(findstart);
-
-#ifdef REQUIRE_SPACE
-
-    if (!isspace(*start)) {
-      bake_errno = BAKE_MISSING_SUFFIX;
-      return NULL;
-    }
-
-#endif /* REQUIRE_SPACE */
-
-    stop = find(start, findstop, end);
-
-    if (!stop) {
-      stop = start;
-
-      while (stop < end && *stop != '\n') {
-        if (stop[0] == '\\'
-            &&  stop[1] == '\n') {
-          stop += 2;
-        }
-
-        ++stop;
-      }
-    }
-
-    buf = strndup(start, (size_t)(stop - start));
-  }
-
-  return buf;
-}
-
-static char *
-file_get_region(char * fn, char * start, char * stop) {
-  map_t m = map(fn);
-  char * buf = NULL;
-
-  if (m.buf) {
-    buf = get_region(m, start, stop);
-    munmap(m.buf, m.len);
-  }
-
-  return buf;
-}
-
-/*** g_short, g_all ***/
-
-static char *
-shorten(char * fn) {
+shorten (char * filename) {
   size_t i, last, len;
-  static char sh[FILENAME_LIMIT];
-  len = strlen(fn);
-
+  static char sh [FILENAME_MAX];
+  len = strlen (filename);
   for (last = i = 0; i < len; ++i) {
-    if (fn[i] == '.') {
-      last = i;
-    }
+    if (filename [i] == '.') { last = i; }
   }
-
   last = last ? last : i;
-  strncpy(sh, fn, last);
-  sh[last] = '\0';
+  strncpy (sh, filename, last);
+  sh [last] = '\0';
   return sh;
 }
 
 static char *
-all_args(size_t argc, char ** argv) {
-  char * all = NULL;
-
+all_args (size_t argc, char ** argv) {
+  static char buffer [BUFFER_SIZE] = {0};
   if (argc > 0) {
     size_t i, len = argc;
-
-    for (i = 0; i < argc; ++i) {
-      len += strlen(argv[i]);
-    }
-
-    all = malloc(len + 1);
-    all[len] = '\0';
-
+    for (i = 0; i < argc; ++i) { len += strlen (argv [i]); }
+    buffer [len] = '\0';
     for (len = 0, i = 0; i < argc; ++i) {
-      strcpy(all + len, argv[i]);
-      len += strlen(argv[i]) + 1;
-
-      if (i + 1 < argc) {
-        all[len - 1] = ' ';
-      }
-    }
-  }
-
-  return all ? all : calloc(1, 1);
+      strcpy (buffer + len, argv [i]);
+      len += strlen (argv [i]) + 1;
+      if (i + 1 < argc) { buffer [len - 1] = ' '; }
+  }}
+  return buffer;
 }
 
-/*** insert, expand, bake_expand ***/
-
-static void
-insert(char * str, char * new, size_t slen, size_t nlen, size_t shift) {
-  memmove(str + nlen, str + shift, slen + 1 - shift);
-  memcpy(str, new, nlen);
-}
-
-static char *
-expand(char * buf, char * macro, char * with) {
-  ssize_t i,
-          blen = strlen(buf),
-          mlen = strlen(macro),
-          wlen = strlen(with),
-          nlen;
-  fflush(stdout);
-
-  for (i = 0; i < blen - mlen + 1; ++i) {
-    if (!strncmp(buf + i, macro, mlen)) {
-      if (i && buf[i - 1] == '\\') {
-        memmove(buf + i - 1, buf + i, blen - i);
-        buf[blen - 1] = '\0';
-      } else {
-        nlen = wlen - mlen + 1;
-
-        if (nlen > 0) {
-          buf = realloc(buf, blen + nlen);
-        }
-
-        insert(buf + i, with, blen - i, wlen, mlen);
-        blen += (nlen > 0) * nlen;
-      }
-    }
+static size_t
+lines (char * buffer, size_t off) {
+  size_t line = 1;
+  char * end = buffer + off;
+  while (buffer < end) {
+    if (*buffer == '\n') { ++line; }
+    ++buffer;
   }
-
-  return buf;
+  return line;
 }
 
 static char *
-bake_expand(char * buf, char * filename, int argc, char ** argv) {
-  enum {
-    MACRO_FILENAME,
-    MACRO_SHORT,
-    MACRO_ARGS,
-    MACRO_STOP,
-    MACRO_NONE
-  };
-
-  char * macro[MACRO_NONE],
-       * macro_old[MACRO_STOP],
-       * global[MACRO_NONE];
-
-  size_t i;
-
-  macro[MACRO_FILENAME] = "@FILENAME";
-  macro[MACRO_SHORT   ] =    "@SHORT";
-  macro[MACRO_ARGS    ] =     "@ARGS";
-  macro[MACRO_STOP    ] =     "@STOP";
-
-  macro_old[MACRO_FILENAME] = "$@";
-  macro_old[MACRO_SHORT   ] = "$*";
-  macro_old[MACRO_ARGS    ] = "$+";
-
-  global[MACRO_FILENAME] = filename;
-  global[MACRO_SHORT   ] = shorten(filename);
-  global[MACRO_ARGS    ] = all_args((size_t) argc, argv);
-  global[MACRO_STOP    ] = "";
-
-#if NEW_MACROS
-
-  for (i = 0; i < ARRLEN(macro); ++i) {
-    buf = expand(buf, macro[i], global[i]);
-  }
-
-#endif
-
-#if OLD_MACROS
-
-  for (i = 0; i < ARRLEN(macro_old); ++i) {
-    buf = expand(buf, macro_old[i], global[i]);
+expand (char * buffer, size_t length, char ** pairs, size_t count) {
+  static char expanded [BUFFER_SIZE] = {0};
+  size_t old, new, i, f, off = 0;
+  /* I need to test the bounds checking here, it'll crash normally if this provision doesn't do anything, though. */
+  length &= (1 << 12) - 1;
+  for (f = 0; f < length; ++f) {
+    for (i = 0; i < count; i += 2) {
+      old = strlen (pairs [i]);
+      new = strlen (pairs [i + 1]);
+      if (memcmp (buffer + f - off, pairs [i], old) == 0) {
+        if (f && buffer [f - off - 1] == '\\')
+        { --f; --off; break; }
+        memcpy (expanded + f, pairs [i + 1], new);
+        f += new;
+        length += new - old;
+        off += new - old;
+        break;
+    }}
+    expanded [f] = buffer [f - off];
   }
-
-#endif
-
-  free(global[MACRO_ARGS]);
-
-  return buf;
+  expanded [f] = '\0';
+  return expanded;
 }
 
-static void
-remove_expand(char * buf, char * argv0, int rm, char * start, char * stop) {
-  size_t i, f, end = strlen(buf);
-  size_t startlen = strlen(start), stoplen = strlen(stop);
-  char x[1] = {'\0'};
-
-
-  for (i = 0; i < end; ++i) {
-    if (!strncmp(buf + i, start, startlen)) {
-      if (buf + i > buf && buf[i - 1] == '\\') {
-        continue;
-      }
-
-      for (f = i; f < end; ++f) {
-        if (!strncmp(buf + f, stop, stoplen)) {
-          if (buf + f > buf && buf[f - 1] == '\\') {
-            continue;
-          }
-
-          insert(buf + f, "", end - f, 0, 1);
-          i += startlen;
-
-          if (rm & BAKE_EXPUNGE) {
-            swap(buf + i + (f - i), x);
-#if !ENABLE_EXPUNGE_REMOVE
-            color_printf("%s: %sremoving '%s'\n",
-                         argv0, rm & BAKE_NORUN ? "not " : "", buf + i);
-
-            if (!(rm & BAKE_NORUN)) {
-              remove(buf + i);
-            }
-
-#else
-            color_printf("%s: not removing '%s'\n", argv0, buf + i);
-#endif
-            swap(buf + i + (f - i), x);
-          }
-
-          goto next;
-        }
-      }
-
-      goto stop;
+static char *
+getmap (char * filename, size_t * length) {
+  char * buffer = NULL;
+  int fd = open (filename, O_RDONLY);
+  if (fd != -1) {
+    struct stat s;
+    if (!fstat (fd, &s)
+        &&   s.st_mode & S_IFREG
+        &&   s.st_size) {
+      *length = (size_t) s.st_size;
+      buffer = (char *) mmap (NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0);
     }
-
-  next:;
+    close (fd);
   }
-
-stop:
-  expand(buf, start, "");
+  return buffer;
 }
 
-/*** strip, run ***/
-
-/* Strips all prefixing and leading whitespace.
- * Except if the last character beforehand is a newline. */
-static size_t
-strip(char * buf) {
-  size_t i = strlen(buf);
-
-  if (!i) {
-    return 0;
-  }
+# define color_printf(...) color_fprintf (stdout, __VA_ARGS__)
+/* not perfect, too simple, doesn't work with a var, only a literal. */
+# define color_fputs(fp, msg) color_fprintf (fp, msg "\n")
+# define color_puts(msg) color_fputs (stdout, msg)
 
-  while (i && isspace(buf[i - 1])) {
-    --i;
-  }
+static int color = ENABLE_COLOR;
 
-  buf[i] = '\0';
+static void
+color_fprintf (FILE * fp, char * format, ...) {
+  va_list ap;
+  char * buf;
 
-  for (i = 0; isspace(buf[i]); ++i);
+  va_start (ap, format);
 
-  if (i && buf[i - 1] == '\n') {
-    --i;
+  if (color) {
+    vfprintf (fp, format, ap);
+    va_end (ap);
+    return;
+  }
+  vasprintf (&buf, format, ap);
+
+  if (buf) {
+    char * expanded, * colors [] = {
+      YELLOW, "",
+      GREEN,  "",
+      RED,    "",
+      BOLD,   "",
+      RESET,  ""
+    };
+    size_t count = ARRLEN (colors);
+    expanded = expand (buf, strlen (buf), colors, count - 2);
+    expanded = expand (expanded, strlen (buf), colors + count - 2, 2);
+    fwrite (expanded, strlen (expanded), 1, fp);
   }
 
-  return i;
+  free (buf);
+  va_end (ap);
 }
+/* -- */
 
-static int
-run(char * buf, char * argv0) {
+int main (int argc, char ** argv) {
+  void help (void);
+  int off, run = 1, list = 0, select_input, select = 1;
+  size_t length, begin = 0, end = 0;
   pid_t pid;
-  color_puts(BOLD GREEN "output" RESET ":\n");
-
-  if ((pid = fork()) == 0) {
-    execl("/bin/sh", "sh", "-c", buf, NULL);
-    return 0; /* execl overwrites the process anyways */
-  } else if (pid == -1) {
-    color_fprintf(stderr, BOLD RED "%s" RESET ": %s, %s\n",
-                  argv0, "Fork Error", strerror(errno));
-    return BAKE_ERROR;
-  } else {
-    int status;
-
-    if (waitpid(pid, &status, 0) < 0) {
-      color_fprintf(stderr, BOLD RED "%s" RESET ": %s, %s\n",
-                    argv0, "Wait PID Error", strerror(errno));
-      return BAKE_ERROR;
-    }
-
-    if (!WIFEXITED(status)) {
-      return BAKE_ERROR;
+  char line [10], expanded [BUFFER_SIZE], * buffer, * expandedp, * args, * shortened, * filename = NULL;
+  /* opts */
+  for (off = 1; off < argc; ++off) {
+    if (argv [off][0] != '-') { filename = argv [off]; ++off; break; }
+    if (argv [off][1] != '-') {
+      while (*(++argv [off]))
+      switch (argv [off][0]) {
+      case_select:          case 's':
+        select = atoi (argv [off] + 1);
+        if (!select) {
+          ++off;
+          if (off >= argc) { help (); }
+          select = atoi (argv [off]);
+        }
+        if (select) { goto next; }
+      case_help:   default: case 'h': help ();
+      case_list:            case 'l': list = 1;
+      case_dryrun:          case 'n': run = 0; break;
+      case_color:           case 'c': color = 0; break;
+      }
+      continue;
     }
-
-    return WEXITSTATUS(status);
+    argv[off] += 2;
+         if (strcmp(argv[off],  "select") == 0) { goto case_select; }
+    else if (strcmp(argv[off],    "list") == 0) { goto case_list; }
+    else if (strcmp(argv[off], "dry-run") == 0) { goto case_dryrun; }
+    else if (strcmp(argv[off],   "color") == 0) { goto case_color; }
+    else if (strcmp(argv[off],    "help") == 0) { goto case_help; }
+  next:;
   }
-}
-
-/*** main ***/
-
-int
-main(int argc, char ** argv) {
-  int ret = BAKE_RUN;
-  char * buf = NULL,
-         * filename,
-         * argv0;
-
-  argv0 = argv[0];
-
-  if (argc < 2) {
-    goto help;
+  if (argc == 1 || !filename) { help (); }
+  select_input = select;
+  /* roots to directory of filename and mutates filename with the change */
+  root (&filename);
+
+  buffer = getmap (filename, &length);
+  if (!buffer) {
+    color_fprintf (stderr, RED "%s" RESET ": Could not access '" BOLD "%s" RESET "'\n", argv [0], filename);
+    return 1;
   }
-
-  while (++argv, --argc && argv[0][0] == '-') {
-    ++argv[0];
-
-    if (argv[0][1] == '-') {
-      ++argv[0];
-
-      if (!strcmp(argv[0],    "help")) {
-        goto help;
-      } else if (!strcmp(argv[0], "version")) {
-        goto version;
-      } else if (!strcmp(argv[0], "expunge")) {
-        ret |= BAKE_EXPUNGE;
-      } else if (!strcmp(argv[0], "dry-run")) {
-        ret |= BAKE_NORUN;
-      } else if (!strcmp(argv[0],   "color")) {
-#if ENABLE_COLOR
-        color = 0;
-#endif
-      } else                                  {
-        goto help;
-      }
-    } else do {
-        switch (argv[0][0]) {
-        case 'h':
-          goto help;
-
-        case 'v':
-          goto version;
-
-        case 'x':
-          ret |= BAKE_EXPUNGE;
-          break;
-
-        case 'n':
-          ret |= BAKE_NORUN;
-          break;
-
-#if ENABLE_COLOR
-
-        case 'c':
-          color = 0;
-          break;
-#endif
-
-        case 0  :
-          goto next;
-
-        default :
-          color_puts("UNKNOWN");
-          goto help;
+  for (begin = 0; (list || select) && begin < length - strlen (START); ++begin) {
+    if (memcmp (buffer + begin, START, strlen (START)) == 0) {
+      end = begin;
+      size_t stop = begin;
+      while (end < length && buffer[end] != '\n') { ++end; }
+      if (end && buffer [end - 1] == '\\') { ++end; }
+      while (stop < length - strlen (STOP)) {
+        if (memcmp(buffer + stop, STOP, strlen (STOP)) == 0) {
+          if (stop && buffer[stop - 1] != '\\') {
+            break;
+          }
         }
-      } while (++(argv[0]));
-
-  next:;
+        ++stop;
+      }
+      if (list) {
+        color_printf (GREEN "%d" RESET ": " BOLD, select++);
+        fwrite (buffer + begin, 1, end - begin, stdout);
+        color_puts (RESET);
+      } else { --select; }
+  }}
+  begin += strlen (START) - 1;
+
+  if (list) { return 0; }
+  if (end < begin) {
+    color_fprintf (stderr, RED "%s" RESET ": " BOLD "%d" RESET " is out of range\n", argv [0], select_input);
+    return 1;
   }
 
-  if (!argc)
-  {
-    color_fprintf(stderr, BOLD RED "%s" RESET
-                  ": No filename provided\n",
-                  argv0);
-    return BAKE_ERROR;
+  /* expansion */
+
+  args = all_args (argc - off, argv + off);
+  shortened = shorten (filename);
+  char * pair [] = {
+      "@FILENAME",  filename,
+      "@FILE",      filename,
+      "$@",         filename,
+      "@SHORT",     shortened,
+      "$*",         shortened,
+      "@ARGS",      args,
+      "$+",         args,
+      "@LINE",      line
+    };
+  size_t count = ARRLEN (pair);
+  snprintf (line, 16, "%lu", lines (buffer, begin));
+  expandedp = expand (buffer + begin, end - begin, pair, count);
+  memcpy(expanded, expandedp, BUFFER_SIZE);
+  munmap (buffer, length);
+
+  /* print and execute */
+  color_printf (GREEN "%s" RESET ": " BOLD "%s" RESET, argv [0], expanded);
+  if (!run) { return 0; }
+
+  color_fprintf (stderr, GREEN "output" RESET ":\n");
+  if ((pid = fork ()) == 0) {
+    execl ("/bin/sh", "sh", "-c", expanded, NULL);
+    return 0; /* execl overwrites the process anyways */
   }
 
-  filename = argv[0];
-  ++argv, --argc;
-
-  if (strlen(filename) > FILENAME_LIMIT) {
-    color_fprintf(stderr, BOLD RED "%s" RESET
-                  ": Filename too long (exceeds %d)\n",
-                  argv0,
-                  FILENAME_LIMIT);
-    return BAKE_ERROR;
+  if (pid == -1) {
+    color_fprintf (stderr, GREEN "%s" RESET ": %s, %s\n",
+            argv [0], "Fork Error", strerror (errno));
+    return 1;
   }
 
-  root(&filename);
-  buf = file_get_region(filename, START, STOP);
-
-  if (!buf) {
-    char * error[2];
-    error[0] = "File Unrecognized";
-    error[1] = "Found start without suffix spacing";
-
-    color_fprintf(stderr, BOLD RED "%s" RESET ": '" BOLD "%s" RESET "' %s.\n",
-                  argv0, filename, errno ? strerror(errno) : error[bake_errno]);
-    return BAKE_ERROR;
+  /* reuse of run as status return */
+  if (waitpid (pid, &run, 0) < 0) {
+    color_fprintf (stderr, GREEN "%s" RESET ": " RED "%s" RESET ", %s\n",
+            argv [0], "Wait PID Error", strerror (errno));
+    return 1;
   }
+  if (!WIFEXITED (run)) {
+    return 1;
+  }
+  return WEXITSTATUS (run);
+}
 
-  buf = bake_expand(buf, filename, argc, argv);
-
-  color_printf(BOLD GREEN "%s" RESET ": %s\n", argv0, buf + strip(buf));
-
-  remove_expand(buf, argv0, ret, EXPUNGE_START, EXPUNGE_STOP);
-
-  if (!ret) {
-    ret = run(buf, argv0);
-
-    if (ret) {
-      color_printf(BOLD RED "result" RESET ": " BOLD "%d\n" RESET, ret);
-    }
-  } else { ret = 0; }
-
-  free(buf);
-  return ret;
-help:
-  color_fprintf(stderr, YELLOW "%s" RESET ": %s\n", argv0, HELP DESC);
-  return BAKE_ERROR;
-version:
-  color_fprintf(stderr,
-                YELLOW "%s" RESET ": v" VERSION "\n"
-                "Copyright " COPYRIGHT "\n" LICENSE "\n",
-                argv0);
-  return BAKE_ERROR;
+void help (void) {
+  char * help =
+    BOLD "bake [-chln] [-s <n>] <FILENAME> [ARGS...]; version 20240804\n\n" RESET
+    GREEN "Bake" RESET " is a simple tool meant to execute embedded shell commands within\n"
+    "any file.  It executes with /bin/sh the command after a \"" BOLD "@BAKE" RESET " \" to\n"
+    "the end of the line (a UNIX newline: '\\n').\n\n"
+    "It expands some macros,\n"
+    YELLOW "\t@NAME   " RESET "- filename\n"
+    YELLOW "\t@SHORT  " RESET "- shortened filename\n"
+    YELLOW "\t@ARGS   " RESET "- other arguments to the program\n"
+    YELLOW "\t@LINE   " RESET "- line number at the selected @BAKE\n\n"
+    "All macros can be exempted by prefixing them with a backslash,\n"
+    "which'll be subtracted in the expansion. multi-line commands may be\n"
+    "done by a leading backslash, which are NOT subtracted.\n\n"
+    "It has five options, this message (-h, --help); prevents the execution\n"
+    "of the shell command (-n, --dry-run); disable color (-c, --color); list\n"
+    "(-l, --list) and select (-s<n>, --select <n>) which respectively lists\n"
+    "all @BAKE commands and select & run the Nth command.\n\n"
+    "It roots the shell execution in the directory of the given file.\n\n"
+    "Licensed under the public domain.\n";
+  color_printf ("%s", help);
+  exit (1);
 }
diff --git a/config.h b/config.h
deleted file mode 100644 (file)
index 987b612..0000000
--- a/config.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Require space after START */
-#define REQUIRE_SPACE
-
-/* colorize output */
-#define ENABLE_COLOR 1
-
-/* preferred,     @FILENAME @SHORT @ARGS */
-#define NEW_MACROS 1
-
-/*                $@        $*     $+    */
-#define OLD_MACROS 1
-
-/* Disables the possibility of remove(1) ever being ran */
-#define ENABLE_EXPUNGE_REMOVE 0
-
-/* ./bake bake will compile bake.c, basically just proves that binary files
- *  really are supported, the bake.c file must exist next to the executable for
- *  this work correctly. Not meant as a serious feature, DO NOT enable this by
- *  default or in user builds.
- */
-#define INCLUDE_AUTONOMOUS_COMPILE 0
-
-#if ENABLE_COLOR == 1
-# define    RED "\033[91m"
-# define  GREEN "\033[92m"
-# define YELLOW "\033[93m"
-# define    DIM "\033[2m"
-# define   BOLD "\033[1m"
-# define  RESET "\033[0m"
-#elif ENABLE_COLOR
-# define    RED "\033[91;5m"
-# define  GREEN "\033[96;7m"
-# define YELLOW "\033[94m"
-# define    DIM "\033[7m"
-# define   BOLD "\033[1;4m"
-# define  RESET "\033[0m"
-#else
-# define    RED
-# define  GREEN
-# define YELLOW
-# define    DIM
-# define   BOLD
-# define  RESET
-#endif
-
-/* It's best if you don't change these */
-
-/* sed -i 's/@COMPILECMD/@BAKE/g' <<<YOUR FILES...>>> */
-#define I_USE_LEGACY_CODE_AND_REFUSE_TO_UPGRADE 0
-
-#if I_USE_LEGACY_CODE_AND_REFUSE_TO_UPGRADE
-# define START "@COMPILECMD"
-# warning | use sed -i 's/@COMPILECMD/@BAKE/g' <YOUR LEGACY FILES...> instead
-#endif /* I_USE_LEGACY_CODE_AND_REFUSE_TO_UPGRADE */
-
-#undef  START
-#define START "@BAKE"
-#define  STOP "@STOP"
-
-#define EXPUNGE_START "@{"
-#define EXPUNGE_STOP   "}"
diff --git a/dist.sh b/dist.sh
deleted file mode 100755 (executable)
index 137de6d..0000000
--- a/dist.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-# distribution tarball
-
-cd "$(dirname "$(readlink -f "$0")")"
-
-FILES='LICENSE README shake install.sh bake.c config.h bake.1'
-VERSION="$(cat VERSION)"
-TARGET="bake-$VERSION"
-
-mkdir -p $TARGET
-cp -f $FILES $TARGET
-tar cf $TARGET.tar $TARGET
-gzip -f $TARGET.tar
-rm -rf $TARGET